diff --git a/.github/workflows/push-image.yaml b/.github/workflows/push-image.yaml index b2a04b5c2..443b2c525 100644 --- a/.github/workflows/push-image.yaml +++ b/.github/workflows/push-image.yaml @@ -85,9 +85,9 @@ jobs: run: make vendor - name: Build web and go applications run: | - make build-web + make build-web-console make build-go -j ${{ env.GO_BUILD_CONCURRENCY }} - make clean-web + make clean-web-console - name: Add executable permission to go binary files run: chmod +x bin/* - name: Set up docker diff --git a/Makefile b/Makefile index 5a22d92eb..0538c30a4 100644 --- a/Makefile +++ b/Makefile @@ -148,13 +148,13 @@ $(GO_APP_BUILD_TARGETS): build-%: go build -ldflags "-s -w -X $(LDFLAGS_VERSION)=$(VERSION) -X $(LDFLAGS_HASH)=$(HASH) -X $(LDFLAGS_BUILDDATE)=$(BUILDDATE)" \ -o bin/$* -mod=vendor cmd/$*/$*.go -.PHONY: clean-web -clean-web: +.PHONY: clean-web-console +clean-web-console: rm -rf ui/web-v2/dist/* touch ui/web-v2/dist/DONT-EDIT-FILES-IN-THIS-DIRECTORY -.PHONY: build-web -build-web: +.PHONY: build-web-console +build-web-console: rm -rf ui/web-v2/dist/* make -C ui/web-v2 install build @@ -162,7 +162,7 @@ build-web: build-go: $(GO_APP_BUILD_TARGETS) .PHONY: build-go-embed -build-go-embed: build-web $(GO_APP_BUILD_TARGETS) clean-web +build-go-embed: build-web-console $(GO_APP_BUILD_TARGETS) clean-web-console # Make sure bucketeer-httpstan is already running. If not, run "make start-httpstan". .PHONY: test-go diff --git a/cmd/backend/backend.go b/cmd/web/web.go similarity index 91% rename from cmd/backend/backend.go rename to cmd/web/web.go index bbfe250e2..981698866 100644 --- a/cmd/backend/backend.go +++ b/cmd/web/web.go @@ -17,12 +17,12 @@ package main import ( "log" - "github.com/bucketeer-io/bucketeer/pkg/backend/cmd/server" "github.com/bucketeer-io/bucketeer/pkg/cli" + "github.com/bucketeer-io/bucketeer/pkg/web/cmd/server" ) var ( - name = "bucketeer-backend" + name = "bucketeer-web" version = "" build = "" ) diff --git a/manifests/bucketeer/charts/api-gateway/templates/envoy-configmap.yaml b/manifests/bucketeer/charts/api-gateway/templates/envoy-configmap.yaml index 6dd41a949..3e30ef9aa 100644 --- a/manifests/bucketeer/charts/api-gateway/templates/envoy-configmap.yaml +++ b/manifests/bucketeer/charts/api-gateway/templates/envoy-configmap.yaml @@ -98,7 +98,7 @@ data: private_key: filename: /usr/local/certs/service/tls.key type: strict_dns - - name: backend + - name: web connect_timeout: 5s ignore_health_on_host_removal: true circuit_breakers: @@ -109,13 +109,13 @@ data: max_pending_requests: 100000000 max_requests: 100000000 load_assignment: - cluster_name: backend + cluster_name: web endpoints: - lb_endpoints: - endpoint: address: socket_address: - address: backend.{{ .Values.namespace }}.svc.cluster.local + address: web.{{ .Values.namespace }}.svc.cluster.local port_value: 9000 dns_lookup_family: V4_ONLY lb_policy: {{ .Values.envoy.lbPolicy }} @@ -256,7 +256,7 @@ data: exact: application/grpc prefix: /bucketeer.feature.FeatureService route: - cluster: backend + cluster: web timeout: 15s retry_policy: retry_on: 5xx @@ -268,7 +268,7 @@ data: exact: application/grpc prefix: /bucketeer.account.AccountService route: - cluster: backend + cluster: web timeout: 15s retry_policy: retry_on: 5xx diff --git a/manifests/bucketeer/charts/backend/Chart.yaml b/manifests/bucketeer/charts/backend/Chart.yaml deleted file mode 100644 index b19b36162..000000000 --- a/manifests/bucketeer/charts/backend/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v1 -appVersion: "1.0" -description: A Helm chart for bucketeer-backend -name: backend -version: 1.0.0 diff --git a/manifests/bucketeer/charts/backend/templates/oauth-configmap.yaml b/manifests/bucketeer/charts/backend/templates/oauth-configmap.yaml deleted file mode 100644 index 06e4c53e0..000000000 --- a/manifests/bucketeer/charts/backend/templates/oauth-configmap.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "backend.fullname" . }}-oauth-config - namespace: {{ .Values.namespace }} - labels: - app: {{ template "backend.name" . }} - chart: {{ template "backend.chart" . }} - release: {{ template "backend.fullname" . }} - heritage: {{ .Release.Service }} -data: - oauth-config.json: |- - {{ toJson .Values.oauth }} \ No newline at end of file diff --git a/manifests/bucketeer/charts/backend/templates/service-cert-secret.yaml b/manifests/bucketeer/charts/backend/templates/service-cert-secret.yaml deleted file mode 100644 index f9ee4fbe0..000000000 --- a/manifests/bucketeer/charts/backend/templates/service-cert-secret.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if not .Values.tls.service.secret }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "backend.fullname" . }}-service-cert - namespace: {{ .Values.namespace }} - labels: - app: {{ template "backend.name" . }} - chart: {{ template "backend.chart" . }} - release: {{ template "backend.fullname" . }} - heritage: {{ .Release.Service }} -type: Opaque -data: - tls.crt: {{ required "Service TLS certificate is required" .Values.tls.service.cert | b64enc | quote }} - tls.key: {{ required "Service TLS key is required" .Values.tls.service.key | b64enc | quote }} -{{- end }} diff --git a/manifests/bucketeer/charts/backend/templates/service.yaml b/manifests/bucketeer/charts/backend/templates/service.yaml deleted file mode 100644 index 3983f2dc6..000000000 --- a/manifests/bucketeer/charts/backend/templates/service.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "backend.fullname" . }} - namespace: {{ .Values.namespace }} - labels: - app: {{ template "backend.name" . }} - chart: {{ template "backend.chart" . }} - release: {{ template "backend.fullname" . }} - heritage: {{ .Release.Service }} - envoy: "true" - metrics: "true" -spec: - type: {{ .Values.service.type }} - clusterIP: {{ .Values.service.clusterIP }} - ports: - - name: service - port: {{ .Values.service.externalPort }} - targetPort: envoy - protocol: TCP - - name: metrics - port: {{ .Values.env.metricsPort }} - protocol: TCP - - name: admin - port: {{ .Values.envoy.adminPort }} - protocol: TCP - selector: - app: {{ template "backend.name" . }} - release: {{ template "backend.fullname" . }} diff --git a/manifests/bucketeer/charts/backend/values.yaml b/manifests/bucketeer/charts/backend/values.yaml deleted file mode 100644 index 5cbf2bffc..000000000 --- a/manifests/bucketeer/charts/backend/values.yaml +++ /dev/null @@ -1,141 +0,0 @@ -image: - repository: ghcr.io/bucketeer-io/bucketeer-backend - pullPolicy: IfNotPresent - -fullnameOverride: "backend" - -namespace: default - -env: - cloudService: - profile: true - bucketeerTestEnabled: - gcpEnabled: true - bigqueryEmulatorHost: - pubsubEmulatorHost: - project: - mysqlUser: - mysqlPass: - mysqlHost: - mysqlPort: 3306 - mysqlDbName: - persistentRedis: - serverName: - addr: - poolMaxIdle: 25 - poolMaxActive: 25 - nonPersistentRedis: - serverName: - addr: - poolMaxIdle: 25 - poolMaxActive: 25 - bigQueryDataSet: - bigQueryDataLocation: - domainTopic: - bulkSegmentUsersReceivedTopic: - accountService: localhost:9001 - authService: localhost:9001 - batchService: localhost:9001 - environmentService: localhost:9001 - experimentService: localhost:9001 - featureService: localhost:9001 - autoOpsService: localhost:9001 - healthCheckServicePort: 8000 - accountServicePort: 9091 - authServicePort: 9092 - auditLogServicePort: 9093 - autoOpsServicePort: 9094 - environmentServicePort: 9095 - eventCounterServicePort: 9096 - experimentServicePort: 9097 - featureServicePort: 9098 - notificationServicePort: 9100 - pushServicePort: 9101 - webConsoleServicePort: 9102 - metricsPort: 9002 - timezone: UTC - emailFilter: - logLevel: info - googleTagManagerId: - -affinity: {} - -nodeSelector: {} - -pdb: - enabled: - maxUnavailable: 50% - -hpa: - enabled: - minReplicas: - maxReplicas: - metrics: - cpu: - targetAverageUtilization: - -tls: - service: - secret: - cert: - key: - issuer: - secret: - cert: - -serviceToken: - secret: - -oauth: - key: - secret: - issuer: - audience: bucketeer - google: - issuer: - clientId: - clientSecret: - redirectUrls: - demoSignIn: - enabled: - email: - password: - organizationId: - projectId: - environmentId: - isSystemAdmin: - -webhook: - baseURL: - kmsResourceName: - -envoy: - image: - repository: ghcr.io/bucketeer-io/bucketeer-envoy - tag: v1.31.0 - pullPolicy: IfNotPresent - lbPolicy: LEAST_REQUEST - config: - port: 9000 - adminPort: 8001 - resources: {} - -service: - type: ClusterIP - clusterIP: None - externalPort: 9000 - -health: - livenessProbe: - initialDelaySeconds: 10 - periodSeconds: 3 - failureThreshold: 5 - readinessProbe: - initialDelaySeconds: 10 - periodSeconds: 3 - failureThreshold: 2 - -resources: {} - -serviceAccount: - annotations: {} diff --git a/manifests/bucketeer/charts/batch/templates/envoy-configmap.yaml b/manifests/bucketeer/charts/batch/templates/envoy-configmap.yaml index dc587dfb4..d68a7a0e5 100644 --- a/manifests/bucketeer/charts/batch/templates/envoy-configmap.yaml +++ b/manifests/bucketeer/charts/batch/templates/envoy-configmap.yaml @@ -63,19 +63,19 @@ data: unhealthy_threshold: 2 ignore_health_on_host_removal: true - - name: backend + - name: web type: strict_dns lb_policy: {{ .Values.envoy.lbPolicy }} connect_timeout: 5s dns_lookup_family: V4_ONLY load_assignment: - cluster_name: backend + cluster_name: web endpoints: - lb_endpoints: - endpoint: address: socket_address: - address: backend.{{ .Values.namespace }}.svc.cluster.local + address: web.{{ .Values.namespace }}.svc.cluster.local port_value: 9000 transport_socket: name: envoy.transport_sockets.tls @@ -96,38 +96,6 @@ data: http2_protocol_options: {} ignore_health_on_host_removal: true - - name: experiment-calculator - dns_lookup_family: V4_ONLY - connect_timeout: 5s - ignore_health_on_host_removal: true - type: strict_dns - lb_policy: {{ .Values.envoy.lbPolicy }} - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: {} - load_assignment: - cluster_name: experiment-calculator - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: experiment-calculator.{{ .Values.namespace }}.svc.cluster.local - port_value: 9000 - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext - common_tls_context: - alpn_protocols: ["h2"] - tls_certificates: - - certificate_chain: - filename: /usr/local/certs/service/tls.crt - private_key: - filename: /usr/local/certs/service/tls.key - listeners: - name: ingress address: @@ -228,7 +196,7 @@ data: exact: application/grpc prefix: /bucketeer.account.AccountService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -240,7 +208,7 @@ data: exact: application/grpc prefix: /bucketeer.autoops.AutoOpsService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -252,7 +220,7 @@ data: exact: application/grpc prefix: /bucketeer.notification.NotificationService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -264,7 +232,7 @@ data: exact: application/grpc prefix: /bucketeer.environment.EnvironmentService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -276,7 +244,7 @@ data: exact: application/grpc prefix: /bucketeer.experiment.ExperimentService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -288,23 +256,11 @@ data: exact: application/grpc prefix: /bucketeer.eventcounter.EventCounterService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx timeout: 1800s - - match: - headers: - - name: content-type - string_match: - exact: application/grpc - prefix: /bucketeer.experimentcalculator.ExperimentCalculatorService - route: - cluster: experiment-calculator - timeout: 1800s - retry_policy: - retry_on: 5xx - num_retries: 3 - match: headers: - name: content-type @@ -324,7 +280,7 @@ data: exact: application/grpc prefix: /bucketeer.feature.FeatureService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx diff --git a/manifests/bucketeer/charts/batch/values.dev.yaml b/manifests/bucketeer/charts/batch/values.dev.yaml index 340ee6c9e..6e8f1230c 100644 --- a/manifests/bucketeer/charts/batch/values.dev.yaml +++ b/manifests/bucketeer/charts/batch/values.dev.yaml @@ -62,7 +62,7 @@ oauth: cronjob: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 - webGatewayAddress: https://web-gateway.default.svc.cluster.local:9000 + webGatewayAddress: https://web.default.svc.cluster.local:9003 jobs: - name: experiment-status-updater jobId: ExperimentStatusUpdater diff --git a/manifests/bucketeer/charts/batch/values.yaml b/manifests/bucketeer/charts/batch/values.yaml index 4af70e707..9a239a109 100644 --- a/manifests/bucketeer/charts/batch/values.yaml +++ b/manifests/bucketeer/charts/batch/values.yaml @@ -123,7 +123,7 @@ serviceAccount: cronjob: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 - webGatewayAddress: https://web-gateway.default.svc.cluster.local:9000 + webGatewayAddress: https://web.default.svc.cluster.local:9003 jobs: - name: experiment-status-updater jobId: ExperimentStatusUpdater diff --git a/manifests/bucketeer/charts/subscriber/templates/envoy-configmap.yaml b/manifests/bucketeer/charts/subscriber/templates/envoy-configmap.yaml index aefd5a1e5..86c6ebd12 100644 --- a/manifests/bucketeer/charts/subscriber/templates/envoy-configmap.yaml +++ b/manifests/bucketeer/charts/subscriber/templates/envoy-configmap.yaml @@ -63,19 +63,19 @@ data: unhealthy_threshold: 2 ignore_health_on_host_removal: true - - name: backend + - name: web type: strict_dns lb_policy: {{ .Values.envoy.lbPolicy }} connect_timeout: 5s dns_lookup_family: V4_ONLY load_assignment: - cluster_name: backend + cluster_name: web endpoints: - lb_endpoints: - endpoint: address: socket_address: - address: backend.{{ .Values.namespace }}.svc.cluster.local + address: web.{{ .Values.namespace }}.svc.cluster.local port_value: 9000 transport_socket: name: envoy.transport_sockets.tls @@ -130,7 +130,7 @@ data: exact: application/grpc prefix: /bucketeer.account.AccountService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -142,7 +142,7 @@ data: exact: application/grpc prefix: /bucketeer.autoops.AutoOpsService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -154,7 +154,7 @@ data: exact: application/grpc prefix: /bucketeer.notification.NotificationService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -166,7 +166,7 @@ data: exact: application/grpc prefix: /bucketeer.environment.EnvironmentService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -178,7 +178,7 @@ data: exact: application/grpc prefix: /bucketeer.experiment.ExperimentService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -190,7 +190,7 @@ data: exact: application/grpc prefix: /bucketeer.eventcounter.EventCounterService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx @@ -214,7 +214,7 @@ data: exact: application/grpc prefix: /bucketeer.feature.FeatureService route: - cluster: backend + cluster: web retry_policy: num_retries: 3 retry_on: 5xx diff --git a/manifests/bucketeer/charts/web-gateway/.helmignore b/manifests/bucketeer/charts/web-gateway/.helmignore deleted file mode 100644 index f0c131944..000000000 --- a/manifests/bucketeer/charts/web-gateway/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/manifests/bucketeer/charts/web-gateway/Chart.yaml b/manifests/bucketeer/charts/web-gateway/Chart.yaml deleted file mode 100644 index 910b81ea9..000000000 --- a/manifests/bucketeer/charts/web-gateway/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v1 -appVersion: 1.0 -description: A Helm chart for web-gateway -name: web-gateway -version: 1.0.0 diff --git a/manifests/bucketeer/charts/web-gateway/templates/NOTES.txt b/manifests/bucketeer/charts/web-gateway/templates/NOTES.txt deleted file mode 100644 index c9a35f712..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/NOTES.txt +++ /dev/null @@ -1,3 +0,0 @@ -export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "web-gateway.fullname" . }}) -export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") -echo http://$NODE_IP:$NODE_PORT diff --git a/manifests/bucketeer/charts/web-gateway/templates/_helpers.tpl b/manifests/bucketeer/charts/web-gateway/templates/_helpers.tpl deleted file mode 100644 index 87d9060c4..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/_helpers.tpl +++ /dev/null @@ -1,40 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "web-gateway.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "web-gateway.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "web-gateway.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{- define "service-cert-secret" -}} -{{- if .Values.tls.service.secret }} -{{- printf "%s" .Values.tls.service.secret -}} -{{- else -}} -{{ template "web-gateway.fullname" . }}-service-cert -{{- end -}} -{{- end -}} diff --git a/manifests/bucketeer/charts/web-gateway/templates/deployment.yaml b/manifests/bucketeer/charts/web-gateway/templates/deployment.yaml deleted file mode 100644 index 028364e1f..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/deployment.yaml +++ /dev/null @@ -1,172 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "web-gateway.fullname" . }} - namespace: {{ .Values.namespace }} - labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} - heritage: {{ .Release.Service }} -spec: - selector: - matchLabels: - app: {{ template "web-gateway.name" . }} - release: {{ template "web-gateway.fullname" . }} - template: - metadata: - labels: - app: {{ template "web-gateway.name" . }} - release: {{ template "web-gateway.fullname" . }} - annotations: - checksum/config: {{ include (print $.Template.BasePath "/envoy-configmap.yaml") . | sha256sum }} - spec: - volumes: - - name: envoy-config - configMap: - name: {{ template "web-gateway.fullname" . }}-envoy-config - - name: envoy-account-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-account - - name: envoy-auditlog-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-auditlog - - name: envoy-auth-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-auth - - name: envoy-autoops-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-autoops - - name: envoy-environment-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-environment - - name: envoy-eventcounter-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-eventcounter - - name: envoy-experiment-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-experiment - - name: envoy-experiment-calculator-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-experimentcalculator - - name: envoy-feature-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-feature - - name: envoy-notification-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-notification - - name: envoy-push-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-push - - name: envoy-batch-descriptor-secret - secret: - secretName: {{ template "web-gateway.fullname" . }}-batch - - name: service-cert-secret - secret: - secretName: {{ template "service-cert-secret" . }} - {{- if .Values.serviceAccount.annotations }} - serviceAccountName: {{ template "web-gateway.fullname" . }} - {{- end }} - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.envoy.image.repository }}:{{ .Values.envoy.image.tag }}" - imagePullPolicy: {{ .Values.envoy.image.pullPolicy }} - lifecycle: - preStop: - exec: - command: - - "/bin/sh" - - "-c" - - "wget -O- --post-data='{}' http://localhost:$ENVOY_ADMIN_PORT/healthcheck/fail; sleep 15" - command: ["envoy"] - args: - - "-c" - - "/usr/local/conf/config.yaml" - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: ENVOY_ADMIN_PORT - value: "{{ .Values.envoy.adminPort }}" - volumeMounts: - - name: envoy-config - mountPath: /usr/local/conf - readOnly: true - - name: envoy-account-descriptor-secret - mountPath: /usr/local/account-secret - readOnly: true - - name: envoy-auditlog-descriptor-secret - mountPath: /usr/local/auditlog-secret - readOnly: true - - name: envoy-auth-descriptor-secret - mountPath: /usr/local/auth-secret - readOnly: true - - name: envoy-autoops-descriptor-secret - mountPath: /usr/local/autoops-secret - readOnly: true - - name: envoy-environment-descriptor-secret - mountPath: /usr/local/environment-secret - readOnly: true - - name: envoy-eventcounter-descriptor-secret - mountPath: /usr/local/eventcounter-secret - readOnly: true - - name: envoy-experiment-descriptor-secret - mountPath: /usr/local/experiment-secret - - name: envoy-experiment-calculator-descriptor-secret - mountPath: /usr/local/experiment-calculator-secret - readOnly: true - - name: envoy-feature-descriptor-secret - mountPath: /usr/local/feature-secret - readOnly: true - - name: envoy-notification-descriptor-secret - mountPath: /usr/local/notification-secret - readOnly: true - - name: envoy-push-descriptor-secret - mountPath: /usr/local/push-secret - readOnly: true - - name: envoy-batch-descriptor-secret - mountPath: /usr/local/batch-secret - readOnly: true - - name: service-cert-secret - mountPath: /usr/local/certs/service - readOnly: true - ports: - - name: http - containerPort: {{ .Values.service.externalPort }} - protocol: TCP - - name: admin - containerPort: {{ .Values.envoy.adminPort }} - protocol: TCP - livenessProbe: - initialDelaySeconds: {{ .Values.health.livenessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.health.livenessProbe.periodSeconds }} - failureThreshold: {{ .Values.health.livenessProbe.failureThreshold }} - httpGet: - path: /ready - port: admin - scheme: HTTP - readinessProbe: - initialDelaySeconds: {{ .Values.health.readinessProbe.initialDelaySeconds }} - periodSeconds: {{ .Values.health.readinessProbe.periodSeconds }} - failureThreshold: {{ .Values.health.readinessProbe.failureThreshold }} - httpGet: - path: /ready - port: admin - scheme: HTTP - resources: -{{ toYaml .Values.resources | indent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - strategy: - type: RollingUpdate diff --git a/manifests/bucketeer/charts/web-gateway/templates/envoy-configmap.yaml b/manifests/bucketeer/charts/web-gateway/templates/envoy-configmap.yaml deleted file mode 100644 index 80168af46..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/envoy-configmap.yaml +++ /dev/null @@ -1,455 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "web-gateway.fullname" . }}-envoy-config - namespace: {{ .Values.namespace }} - labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} - heritage: {{ .Release.Service }} -data: - config.yaml: |- - admin: - access_log: - - name: envoy.access_loggers.file - typed_config: - '@type': type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog - path: "/dev/stdout" - address: - socket_address: - address: 0.0.0.0 - port_value: 8001 - static_resources: - clusters: - - name: backend - dns_lookup_family: V4_ONLY - connect_timeout: 5s - ignore_health_on_host_removal: true - type: strict_dns - lb_policy: {{ .Values.envoy.lbPolicy }} - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: {} - load_assignment: - cluster_name: backend - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: backend.{{ .Values.namespace }}.svc.cluster.local - port_value: 9000 - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext - common_tls_context: - alpn_protocols: ["h2"] - tls_certificates: - - certificate_chain: - filename: /usr/local/certs/service/tls.crt - private_key: - filename: /usr/local/certs/service/tls.key - - - name: batch - dns_lookup_family: V4_ONLY - connect_timeout: 5s - ignore_health_on_host_removal: true - type: strict_dns - lb_policy: {{ .Values.envoy.lbPolicy }} - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: {} - load_assignment: - cluster_name: batch - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: batch-server.{{ .Values.namespace }}.svc.cluster.local - port_value: 9000 - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext - common_tls_context: - alpn_protocols: ["h2"] - tls_certificates: - - certificate_chain: - filename: /usr/local/certs/service/tls.crt - private_key: - filename: /usr/local/certs/service/tls.key - health_checks: - - http_health_check: - path: /health - timeout: 1s - interval: 10s - interval_jitter: 1s - no_traffic_interval: 2s - healthy_threshold: 1 - unhealthy_threshold: 2 - - - name: experiment-calculator - dns_lookup_family: V4_ONLY - connect_timeout: 5s - ignore_health_on_host_removal: true - type: strict_dns - lb_policy: {{ .Values.envoy.lbPolicy }} - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: {} - load_assignment: - cluster_name: experiment-calculator - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: experiment-calculator.{{ .Values.namespace }}.svc.cluster.local - port_value: 9000 - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext - common_tls_context: - alpn_protocols: ["h2"] - tls_certificates: - - certificate_chain: - filename: /usr/local/certs/service/tls.crt - private_key: - filename: /usr/local/certs/service/tls.key - - - name: web - dns_lookup_family: V4_ONLY - connect_timeout: 5s - ignore_health_on_host_removal: true - type: strict_dns - lb_policy: {{ .Values.envoy.lbPolicy }} - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - '@type': type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: {} - load_assignment: - cluster_name: web - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: web.{{ .Values.namespace }}.svc.cluster.local - port_value: 443 - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext - common_tls_context: - alpn_protocols: ["h2"] - tls_certificates: - - certificate_chain: - filename: /usr/local/certs/service/tls.crt - private_key: - filename: /usr/local/certs/service/tls.key - - listeners: - - name: ingress - address: - socket_address: - address: 0.0.0.0 - port_value: 9000 - filter_chains: - - filters: - - name: envoy.filters.network.http_connection_manager - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager - stat_prefix: ingress_http - access_log: - name: envoy.access_loggers.file - typed_config: - "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog - path: /dev/stdout - codec_type: auto - common_http_protocol_options: - # set longer timeout than lb session timeout (600s) - idle_timeout: 620s - stream_idle_timeout: 10800s - request_timeout: 10800s - http_filters: - - name: envoy.filters.http.cors - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors - - name: envoy.filters.http.grpc_web - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/account-secret/account_proto_descriptor.pb - services: - - bucketeer.account.AccountService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/auditlog-secret/auditlog_proto_descriptor.pb - services: - - bucketeer.auditlog.AuditLogService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/auth-secret/auth_proto_descriptor.pb - services: - - bucketeer.auth.AuthService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/autoops-secret/autoops_proto_descriptor.pb - services: - - bucketeer.autoops.AutoOpsService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/environment-secret/environment_proto_descriptor.pb - services: - - bucketeer.environment.EnvironmentService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/eventcounter-secret/eventcounter_proto_descriptor.pb - services: - - bucketeer.eventcounter.EventCounterService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/experiment-secret/experiment_proto_descriptor.pb - services: - - bucketeer.experiment.ExperimentService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/experiment-calculator-secret/experiment_calculator_proto_descriptor.pb - services: - - bucketeer.experimentcalculator.ExperimentCalculatorService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/feature-secret/feature_proto_descriptor.pb - services: - - bucketeer.feature.FeatureService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/notification-secret/notification_proto_descriptor.pb - services: - - bucketeer.notification.NotificationService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/push-secret/push_proto_descriptor.pb - services: - - bucketeer.push.PushService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.grpc_json_transcoder - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder - auto_mapping: true - proto_descriptor: /usr/local/batch-secret/batch_proto_descriptor.pb - services: - - bucketeer.batch.BatchService - print_options: - always_print_primitive_fields: true - - name: envoy.filters.http.router - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router - route_config: - virtual_hosts: - - name: web-gateway - domains: - - "*" - typed_per_filter_config: - envoy.filters.http.cors: - "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.CorsPolicy - allow_origin_string_match: - - prefix: "*" - allow_headers: "content-type, x-grpc-web, authorization" - allow_methods: "POST" - allow_credentials: true - routes: - - match: - prefix: /bucketeer.account.AccountService - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.auditlog.AuditLogService - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.auth.AuthService - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.autoops.AutoOpsService - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /hook - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.batch.BatchService - route: - cluster: batch - timeout: 3600s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.environment.EnvironmentService - route: - cluster: backend - timeout: 60s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.eventcounter.EventCounterService - route: - cluster: backend - timeout: 1800s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.experimentcalculator.ExperimentCalculatorService - route: - cluster: experiment-calculator - timeout: 1800s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.experiment.ExperimentService - route: - cluster: backend - timeout: 60s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.feature.FeatureService - route: - cluster: backend - timeout: 60s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /webhook - route: - cluster: backend - timeout: 60s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.notification.NotificationService - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: /bucketeer.push.PushService - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - - match: - prefix: / - route: - cluster: backend - timeout: 15s - retry_policy: - retry_on: 5xx - num_retries: 3 - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext - require_client_certificate: true - common_tls_context: - alpn_protocols: ["h2"] - tls_certificates: - - certificate_chain: - filename: /usr/local/certs/service/tls.crt - private_key: - filename: /usr/local/certs/service/tls.key - overload_manager: - resource_monitors: - - name: 'envoy.resource_monitors.global_downstream_max_connections' - typed_config: - '@type': type.googleapis.com/envoy.extensions.resource_monitors.downstream_connections.v3.DownstreamConnectionsConfig - # We want disable the warning without setting a limit. So, we set a large number. - max_active_downstream_connections: 100000 diff --git a/manifests/bucketeer/charts/web-gateway/templates/hpa.yaml b/manifests/bucketeer/charts/web-gateway/templates/hpa.yaml deleted file mode 100644 index b78dea0ac..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/hpa.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ if .Values.hpa.enabled }} -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: {{ template "web-gateway.fullname" . }} - namespace: {{ .Values.namespace }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ template "web-gateway.fullname" . }} - minReplicas: {{ .Values.hpa.minReplicas }} - maxReplicas: {{ .Values.hpa.maxReplicas }} - metrics: - - type: Resource - resource: - name: cpu - target: - averageUtilization: {{ .Values.hpa.metrics.cpu.targetAverageUtilization }} - type: Utilization -{{ end }} diff --git a/manifests/bucketeer/charts/web-gateway/templates/pdb.yaml b/manifests/bucketeer/charts/web-gateway/templates/pdb.yaml deleted file mode 100644 index 2c26f6d6d..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/pdb.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{ if .Values.pdb.enabled }} -apiVersion: policy/v1 -kind: PodDisruptionBudget -metadata: - name: {{ template "web-gateway.fullname" . }} - namespace: {{ .Values.namespace }} -spec: - maxUnavailable: {{ .Values.pdb.maxUnavailable }} - selector: - matchLabels: - app: {{ template "web-gateway.name" . }} -{{ end }} diff --git a/manifests/bucketeer/charts/web-gateway/templates/service-account.yaml b/manifests/bucketeer/charts/web-gateway/templates/service-account.yaml deleted file mode 100644 index 128182726..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/service-account.yaml +++ /dev/null @@ -1,8 +0,0 @@ -{{- if .Values.serviceAccount.annotations }} -apiVersion: v1 -kind: ServiceAccount -metadata: - namespace: {{ .Values.namespace }} - name: {{ template "web-gateway.fullname" . }} - annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 8 }} -{{- end }} diff --git a/manifests/bucketeer/charts/web-gateway/templates/service-cert-secret.yaml b/manifests/bucketeer/charts/web-gateway/templates/service-cert-secret.yaml deleted file mode 100644 index 394ca5ef3..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/service-cert-secret.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if not .Values.tls.service.secret }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "web-gateway.fullname" . }}-service-cert - namespace: {{ .Values.namespace }} - labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} - heritage: {{ .Release.Service }} -type: Opaque -data: - tls.crt: {{ required "Service TLS certificate is required" .Values.tls.service.cert | b64enc | quote }} - tls.key: {{ required "Service TLS key is required" .Values.tls.service.key | b64enc | quote }} -{{- end }} \ No newline at end of file diff --git a/manifests/bucketeer/charts/web-gateway/templates/service.yaml b/manifests/bucketeer/charts/web-gateway/templates/service.yaml deleted file mode 100644 index b9154d0e7..000000000 --- a/manifests/bucketeer/charts/web-gateway/templates/service.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "web-gateway.fullname" . }} - namespace: {{ .Values.namespace }} - annotations: - cloud.google.com/backend-config: '{"default": "{{ template "web-gateway.fullname" . }}"}' - cloud.google.com/neg: '{"ingress": true}' - cloud.google.com/app-protocols: '{"service":"HTTP2"}' - labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} - heritage: {{ .Release.Service }} - envoy: "true" -spec: - type: NodePort - ports: - - name: service - port: {{ .Values.service.externalPort }} - targetPort: http - protocol: TCP - - name: admin - port: {{ .Values.envoy.adminPort }} - targetPort: admin - protocol: TCP - selector: - app: {{ template "web-gateway.name" . }} - release: {{ template "web-gateway.fullname" . }} diff --git a/manifests/bucketeer/charts/web-gateway/values.dev.yaml b/manifests/bucketeer/charts/web-gateway/values.dev.yaml deleted file mode 100644 index 67fff7597..000000000 --- a/manifests/bucketeer/charts/web-gateway/values.dev.yaml +++ /dev/null @@ -1,12 +0,0 @@ -env: - gcpEnabled: false -tls: - bucketeerJP: - secrets: - - hosts: - - web-gateway.bucketeer.io - secretName: bucketeer-service-cert - service: - secret: bucketeer-service-cert -ingress: - host: web-gateway.bucketeer.io \ No newline at end of file diff --git a/manifests/bucketeer/charts/backend/.helmignore b/manifests/bucketeer/charts/web/.helmignore similarity index 100% rename from manifests/bucketeer/charts/backend/.helmignore rename to manifests/bucketeer/charts/web/.helmignore diff --git a/manifests/bucketeer/charts/web/Chart.yaml b/manifests/bucketeer/charts/web/Chart.yaml new file mode 100644 index 000000000..bcf374b68 --- /dev/null +++ b/manifests/bucketeer/charts/web/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for bucketeer-web +name: web +version: 1.0.0 diff --git a/manifests/bucketeer/charts/backend/templates/NOTES.txt b/manifests/bucketeer/charts/web/templates/NOTES.txt similarity index 75% rename from manifests/bucketeer/charts/backend/templates/NOTES.txt rename to manifests/bucketeer/charts/web/templates/NOTES.txt index eea60e7da..d34c3e721 100644 --- a/manifests/bucketeer/charts/backend/templates/NOTES.txt +++ b/manifests/bucketeer/charts/web/templates/NOTES.txt @@ -1,15 +1,15 @@ 1. Get the application URL by running these commands: {{- if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "backend.fullname" . }}) + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "web.fullname" . }}) export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT {{- else if contains "LoadBalancer" .Values.service.type }} NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc -w {{ template "backend.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "backend.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + You can watch the status of by running 'kubectl get svc -w {{ template "web.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "web.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://$SERVICE_IP:{{ .Values.service.port }} {{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "backend.name" . }},release={{ template "backend.fullname" . }}" -o jsonpath="{.items[0].metadata.name}") + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "web.name" . }},release={{ template "web.fullname" . }}" -o jsonpath="{.items[0].metadata.name}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl port-forward $POD_NAME 8080:80 {{- end }} diff --git a/manifests/bucketeer/charts/backend/templates/_helpers.tpl b/manifests/bucketeer/charts/web/templates/_helpers.tpl similarity index 76% rename from manifests/bucketeer/charts/backend/templates/_helpers.tpl rename to manifests/bucketeer/charts/web/templates/_helpers.tpl index 48af885a6..4a1f678ac 100644 --- a/manifests/bucketeer/charts/backend/templates/_helpers.tpl +++ b/manifests/bucketeer/charts/web/templates/_helpers.tpl @@ -2,7 +2,7 @@ {{/* Expand the name of the chart. */}} -{{- define "backend.name" -}} +{{- define "web.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} @@ -11,7 +11,7 @@ Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). If release name contains chart name it will be used as a full name. */}} -{{- define "backend.fullname" -}} +{{- define "web.fullname" -}} {{- if .Values.fullnameOverride -}} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} {{- else -}} @@ -27,7 +27,7 @@ If release name contains chart name it will be used as a full name. {{/* Create chart name and version as used by the chart label. */}} -{{- define "backend.chart" -}} +{{- define "web.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} {{- end -}} @@ -35,15 +35,7 @@ Create chart name and version as used by the chart label. {{- if .Values.tls.service.secret }} {{- printf "%s" .Values.tls.service.secret -}} {{- else -}} -{{ template "backend.fullname" . }}-service-cert -{{- end -}} -{{- end -}} - -{{- define "issuer-cert-secret" -}} -{{- if .Values.tls.issuer.secret }} -{{- printf "%s" .Values.tls.issuer.secret -}} -{{- else -}} -{{ template "backend.fullname" . }}-issuer-cert +{{ template "web.fullname" . }}-service-cert {{- end -}} {{- end -}} @@ -51,7 +43,7 @@ Create chart name and version as used by the chart label. {{- if .Values.oauth.key.secret }} {{- printf "%s" .Values.oauth.key.secret -}} {{- else -}} -{{ template "backend.fullname" . }}-oauth-key +{{ template "web.fullname" . }}-oauth-key {{- end -}} {{- end -}} @@ -59,6 +51,6 @@ Create chart name and version as used by the chart label. {{- if .Values.serviceToken.secret }} {{- printf "%s" .Values.serviceToken.secret -}} {{- else -}} -{{ template "backend.fullname" . }}-service-token +{{ template "web.fullname" . }}-service-token {{- end -}} {{- end -}} diff --git a/manifests/bucketeer/charts/web-gateway/templates/backend-config.yaml b/manifests/bucketeer/charts/web/templates/backend-config.yaml similarity index 81% rename from manifests/bucketeer/charts/web-gateway/templates/backend-config.yaml rename to manifests/bucketeer/charts/web/templates/backend-config.yaml index fd058b2e1..7fda71260 100644 --- a/manifests/bucketeer/charts/web-gateway/templates/backend-config.yaml +++ b/manifests/bucketeer/charts/web/templates/backend-config.yaml @@ -2,7 +2,7 @@ apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: - name: {{ template "web-gateway.fullname" . }} + name: {{ template "web.fullname" . }} namespace: {{ .Values.namespace }} spec: timeoutSec: 300 diff --git a/manifests/bucketeer/charts/backend/templates/deployment.yaml b/manifests/bucketeer/charts/web/templates/deployment.yaml similarity index 55% rename from manifests/bucketeer/charts/backend/templates/deployment.yaml rename to manifests/bucketeer/charts/web/templates/deployment.yaml index 815f09304..e7d127bdd 100644 --- a/manifests/bucketeer/charts/backend/templates/deployment.yaml +++ b/manifests/bucketeer/charts/web/templates/deployment.yaml @@ -1,23 +1,23 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ template "backend.fullname" . }} + name: {{ template "web.fullname" . }} namespace: {{ .Values.namespace }} labels: - app: {{ template "backend.name" . }} - chart: {{ template "backend.chart" . }} - release: {{ template "backend.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} spec: selector: matchLabels: - app: {{ template "backend.name" . }} - release: {{ template "backend.fullname" . }} + app: {{ template "web.name" . }} + release: {{ template "web.fullname" . }} template: metadata: labels: - app: {{ template "backend.name" . }} - release: {{ template "backend.fullname" . }} + app: {{ template "web.name" . }} + release: {{ template "web.fullname" . }} annotations: checksum/config: {{ include (print $.Template.BasePath "/envoy-configmap.yaml") . | sha256sum }} spec: @@ -31,16 +31,13 @@ spec: volumes: - name: envoy-config configMap: - name: {{ template "backend.fullname" . }}-envoy-config + name: {{ template "web.fullname" . }}-envoy-config - name: oauth-config configMap: - name: {{ template "backend.fullname" . }}-oauth-config + name: {{ template "web.fullname" . }}-oauth-config - name: service-cert-secret secret: secretName: {{ template "service-cert-secret" . }} - - name: issuer-cert-secret - secret: - secretName: {{ template "issuer-cert-secret" . }} - name: service-token-secret secret: secretName: {{ template "service-token-secret" . }} @@ -49,9 +46,45 @@ spec: secretName: {{ template "oauth-key-secret" . }} - name: env-js configMap: - name: {{ template "backend.name" . }}-env-js + name: {{ template "web.name" . }}-env-js + - name: envoy-account-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-account + - name: envoy-auditlog-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-auditlog + - name: envoy-auth-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-auth + - name: envoy-autoops-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-autoops + - name: envoy-environment-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-environment + - name: envoy-eventcounter-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-eventcounter + - name: envoy-experiment-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-experiment + - name: envoy-experiment-calculator-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-experimentcalculator + - name: envoy-feature-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-feature + - name: envoy-notification-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-notification + - name: envoy-push-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-push + - name: envoy-batch-descriptor-secret + secret: + secretName: {{ template "web.fullname" . }}-batch {{- if .Values.serviceAccount.annotations }} - serviceAccountName: {{ template "backend.fullname" . }} + serviceAccountName: {{ template "web.fullname" . }} {{- end }} containers: - name: {{ .Chart.Name }} @@ -59,117 +92,117 @@ spec: imagePullPolicy: {{ .Values.image.pullPolicy }} args: ["server"] env: - - name: BUCKETEER_BACKEND_CLOUD_SERVICE + - name: BUCKETEER_WEB_CLOUD_SERVICE value: "{{ .Values.env.cloudService }}" - name: BIGQUERY_EMULATOR_HOST value: "{{.Values.env.bigqueryEmulatorHost}}" - name: PUBSUB_EMULATOR_HOST value: "{{.Values.env.pubsubEmulatorHost}}" - - name: BUCKETEER_BACKEND_PROFILE + - name: BUCKETEER_WEB_PROFILE value: "{{.Values.env.profile}}" - name: BUCKETEER_TEST_ENABLED value: "{{.Values.env.bucketeerTestEnabled}}" - - name: BUCKETEER_BACKEND_GCP_TRACE_ENABLED + - name: BUCKETEER_WEB_GCP_TRACE_ENABLED value: "{{.Values.env.gcpEnabled}}" - - name: BUCKETEER_BACKEND_PROJECT + - name: BUCKETEER_WEB_PROJECT value: "{{ .Values.env.project }}" - - name: BUCKETEER_BACKEND_MYSQL_USER + - name: BUCKETEER_WEB_MYSQL_USER value: "{{ .Values.env.mysqlUser }}" - - name: BUCKETEER_BACKEND_MYSQL_PASS + - name: BUCKETEER_WEB_MYSQL_PASS value: "{{ .Values.env.mysqlPass }}" - - name: BUCKETEER_BACKEND_MYSQL_HOST + - name: BUCKETEER_WEB_MYSQL_HOST value: "{{ .Values.env.mysqlHost }}" - - name: BUCKETEER_BACKEND_MYSQL_PORT + - name: BUCKETEER_WEB_MYSQL_PORT value: "{{ .Values.env.mysqlPort }}" - - name: BUCKETEER_BACKEND_MYSQL_DB_NAME + - name: BUCKETEER_WEB_MYSQL_DB_NAME value: "{{ .Values.env.mysqlDbName }}" - - name: BUCKETEER_BACKEND_PERSISTENT_REDIS_SERVER_NAME + - name: BUCKETEER_WEB_PERSISTENT_REDIS_SERVER_NAME value: "{{ .Values.env.persistentRedis.serverName }}" - - name: BUCKETEER_BACKEND_PERSISTENT_REDIS_ADDR + - name: BUCKETEER_WEB_PERSISTENT_REDIS_ADDR value: "{{ .Values.env.persistentRedis.addr }}" - - name: BUCKETEER_BACKEND_PERSISTENT_REDIS_POOL_MAX_IDLE + - name: BUCKETEER_WEB_PERSISTENT_REDIS_POOL_MAX_IDLE value: "{{ .Values.env.persistentRedis.poolMaxIdle }}" - - name: BUCKETEER_BACKEND_PERSISTENT_REDIS_POOL_MAX_ACTIVE + - name: BUCKETEER_WEB_PERSISTENT_REDIS_POOL_MAX_ACTIVE value: "{{ .Values.env.persistentRedis.poolMaxActive }}" - - name: BUCKETEER_BACKEND_NON_PERSISTENT_REDIS_SERVER_NAME + - name: BUCKETEER_WEB_NON_PERSISTENT_REDIS_SERVER_NAME value: "{{ .Values.env.nonPersistentRedis.serverName }}" - - name: BUCKETEER_BACKEND_NON_PERSISTENT_REDIS_ADDR + - name: BUCKETEER_WEB_NON_PERSISTENT_REDIS_ADDR value: "{{ .Values.env.nonPersistentRedis.addr }}" - - name: BUCKETEER_BACKEND_NON_PERSISTENT_REDIS_POOL_MAX_IDLE + - name: BUCKETEER_WEB_NON_PERSISTENT_REDIS_POOL_MAX_IDLE value: "{{ .Values.env.nonPersistentRedis.poolMaxIdle }}" - - name: BUCKETEER_BACKEND_NON_PERSISTENT_REDIS_POOL_MAX_ACTIVE + - name: BUCKETEER_WEB_NON_PERSISTENT_REDIS_POOL_MAX_ACTIVE value: "{{ .Values.env.nonPersistentRedis.poolMaxActive }}" - - name: BUCKETEER_BACKEND_BIGQUERY_DATA_SET + - name: BUCKETEER_WEB_BIGQUERY_DATA_SET value: "{{ .Values.env.bigQueryDataSet }}" - - name: BUCKETEER_BACKEND_BIGQUERY_DATA_LOCATION + - name: BUCKETEER_WEB_BIGQUERY_DATA_LOCATION value: "{{ .Values.env.bigQueryDataLocation }}" - - name: BUCKETEER_BACKEND_DOMAIN_TOPIC + - name: BUCKETEER_WEB_DOMAIN_TOPIC value: "{{ .Values.env.domainTopic }}" - - name: BUCKETEER_BACKEND_BULK_SEGMENT_USERS_RECEIVED_TOPIC + - name: BUCKETEER_WEB_BULK_SEGMENT_USERS_RECEIVED_TOPIC value: "{{ .Values.env.bulkSegmentUsersReceivedTopic }}" - - name: BUCKETEER_BACKEND_HEALTH_CHECK_SERVICE_PORT + - name: BUCKETEER_WEB_HEALTH_CHECK_SERVICE_PORT value: "{{ .Values.env.healthCheckServicePort }}" - - name: BUCKETEER_BACKEND_ACCOUNT_SERVICE_PORT + - name: BUCKETEER_WEB_ACCOUNT_SERVICE_PORT value: "{{ .Values.env.accountServicePort }}" - - name: BUCKETEER_BACKEND_AUTH_SERVICE_PORT + - name: BUCKETEER_WEB_AUTH_SERVICE_PORT value: "{{ .Values.env.authServicePort }}" - - name: BUCKETEER_BACKEND_AUDIT_LOG_SERVICE_PORT + - name: BUCKETEER_WEB_AUDIT_LOG_SERVICE_PORT value: "{{ .Values.env.auditLogServicePort }}" - - name: BUCKETEER_BACKEND_AUTO_OPS_SERVICE_PORT + - name: BUCKETEER_WEB_AUTO_OPS_SERVICE_PORT value: "{{ .Values.env.autoOpsServicePort }}" - - name: BUCKETEER_BACKEND_ENVIRONMENT_SERVICE_PORT + - name: BUCKETEER_WEB_ENVIRONMENT_SERVICE_PORT value: "{{ .Values.env.environmentServicePort }}" - - name: BUCKETEER_BACKEND_EVENT_COUNTER_SERVICE_PORT + - name: BUCKETEER_WEB_EVENT_COUNTER_SERVICE_PORT value: "{{ .Values.env.eventCounterServicePort }}" - - name: BUCKETEER_BACKEND_EXPERIMENT_SERVICE_PORT + - name: BUCKETEER_WEB_EXPERIMENT_SERVICE_PORT value: "{{ .Values.env.experimentServicePort }}" - - name: BUCKETEER_BACKEND_FEATURE_SERVICE_PORT + - name: BUCKETEER_WEB_FEATURE_SERVICE_PORT value: "{{ .Values.env.featureServicePort }}" - - name: BUCKETEER_BACKEND_NOTIFICATION_SERVICE_PORT + - name: BUCKETEER_WEB_NOTIFICATION_SERVICE_PORT value: "{{ .Values.env.notificationServicePort }}" - - name: BUCKETEER_BACKEND_PUSH_SERVICE_PORT + - name: BUCKETEER_WEB_PUSH_SERVICE_PORT value: "{{ .Values.env.pushServicePort }}" - - name: BUCKETEER_BACKEND_WEB_CONSOLE_SERVICE_PORT + - name: BUCKETEER_WEB_WEB_CONSOLE_SERVICE_PORT value: "{{ .Values.env.webConsoleServicePort }}" - - name: BUCKETEER_BACKEND_ACCOUNT_SERVICE + - name: BUCKETEER_WEB_ACCOUNT_SERVICE value: "{{ .Values.env.accountService }}" - - name: BUCKETEER_BACKEND_AUTH_SERVICE + - name: BUCKETEER_WEB_AUTH_SERVICE value: "{{ .Values.env.authService }}" - - name: BUCKETEER_BACKEND_BATCH_SERVICE + - name: BUCKETEER_WEB_BATCH_SERVICE value: "{{ .Values.env.batchService }}" - - name: BUCKETEER_BACKEND_ENVIRONMENT_SERVICE + - name: BUCKETEER_WEB_ENVIRONMENT_SERVICE value: "{{ .Values.env.environmentService }}" - - name: BUCKETEER_BACKEND_EXPERIMENT_SERVICE + - name: BUCKETEER_WEB_EXPERIMENT_SERVICE value: "{{ .Values.env.experimentService }}" - - name: BUCKETEER_BACKEND_FEATURE_SERVICE + - name: BUCKETEER_WEB_FEATURE_SERVICE value: "{{ .Values.env.featureService }}" - - name: BUCKETEER_BACKEND_AUTO_OPS_SERVICE + - name: BUCKETEER_WEB_AUTO_OPS_SERVICE value: "{{ .Values.env.autoOpsService }}" - - name: BUCKETEER_BACKEND_TIMEZONE + - name: BUCKETEER_WEB_TIMEZONE value: "{{ .Values.env.timezone }}" - - name: BUCKETEER_BACKEND_METRICS_PORT + - name: BUCKETEER_WEB_METRICS_PORT value: "{{ .Values.env.metricsPort }}" - - name: BUCKETEER_BACKEND_LOG_LEVEL + - name: BUCKETEER_WEB_LOG_LEVEL value: "{{ .Values.env.logLevel }}" - - name: BUCKETEER_BACKEND_OAUTH_PUBLIC_KEY + - name: BUCKETEER_WEB_OAUTH_PUBLIC_KEY value: /usr/local/oauth-key/public.pem - - name: BUCKETEER_BACKEND_OAUTH_PRIVATE_KEY + - name: BUCKETEER_WEB_OAUTH_PRIVATE_KEY value: /usr/local/oauth-key/private.pem - - name: BUCKETEER_BACKEND_CERT + - name: BUCKETEER_WEB_CERT value: /usr/local/certs/service/tls.crt - - name: BUCKETEER_BACKEND_KEY + - name: BUCKETEER_WEB_KEY value: /usr/local/certs/service/tls.key - - name: BUCKETEER_BACKEND_OAUTH_CONFIG_PATH + - name: BUCKETEER_WEB_OAUTH_CONFIG_PATH value: /usr/local/oauth-config/oauth-config.json - - name: BUCKETEER_BACKEND_SERVICE_TOKEN + - name: BUCKETEER_WEB_SERVICE_TOKEN value: /usr/local/service-token/token - - name: BUCKETEER_BACKEND_EMAIL_FILTER + - name: BUCKETEER_WEB_EMAIL_FILTER value: "{{ .Values.env.emailFilter }}" - - name: BUCKETEER_BACKEND_WEBHOOK_BASE_URL + - name: BUCKETEER_WEB_WEBHOOK_BASE_URL value: "{{ .Values.webhook.baseURL }}" - - name: BUCKETEER_BACKEND_WEBHOOK_KMS_RESOURCE_NAME + - name: BUCKETEER_WEB_WEBHOOK_KMS_RESOURCE_NAME value: "{{ .Values.webhook.kmsResourceName }}" - - name: BUCKETEER_BACKEND_WEB_CONSOLE_ENV_JS_PATH + - name: BUCKETEER_WEB_WEB_CONSOLE_ENV_JS_PATH value: /usr/local/static/js volumeMounts: - name: service-cert-secret @@ -237,12 +270,49 @@ spec: - name: envoy-config mountPath: /usr/local/conf/ readOnly: true + - name: envoy-account-descriptor-secret + mountPath: /usr/local/account-secret + readOnly: true + - name: envoy-auditlog-descriptor-secret + mountPath: /usr/local/auditlog-secret + readOnly: true + - name: envoy-auth-descriptor-secret + mountPath: /usr/local/auth-secret + readOnly: true + - name: envoy-autoops-descriptor-secret + mountPath: /usr/local/autoops-secret + readOnly: true + - name: envoy-environment-descriptor-secret + mountPath: /usr/local/environment-secret + readOnly: true + - name: envoy-eventcounter-descriptor-secret + mountPath: /usr/local/eventcounter-secret + readOnly: true + - name: envoy-experiment-descriptor-secret + mountPath: /usr/local/experiment-secret + - name: envoy-experiment-calculator-descriptor-secret + mountPath: /usr/local/experiment-calculator-secret + readOnly: true + - name: envoy-feature-descriptor-secret + mountPath: /usr/local/feature-secret + readOnly: true + - name: envoy-notification-descriptor-secret + mountPath: /usr/local/notification-secret + readOnly: true + - name: envoy-push-descriptor-secret + mountPath: /usr/local/push-secret + readOnly: true + - name: envoy-batch-descriptor-secret + mountPath: /usr/local/batch-secret + readOnly: true - name: service-cert-secret mountPath: /usr/local/certs/service readOnly: true ports: - - name: envoy - containerPort: {{ .Values.envoy.port }} + - name: envoy-grpc + containerPort: {{ .Values.envoy.grpcPort }} + - name: envoy-http + containerPort: {{ .Values.envoy.httpPort }} - name: admin containerPort: {{ .Values.envoy.adminPort }} livenessProbe: diff --git a/manifests/bucketeer/charts/backend/templates/env-js-configmap.yaml b/manifests/bucketeer/charts/web/templates/env-js-configmap.yaml similarity index 69% rename from manifests/bucketeer/charts/backend/templates/env-js-configmap.yaml rename to manifests/bucketeer/charts/web/templates/env-js-configmap.yaml index ce41c8bbc..0754214e2 100644 --- a/manifests/bucketeer/charts/backend/templates/env-js-configmap.yaml +++ b/manifests/bucketeer/charts/web/templates/env-js-configmap.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: ConfigMap metadata: - name: {{ template "backend.fullname" . }}-env-js + name: {{ template "web.fullname" . }}-env-js namespace: {{ .Values.namespace }} labels: - app: {{ template "backend.name" . }} - chart: {{ template "backend.chart" . }} - release: {{ template "backend.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} data: env.js: |- diff --git a/manifests/bucketeer/charts/backend/templates/envoy-configmap.yaml b/manifests/bucketeer/charts/web/templates/envoy-configmap.yaml similarity index 68% rename from manifests/bucketeer/charts/backend/templates/envoy-configmap.yaml rename to manifests/bucketeer/charts/web/templates/envoy-configmap.yaml index bdece79ed..70ec3ca9e 100644 --- a/manifests/bucketeer/charts/backend/templates/envoy-configmap.yaml +++ b/manifests/bucketeer/charts/web/templates/envoy-configmap.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: ConfigMap metadata: - name: {{ template "backend.fullname" . }}-envoy-config + name: {{ template "web.fullname" . }}-envoy-config namespace: {{ .Values.namespace }} labels: - app: {{ template "backend.name" . }} - chart: {{ template "backend.chart" . }} - release: {{ template "backend.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} data: config.yaml: |- @@ -437,7 +437,7 @@ data: ignore_health_on_host_removal: true listeners: - - name: ingress + - name: grpc-ingress address: socket_address: address: 0.0.0.0 @@ -587,6 +587,270 @@ data: num_retries: 3 retry_on: 5xx timeout: 15s + stat_prefix: ingress_http + stream_idle_timeout: 300s + transport_socket: + name: envoy.transport_sockets.tls + typed_config: + '@type': type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext + common_tls_context: + alpn_protocols: + - h2 + tls_certificates: + - certificate_chain: + filename: /usr/local/certs/service/tls.crt + private_key: + filename: /usr/local/certs/service/tls.key + require_client_certificate: true + - name: transcoder-ingress + address: + socket_address: + address: 0.0.0.0 + port_value: 9003 + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + stat_prefix: ingress_http + access_log: + name: envoy.access_loggers.file + typed_config: + "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog + path: /dev/stdout + codec_type: auto + common_http_protocol_options: + # set longer timeout than lb session timeout (600s) + idle_timeout: 620s + stream_idle_timeout: 10800s + request_timeout: 10800s + http_filters: + - name: envoy.filters.http.cors + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors + - name: envoy.filters.http.grpc_web + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/account-secret/account_proto_descriptor.pb + services: + - bucketeer.account.AccountService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/auditlog-secret/auditlog_proto_descriptor.pb + services: + - bucketeer.auditlog.AuditLogService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/auth-secret/auth_proto_descriptor.pb + services: + - bucketeer.auth.AuthService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/autoops-secret/autoops_proto_descriptor.pb + services: + - bucketeer.autoops.AutoOpsService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/environment-secret/environment_proto_descriptor.pb + services: + - bucketeer.environment.EnvironmentService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/eventcounter-secret/eventcounter_proto_descriptor.pb + services: + - bucketeer.eventcounter.EventCounterService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/experiment-secret/experiment_proto_descriptor.pb + services: + - bucketeer.experiment.ExperimentService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/feature-secret/feature_proto_descriptor.pb + services: + - bucketeer.feature.FeatureService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/notification-secret/notification_proto_descriptor.pb + services: + - bucketeer.notification.NotificationService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/push-secret/push_proto_descriptor.pb + services: + - bucketeer.push.PushService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.grpc_json_transcoder + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder + auto_mapping: true + proto_descriptor: /usr/local/batch-secret/batch_proto_descriptor.pb + services: + - bucketeer.batch.BatchService + print_options: + always_print_primitive_fields: true + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + route_config: + virtual_hosts: + - name: web-gateway + domains: + - "*" + typed_per_filter_config: + envoy.filters.http.cors: + "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.CorsPolicy + allow_origin_string_match: + - prefix: "*" + allow_headers: "content-type, x-grpc-web, authorization" + allow_methods: "POST" + allow_credentials: true + routes: + - match: + prefix: /bucketeer.account.AccountService + route: + cluster: account + timeout: 15s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.auditlog.AuditLogService + route: + cluster: auditlog + timeout: 15s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.auth.AuthService + route: + cluster: auth + timeout: 15s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.autoops.AutoOpsService + route: + cluster: autoops + timeout: 15s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /hook + route: + cluster: autoops + timeout: 15s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.batch.BatchService + route: + cluster: batch + timeout: 3600s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.environment.EnvironmentService + route: + cluster: environment + timeout: 60s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.eventcounter.EventCounterService + route: + cluster: eventcounter + timeout: 1800s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.experiment.ExperimentService + route: + cluster: experiment + timeout: 60s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.feature.FeatureService + route: + cluster: feature + timeout: 60s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /webhook + route: + cluster: feature + timeout: 60s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.notification.NotificationService + route: + cluster: notification + timeout: 15s + retry_policy: + retry_on: 5xx + num_retries: 3 + - match: + prefix: /bucketeer.push.PushService + route: + cluster: push + timeout: 15s + retry_policy: + retry_on: 5xx + num_retries: 3 - match: prefix: / route: @@ -595,8 +859,18 @@ data: retry_policy: retry_on: 5xx num_retries: 3 - stat_prefix: ingress_http - stream_idle_timeout: 300s + - match: + prefix: / + headers: + - name: content-type + string_match: + exact: application/grpc + route: + cluster: healthcheck + retry_policy: + num_retries: 3 + retry_on: 5xx + timeout: 15s transport_socket: name: envoy.transport_sockets.tls typed_config: diff --git a/manifests/bucketeer/charts/backend/templates/hpa.yaml b/manifests/bucketeer/charts/web/templates/hpa.yaml similarity index 84% rename from manifests/bucketeer/charts/backend/templates/hpa.yaml rename to manifests/bucketeer/charts/web/templates/hpa.yaml index 70730b0c6..54ee240ab 100644 --- a/manifests/bucketeer/charts/backend/templates/hpa.yaml +++ b/manifests/bucketeer/charts/web/templates/hpa.yaml @@ -2,13 +2,13 @@ apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: - name: {{ template "backend.fullname" . }} + name: {{ template "web.fullname" . }} namespace: {{ .Values.namespace }} spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment - name: {{ template "backend.fullname" . }} + name: {{ template "web.fullname" . }} minReplicas: {{ .Values.hpa.minReplicas }} maxReplicas: {{ .Values.hpa.maxReplicas }} metrics: diff --git a/manifests/bucketeer/charts/web-gateway/templates/ingress.yaml b/manifests/bucketeer/charts/web/templates/ingress.yaml similarity index 70% rename from manifests/bucketeer/charts/web-gateway/templates/ingress.yaml rename to manifests/bucketeer/charts/web/templates/ingress.yaml index 05e919a99..6af058029 100644 --- a/manifests/bucketeer/charts/web-gateway/templates/ingress.yaml +++ b/manifests/bucketeer/charts/web/templates/ingress.yaml @@ -1,12 +1,12 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - name: {{ template "web-gateway.fullname" . }} + name: {{ .Values.ingress.name }} namespace: {{ .Values.namespace }} labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} annotations: {{- if .Values.env.gcpEnabled }} @@ -26,6 +26,6 @@ spec: - pathType: ImplementationSpecific backend: service: - name: {{ template "web-gateway.fullname" . }} + name: {{ template "web.fullname" . }} port: - number: {{ .Values.service.externalPort }} + number: {{ .Values.service.httpPort }} diff --git a/manifests/bucketeer/charts/web/templates/oauth-configmap.yaml b/manifests/bucketeer/charts/web/templates/oauth-configmap.yaml new file mode 100644 index 000000000..96d4848cc --- /dev/null +++ b/manifests/bucketeer/charts/web/templates/oauth-configmap.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "web.fullname" . }}-oauth-config + namespace: {{ .Values.namespace }} + labels: + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} + heritage: {{ .Release.Service }} +data: + oauth-config.json: |- + {{ toJson .Values.oauth }} \ No newline at end of file diff --git a/manifests/bucketeer/charts/backend/templates/pdb.yaml b/manifests/bucketeer/charts/web/templates/pdb.yaml similarity index 71% rename from manifests/bucketeer/charts/backend/templates/pdb.yaml rename to manifests/bucketeer/charts/web/templates/pdb.yaml index 649da5f0d..af4d924a3 100644 --- a/manifests/bucketeer/charts/backend/templates/pdb.yaml +++ b/manifests/bucketeer/charts/web/templates/pdb.yaml @@ -2,11 +2,11 @@ apiVersion: policy/v1 kind: PodDisruptionBudget metadata: - name: {{ template "backend.fullname" . }} + name: {{ template "web.fullname" . }} namespace: {{ .Values.namespace }} spec: maxUnavailable: {{ .Values.pdb.maxUnavailable }} selector: matchLabels: - app: {{ template "backend.name" . }} + app: {{ template "web.name" . }} {{ end }} diff --git a/manifests/bucketeer/charts/web-gateway/templates/secret.yaml b/manifests/bucketeer/charts/web/templates/secret.yaml similarity index 54% rename from manifests/bucketeer/charts/web-gateway/templates/secret.yaml rename to manifests/bucketeer/charts/web/templates/secret.yaml index 8215f8b84..2ffadd064 100644 --- a/manifests/bucketeer/charts/web-gateway/templates/secret.yaml +++ b/manifests/bucketeer/charts/web/templates/secret.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-account + name: {{ template "web.fullname" . }}-account namespace: {{ .Values.namespace }} labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -15,11 +15,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-auditlog + name: {{ template "web.fullname" . }}-auditlog labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -28,11 +28,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-auth + name: {{ template "web.fullname" . }}-auth labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -41,11 +41,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-autoops + name: {{ template "web.fullname" . }}-autoops labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -54,11 +54,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-environment + name: {{ template "web.fullname" . }}-environment labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -67,11 +67,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-eventcounter + name: {{ template "web.fullname" . }}-eventcounter labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -80,11 +80,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-experiment + name: {{ template "web.fullname" . }}-experiment labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -93,11 +93,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-experimentcalculator + name: {{ template "web.fullname" . }}-experimentcalculator labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -106,11 +106,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-feature + name: {{ template "web.fullname" . }}-feature labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -119,11 +119,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-notification + name: {{ template "web.fullname" . }}-notification labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -132,11 +132,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-push + name: {{ template "web.fullname" . }}-push labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: @@ -145,11 +145,11 @@ data: apiVersion: v1 kind: Secret metadata: - name: {{ template "web-gateway.fullname" . }}-batch + name: {{ template "web.fullname" . }}-batch labels: - app: {{ template "web-gateway.name" . }} - chart: {{ template "web-gateway.chart" . }} - release: {{ template "web-gateway.fullname" . }} + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} heritage: {{ .Release.Service }} type: Opaque data: diff --git a/manifests/bucketeer/charts/backend/templates/service-account.yaml b/manifests/bucketeer/charts/web/templates/service-account.yaml similarity index 82% rename from manifests/bucketeer/charts/backend/templates/service-account.yaml rename to manifests/bucketeer/charts/web/templates/service-account.yaml index d55e81bcb..094eb6a97 100644 --- a/manifests/bucketeer/charts/backend/templates/service-account.yaml +++ b/manifests/bucketeer/charts/web/templates/service-account.yaml @@ -3,6 +3,6 @@ apiVersion: v1 kind: ServiceAccount metadata: namespace: {{ .Values.namespace }} - name: {{ template "backend.fullname" . }} + name: {{ template "web.fullname" . }} annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 8 }} {{- end }} diff --git a/manifests/bucketeer/charts/web/templates/service.yaml b/manifests/bucketeer/charts/web/templates/service.yaml new file mode 100644 index 000000000..320718678 --- /dev/null +++ b/manifests/bucketeer/charts/web/templates/service.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ template "web.fullname" . }} + namespace: {{ .Values.namespace }} + annotations: + cloud.google.com/backend-config: '{"default": "{{ template "web.fullname" . }}"}' + cloud.google.com/neg: '{"ingress": true}' + cloud.google.com/app-protocols: '{"http-service":"HTTP2"}' + labels: + app: {{ template "web.name" . }} + chart: {{ template "web.chart" . }} + release: {{ template "web.fullname" . }} + heritage: {{ .Release.Service }} + envoy: "true" + metrics: "true" +spec: + type: {{ .Values.service.type }} + ports: + - name: grpc-service + port: {{ .Values.service.grpcPort }} + targetPort: envoy-grpc + protocol: TCP + - name: http-service + port: {{ .Values.service.httpPort }} + targetPort: envoy-http + protocol: TCP + - name: metrics + port: {{ .Values.env.metricsPort }} + protocol: TCP + - name: admin + port: {{ .Values.envoy.adminPort }} + protocol: TCP + selector: + app: {{ template "web.name" . }} + release: {{ template "web.fullname" . }} diff --git a/manifests/bucketeer/charts/backend/values.dev.yaml b/manifests/bucketeer/charts/web/values.dev.yaml similarity index 94% rename from manifests/bucketeer/charts/backend/values.dev.yaml rename to manifests/bucketeer/charts/web/values.dev.yaml index 36b0e9797..d2f486849 100644 --- a/manifests/bucketeer/charts/backend/values.dev.yaml +++ b/manifests/bucketeer/charts/web/values.dev.yaml @@ -36,11 +36,6 @@ env: tls: service: secret: bucketeer-service-cert - cert: - key: - issuer: - secret: bucketeer-service-cert - cert: serviceToken: secret: bucketeer-service-token oauth: diff --git a/manifests/bucketeer/charts/web-gateway/values.yaml b/manifests/bucketeer/charts/web/values.yaml similarity index 99% rename from manifests/bucketeer/charts/web-gateway/values.yaml rename to manifests/bucketeer/charts/web/values.yaml index e1a4b31c4..f62d05eac 100644 --- a/manifests/bucketeer/charts/web-gateway/values.yaml +++ b/manifests/bucketeer/charts/web/values.yaml @@ -1,24 +1,105 @@ -fullnameOverride: "web-gateway" +image: + repository: ghcr.io/bucketeer-io/bucketeer-web + pullPolicy: IfNotPresent +fullnameOverride: "web" namespace: default env: + cloudService: + profile: true + bucketeerTestEnabled: gcpEnabled: true + bigqueryEmulatorHost: + pubsubEmulatorHost: + project: + mysqlUser: + mysqlPass: + mysqlHost: + mysqlPort: 3306 + mysqlDbName: + persistentRedis: + serverName: + addr: + poolMaxIdle: 25 + poolMaxActive: 25 + nonPersistentRedis: + serverName: + addr: + poolMaxIdle: 25 + poolMaxActive: 25 + bigQueryDataSet: + bigQueryDataLocation: + domainTopic: + bulkSegmentUsersReceivedTopic: + accountService: localhost:9001 + authService: localhost:9001 + batchService: localhost:9001 + environmentService: localhost:9001 + experimentService: localhost:9001 + featureService: localhost:9001 + autoOpsService: localhost:9001 + healthCheckServicePort: 8000 + accountServicePort: 9091 + authServicePort: 9092 + auditLogServicePort: 9093 + autoOpsServicePort: 9094 + environmentServicePort: 9095 + eventCounterServicePort: 9096 + experimentServicePort: 9097 + featureServicePort: 9098 + notificationServicePort: 9100 + pushServicePort: 9101 + webConsoleServicePort: 9102 + metricsPort: 9002 + timezone: UTC + emailFilter: + logLevel: info + googleTagManagerId: +affinity: {} +nodeSelector: {} +pdb: + enabled: + maxUnavailable: 50% +hpa: + enabled: + minReplicas: + maxReplicas: + metrics: + cpu: + targetAverageUtilization: tls: + service: + secret: bucketeerJP: secrets: - cert: - key: - service: +serviceToken: + secret: +oauth: + key: secret: - cert: - key: + issuer: + audience: bucketeer + google: + issuer: + clientId: + clientSecret: + redirectUrls: + demoSignIn: + enabled: + email: + password: + organizationId: + projectId: + environmentId: + isSystemAdmin: +webhook: + baseURL: + kmsResourceName: envoy: image: repository: ghcr.io/bucketeer-io/bucketeer-envoy tag: v1.31.0 pullPolicy: IfNotPresent lbPolicy: LEAST_REQUEST - serviceCluster: bucketeer - adminPort: 8001 eventcounterDescriptor: CrEBCiJwcm90by9ldmVudGNvdW50ZXIvaGlzdG9ncmFtLnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyIjMKCUhpc3RvZ3JhbRISCgRoaXN0GAEgAygDUgRoaXN0EhIKBGJpbnMYAiADKAFSBGJpbnNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCqADCi1wcm90by9ldmVudGNvdW50ZXIvZGlzdHJpYnV0aW9uX3N1bW1hcnkucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIaInByb3RvL2V2ZW50Y291bnRlci9oaXN0b2dyYW0ucHJvdG8i8gEKE0Rpc3RyaWJ1dGlvblN1bW1hcnkSEgoEbWVhbhgBIAEoAVIEbWVhbhIOCgJzZBgCIAEoAVICc2QSEgoEcmhhdBgDIAEoAVIEcmhhdBI/CgloaXN0b2dyYW0YBCABKAsyIS5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkhpc3RvZ3JhbVIJaGlzdG9ncmFtEhYKBm1lZGlhbhgFIAEoAVIGbWVkaWFuEiQKDXBlcmNlbnRpbGUwMjUYBiABKAFSDXBlcmNlbnRpbGUwMjUSJAoNcGVyY2VudGlsZTk3NRgHIAEoAVINcGVyY2VudGlsZTk3NUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK0QMKKHByb3RvL2V2ZW50Y291bnRlci92YXJpYXRpb25fY291bnQucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIizAIKDlZhcmlhdGlvbkNvdW50EiEKDHZhcmlhdGlvbl9pZBgBIAEoCVILdmFyaWF0aW9uSWQSHQoKdXNlcl9jb3VudBgCIAEoA1IJdXNlckNvdW50Eh8KC2V2ZW50X2NvdW50GAMgASgDUgpldmVudENvdW50EhsKCXZhbHVlX3N1bRgEIAEoAVIIdmFsdWVTdW0SHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0EicKD3ZhcmlhdGlvbl92YWx1ZRgGIAEoCVIOdmFyaWF0aW9uVmFsdWUSNAoXdmFsdWVfc3VtX3Blcl91c2VyX21lYW4YByABKAFSE3ZhbHVlU3VtUGVyVXNlck1lYW4SPAobdmFsdWVfc3VtX3Blcl91c2VyX3ZhcmlhbmNlGAggASgBUhd2YWx1ZVN1bVBlclVzZXJWYXJpYW5jZUI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK1AMKKXByb3RvL2V2ZW50Y291bnRlci9ldmFsdWF0aW9uX2NvdW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIqQCCg9FdmFsdWF0aW9uQ291bnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEk8KD3JlYWx0aW1lX2NvdW50cxgEIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSDnJlYWx0aW1lQ291bnRzEkkKDGJhdGNoX2NvdW50cxgFIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSC2JhdGNoQ291bnRzEh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdEI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKhgYKKXByb3RvL2V2ZW50Y291bnRlci9leHBlcmltZW50X2NvdW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIo4DCg9FeHBlcmltZW50Q291bnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YAyABKAVSDmZlYXR1cmVWZXJzaW9uEhsKB2dvYWxfaWQYBCABKAlCAhgBUgZnb2FsSWQSUwoPcmVhbHRpbWVfY291bnRzGAUgAygLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudEICGAFSDnJlYWx0aW1lQ291bnRzEk0KDGJhdGNoX2NvdW50cxgGIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRCAhgBUgtiYXRjaENvdW50cxIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSQwoLZ29hbF9jb3VudHMYCCADKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdvYWxDb3VudHNSCmdvYWxDb3VudHMixQEKCkdvYWxDb3VudHMSFwoHZ29hbF9pZBgBIAEoCVIGZ29hbElkEk8KD3JlYWx0aW1lX2NvdW50cxgCIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSDnJlYWx0aW1lQ291bnRzEk0KDGJhdGNoX2NvdW50cxgDIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRCAhgBUgtiYXRjaENvdW50c0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKvQMKI3Byb3RvL2V2ZW50Y291bnRlci90aW1lc2VyaWVzLnByb3RvEhZidWNrZXRlZXIuZXZlbnRjb3VudGVyInwKE1ZhcmlhdGlvblRpbWVzZXJpZXMSIQoMdmFyaWF0aW9uX2lkGAEgASgJUgt2YXJpYXRpb25JZBJCCgp0aW1lc2VyaWVzGAIgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUgp0aW1lc2VyaWVzIr8BCgpUaW1lc2VyaWVzEh4KCnRpbWVzdGFtcHMYASADKANSCnRpbWVzdGFtcHMSFgoGdmFsdWVzGAIgAygBUgZ2YWx1ZXMSOwoEdW5pdBgDIAEoDjInLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllcy5Vbml0UgR1bml0EiEKDHRvdGFsX2NvdW50cxgEIAEoA1ILdG90YWxDb3VudHMiGQoEVW5pdBIICgRIT1VSEAASBwoDREFZEAFCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCrATCilwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchoocHJvdG8vZXZlbnRjb3VudGVyL3ZhcmlhdGlvbl9jb3VudC5wcm90bxotcHJvdG8vZXZlbnRjb3VudGVyL2Rpc3RyaWJ1dGlvbl9zdW1tYXJ5LnByb3RvGiNwcm90by9ldmVudGNvdW50ZXIvdGltZXNlcmllcy5wcm90byKsEQoPVmFyaWF0aW9uUmVzdWx0EiEKDHZhcmlhdGlvbl9pZBgBIAEoCVILdmFyaWF0aW9uSWQSUQoQZXhwZXJpbWVudF9jb3VudBgCIAEoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSD2V4cGVyaW1lbnRDb3VudBJRChBldmFsdWF0aW9uX2NvdW50GAMgASgLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudFIPZXZhbHVhdGlvbkNvdW50Ek8KDWN2cl9wcm9iX2Jlc3QYBCABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSC2N2clByb2JCZXN0EmAKFmN2cl9wcm9iX2JlYXRfYmFzZWxpbmUYBSABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSE2N2clByb2JCZWF0QmFzZWxpbmUSRgoIY3ZyX3Byb2IYBiABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSB2N2clByb2ISawogZXZhbHVhdGlvbl91c2VyX2NvdW50X3RpbWVzZXJpZXMYByABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSHWV2YWx1YXRpb25Vc2VyQ291bnRUaW1lc2VyaWVzEm0KIWV2YWx1YXRpb25fZXZlbnRfY291bnRfdGltZXNlcmllcxgIIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IeZXZhbHVhdGlvbkV2ZW50Q291bnRUaW1lc2VyaWVzEl8KGmdvYWxfdXNlcl9jb3VudF90aW1lc2VyaWVzGAkgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhdnb2FsVXNlckNvdW50VGltZXNlcmllcxJhChtnb2FsX2V2ZW50X2NvdW50X3RpbWVzZXJpZXMYCiABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSGGdvYWxFdmVudENvdW50VGltZXNlcmllcxJdChlnb2FsX3ZhbHVlX3N1bV90aW1lc2VyaWVzGAsgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhZnb2FsVmFsdWVTdW1UaW1lc2VyaWVzElYKFWN2cl9tZWRpYW5fdGltZXNlcmllcxgMIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1ITY3ZyTWVkaWFuVGltZXNlcmllcxJkChxjdnJfcGVyY2VudGlsZTAyNV90aW1lc2VyaWVzGA0gASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhpjdnJQZXJjZW50aWxlMDI1VGltZXNlcmllcxJkChxjdnJfcGVyY2VudGlsZTk3NV90aW1lc2VyaWVzGA4gASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUhpjdnJQZXJjZW50aWxlOTc1VGltZXNlcmllcxJJCg5jdnJfdGltZXNlcmllcxgPIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1INY3ZyVGltZXNlcmllcxJtCiJnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl90aW1lc2VyaWVzGBAgASgLMiIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5UaW1lc2VyaWVzUh1nb2FsVmFsdWVTdW1QZXJVc2VyVGltZXNlcmllcxJqChxnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wcm9iGBEgASgLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5EaXN0cmlidXRpb25TdW1tYXJ5Uhdnb2FsVmFsdWVTdW1QZXJVc2VyUHJvYhJzCiFnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wcm9iX2Jlc3QYEiABKAsyKy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkRpc3RyaWJ1dGlvblN1bW1hcnlSG2dvYWxWYWx1ZVN1bVBlclVzZXJQcm9iQmVzdBKEAQoqZ29hbF92YWx1ZV9zdW1fcGVyX3VzZXJfcHJvYl9iZWF0X2Jhc2VsaW5lGBMgASgLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5EaXN0cmlidXRpb25TdW1tYXJ5UiNnb2FsVmFsdWVTdW1QZXJVc2VyUHJvYkJlYXRCYXNlbGluZRJ6Cilnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9tZWRpYW5fdGltZXNlcmllcxgUIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IjZ29hbFZhbHVlU3VtUGVyVXNlck1lZGlhblRpbWVzZXJpZXMSiAEKMGdvYWxfdmFsdWVfc3VtX3Blcl91c2VyX3BlcmNlbnRpbGUwMjVfdGltZXNlcmllcxgVIAEoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVGltZXNlcmllc1IqZ29hbFZhbHVlU3VtUGVyVXNlclBlcmNlbnRpbGUwMjVUaW1lc2VyaWVzEogBCjBnb2FsX3ZhbHVlX3N1bV9wZXJfdXNlcl9wZXJjZW50aWxlOTc1X3RpbWVzZXJpZXMYFiABKAsyIi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlRpbWVzZXJpZXNSKmdvYWxWYWx1ZVN1bVBlclVzZXJQZXJjZW50aWxlOTc1VGltZXNlcmllc0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMKpgIKJHByb3RvL2V2ZW50Y291bnRlci9nb2FsX3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchopcHJvdG8vZXZlbnRjb3VudGVyL3ZhcmlhdGlvbl9yZXN1bHQucHJvdG8iewoKR29hbFJlc3VsdBIXCgdnb2FsX2lkGAEgASgJUgZnb2FsSWQSVAoRdmFyaWF0aW9uX3Jlc3VsdHMYAiADKAsyJy5idWNrZXRlZXIuZXZlbnRjb3VudGVyLlZhcmlhdGlvblJlc3VsdFIQdmFyaWF0aW9uUmVzdWx0c0I2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXZlbnRjb3VudGVyYgZwcm90bzMK2gIKKnByb3RvL2V2ZW50Y291bnRlci9leHBlcmltZW50X3Jlc3VsdC5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchokcHJvdG8vZXZlbnRjb3VudGVyL2dvYWxfcmVzdWx0LnByb3RvIq0BChBFeHBlcmltZW50UmVzdWx0Eg4KAmlkGAEgASgJUgJpZBIjCg1leHBlcmltZW50X2lkGAIgASgJUgxleHBlcmltZW50SWQSHQoKdXBkYXRlZF9hdBgDIAEoA1IJdXBkYXRlZEF0EkUKDGdvYWxfcmVzdWx0cxgEIAMoCzIiLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR29hbFJlc3VsdFILZ29hbFJlc3VsdHNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8zCuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCp4CChpwcm90by9mZWF0dXJlL3JlYXNvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUisQEKBlJlYXNvbhIyCgR0eXBlGAEgASgOMh4uYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uLlR5cGVSBHR5cGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkIloKBFR5cGUSCgoGVEFSR0VUEAASCAoEUlVMRRABEgsKB0RFRkFVTFQQAxIKCgZDTElFTlQQBBIRCg1PRkZfVkFSSUFUSU9OEAUSEAoMUFJFUkVRVUlTSVRFEAZCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwqYBgoecHJvdG8vZmVhdHVyZS9ldmFsdWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZRodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8aGnByb3RvL2ZlYXR1cmUvcmVhc29uLnByb3RvIuMCCgpFdmFsdWF0aW9uEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIXCgd1c2VyX2lkGAQgASgJUgZ1c2VySWQSIQoMdmFyaWF0aW9uX2lkGAUgASgJUgt2YXJpYXRpb25JZBI+Cgl2YXJpYXRpb24YBiABKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25CAhgBUgl2YXJpYXRpb24SMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SJwoPdmFyaWF0aW9uX3ZhbHVlGAggASgJUg52YXJpYXRpb25WYWx1ZRIlCg52YXJpYXRpb25fbmFtZRgJIAEoCVINdmFyaWF0aW9uTmFtZSKGAgoPVXNlckV2YWx1YXRpb25zEhIKAmlkGAEgASgJQgIYAVICaWQSPwoLZXZhbHVhdGlvbnMYAiADKAsyHS5idWNrZXRlZXIuZmVhdHVyZS5FdmFsdWF0aW9uUgtldmFsdWF0aW9ucxIdCgpjcmVhdGVkX2F0GAMgASgDUgljcmVhdGVkQXQSMAoUYXJjaGl2ZWRfZmVhdHVyZV9pZHMYBCADKAlSEmFyY2hpdmVkRmVhdHVyZUlkcxIhCgxmb3JjZV91cGRhdGUYBSABKAhSC2ZvcmNlVXBkYXRlIioKBVN0YXRlEgoKBlFVRVVFRBAAEgsKB1BBUlRJQUwQARIICgRGVUxMEAJCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwrABAoVcHJvdG8vdXNlci91c2VyLnByb3RvEg5idWNrZXRlZXIudXNlciLeAwoEVXNlchIOCgJpZBgBIAEoCVICaWQSMgoEZGF0YRgCIAMoCzIeLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YUVudHJ5UgRkYXRhEkUKC3RhZ2dlZF9kYXRhGAMgAygLMiQuYnVja2V0ZWVyLnVzZXIuVXNlci5UYWdnZWREYXRhRW50cnlSCnRhZ2dlZERhdGESGwoJbGFzdF9zZWVuGAQgASgDUghsYXN0U2VlbhIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQafAoERGF0YRI6CgV2YWx1ZRgBIAMoCzIkLmJ1Y2tldGVlci51c2VyLlVzZXIuRGF0YS5WYWx1ZUVudHJ5UgV2YWx1ZRo4CgpWYWx1ZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNwoJRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaWAoPVGFnZ2VkRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuYnVja2V0ZWVyLnVzZXIuVXNlci5EYXRhUgV2YWx1ZToCOAFCLlosZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL3VzZXJiBnByb3RvMwrONAoecHJvdG8vZXZlbnQvY2xpZW50L2V2ZW50LnByb3RvEhZidWNrZXRlZXIuZXZlbnQuY2xpZW50Ghlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvGh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8aHnByb3RvL2ZlYXR1cmUvZXZhbHVhdGlvbi5wcm90bxoacHJvdG8vZmVhdHVyZS9yZWFzb24ucHJvdG8aFXByb3RvL3VzZXIvdXNlci5wcm90byJ4CgVFdmVudBIOCgJpZBgBIAEoCVICaWQSKgoFZXZlbnQYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgVldmVudBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIpIECg9FdmFsdWF0aW9uRXZlbnQSHAoJdGltZXN0YW1wGAEgASgDUgl0aW1lc3RhbXASHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgDIAEoBVIOZmVhdHVyZVZlcnNpb24SFwoHdXNlcl9pZBgEIAEoCVIGdXNlcklkEiEKDHZhcmlhdGlvbl9pZBgFIAEoCVILdmFyaWF0aW9uSWQSKAoEdXNlchgGIAEoCzIULmJ1Y2tldGVlci51c2VyLlVzZXJSBHVzZXISMQoGcmVhc29uGAcgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuUmVhc29uUgZyZWFzb24SEAoDdGFnGAggASgJUgN0YWcSPQoJc291cmNlX2lkGAkgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YCiABKAlSCnNka1ZlcnNpb24SUQoIbWV0YWRhdGEYCyADKAsyNS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkV2YWx1YXRpb25FdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi3AMKCUdvYWxFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIXCgdnb2FsX2lkGAIgASgJUgZnb2FsSWQSFwoHdXNlcl9pZBgDIAEoCVIGdXNlcklkEhQKBXZhbHVlGAQgASgBUgV2YWx1ZRIoCgR1c2VyGAUgASgLMhQuYnVja2V0ZWVyLnVzZXIuVXNlclIEdXNlchJDCgtldmFsdWF0aW9ucxgGIAMoCzIdLmJ1Y2tldGVlci5mZWF0dXJlLkV2YWx1YXRpb25CAhgBUgtldmFsdWF0aW9ucxIQCgN0YWcYByABKAlSA3RhZxI9Cglzb3VyY2VfaWQYCCABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIfCgtzZGtfdmVyc2lvbhgJIAEoCVIKc2RrVmVyc2lvbhJLCghtZXRhZGF0YRgKIAMoCzIvLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR29hbEV2ZW50Lk1ldGFkYXRhRW50cnlSCG1ldGFkYXRhGjsKDU1ldGFkYXRhRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLFAgoMTWV0cmljc0V2ZW50EhwKCXRpbWVzdGFtcBgBIAEoA1IJdGltZXN0YW1wEioKBWV2ZW50GAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIFZXZlbnQSPQoJc291cmNlX2lkGAMgASgOMiAuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Tb3VyY2VJZFIIc291cmNlSWQSHwoLc2RrX3ZlcnNpb24YBCABKAlSCnNka1ZlcnNpb24STgoIbWV0YWRhdGEYBSADKAsyMi5idWNrZXRlZXIuZXZlbnQuY2xpZW50Lk1ldHJpY3NFdmVudC5NZXRhZGF0YUVudHJ5UghtZXRhZGF0YRo7Cg1NZXRhZGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi9gEKIEdldEV2YWx1YXRpb25MYXRlbmN5TWV0cmljc0V2ZW50ElwKBmxhYmVscxgBIAMoCzJELmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvbkxhdGVuY3lNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxI1CghkdXJhdGlvbhgCIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIIZHVyYXRpb24aOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AToCGAEi1gEKHUdldEV2YWx1YXRpb25TaXplTWV0cmljc0V2ZW50ElkKBmxhYmVscxgBIAMoCzJBLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuR2V0RXZhbHVhdGlvblNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAiABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE6AhgBIrkCChNMYXRlbmN5TWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkEk8KBmxhYmVscxgCIAMoCzI3LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTGF0ZW5jeU1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzEjkKCGR1cmF0aW9uGAMgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgIYAVIIZHVyYXRpb24SJQoObGF0ZW5jeV9zZWNvbmQYBCABKAFSDWxhdGVuY3lTZWNvbmQaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLuAQoQU2l6ZU1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJMCgZsYWJlbHMYAiADKAsyNC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNpemVNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxIbCglzaXplX2J5dGUYAyABKAVSCHNpemVCeXRlGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiNQodVGltZW91dEVycm9yQ291bnRNZXRyaWNzRXZlbnQSEAoDdGFnGAEgASgJUgN0YWc6AhgBIjYKHkludGVybmFsRXJyb3JDb3VudE1ldHJpY3NFdmVudBIQCgN0YWcYASABKAlSA3RhZzoCGAEi8QEKIFJlZGlyZWN0aW9uUmVxdWVzdEV4Y2VwdGlvbkV2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElwKBmxhYmVscxgCIAMoCzJELmJ1Y2tldGVlci5ldmVudC5jbGllbnQuUmVkaXJlY3Rpb25SZXF1ZXN0RXhjZXB0aW9uRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIucBChtCYWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVwoGbGFiZWxzGAIgAygLMj8uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5CYWRSZXF1ZXN0RXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIusBCh1VbmF1dGhvcml6ZWRFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJZCgZsYWJlbHMYAiADKAsyQS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlVuYXV0aG9yaXplZEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLlAQoaRm9yYmlkZGVuRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVgoGbGFiZWxzGAIgAygLMj4uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Gb3JiaWRkZW5FcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4wEKGU5vdEZvdW5kRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVQoGbGFiZWxzGAIgAygLMj0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Ob3RGb3VuZEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLrAQodUGF5bG9hZFRvb0xhcmdlRXhjZXB0aW9uRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWQoGbGFiZWxzGAIgAygLMkEuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5QYXlsb2FkVG9vTGFyZ2VFeGNlcHRpb25FdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi+QEKJENsaWVudENsb3NlZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJgCgZsYWJlbHMYAiADKAsySC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkNsaWVudENsb3NlZFJlcXVlc3RFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi7wEKH0ludGVybmFsU2VydmVyRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSWwoGbGFiZWxzGAIgAygLMkMuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbFNlcnZlckVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASL3AQojU2VydmljZVVuYXZhaWxhYmxlRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSXwoGbGFiZWxzGAIgAygLMkcuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5TZXJ2aWNlVW5hdmFpbGFibGVFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4QEKGFRpbWVvdXRFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJUCgZsYWJlbHMYAiADKAsyPC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlRpbWVvdXRFcnJvck1ldHJpY3NFdmVudC5MYWJlbHNFbnRyeVIGbGFiZWxzGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEi4wEKGUludGVybmFsRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVQoGbGFiZWxzGAIgAygLMj0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5JbnRlcm5hbEVycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLhAQoYTmV0d29ya0Vycm9yTWV0cmljc0V2ZW50EjQKBmFwaV9pZBgBIAEoDjIdLmJ1Y2tldGVlci5ldmVudC5jbGllbnQuQXBpSWRSBWFwaUlkElQKBmxhYmVscxgCIAMoCzI8LmJ1Y2tldGVlci5ldmVudC5jbGllbnQuTmV0d29ya0Vycm9yTWV0cmljc0V2ZW50LkxhYmVsc0VudHJ5UgZsYWJlbHMaOQoLTGFiZWxzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASLpAQocSW50ZXJuYWxTZGtFcnJvck1ldHJpY3NFdmVudBI0CgZhcGlfaWQYASABKA4yHS5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkFwaUlkUgVhcGlJZBJYCgZsYWJlbHMYAiADKAsyQC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LkludGVybmFsU2RrRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIuEBChhVbmtub3duRXJyb3JNZXRyaWNzRXZlbnQSNAoGYXBpX2lkGAEgASgOMh0uYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5BcGlJZFIFYXBpSWQSVAoGbGFiZWxzGAIgAygLMjwuYnVja2V0ZWVyLmV2ZW50LmNsaWVudC5Vbmtub3duRXJyb3JNZXRyaWNzRXZlbnQuTGFiZWxzRW50cnlSBmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIsUBCghPcHNFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkEhcKB2dvYWxfaWQYBSABKAlSBmdvYWxJZBIXCgd1c2VyX2lkGAYgASgJUgZ1c2VySWQiXAoNVXNlckdvYWxFdmVudBIcCgl0aW1lc3RhbXAYASABKANSCXRpbWVzdGFtcBIXCgdnb2FsX2lkGAIgASgJUgZnb2FsSWQSFAoFdmFsdWUYAyABKAFSBXZhbHVlKnAKCFNvdXJjZUlkEgsKB1VOS05PV04QABILCgdBTkRST0lEEAESBwoDSU9TEAISCwoDV0VCEAMaAggBEg0KCUdPX1NFUlZFUhAFEg8KC05PREVfU0VSVkVSEAYSDgoKSkFWQVNDUklQVBAHIgQIBBAEKpsBCgVBcGlJZBIPCgtVTktOT1dOX0FQSRAAEhIKDkdFVF9FVkFMVUFUSU9OEAESEwoPR0VUX0VWQUxVQVRJT05TEAISEwoPUkVHSVNURVJfRVZFTlRTEAMSFQoRR0VUX0ZFQVRVUkVfRkxBR1MQBBIVChFHRVRfU0VHTUVOVF9VU0VSUxAFEhUKEVNES19HRVRfVkFSSUFUSU9OEGRCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50L2NsaWVudGIGcHJvdG8zCrUECiRwcm90by9ldmVudGNvdW50ZXIvbWF1X3N1bW1hcnkucHJvdG8SFmJ1Y2tldGVlci5ldmVudGNvdW50ZXIaHnByb3RvL2V2ZW50L2NsaWVudC9ldmVudC5wcm90byKUAwoKTUFVU3VtbWFyeRIcCgl5ZWFybW9udGgYASABKAlSCXllYXJtb250aBIlCg5lbnZpcm9ubWVudF9pZBgCIAEoCVINZW52aXJvbm1lbnRJZBI9Cglzb3VyY2VfaWQYAyABKA4yIC5idWNrZXRlZXIuZXZlbnQuY2xpZW50LlNvdXJjZUlkUghzb3VyY2VJZBIdCgp1c2VyX2NvdW50GAQgASgDUgl1c2VyQ291bnQSIwoNcmVxdWVzdF9jb3VudBgFIAEoA1IMcmVxdWVzdENvdW50EikKEGV2YWx1YXRpb25fY291bnQYBiABKANSD2V2YWx1YXRpb25Db3VudBIdCgpnb2FsX2NvdW50GAcgASgDUglnb2FsQ291bnQSFQoGaXNfYWxsGAggASgIUgVpc0FsbBIfCgtpc19maW5pc2hlZBgJIAEoCFIKaXNGaW5pc2hlZBIdCgpjcmVhdGVkX2F0GAogASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgLIAEoA1IJdXBkYXRlZEF0QjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ldmVudGNvdW50ZXJiBnByb3RvMwqGBAoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvEg9nb29nbGUucHJvdG9idWYiIwoLRG91YmxlVmFsdWUSFAoFdmFsdWUYASABKAFSBXZhbHVlIiIKCkZsb2F0VmFsdWUSFAoFdmFsdWUYASABKAJSBXZhbHVlIiIKCkludDY0VmFsdWUSFAoFdmFsdWUYASABKANSBXZhbHVlIiMKC1VJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgEUgV2YWx1ZSIiCgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZSIjCgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWUiIQoJQm9vbFZhbHVlEhQKBXZhbHVlGAEgASgIUgV2YWx1ZSIjCgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUiIgoKQnl0ZXNWYWx1ZRIUCgV2YWx1ZRgBIAEoDFIFdmFsdWVCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDVdyYXBwZXJzUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vd3JhcHBlcnNwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCqEkCiBwcm90by9ldmVudGNvdW50ZXIvc2VydmljZS5wcm90bxIWYnVja2V0ZWVyLmV2ZW50Y291bnRlchoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvGipwcm90by9ldmVudGNvdW50ZXIvZXhwZXJpbWVudF9yZXN1bHQucHJvdG8aI3Byb3RvL2V2ZW50Y291bnRlci90aW1lc2VyaWVzLnByb3RvGihwcm90by9ldmVudGNvdW50ZXIvdmFyaWF0aW9uX2NvdW50LnByb3RvIvkBCiNHZXRFeHBlcmltZW50RXZhbHVhdGlvbkNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhkKCHN0YXJ0X2F0GAIgASgDUgdzdGFydEF0EhUKBmVuZF9hdBgDIAEoA1IFZW5kQXQSHQoKZmVhdHVyZV9pZBgEIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgFIAEoBVIOZmVhdHVyZVZlcnNpb24SIwoNdmFyaWF0aW9uX2lkcxgGIAMoCVIMdmFyaWF0aW9uSWRzIsEBCiRHZXRFeHBlcmltZW50RXZhbHVhdGlvbkNvdW50UmVzcG9uc2USHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgCIAEoBVIOZmVhdHVyZVZlcnNpb24SUQoQdmFyaWF0aW9uX2NvdW50cxgDIAMoCzImLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uQ291bnRSD3ZhcmlhdGlvbkNvdW50cyLEAgojR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSZAoKdGltZV9yYW5nZRgDIAEoDjJFLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlcXVlc3QuVGltZVJhbmdlUgl0aW1lUmFuZ2UiYwoJVGltZVJhbmdlEgsKB1VOS05PV04QABIVChFUV0VOVFlfRk9VUl9IT1VSUxABEg4KClNFVkVOX0RBWVMQAhIRCg1GT1VSVEVFTl9EQVlTEAMSDwoLVEhJUlRZX0RBWVMQBCLEAQokR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlc3BvbnNlEkwKC3VzZXJfY291bnRzGAEgAygLMisuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25UaW1lc2VyaWVzUgp1c2VyQ291bnRzEk4KDGV2ZW50X2NvdW50cxgCIAMoCzIrLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuVmFyaWF0aW9uVGltZXNlcmllc1ILZXZlbnRDb3VudHMidgoaR2V0RXhwZXJpbWVudFJlc3VsdFJlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIjCg1leHBlcmltZW50X2lkGAIgASgJUgxleHBlcmltZW50SWQidAobR2V0RXhwZXJpbWVudFJlc3VsdFJlc3BvbnNlElUKEWV4cGVyaW1lbnRfcmVzdWx0GAEgASgLMiguYnVja2V0ZWVyLmV2ZW50Y291bnRlci5FeHBlcmltZW50UmVzdWx0UhBleHBlcmltZW50UmVzdWx0IrgBChxMaXN0RXhwZXJpbWVudFJlc3VsdHNSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBJECg9mZWF0dXJlX3ZlcnNpb24YAiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIOZmVhdHVyZVZlcnNpb24SMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAMgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZSLjAQodTGlzdEV4cGVyaW1lbnRSZXN1bHRzUmVzcG9uc2USXAoHcmVzdWx0cxgBIAMoCzJCLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuTGlzdEV4cGVyaW1lbnRSZXN1bHRzUmVzcG9uc2UuUmVzdWx0c0VudHJ5UgdyZXN1bHRzGmQKDFJlc3VsdHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRI+CgV2YWx1ZRgCIAEoCzIoLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuRXhwZXJpbWVudFJlc3VsdFIFdmFsdWU6AjgBIowCCh1HZXRFeHBlcmltZW50R29hbENvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhkKCHN0YXJ0X2F0GAIgASgDUgdzdGFydEF0EhUKBmVuZF9hdBgDIAEoA1IFZW5kQXQSFwoHZ29hbF9pZBgEIAEoCVIGZ29hbElkEh0KCmZlYXR1cmVfaWQYBSABKAlSCWZlYXR1cmVJZBInCg9mZWF0dXJlX3ZlcnNpb24YBiABKAVSDmZlYXR1cmVWZXJzaW9uEiMKDXZhcmlhdGlvbl9pZHMYByADKAlSDHZhcmlhdGlvbklkcyKMAQoeR2V0RXhwZXJpbWVudEdvYWxDb3VudFJlc3BvbnNlEhcKB2dvYWxfaWQYASABKAlSBmdvYWxJZBJRChB2YXJpYXRpb25fY291bnRzGAIgAygLMiYuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5WYXJpYXRpb25Db3VudFIPdmFyaWF0aW9uQ291bnRzIv8BCiBHZXRPcHNFdmFsdWF0aW9uVXNlckNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEh4KC29wc19ydWxlX2lkGAIgASgJUglvcHNSdWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIdCgpmZWF0dXJlX2lkGAQgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAUgASgFUg5mZWF0dXJlVmVyc2lvbhIhCgx2YXJpYXRpb25faWQYBiABKAlSC3ZhcmlhdGlvbklkInYKIUdldE9wc0V2YWx1YXRpb25Vc2VyQ291bnRSZXNwb25zZRIeCgtvcHNfcnVsZV9pZBgBIAEoCVIJb3BzUnVsZUlkEhsKCWNsYXVzZV9pZBgCIAEoCVIIY2xhdXNlSWQSFAoFY291bnQYAyABKANSBWNvdW50IvkBChpHZXRPcHNHb2FsVXNlckNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEh4KC29wc19ydWxlX2lkGAIgASgJUglvcHNSdWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIdCgpmZWF0dXJlX2lkGAQgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAUgASgFUg5mZWF0dXJlVmVyc2lvbhIhCgx2YXJpYXRpb25faWQYBiABKAlSC3ZhcmlhdGlvbklkInAKG0dldE9wc0dvYWxVc2VyQ291bnRSZXNwb25zZRIeCgtvcHNfcnVsZV9pZBgBIAEoCVIJb3BzUnVsZUlkEhsKCWNsYXVzZV9pZBgCIAEoCVIIY2xhdXNlSWQSFAoFY291bnQYAyABKANSBWNvdW50ImgKEkdldE1BVUNvdW50UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEh0KCnllYXJfbW9udGgYAiABKAlSCXllYXJNb250aCJVChNHZXRNQVVDb3VudFJlc3BvbnNlEh8KC2V2ZW50X2NvdW50GAEgASgDUgpldmVudENvdW50Eh0KCnVzZXJfY291bnQYAiABKANSCXVzZXJDb3VudCJbChlTdW1tYXJpemVNQVVDb3VudHNSZXF1ZXN0Eh0KCnllYXJfbW9udGgYASABKAlSCXllYXJNb250aBIfCgtpc19maW5pc2hlZBgCIAEoCFIKaXNGaW5pc2hlZCIcChpTdW1tYXJpemVNQVVDb3VudHNSZXNwb25zZTLqCQoTRXZlbnRDb3VudGVyU2VydmljZRKbAQocR2V0RXhwZXJpbWVudEV2YWx1YXRpb25Db3VudBI7LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXhwZXJpbWVudEV2YWx1YXRpb25Db3VudFJlcXVlc3QaPC5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldEV4cGVyaW1lbnRFdmFsdWF0aW9uQ291bnRSZXNwb25zZSIAEpsBChxHZXRFdmFsdWF0aW9uVGltZXNlcmllc0NvdW50EjsuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFdmFsdWF0aW9uVGltZXNlcmllc0NvdW50UmVxdWVzdBo8LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXZhbHVhdGlvblRpbWVzZXJpZXNDb3VudFJlc3BvbnNlIgASgAEKE0dldEV4cGVyaW1lbnRSZXN1bHQSMi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldEV4cGVyaW1lbnRSZXN1bHRSZXF1ZXN0GjMuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFeHBlcmltZW50UmVzdWx0UmVzcG9uc2UiABKGAQoVTGlzdEV4cGVyaW1lbnRSZXN1bHRzEjQuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXF1ZXN0GjUuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5MaXN0RXhwZXJpbWVudFJlc3VsdHNSZXNwb25zZSIAEokBChZHZXRFeHBlcmltZW50R29hbENvdW50EjUuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRFeHBlcmltZW50R29hbENvdW50UmVxdWVzdBo2LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0RXhwZXJpbWVudEdvYWxDb3VudFJlc3BvbnNlIgASaAoLR2V0TUFVQ291bnQSKi5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldE1BVUNvdW50UmVxdWVzdBorLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0TUFVQ291bnRSZXNwb25zZSIAEn0KElN1bW1hcml6ZU1BVUNvdW50cxIxLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuU3VtbWFyaXplTUFVQ291bnRzUmVxdWVzdBoyLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuU3VtbWFyaXplTUFVQ291bnRzUmVzcG9uc2UiABKSAQoZR2V0T3BzRXZhbHVhdGlvblVzZXJDb3VudBI4LmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0T3BzRXZhbHVhdGlvblVzZXJDb3VudFJlcXVlc3QaOS5idWNrZXRlZXIuZXZlbnRjb3VudGVyLkdldE9wc0V2YWx1YXRpb25Vc2VyQ291bnRSZXNwb25zZSIAEoABChNHZXRPcHNHb2FsVXNlckNvdW50EjIuYnVja2V0ZWVyLmV2ZW50Y291bnRlci5HZXRPcHNHb2FsVXNlckNvdW50UmVxdWVzdBozLmJ1Y2tldGVlci5ldmVudGNvdW50ZXIuR2V0T3BzR29hbFVzZXJDb3VudFJlc3BvbnNlIgBCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50Y291bnRlcmIGcHJvdG8z autoopsDescriptor: CuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCpoLChpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8ihgEKBkNsYXVzZRIOCgJpZBgBIAEoCVICaWQSLAoGY2xhdXNlGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEj4KC2FjdGlvbl90eXBlGAMgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSLfAgoST3BzRXZlbnRSYXRlQ2xhdXNlEiEKDHZhcmlhdGlvbl9pZBgCIAEoCVILdmFyaWF0aW9uSWQSFwoHZ29hbF9pZBgDIAEoCVIGZ29hbElkEhsKCW1pbl9jb3VudBgEIAEoA1IIbWluQ291bnQSKQoQdGhyZWFkc2hvbGRfcmF0ZRgFIAEoAVIPdGhyZWFkc2hvbGRSYXRlEkoKCG9wZXJhdG9yGAYgASgOMi4uYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlLk9wZXJhdG9yUghvcGVyYXRvchI+CgthY3Rpb25fdHlwZRgHIAEoDjIdLmJ1Y2tldGVlci5hdXRvb3BzLkFjdGlvblR5cGVSCmFjdGlvblR5cGUiMwoIT3BlcmF0b3ISFAoQR1JFQVRFUl9PUl9FUVVBTBAAEhEKDUxFU1NfT1JfRVFVQUwQAUoECAEQAiJkCg5EYXRldGltZUNsYXVzZRISCgR0aW1lGAEgASgDUgR0aW1lEj4KC2FjdGlvbl90eXBlGAIgASgOMh0uYnVja2V0ZWVyLmF1dG9vcHMuQWN0aW9uVHlwZVIKYWN0aW9uVHlwZSKXAQoaUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGUSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQSHQoKZXhlY3V0ZV9hdBgCIAEoA1IJZXhlY3V0ZUF0EhYKBndlaWdodBgDIAEoBVIGd2VpZ2h0EiEKDHRyaWdnZXJlZF9hdBgEIAEoA1ILdHJpZ2dlcmVkQXQimAEKJlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlEksKCXNjaGVkdWxlcxgBIAMoCzItLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlUglzY2hlZHVsZXMSIQoMdmFyaWF0aW9uX2lkGAIgASgJUgt2YXJpYXRpb25JZCLYAgooUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZRJLCglzY2hlZHVsZXMYASADKAsyLS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVIJc2NoZWR1bGVzEmAKCGludGVydmFsGAIgASgOMkQuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZS5JbnRlcnZhbFIIaW50ZXJ2YWwSHgoKaW5jcmVtZW50cxgDIAEoA1IKaW5jcmVtZW50cxIhCgx2YXJpYXRpb25faWQYBCABKAlSC3ZhcmlhdGlvbklkIjoKCEludGVydmFsEgsKB1VOS05PV04QABIKCgZIT1VSTFkQARIJCgVEQUlMWRACEgoKBldFRUtMWRADKjIKCkFjdGlvblR5cGUSCwoHVU5LTk9XThAAEgoKBkVOQUJMRRABEgsKB0RJU0FCTEUQAkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCvcFCiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhpwcm90by9hdXRvb3BzL2NsYXVzZS5wcm90byLxAgoLQXV0b09wc1J1bGUSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBI1CghvcHNfdHlwZRgDIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUSMwoHY2xhdXNlcxgEIAMoCzIZLmJ1Y2tldGVlci5hdXRvb3BzLkNsYXVzZVIHY2xhdXNlcxIlCgx0cmlnZ2VyZWRfYXQYBiABKANCAhgBUgt0cmlnZ2VyZWRBdBIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCSABKAhSB2RlbGV0ZWQSSAoPYXV0b19vcHNfc3RhdHVzGAogASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1INYXV0b09wc1N0YXR1cyJUCgxBdXRvT3BzUnVsZXMSRAoOYXV0b19vcHNfcnVsZXMYASADKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVIMYXV0b09wc1J1bGVzKlgKB09wc1R5cGUSFgoORU5BQkxFX0ZFQVRVUkUQABoCCAESFwoPRElTQUJMRV9GRUFUVVJFEAEaAggBEgwKCFNDSEVEVUxFEAISDgoKRVZFTlRfUkFURRADKkQKDUF1dG9PcHNTdGF0dXMSCwoHV0FJVElORxAAEgsKB1JVTk5JTkcQARIMCghGSU5JU0hFRBACEgsKB1NUT1BQRUQQA0IxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCvcFCidwcm90by9hdXRvb3BzL3Byb2dyZXNzaXZlX3JvbGxvdXQucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIuIEChJQcm9ncmVzc2l2ZVJvbGxvdXQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIsCgZjbGF1c2UYAyABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgZjbGF1c2USRAoGc3RhdHVzGAQgASgOMiwuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0YXR1c1IGc3RhdHVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSPgoEdHlwZRgHIAEoDjIqLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5UeXBlUgR0eXBlEk4KCnN0b3BwZWRfYnkYCCABKA4yLy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RvcHBlZEJ5UglzdG9wcGVkQnkSHQoKc3RvcHBlZF9hdBgJIAEoA1IJc3RvcHBlZEF0IjIKBFR5cGUSEwoPTUFOVUFMX1NDSEVEVUxFEAASFQoRVEVNUExBVEVfU0NIRURVTEUQASI9CgZTdGF0dXMSCwoHV0FJVElORxAAEgsKB1JVTk5JTkcQARIMCghGSU5JU0hFRBACEgsKB1NUT1BQRUQQAyJJCglTdG9wcGVkQnkSCwoHVU5LTk9XThAAEggKBFVTRVIQARIQCgxPUFNfU0NIRURVTEUQAhITCg9PUFNfS0lMTF9TV0lUQ0gQA0IxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCq0SChtwcm90by9hdXRvb3BzL2NvbW1hbmQucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGiFwcm90by9hdXRvb3BzL2F1dG9fb3BzX3J1bGUucHJvdG8aGnByb3RvL2F1dG9vcHMvY2xhdXNlLnByb3RvGidwcm90by9hdXRvb3BzL3Byb2dyZXNzaXZlX3JvbGxvdXQucHJvdG8imgIKGENyZWF0ZUF1dG9PcHNSdWxlQ29tbWFuZBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSNQoIb3BzX3R5cGUYAiABKA4yGi5idWNrZXRlZXIuYXV0b29wcy5PcHNUeXBlUgdvcHNUeXBlEloKFm9wc19ldmVudF9yYXRlX2NsYXVzZXMYAyADKAsyJS5idWNrZXRlZXIuYXV0b29wcy5PcHNFdmVudFJhdGVDbGF1c2VSE29wc0V2ZW50UmF0ZUNsYXVzZXMSTAoQZGF0ZXRpbWVfY2xhdXNlcxgEIAMoCzIhLmJ1Y2tldGVlci5hdXRvb3BzLkRhdGV0aW1lQ2xhdXNlUg9kYXRldGltZUNsYXVzZXMiWAofQ2hhbmdlQXV0b09wc1J1bGVPcHNUeXBlQ29tbWFuZBI1CghvcHNfdHlwZRgBIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUiGgoYRGVsZXRlQXV0b09wc1J1bGVDb21tYW5kIhgKFlN0b3BBdXRvT3BzUnVsZUNvbW1hbmQiJQojQ2hhbmdlQXV0b09wc1J1bGVUcmlnZ2VyZWRBdENvbW1hbmQiVgoaQ2hhbmdlQXV0b09wc1N0YXR1c0NvbW1hbmQSOAoGc3RhdHVzGAEgASgOMiAuYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1N0YXR1c1IGc3RhdHVzIjgKGUV4ZWN1dGVBdXRvT3BzUnVsZUNvbW1hbmQSGwoJY2xhdXNlX2lkGAEgASgJUghjbGF1c2VJZCJ4ChxBZGRPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kElgKFW9wc19ldmVudF9yYXRlX2NsYXVzZRgBIAEoCzIlLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZVISb3BzRXZlbnRSYXRlQ2xhdXNlIosBCh9DaGFuZ2VPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kEg4KAmlkGAEgASgJUgJpZBJYChVvcHNfZXZlbnRfcmF0ZV9jbGF1c2UYAiABKAsyJS5idWNrZXRlZXIuYXV0b29wcy5PcHNFdmVudFJhdGVDbGF1c2VSEm9wc0V2ZW50UmF0ZUNsYXVzZSIlChNEZWxldGVDbGF1c2VDb21tYW5kEg4KAmlkGAEgASgJUgJpZCJmChhBZGREYXRldGltZUNsYXVzZUNvbW1hbmQSSgoPZGF0ZXRpbWVfY2xhdXNlGAEgASgLMiEuYnVja2V0ZWVyLmF1dG9vcHMuRGF0ZXRpbWVDbGF1c2VSDmRhdGV0aW1lQ2xhdXNlInkKG0NoYW5nZURhdGV0aW1lQ2xhdXNlQ29tbWFuZBIOCgJpZBgBIAEoCVICaWQSSgoPZGF0ZXRpbWVfY2xhdXNlGAIgASgLMiEuYnVja2V0ZWVyLmF1dG9vcHMuRGF0ZXRpbWVDbGF1c2VSDmRhdGV0aW1lQ2xhdXNlIuADCh9DcmVhdGVQcm9ncmVzc2l2ZVJvbGxvdXRDb21tYW5kEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBKaAQoqcHJvZ3Jlc3NpdmVfcm9sbG91dF9tYW51YWxfc2NoZWR1bGVfY2xhdXNlGAIgASgLMjkuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2VIAFImcHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2WIAQESoAEKLHByb2dyZXNzaXZlX3JvbGxvdXRfdGVtcGxhdGVfc2NoZWR1bGVfY2xhdXNlGAMgASgLMjsuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0VGVtcGxhdGVTY2hlZHVsZUNsYXVzZUgBUihwcm9ncmVzc2l2ZVJvbGxvdXRUZW1wbGF0ZVNjaGVkdWxlQ2xhdXNliAEBQi0KK19wcm9ncmVzc2l2ZV9yb2xsb3V0X21hbnVhbF9zY2hlZHVsZV9jbGF1c2VCLwotX3Byb2dyZXNzaXZlX3JvbGxvdXRfdGVtcGxhdGVfc2NoZWR1bGVfY2xhdXNlIm8KHVN0b3BQcm9ncmVzc2l2ZVJvbGxvdXRDb21tYW5kEk4KCnN0b3BwZWRfYnkYASABKA4yLy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RvcHBlZEJ5UglzdG9wcGVkQnkiIQofRGVsZXRlUHJvZ3Jlc3NpdmVSb2xsb3V0Q29tbWFuZCKFAQowQWRkUHJvZ3Jlc3NpdmVSb2xsb3V0TWFudWFsU2NoZWR1bGVDbGF1c2VDb21tYW5kElEKBmNsYXVzZRgBIAEoCzI5LmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dE1hbnVhbFNjaGVkdWxlQ2xhdXNlUgZjbGF1c2UiiQEKMkFkZFByb2dyZXNzaXZlUm9sbG91dFRlbXBsYXRlU2NoZWR1bGVDbGF1c2VDb21tYW5kElMKBmNsYXVzZRgBIAEoCzI7LmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFRlbXBsYXRlU2NoZWR1bGVDbGF1c2VSBmNsYXVzZSJVCjJDaGFuZ2VQcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVRyaWdnZXJlZEF0Q29tbWFuZBIfCgtzY2hlZHVsZV9pZBgBIAEoCVIKc2NoZWR1bGVJZEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCuECCh1wcm90by9hdXRvb3BzL29wc19jb3VudC5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMi8QEKCE9wc0NvdW50Eg4KAmlkGAEgASgJUgJpZBInChBhdXRvX29wc19ydWxlX2lkGAIgASgJUg1hdXRvT3BzUnVsZUlkEhsKCWNsYXVzZV9pZBgDIAEoCVIIY2xhdXNlSWQSHQoKdXBkYXRlZF9hdBgEIAEoA1IJdXBkYXRlZEF0EiYKD29wc19ldmVudF9jb3VudBgFIAEoA1INb3BzRXZlbnRDb3VudBIpChBldmFsdWF0aW9uX2NvdW50GAYgASgDUg9ldmFsdWF0aW9uQ291bnQSHQoKZmVhdHVyZV9pZBgHIAEoCVIJZmVhdHVyZUlkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRvb3BzYgZwcm90bzMKlzMKG3Byb3RvL2F1dG9vcHMvc2VydmljZS5wcm90bxIRYnVja2V0ZWVyLmF1dG9vcHMaIXByb3RvL2F1dG9vcHMvYXV0b19vcHNfcnVsZS5wcm90bxobcHJvdG8vYXV0b29wcy9jb21tYW5kLnByb3RvGh1wcm90by9hdXRvb3BzL29wc19jb3VudC5wcm90bxoncHJvdG8vYXV0b29wcy9wcm9ncmVzc2l2ZV9yb2xsb3V0LnByb3RvIlwKFUdldEF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZCJcChZHZXRBdXRvT3BzUnVsZVJlc3BvbnNlEkIKDWF1dG9fb3BzX3J1bGUYASABKAsyHi5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzUnVsZVILYXV0b09wc1J1bGUilgEKGENyZWF0ZUF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEkUKB2NvbW1hbmQYAiABKAsyKy5idWNrZXRlZXIuYXV0b29wcy5DcmVhdGVBdXRvT3BzUnVsZUNvbW1hbmRSB2NvbW1hbmQiGwoZQ3JlYXRlQXV0b09wc1J1bGVSZXNwb25zZSKkAQoXTGlzdEF1dG9PcHNSdWxlc1JlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIbCglwYWdlX3NpemUYAiABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgDIAEoCVIGY3Vyc29yEh8KC2ZlYXR1cmVfaWRzGAQgAygJUgpmZWF0dXJlSWRzIngKGExpc3RBdXRvT3BzUnVsZXNSZXNwb25zZRJECg5hdXRvX29wc19ydWxlcxgBIAMoCzIeLmJ1Y2tldGVlci5hdXRvb3BzLkF1dG9PcHNSdWxlUgxhdXRvT3BzUnVsZXMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3IiogEKFlN0b3BBdXRvT3BzUnVsZVJlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIOCgJpZBgCIAEoCVICaWQSQwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hdXRvb3BzLlN0b3BBdXRvT3BzUnVsZUNvbW1hbmRSB2NvbW1hbmQiGQoXU3RvcEF1dG9PcHNSdWxlUmVzcG9uc2UipgEKGERlbGV0ZUF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZBJFCgdjb21tYW5kGAMgASgLMisuYnVja2V0ZWVyLmF1dG9vcHMuRGVsZXRlQXV0b09wc1J1bGVDb21tYW5kUgdjb21tYW5kIhsKGURlbGV0ZUF1dG9PcHNSdWxlUmVzcG9uc2UirQYKGFVwZGF0ZUF1dG9PcHNSdWxlUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZBKGAQolY2hhbmdlX2F1dG9fb3BzX3J1bGVfb3BzX3R5cGVfY29tbWFuZBgDIAEoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZUF1dG9PcHNSdWxlT3BzVHlwZUNvbW1hbmRCAhgBUh9jaGFuZ2VBdXRvT3BzUnVsZU9wc1R5cGVDb21tYW5kEnoKImFkZF9vcHNfZXZlbnRfcmF0ZV9jbGF1c2VfY29tbWFuZHMYBCADKAsyLy5idWNrZXRlZXIuYXV0b29wcy5BZGRPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kUh1hZGRPcHNFdmVudFJhdGVDbGF1c2VDb21tYW5kcxKDAQolY2hhbmdlX29wc19ldmVudF9yYXRlX2NsYXVzZV9jb21tYW5kcxgFIAMoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZU9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmRSIGNoYW5nZU9wc0V2ZW50UmF0ZUNsYXVzZUNvbW1hbmRzElwKFmRlbGV0ZV9jbGF1c2VfY29tbWFuZHMYBiADKAsyJi5idWNrZXRlZXIuYXV0b29wcy5EZWxldGVDbGF1c2VDb21tYW5kUhRkZWxldGVDbGF1c2VDb21tYW5kcxJsChxhZGRfZGF0ZXRpbWVfY2xhdXNlX2NvbW1hbmRzGAcgAygLMisuYnVja2V0ZWVyLmF1dG9vcHMuQWRkRGF0ZXRpbWVDbGF1c2VDb21tYW5kUhlhZGREYXRldGltZUNsYXVzZUNvbW1hbmRzEnUKH2NoYW5nZV9kYXRldGltZV9jbGF1c2VfY29tbWFuZHMYCCADKAsyLi5idWNrZXRlZXIuYXV0b29wcy5DaGFuZ2VEYXRldGltZUNsYXVzZUNvbW1hbmRSHGNoYW5nZURhdGV0aW1lQ2xhdXNlQ29tbWFuZHMiGwoZVXBkYXRlQXV0b09wc1J1bGVSZXNwb25zZSLhAgoVRXhlY3V0ZUF1dG9PcHNSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USDgoCaWQYAiABKAlSAmlkEpIBCiljaGFuZ2VfYXV0b19vcHNfcnVsZV90cmlnZ2VyZWRfYXRfY29tbWFuZBgDIAEoCzI2LmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZUF1dG9PcHNSdWxlVHJpZ2dlcmVkQXRDb21tYW5kQgIYAVIjY2hhbmdlQXV0b09wc1J1bGVUcmlnZ2VyZWRBdENvbW1hbmQSbgodZXhlY3V0ZV9hdXRvX29wc19ydWxlX2NvbW1hbmQYBCABKAsyLC5idWNrZXRlZXIuYXV0b29wcy5FeGVjdXRlQXV0b09wc1J1bGVDb21tYW5kUhlleGVjdXRlQXV0b09wc1J1bGVDb21tYW5kIkUKFkV4ZWN1dGVBdXRvT3BzUmVzcG9uc2USKwoRYWxyZWFkeV90cmlnZ2VyZWQYASABKAhSEGFscmVhZHlUcmlnZ2VyZWQizAEKFExpc3RPcHNDb3VudHNSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USGwoJcGFnZV9zaXplGAIgASgDUghwYWdlU2l6ZRIWCgZjdXJzb3IYAyABKAlSBmN1cnNvchIpChFhdXRvX29wc19ydWxlX2lkcxgEIAMoCVIOYXV0b09wc1J1bGVJZHMSHwoLZmVhdHVyZV9pZHMYBSADKAlSCmZlYXR1cmVJZHMiawoVTGlzdE9wc0NvdW50c1Jlc3BvbnNlEhYKBmN1cnNvchgBIAEoCVIGY3Vyc29yEjoKCm9wc19jb3VudHMYAiADKAsyGy5idWNrZXRlZXIuYXV0b29wcy5PcHNDb3VudFIJb3BzQ291bnRzIqQBCh9DcmVhdGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USTAoHY29tbWFuZBgCIAEoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZVByb2dyZXNzaXZlUm9sbG91dENvbW1hbmRSB2NvbW1hbmQiIgogQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0UmVzcG9uc2UiYwocR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEg4KAmlkGAIgASgJUgJpZCJ3Ch1HZXRQcm9ncmVzc2l2ZVJvbGxvdXRSZXNwb25zZRJWChNwcm9ncmVzc2l2ZV9yb2xsb3V0GAEgASgLMiUuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0UhJwcm9ncmVzc2l2ZVJvbGxvdXQisAEKHVN0b3BQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USDgoCaWQYAiABKAlSAmlkEkoKB2NvbW1hbmQYAyABKAsyMC5idWNrZXRlZXIuYXV0b29wcy5TdG9wUHJvZ3Jlc3NpdmVSb2xsb3V0Q29tbWFuZFIHY29tbWFuZCIgCh5TdG9wUHJvZ3Jlc3NpdmVSb2xsb3V0UmVzcG9uc2UitAEKH0RlbGV0ZVByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIOCgJpZBgCIAEoCVICaWQSTAoHY29tbWFuZBgDIAEoCzIyLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZVByb2dyZXNzaXZlUm9sbG91dENvbW1hbmRSB2NvbW1hbmQiIgogRGVsZXRlUHJvZ3Jlc3NpdmVSb2xsb3V0UmVzcG9uc2Ui7QQKHkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVxdWVzdBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYASABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhsKCXBhZ2Vfc2l6ZRgCIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAMgASgJUgZjdXJzb3ISHwoLZmVhdHVyZV9pZHMYBCADKAlSCmZlYXR1cmVJZHMSVAoIb3JkZXJfYnkYBSABKA4yOS5idWNrZXRlZXIuYXV0b29wcy5MaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0c1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJpCg9vcmRlcl9kaXJlY3Rpb24YBiABKA4yQC5idWNrZXRlZXIuYXV0b29wcy5MaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0c1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEkkKBnN0YXR1cxgHIAEoDjIsLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdGF0dXNIAFIGc3RhdHVziAEBEkMKBHR5cGUYCCABKA4yKi5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuVHlwZUgBUgR0eXBliAEBIjYKB09yZGVyQnkSCwoHREVGQVVMVBAAEg4KCkNSRUFURURfQVQQARIOCgpVUERBVEVEX0FUEAIiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABQgkKB19zdGF0dXNCBwoFX3R5cGUitAEKH0xpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVzcG9uc2USWAoUcHJvZ3Jlc3NpdmVfcm9sbG91dHMYASADKAsyJS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRSE3Byb2dyZXNzaXZlUm9sbG91dHMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQilAIKIEV4ZWN1dGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0EjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgBIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USDgoCaWQYAiABKAlSAmlkEqoBCi9jaGFuZ2VfcHJvZ3Jlc3NpdmVfcm9sbG91dF90cmlnZ2VyZWRfYXRfY29tbWFuZBgDIAEoCzJFLmJ1Y2tldGVlci5hdXRvb3BzLkNoYW5nZVByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlVHJpZ2dlcmVkQXRDb21tYW5kUipjaGFuZ2VQcm9ncmVzc2l2ZVJvbGxvdXRUcmlnZ2VyZWRBdENvbW1hbmQiIwohRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlMpgNCg5BdXRvT3BzU2VydmljZRJnCg5HZXRBdXRvT3BzUnVsZRIoLmJ1Y2tldGVlci5hdXRvb3BzLkdldEF1dG9PcHNSdWxlUmVxdWVzdBopLmJ1Y2tldGVlci5hdXRvb3BzLkdldEF1dG9PcHNSdWxlUmVzcG9uc2UiABJtChBMaXN0QXV0b09wc1J1bGVzEiouYnVja2V0ZWVyLmF1dG9vcHMuTGlzdEF1dG9PcHNSdWxlc1JlcXVlc3QaKy5idWNrZXRlZXIuYXV0b29wcy5MaXN0QXV0b09wc1J1bGVzUmVzcG9uc2UiABJwChFDcmVhdGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJqCg9TdG9wQXV0b09wc1J1bGUSKS5idWNrZXRlZXIuYXV0b29wcy5TdG9wQXV0b09wc1J1bGVSZXF1ZXN0GiouYnVja2V0ZWVyLmF1dG9vcHMuU3RvcEF1dG9PcHNSdWxlUmVzcG9uc2UiABJwChFEZWxldGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJwChFVcGRhdGVBdXRvT3BzUnVsZRIrLmJ1Y2tldGVlci5hdXRvb3BzLlVwZGF0ZUF1dG9PcHNSdWxlUmVxdWVzdBosLmJ1Y2tldGVlci5hdXRvb3BzLlVwZGF0ZUF1dG9PcHNSdWxlUmVzcG9uc2UiABJnCg5FeGVjdXRlQXV0b09wcxIoLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVBdXRvT3BzUmVxdWVzdBopLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVBdXRvT3BzUmVzcG9uc2UiABJkCg1MaXN0T3BzQ291bnRzEicuYnVja2V0ZWVyLmF1dG9vcHMuTGlzdE9wc0NvdW50c1JlcXVlc3QaKC5idWNrZXRlZXIuYXV0b29wcy5MaXN0T3BzQ291bnRzUmVzcG9uc2UiABKFAQoYQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0EjIuYnVja2V0ZWVyLmF1dG9vcHMuQ3JlYXRlUHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBozLmJ1Y2tldGVlci5hdXRvb3BzLkNyZWF0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgASfAoVR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0Ei8uYnVja2V0ZWVyLmF1dG9vcHMuR2V0UHJvZ3Jlc3NpdmVSb2xsb3V0UmVxdWVzdBowLmJ1Y2tldGVlci5hdXRvb3BzLkdldFByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgASfwoWU3RvcFByb2dyZXNzaXZlUm9sbG91dBIwLmJ1Y2tldGVlci5hdXRvb3BzLlN0b3BQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0GjEuYnVja2V0ZWVyLmF1dG9vcHMuU3RvcFByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgAShQEKGERlbGV0ZVByb2dyZXNzaXZlUm9sbG91dBIyLmJ1Y2tldGVlci5hdXRvb3BzLkRlbGV0ZVByb2dyZXNzaXZlUm9sbG91dFJlcXVlc3QaMy5idWNrZXRlZXIuYXV0b29wcy5EZWxldGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXNwb25zZSIAEoIBChdMaXN0UHJvZ3Jlc3NpdmVSb2xsb3V0cxIxLmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVxdWVzdBoyLmJ1Y2tldGVlci5hdXRvb3BzLkxpc3RQcm9ncmVzc2l2ZVJvbGxvdXRzUmVzcG9uc2UiABKIAQoZRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dBIzLmJ1Y2tldGVlci5hdXRvb3BzLkV4ZWN1dGVQcm9ncmVzc2l2ZVJvbGxvdXRSZXF1ZXN0GjQuYnVja2V0ZWVyLmF1dG9vcHMuRXhlY3V0ZVByb2dyZXNzaXZlUm9sbG91dFJlc3BvbnNlIgBCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMw== authDescriptor: CocFChVnb29nbGUvYXBpL2h0dHAucHJvdG8SCmdvb2dsZS5hcGkieQoESHR0cBIqCgVydWxlcxgBIAMoCzIULmdvb2dsZS5hcGkuSHR0cFJ1bGVSBXJ1bGVzEkUKH2Z1bGx5X2RlY29kZV9yZXNlcnZlZF9leHBhbnNpb24YAiABKAhSHGZ1bGx5RGVjb2RlUmVzZXJ2ZWRFeHBhbnNpb24itQIKCEh0dHBSdWxlEhoKCHNlbGVjdG9yGAEgASgJUghzZWxlY3RvchISCgNnZXQYAiABKAlIAFIDZ2V0EhIKA3B1dBgDIAEoCUgAUgNwdXQSFAoEcG9zdBgEIAEoCUgAUgRwb3N0EhgKBmRlbGV0ZRgFIAEoCUgAUgZkZWxldGUSFgoFcGF0Y2gYBiABKAlIAFIFcGF0Y2gSNwoGY3VzdG9tGAggASgLMh0uZ29vZ2xlLmFwaS5DdXN0b21IdHRwUGF0dGVybkgAUgZjdXN0b20SEgoEYm9keRgHIAEoCVIEYm9keRJFChNhZGRpdGlvbmFsX2JpbmRpbmdzGAsgAygLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVISYWRkaXRpb25hbEJpbmRpbmdzQgkKB3BhdHRlcm4iOwoRQ3VzdG9tSHR0cFBhdHRlcm4SEgoEa2luZBgBIAEoCVIEa2luZBISCgRwYXRoGAIgASgJUgRwYXRoQmoKDmNvbS5nb29nbGUuYXBpQglIdHRwUHJvdG9QAVpBZ29vZ2xlLmdvbGFuZy5vcmcvZ2VucHJvdG8vZ29vZ2xlYXBpcy9hcGkvYW5ub3RhdGlvbnM7YW5ub3RhdGlvbnP4AQGiAgRHQVBJYgZwcm90bzMK4UYKIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvEg9nb29nbGUucHJvdG9idWYiTQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlIv4EChNGaWxlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIeCgpkZXBlbmRlbmN5GAMgAygJUgpkZXBlbmRlbmN5EisKEXB1YmxpY19kZXBlbmRlbmN5GAogAygFUhBwdWJsaWNEZXBlbmRlbmN5EicKD3dlYWtfZGVwZW5kZW5jeRgLIAMoBVIOd2Vha0RlcGVuZGVuY3kSQwoMbWVzc2FnZV90eXBlGAQgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1ILbWVzc2FnZVR5cGUSQQoJZW51bV90eXBlGAUgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlEkEKB3NlcnZpY2UYBiADKAsyJy5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90b1IHc2VydmljZRJDCglleHRlbnNpb24YByADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhI2CgdvcHRpb25zGAggASgLMhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zUgdvcHRpb25zEkkKEHNvdXJjZV9jb2RlX2luZm8YCSABKAsyHy5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm9SDnNvdXJjZUNvZGVJbmZvEhYKBnN5bnRheBgMIAEoCVIGc3ludGF4EhgKB2VkaXRpb24YDSABKAlSB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQirQQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SaAoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFRFIMdmVyaWZpY2F0aW9uGrMBCgtEZWNsYXJhdGlvbhIWCgZudW1iZXIYASABKAVSBm51bWJlchIbCglmdWxsX25hbWUYAiABKAlSCGZ1bGxOYW1lEhIKBHR5cGUYAyABKAlSBHR5cGUSIwoLaXNfcmVwZWF0ZWQYBCABKAhCAhgBUgppc1JlcGVhdGVkEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWQiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQAhISCg5MQUJFTF9SRVBFQVRFRBADImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMi4wIKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUaOwoRRW51bVJlc2VydmVkUmFuZ2USFAoFc3RhcnQYASABKAVSBXN0YXJ0EhAKA2VuZBgCIAEoBVIDZW5kIoMBChhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAiABKAVSBm51bWJlchI7CgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNSB29wdGlvbnMipwEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI+CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvUgZtZXRob2QSOQoHb3B0aW9ucxgDIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1IHb3B0aW9ucyKJAgoVTWV0aG9kRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSHQoKaW5wdXRfdHlwZRgCIAEoCVIJaW5wdXRUeXBlEh8KC291dHB1dF90eXBlGAMgASgJUgpvdXRwdXRUeXBlEjgKB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1IHb3B0aW9ucxIwChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZVIPY2xpZW50U3RyZWFtaW5nEjAKEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNlUg9zZXJ2ZXJTdHJlYW1pbmcikQkKC0ZpbGVPcHRpb25zEiEKDGphdmFfcGFja2FnZRgBIAEoCVILamF2YVBhY2thZ2USMAoUamF2YV9vdXRlcl9jbGFzc25hbWUYCCABKAlSEmphdmFPdXRlckNsYXNzbmFtZRI1ChNqYXZhX211bHRpcGxlX2ZpbGVzGAogASgIOgVmYWxzZVIRamF2YU11bHRpcGxlRmlsZXMSRAodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gYFCABKAhCAhgBUhlqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoEjoKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6BWZhbHNlUhNqYXZhU3RyaW5nQ2hlY2tVdGY4ElMKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEUgtvcHRpbWl6ZUZvchIdCgpnb19wYWNrYWdlGAsgASgJUglnb1BhY2thZ2USNQoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2VSEWNjR2VuZXJpY1NlcnZpY2VzEjkKFWphdmFfZ2VuZXJpY19zZXJ2aWNlcxgRIAEoCDoFZmFsc2VSE2phdmFHZW5lcmljU2VydmljZXMSNQoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgSIAEoCDoFZmFsc2VSEXB5R2VuZXJpY1NlcnZpY2VzEjcKFHBocF9nZW5lcmljX3NlcnZpY2VzGCogASgIOgVmYWxzZVIScGhwR2VuZXJpY1NlcnZpY2VzEiUKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEi4KEGNjX2VuYWJsZV9hcmVuYXMYHyABKAg6BHRydWVSDmNjRW5hYmxlQXJlbmFzEioKEW9iamNfY2xhc3NfcHJlZml4GCQgASgJUg9vYmpjQ2xhc3NQcmVmaXgSKQoQY3NoYXJwX25hbWVzcGFjZRglIAEoCVIPY3NoYXJwTmFtZXNwYWNlEiEKDHN3aWZ0X3ByZWZpeBgnIAEoCVILc3dpZnRQcmVmaXgSKAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCVIOcGhwQ2xhc3NQcmVmaXgSIwoNcGhwX25hbWVzcGFjZRgpIAEoCVIMcGhwTmFtZXNwYWNlEjQKFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAlSFHBocE1ldGFkYXRhTmFtZXNwYWNlEiEKDHJ1YnlfcGFja2FnZRgtIAEoCVILcnVieVBhY2thZ2USWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09ERV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyK7AwoOTWVzc2FnZU9wdGlvbnMSPAoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQYASABKAg6BWZhbHNlUhRtZXNzYWdlU2V0V2lyZUZvcm1hdBJMCh9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZVIcbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvchIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIbCgltYXBfZW50cnkYByABKAhSCG1hcEVudHJ5ElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAsgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIoUJCgxGaWVsZE9wdGlvbnMSQQoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOgZTVFJJTkdSBWN0eXBlEhYKBnBhY2tlZBgCIAEoCFIGcGFja2VkEkcKBmpzdHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOglKU19OT1JNQUxSBmpzdHlwZRIZCgRsYXp5GAUgASgIOgVmYWxzZVIEbGF6eRIuCg91bnZlcmlmaWVkX2xhenkYDyABKAg6BWZhbHNlUg51bnZlcmlmaWVkTGF6eRIlCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIZCgR3ZWFrGAogASgIOgVmYWxzZVIEd2VhaxIoCgxkZWJ1Z19yZWRhY3QYECABKAg6BWZhbHNlUgtkZWJ1Z1JlZGFjdBJLCglyZXRlbnRpb24YESABKA4yLS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvblIJcmV0ZW50aW9uEkoKBnRhcmdldBgSIAEoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZUICGAFSBnRhcmdldBJICgd0YXJnZXRzGBMgAygOMi4uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlUgd0YXJnZXRzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIi8KBUNUeXBlEgoKBlNUUklORxAAEggKBENPUkQQARIQCgxTVFJJTkdfUElFQ0UQAiI1CgZKU1R5cGUSDQoJSlNfTk9STUFMEAASDQoJSlNfU1RSSU5HEAESDQoJSlNfTlVNQkVSEAIiVQoPT3B0aW9uUmV0ZW50aW9uEhUKEVJFVEVOVElPTl9VTktOT1dOEAASFQoRUkVURU5USU9OX1JVTlRJTUUQARIUChBSRVRFTlRJT05fU09VUkNFEAIijAIKEE9wdGlvblRhcmdldFR5cGUSFwoTVEFSR0VUX1RZUEVfVU5LTk9XThAAEhQKEFRBUkdFVF9UWVBFX0ZJTEUQARIfChtUQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0UQAhIXChNUQVJHRVRfVFlQRV9NRVNTQUdFEAMSFQoRVEFSR0VUX1RZUEVfRklFTEQQBBIVChFUQVJHRVRfVFlQRV9PTkVPRhAFEhQKEFRBUkdFVF9UWVBFX0VOVU0QBhIaChZUQVJHRVRfVFlQRV9FTlVNX0VOVFJZEAcSFwoTVEFSR0VUX1RZUEVfU0VSVklDRRAIEhYKElRBUkdFVF9UWVBFX01FVEhPRBAJKgkI6AcQgICAgAJKBAgEEAUicwoMT25lb2ZPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIimAIKC0VudW1PcHRpb25zEh8KC2FsbG93X2FsaWFzGAIgASgIUgphbGxvd0FsaWFzEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkElYKJmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzGAYgASgIQgIYAVIiZGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0cxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIp4BChBFbnVtVmFsdWVPcHRpb25zEiUKCmRlcHJlY2F0ZWQYASABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIinAEKDlNlcnZpY2VPcHRpb25zEiUKCmRlcHJlY2F0ZWQYISABKAg6BWZhbHNlUgpkZXByZWNhdGVkElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi4AIKDU1ldGhvZE9wdGlvbnMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQScQoRaWRlbXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dOUhBpZGVtcG90ZW5jeUxldmVsElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwSFwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxABEg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIpoDChNVbmludGVycHJldGVkT3B0aW9uEkEKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFIEbmFtZRIpChBpZGVudGlmaWVyX3ZhbHVlGAMgASgJUg9pZGVudGlmaWVyVmFsdWUSLAoScG9zaXRpdmVfaW50X3ZhbHVlGAQgASgEUhBwb3NpdGl2ZUludFZhbHVlEiwKEm5lZ2F0aXZlX2ludF92YWx1ZRgFIAEoA1IQbmVnYXRpdmVJbnRWYWx1ZRIhCgxkb3VibGVfdmFsdWUYBiABKAFSC2RvdWJsZVZhbHVlEiEKDHN0cmluZ192YWx1ZRgHIAEoDFILc3RyaW5nVmFsdWUSJwoPYWdncmVnYXRlX3ZhbHVlGAggASgJUg5hZ2dyZWdhdGVWYWx1ZRpKCghOYW1lUGFydBIbCgluYW1lX3BhcnQYASACKAlSCG5hbWVQYXJ0EiEKDGlzX2V4dGVuc2lvbhgCIAIoCFILaXNFeHRlbnNpb24ipwIKDlNvdXJjZUNvZGVJbmZvEkQKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uUghsb2NhdGlvbhrOAQoITG9jYXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSFgoEc3BhbhgCIAMoBUICEAFSBHNwYW4SKQoQbGVhZGluZ19jb21tZW50cxgDIAEoCVIPbGVhZGluZ0NvbW1lbnRzEisKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJUhB0cmFpbGluZ0NvbW1lbnRzEjoKGWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMYBiADKAlSF2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQcm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVzY3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KqAIKHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8SCmdvb2dsZS5hcGkaFWdvb2dsZS9hcGkvaHR0cC5wcm90bxogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG86SwoEaHR0cBIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLDKvCIgASgLMhQuZ29vZ2xlLmFwaS5IdHRwUnVsZVIEaHR0cEJuCg5jb20uZ29vZ2xlLmFwaUIQQW5ub3RhdGlvbnNQcm90b1ABWkFnb29nbGUuZ29sYW5nLm9yZy9nZW5wcm90by9nb29nbGVhcGlzL2FwaS9hbm5vdGF0aW9uczthbm5vdGF0aW9uc6ICBEdBUEliBnByb3RvMwriBQocZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIpgBCgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEisgIKBVZhbHVlEjsKCm51bGxfdmFsdWUYASABKA4yGi5nb29nbGUucHJvdG9idWYuTnVsbFZhbHVlSABSCW51bGxWYWx1ZRIjCgxudW1iZXJfdmFsdWUYAiABKAFIAFILbnVtYmVyVmFsdWUSIwoMc3RyaW5nX3ZhbHVlGAMgASgJSABSC3N0cmluZ1ZhbHVlEh8KCmJvb2xfdmFsdWUYBCABKAhIAFIJYm9vbFZhbHVlEjwKDHN0cnVjdF92YWx1ZRgFIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RIAFILc3RydWN0VmFsdWUSOwoKbGlzdF92YWx1ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWVIAFIJbGlzdFZhbHVlQgYKBGtpbmQiOwoJTGlzdFZhbHVlEi4KBnZhbHVlcxgBIAMoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIGdmFsdWVzKhsKCU51bGxWYWx1ZRIOCgpOVUxMX1ZBTFVFEABCfwoTY29tLmdvb2dsZS5wcm90b2J1ZkILU3RydWN0UHJvdG9QAVovZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vc3RydWN0cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqmPgoscHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9vcGVuYXBpdjIucHJvdG8SKWdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zGhxnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIrMICgdTd2FnZ2VyEhgKB3N3YWdnZXIYASABKAlSB3N3YWdnZXISQwoEaW5mbxgCIAEoCzIvLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkluZm9SBGluZm8SEgoEaG9zdBgDIAEoCVIEaG9zdBIbCgliYXNlX3BhdGgYBCABKAlSCGJhc2VQYXRoEksKB3NjaGVtZXMYBSADKA4yMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWVSB3NjaGVtZXMSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJfCglyZXNwb25zZXMYCiADKAsyQS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyLlJlc3BvbnNlc0VudHJ5UglyZXNwb25zZXMScQoUc2VjdXJpdHlfZGVmaW5pdGlvbnMYCyABKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eURlZmluaXRpb25zUhNzZWN1cml0eURlZmluaXRpb25zEloKCHNlY3VyaXR5GAwgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlSZXF1aXJlbWVudFIIc2VjdXJpdHkSQgoEdGFncxgNIAMoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IEdGFncxJlCg1leHRlcm5hbF9kb2NzGA4gASgLMkAuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uUgxleHRlcm5hbERvY3MSYgoKZXh0ZW5zaW9ucxgPIAMoCzJCLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlN3YWdnZXIuRXh0ZW5zaW9uc0VudHJ5UgpleHRlbnNpb25zGnEKDlJlc3BvbnNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkkKBXZhbHVlGAIgASgLMjMuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUmVzcG9uc2VSBXZhbHVlOgI4ARpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4AUoECAgQCUoECAkQCiLWBwoJT3BlcmF0aW9uEhIKBHRhZ3MYASADKAlSBHRhZ3MSGAoHc3VtbWFyeRgCIAEoCVIHc3VtbWFyeRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SZQoNZXh0ZXJuYWxfZG9jcxgEIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEiEKDG9wZXJhdGlvbl9pZBgFIAEoCVILb3BlcmF0aW9uSWQSGgoIY29uc3VtZXMYBiADKAlSCGNvbnN1bWVzEhoKCHByb2R1Y2VzGAcgAygJUghwcm9kdWNlcxJhCglyZXNwb25zZXMYCSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5PcGVyYXRpb24uUmVzcG9uc2VzRW50cnlSCXJlc3BvbnNlcxJLCgdzY2hlbWVzGAogAygOMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1lUgdzY2hlbWVzEh4KCmRlcHJlY2F0ZWQYCyABKAhSCmRlcHJlY2F0ZWQSWgoIc2VjdXJpdHkYDCADKAsyPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVJlcXVpcmVtZW50UghzZWN1cml0eRJkCgpleHRlbnNpb25zGA0gAygLMkQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxJVCgpwYXJhbWV0ZXJzGA4gASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuUGFyYW1ldGVyc1IKcGFyYW1ldGVycxpxCg5SZXNwb25zZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlUgV2YWx1ZToCOAEaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAFKBAgIEAkiYgoKUGFyYW1ldGVycxJUCgdoZWFkZXJzGAEgAygLMjouZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUGFyYW1ldGVyUgdoZWFkZXJzIqMCCg9IZWFkZXJQYXJhbWV0ZXISEgoEbmFtZRgBIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SUwoEdHlwZRgDIAEoDjI/LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkhlYWRlclBhcmFtZXRlci5UeXBlUgR0eXBlEhYKBmZvcm1hdBgEIAEoCVIGZm9ybWF0EhoKCHJlcXVpcmVkGAUgASgIUghyZXF1aXJlZCJFCgRUeXBlEgsKB1VOS05PV04QABIKCgZTVFJJTkcQARIKCgZOVU1CRVIQAhILCgdJTlRFR0VSEAMSCwoHQk9PTEVBThAESgQIBhAHSgQIBxAIItgBCgZIZWFkZXISIAoLZGVzY3JpcHRpb24YASABKAlSC2Rlc2NyaXB0aW9uEhIKBHR5cGUYAiABKAlSBHR5cGUSFgoGZm9ybWF0GAMgASgJUgZmb3JtYXQSGAoHZGVmYXVsdBgGIAEoCVIHZGVmYXVsdBIYCgdwYXR0ZXJuGA0gASgJUgdwYXR0ZXJuSgQIBBAFSgQIBRAGSgQIBxAISgQICBAJSgQICRAKSgQIChALSgQICxAMSgQIDBANSgQIDhAPSgQIDxAQSgQIEBARSgQIERASSgQIEhATIpoFCghSZXNwb25zZRIgCgtkZXNjcmlwdGlvbhgBIAEoCVILZGVzY3JpcHRpb24SSQoGc2NoZW1hGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NoZW1hUgZzY2hlbWESWgoHaGVhZGVycxgDIAMoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkhlYWRlcnNFbnRyeVIHaGVhZGVycxJdCghleGFtcGxlcxgEIAMoCzJBLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlJlc3BvbnNlLkV4YW1wbGVzRW50cnlSCGV4YW1wbGVzEmMKCmV4dGVuc2lvbnMYBSADKAsyQy5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5SZXNwb25zZS5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMabQoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkcKBXZhbHVlGAIgASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSGVhZGVyUgV2YWx1ZToCOAEaOwoNRXhhbXBsZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBItYDCgRJbmZvEhQKBXRpdGxlGAEgASgJUgV0aXRsZRIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24SKAoQdGVybXNfb2Zfc2VydmljZRgDIAEoCVIOdGVybXNPZlNlcnZpY2USTAoHY29udGFjdBgEIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkNvbnRhY3RSB2NvbnRhY3QSTAoHbGljZW5zZRgFIAEoCzIyLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkxpY2Vuc2VSB2xpY2Vuc2USGAoHdmVyc2lvbhgGIAEoCVIHdmVyc2lvbhJfCgpleHRlbnNpb25zGAcgAygLMj8uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSW5mby5FeHRlbnNpb25zRW50cnlSCmV4dGVuc2lvbnMaVQoPRXh0ZW5zaW9uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAEiRQoHQ29udGFjdBISCgRuYW1lGAEgASgJUgRuYW1lEhAKA3VybBgCIAEoCVIDdXJsEhQKBWVtYWlsGAMgASgJUgVlbWFpbCIvCgdMaWNlbnNlEhIKBG5hbWUYASABKAlSBG5hbWUSEAoDdXJsGAIgASgJUgN1cmwiSwoVRXh0ZXJuYWxEb2N1bWVudGF0aW9uEiAKC2Rlc2NyaXB0aW9uGAEgASgJUgtkZXNjcmlwdGlvbhIQCgN1cmwYAiABKAlSA3VybCKqAgoGU2NoZW1hElYKC2pzb25fc2NoZW1hGAEgASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIKanNvblNjaGVtYRIkCg1kaXNjcmltaW5hdG9yGAIgASgJUg1kaXNjcmltaW5hdG9yEhsKCXJlYWRfb25seRgDIAEoCFIIcmVhZE9ubHkSZQoNZXh0ZXJuYWxfZG9jcxgFIAEoCzJALmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkV4dGVybmFsRG9jdW1lbnRhdGlvblIMZXh0ZXJuYWxEb2NzEhgKB2V4YW1wbGUYBiABKAlSB2V4YW1wbGVKBAgEEAUi1woKCkpTT05TY2hlbWESEAoDcmVmGAMgASgJUgNyZWYSFAoFdGl0bGUYBSABKAlSBXRpdGxlEiAKC2Rlc2NyaXB0aW9uGAYgASgJUgtkZXNjcmlwdGlvbhIYCgdkZWZhdWx0GAcgASgJUgdkZWZhdWx0EhsKCXJlYWRfb25seRgIIAEoCFIIcmVhZE9ubHkSGAoHZXhhbXBsZRgJIAEoCVIHZXhhbXBsZRIfCgttdWx0aXBsZV9vZhgKIAEoAVIKbXVsdGlwbGVPZhIYCgdtYXhpbXVtGAsgASgBUgdtYXhpbXVtEisKEWV4Y2x1c2l2ZV9tYXhpbXVtGAwgASgIUhBleGNsdXNpdmVNYXhpbXVtEhgKB21pbmltdW0YDSABKAFSB21pbmltdW0SKwoRZXhjbHVzaXZlX21pbmltdW0YDiABKAhSEGV4Y2x1c2l2ZU1pbmltdW0SHQoKbWF4X2xlbmd0aBgPIAEoBFIJbWF4TGVuZ3RoEh0KCm1pbl9sZW5ndGgYECABKARSCW1pbkxlbmd0aBIYCgdwYXR0ZXJuGBEgASgJUgdwYXR0ZXJuEhsKCW1heF9pdGVtcxgUIAEoBFIIbWF4SXRlbXMSGwoJbWluX2l0ZW1zGBUgASgEUghtaW5JdGVtcxIhCgx1bmlxdWVfaXRlbXMYFiABKAhSC3VuaXF1ZUl0ZW1zEiUKDm1heF9wcm9wZXJ0aWVzGBggASgEUg1tYXhQcm9wZXJ0aWVzEiUKDm1pbl9wcm9wZXJ0aWVzGBkgASgEUg1taW5Qcm9wZXJ0aWVzEhoKCHJlcXVpcmVkGBogAygJUghyZXF1aXJlZBIUCgVhcnJheRgiIAMoCVIFYXJyYXkSXwoEdHlwZRgjIAMoDjJLLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLkpTT05TY2hlbWEuSlNPTlNjaGVtYVNpbXBsZVR5cGVzUgR0eXBlEhYKBmZvcm1hdBgkIAEoCVIGZm9ybWF0EhIKBGVudW0YLiADKAlSBGVudW0SegoTZmllbGRfY29uZmlndXJhdGlvbhjpByABKAsySC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkZpZWxkQ29uZmlndXJhdGlvblISZmllbGRDb25maWd1cmF0aW9uEmUKCmV4dGVuc2lvbnMYMCADKAsyRS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5KU09OU2NoZW1hLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxo8ChJGaWVsZENvbmZpZ3VyYXRpb24SJgoPcGF0aF9wYXJhbV9uYW1lGC8gASgJUg1wYXRoUGFyYW1OYW1lGlUKD0V4dGVuc2lvbnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIsCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZVIFdmFsdWU6AjgBIncKFUpTT05TY2hlbWFTaW1wbGVUeXBlcxILCgdVTktOT1dOEAASCQoFQVJSQVkQARILCgdCT09MRUFOEAISCwoHSU5URUdFUhADEggKBE5VTEwQBBIKCgZOVU1CRVIQBRIKCgZPQkpFQ1QQBhIKCgZTVFJJTkcQB0oECAEQAkoECAIQA0oECAQQBUoECBIQE0oECBMQFEoECBcQGEoECBsQHEoECBwQHUoECB0QHkoECB4QIkoECCUQKkoECCoQK0oECCsQLiLZAgoDVGFnEhIKBG5hbWUYASABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEmUKDWV4dGVybmFsX2RvY3MYAyABKAsyQC5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5FeHRlcm5hbERvY3VtZW50YXRpb25SDGV4dGVybmFsRG9jcxJeCgpleHRlbnNpb25zGAQgAygLMj4uZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuVGFnLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASL3AQoTU2VjdXJpdHlEZWZpbml0aW9ucxJoCghzZWN1cml0eRgBIAMoCzJMLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5RGVmaW5pdGlvbnMuU2VjdXJpdHlFbnRyeVIIc2VjdXJpdHkadgoNU2VjdXJpdHlFbnRyeRIQCgNrZXkYASABKAlSA2tleRJPCgV2YWx1ZRgCIAEoCzI5LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lUgV2YWx1ZToCOAEi/wYKDlNlY3VyaXR5U2NoZW1lElIKBHR5cGUYASABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5UeXBlUgR0eXBlEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhISCgRuYW1lGAMgASgJUgRuYW1lEkwKAmluGAQgASgOMjwuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2VjdXJpdHlTY2hlbWUuSW5SAmluElIKBGZsb3cYBSABKA4yPi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TZWN1cml0eVNjaGVtZS5GbG93UgRmbG93EisKEWF1dGhvcml6YXRpb25fdXJsGAYgASgJUhBhdXRob3JpemF0aW9uVXJsEhsKCXRva2VuX3VybBgHIAEoCVIIdG9rZW5VcmwSSQoGc2NvcGVzGAggASgLMjEuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuU2NvcGVzUgZzY29wZXMSaQoKZXh0ZW5zaW9ucxgJIAMoCzJJLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5U2NoZW1lLkV4dGVuc2lvbnNFbnRyeVIKZXh0ZW5zaW9ucxpVCg9FeHRlbnNpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSLAoFdmFsdWUYAiABKAsyFi5nb29nbGUucHJvdG9idWYuVmFsdWVSBXZhbHVlOgI4ASJLCgRUeXBlEhAKDFRZUEVfSU5WQUxJRBAAEg4KClRZUEVfQkFTSUMQARIQCgxUWVBFX0FQSV9LRVkQAhIPCgtUWVBFX09BVVRIMhADIjEKAkluEg4KCklOX0lOVkFMSUQQABIMCghJTl9RVUVSWRABEg0KCUlOX0hFQURFUhACImoKBEZsb3cSEAoMRkxPV19JTlZBTElEEAASEQoNRkxPV19JTVBMSUNJVBABEhEKDUZMT1dfUEFTU1dPUkQQAhIUChBGTE9XX0FQUExJQ0FUSU9OEAMSFAoQRkxPV19BQ0NFU1NfQ09ERRAEIvYCChNTZWN1cml0eVJlcXVpcmVtZW50EooBChRzZWN1cml0eV9yZXF1aXJlbWVudBgBIAMoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudEVudHJ5UhNzZWN1cml0eVJlcXVpcmVtZW50GjAKGFNlY3VyaXR5UmVxdWlyZW1lbnRWYWx1ZRIUCgVzY29wZRgBIAMoCVIFc2NvcGUanwEKGFNlY3VyaXR5UmVxdWlyZW1lbnRFbnRyeRIQCgNrZXkYASABKAlSA2tleRJtCgV2YWx1ZRgCIAEoCzJXLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNlY3VyaXR5UmVxdWlyZW1lbnQuU2VjdXJpdHlSZXF1aXJlbWVudFZhbHVlUgV2YWx1ZToCOAEilgEKBlNjb3BlcxJSCgVzY29wZRgBIAMoCzI8LmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlNjb3Blcy5TY29wZUVudHJ5UgVzY29wZRo4CgpTY29wZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEqOwoGU2NoZW1lEgsKB1VOS05PV04QABIICgRIVFRQEAESCQoFSFRUUFMQAhIGCgJXUxADEgcKA1dTUxAEQkhaRmdpdGh1Yi5jb20vZ3JwYy1lY29zeXN0ZW0vZ3JwYy1nYXRld2F5L3YyL3Byb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnNiBnByb3RvMwr9BgoucHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9ucy9hbm5vdGF0aW9ucy5wcm90bxIpZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvGixwcm90b2MtZ2VuLW9wZW5hcGl2Mi9vcHRpb25zL29wZW5hcGl2Mi5wcm90bzp+ChFvcGVuYXBpdjJfc3dhZ2dlchIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxiSCCABKAsyMi5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5Td2FnZ2VyUhBvcGVuYXBpdjJTd2FnZ2VyOoYBChNvcGVuYXBpdjJfb3BlcmF0aW9uEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYkgggASgLMjQuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuT3BlcmF0aW9uUhJvcGVuYXBpdjJPcGVyYXRpb246fgoQb3BlbmFwaXYyX3NjaGVtYRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiSCCABKAsyMS5ncnBjLmdhdGV3YXkucHJvdG9jX2dlbl9vcGVuYXBpdjIub3B0aW9ucy5TY2hlbWFSD29wZW5hcGl2MlNjaGVtYTp1Cg1vcGVuYXBpdjJfdGFnEh8uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zGJIIIAEoCzIuLmdycGMuZ2F0ZXdheS5wcm90b2NfZ2VuX29wZW5hcGl2Mi5vcHRpb25zLlRhZ1IMb3BlbmFwaXYyVGFnOn4KD29wZW5hcGl2Ml9maWVsZBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYkgggASgLMjUuZ3JwYy5nYXRld2F5LnByb3RvY19nZW5fb3BlbmFwaXYyLm9wdGlvbnMuSlNPTlNjaGVtYVIOb3BlbmFwaXYyRmllbGRCSFpGZ2l0aHViLmNvbS9ncnBjLWVjb3N5c3RlbS9ncnBjLWdhdGV3YXkvdjIvcHJvdG9jLWdlbi1vcGVuYXBpdjIvb3B0aW9uc2IGcHJvdG8zCukBChZwcm90by9hdXRoL3Rva2VuLnByb3RvEg5idWNrZXRlZXIuYXV0aCKGAQoFVG9rZW4SIQoMYWNjZXNzX3Rva2VuGAEgASgJUgthY2Nlc3NUb2tlbhIdCgp0b2tlbl90eXBlGAIgASgJUgl0b2tlblR5cGUSIwoNcmVmcmVzaF90b2tlbhgDIAEoCVIMcmVmcmVzaFRva2VuEhYKBmV4cGlyeRgEIAEoA1IGZXhwaXJ5Qi5aLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRoYgZwcm90bzMKrBwKGHByb3RvL2F1dGgvc2VydmljZS5wcm90bxIOYnVja2V0ZWVyLmF1dGgaHGdvb2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8aLnByb3RvYy1nZW4tb3BlbmFwaXYyL29wdGlvbnMvYW5ub3RhdGlvbnMucHJvdG8aFnByb3RvL2F1dGgvdG9rZW4ucHJvdG8ihAEKG0dldEF1dGhlbnRpY2F0aW9uVVJMUmVxdWVzdBIUCgVzdGF0ZRgBIAEoCVIFc3RhdGUSIQoMcmVkaXJlY3RfdXJsGAIgASgJUgtyZWRpcmVjdFVybBIsCgR0eXBlGAMgASgOMhguYnVja2V0ZWVyLmF1dGguQXV0aFR5cGVSBHR5cGUiMAocR2V0QXV0aGVudGljYXRpb25VUkxSZXNwb25zZRIQCgN1cmwYASABKAlSA3VybCJ7ChRFeGNoYW5nZVRva2VuUmVxdWVzdBISCgRjb2RlGAEgASgJUgRjb2RlEiEKDHJlZGlyZWN0X3VybBgCIAEoCVILcmVkaXJlY3RVcmwSLAoEdHlwZRgDIAEoDjIYLmJ1Y2tldGVlci5hdXRoLkF1dGhUeXBlUgR0eXBlIkQKFUV4Y2hhbmdlVG9rZW5SZXNwb25zZRIrCgV0b2tlbhgBIAEoCzIVLmJ1Y2tldGVlci5hdXRoLlRva2VuUgV0b2tlbiI6ChNSZWZyZXNoVG9rZW5SZXF1ZXN0EiMKDXJlZnJlc2hfdG9rZW4YASABKAlSDHJlZnJlc2hUb2tlbiJDChRSZWZyZXNoVG9rZW5SZXNwb25zZRIrCgV0b2tlbhgBIAEoCzIVLmJ1Y2tldGVlci5hdXRoLlRva2VuUgV0b2tlbiJBCg1TaWduSW5SZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIaCghwYXNzd29yZBgCIAEoCVIIcGFzc3dvcmQiPQoOU2lnbkluUmVzcG9uc2USKwoFdG9rZW4YASABKAsyFS5idWNrZXRlZXIuYXV0aC5Ub2tlblIFdG9rZW4qcgoIQXV0aFR5cGUSGQoVQVVUSF9UWVBFX1VOU1BFQ0lGSUVEEAASHwoXQVVUSF9UWVBFX1VTRVJfUEFTU1dPUkQQARoCCAESFAoQQVVUSF9UWVBFX0dPT0dMRRACEhQKEEFVVEhfVFlQRV9HSVRIVUIQAzL8EgoLQXV0aFNlcnZpY2USlAUKDUV4Y2hhbmdlVG9rZW4SJC5idWNrZXRlZXIuYXV0aC5FeGNoYW5nZVRva2VuUmVxdWVzdBolLmJ1Y2tldGVlci5hdXRoLkV4Y2hhbmdlVG9rZW5SZXNwb25zZSK1BJJBjwQKDkF1dGhlbnRpY2F0aW9uEg5FeGNoYW5nZSBUb2tlbhplRXhjaGFuZ2UgdGhlIHRva2VuIGZyb20gdGhlIE9BdXRoIHByb3ZpZGVyIHRvIHRoZSBCdWNrZXRlZXIgdG9rZW4uCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IEdvb2dsZS4qGndlYi52MS5hdXRoLmV4Y2hhbmdlX3Rva2VuSrQBCgM0MDASrAEKOlJldHVybmVkIGZvciBiYWQgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBmYWlsZWQgdmFsaWRhdGlvbi4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiVgoQYXBwbGljYXRpb24vanNvbhJCeyAiY29kZSI6IDMsICJtZXNzYWdlIjogImludmFsaWQgYXJndW1lbnRzIGVycm9yIiwgImRldGFpbHMiOiBbXSB9SrIBCgM0MDESqgEKPVJlcXVlc3QgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgKGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkKS4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiUQoQYXBwbGljYXRpb24vanNvbhI9eyAiY29kZSI6IDE2LCAibWVzc2FnZSI6ICJub3QgYXV0aGVudGljYXRlZCIsICJkZXRhaWxzIjogW10gfYLT5JMCHCIXL3YxL2F1dGgvZXhjaGFuZ2VfdG9rZW46ASoSsgQKFEdldEF1dGhlbnRpY2F0aW9uVVJMEisuYnVja2V0ZWVyLmF1dGguR2V0QXV0aGVudGljYXRpb25VUkxSZXF1ZXN0GiwuYnVja2V0ZWVyLmF1dGguR2V0QXV0aGVudGljYXRpb25VUkxSZXNwb25zZSK+A5JBlAMKDkF1dGhlbnRpY2F0aW9uEhZHZXQgQXV0aGVudGljYXRpb24gVVJMGpIBVGhlIE9BdXRoIGNyZWRlbnRpYWxzIG11c3QgYmUgY29uZmlndXJlZCBvbiB0aGUgc2VydmVyIHRvIGNhbGwgdGhpcyBBUEkuIEl0IHdpbGwgcmV0dXJuIHRoZSBBdXRoZW50aWNhdGlvbiBVUkwuCkN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IEdvb2dsZS4qHndlYi52MS5hdXRoLmF1dGhlbnRpY2F0aW9uX3VybEq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfYLT5JMCICIbL3YxL2F1dGgvYXV0aGVudGljYXRpb25fdXJsOgEqEuMECgxSZWZyZXNoVG9rZW4SIy5idWNrZXRlZXIuYXV0aC5SZWZyZXNoVG9rZW5SZXF1ZXN0GiQuYnVja2V0ZWVyLmF1dGguUmVmcmVzaFRva2VuUmVzcG9uc2UihwSSQeIDCg5BdXRoZW50aWNhdGlvbhINUmVmcmVzaCBUb2tlbho6UmVmcmVzaCB0aGUgQnVja2V0ZWVyIHRva2VuIG1haW50YWluZWQgYnkgdGhlIHdlYiBjb25zb2xlLioZd2ViLnYxLmF1dGgucmVmcmVzaF90b2tlbkq0AQoDNDAwEqwBCjpSZXR1cm5lZCBmb3IgYmFkIHJlcXVlc3RzIHRoYXQgbWF5IGhhdmUgZmFpbGVkIHZhbGlkYXRpb24uEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlYKEGFwcGxpY2F0aW9uL2pzb24SQnsgImNvZGUiOiAzLCAibWVzc2FnZSI6ICJpbnZhbGlkIGFyZ3VtZW50cyBlcnJvciIsICJkZXRhaWxzIjogW10gfUqyAQoDNDAxEqoBCj1SZXF1ZXN0IGNvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkIChhdXRoZW50aWNhdGlvbiByZXF1aXJlZCkuEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVzIlEKEGFwcGxpY2F0aW9uL2pzb24SPXsgImNvZGUiOiAxNiwgIm1lc3NhZ2UiOiAibm90IGF1dGhlbnRpY2F0ZWQiLCAiZGV0YWlscyI6IFtdIH2C0+STAhsiFi92MS9hdXRoL3JlZnJlc2hfdG9rZW46ASoSugQKBlNpZ25JbhIdLmJ1Y2tldGVlci5hdXRoLlNpZ25JblJlcXVlc3QaHi5idWNrZXRlZXIuYXV0aC5TaWduSW5SZXNwb25zZSLwA5JB0gMKDkF1dGhlbnRpY2F0aW9uEgdTaWduIEluGjdTaWduIGluIG9uIHRoZSB3ZWIgY29uc29sZSB1c2luZyBhbiBlbWFpbCBhbmQgcGFzc3dvcmQuKhJ3ZWIudjEuYXV0aC5zaWduaW5KtAEKAzQwMBKsAQo6UmV0dXJuZWQgZm9yIGJhZCByZXF1ZXN0cyB0aGF0IG1heSBoYXZlIGZhaWxlZCB2YWxpZGF0aW9uLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJWChBhcHBsaWNhdGlvbi9qc29uEkJ7ICJjb2RlIjogMywgIm1lc3NhZ2UiOiAiaW52YWxpZCBhcmd1bWVudHMgZXJyb3IiLCAiZGV0YWlscyI6IFtdIH1KsgEKAzQwMRKqAQo9UmVxdWVzdCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCAoYXV0aGVudGljYXRpb24gcmVxdWlyZWQpLhIWChQaEi5nb29nbGUucnBjLlN0YXR1cyJRChBhcHBsaWNhdGlvbi9qc29uEj17ICJjb2RlIjogMTYsICJtZXNzYWdlIjogIm5vdCBhdXRoZW50aWNhdGVkIiwgImRldGFpbHMiOiBbXSB9gtPkkwIUIg8vdjEvYXV0aC9zaWduaW46ASpCnwJaLGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdXRokkHtARIcChVCdWNrZXRlZXIgV2ViIFNlcnZpY2UyAzEuMBoIRU5EUE9JTlQqAQIyEGFwcGxpY2F0aW9uL2pzb246EGFwcGxpY2F0aW9uL2pzb25SiQEKAzUwMxKBAQodUmV0dXJuZWQgZm9yIGludGVybmFsIGVycm9ycy4SFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXMiSAoQYXBwbGljYXRpb24vanNvbhI0eyAiY29kZSI6IDEzLCAibWVzc2FnZSI6ICJpbnRlcm5hbCIsICJkZXRhaWxzIjogW10gfWoQCg5BdXRoZW50aWNhdGlvbmIGcHJvdG8z @@ -31,11 +112,15 @@ envoy: accountDescriptor: CrkDCiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IrsCCg1FbnZpcm9ubWVudFYyEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIdCgpwcm9qZWN0X2lkGAUgASgJUglwcm9qZWN0SWQSGgoIYXJjaGl2ZWQYBiABKAhSCGFyY2hpdmVkEh0KCmNyZWF0ZWRfYXQYByABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAggASgDUgl1cGRhdGVkQXQSJwoPb3JnYW5pemF0aW9uX2lkGAkgASgJUg5vcmdhbml6YXRpb25JZBInCg9yZXF1aXJlX2NvbW1lbnQYCiABKAhSDnJlcXVpcmVDb21tZW50QjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCqIDCh9wcm90by9lbnZpcm9ubWVudC9wcm9qZWN0LnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQiqAIKB1Byb2plY3QSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSFAoFdHJpYWwYBCABKAhSBXRyaWFsEiMKDWNyZWF0b3JfZW1haWwYBSABKAlSDGNyZWF0b3JFbWFpbBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhIKBG5hbWUYCCABKAlSBG5hbWUSGQoIdXJsX2NvZGUYCSABKAlSB3VybENvZGUSJwoPb3JnYW5pemF0aW9uX2lkGAogASgJUg5vcmdhbml6YXRpb25JZEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwqdAwokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQingIKDE9yZ2FuaXphdGlvbhIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIUCgV0cmlhbBgHIAEoCFIFdHJpYWwSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBIhCgxzeXN0ZW1fYWRtaW4YCiABKAhSC3N5c3RlbUFkbWluQjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCtwOChtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxofcHJvdG8vZW52aXJvbm1lbnQvcHJvamVjdC5wcm90bxokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvIqsCCgdBY2NvdW50Eg4KAmlkGAEgASgJUgJpZBIUCgVlbWFpbBgCIAEoCVIFZW1haWwSEgoEbmFtZRgDIAEoCVIEbmFtZRIzCgRyb2xlGAQgASgOMh8uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudC5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCCABKAhSB2RlbGV0ZWQiOQoEUm9sZRIKCgZWSUVXRVIQABIKCgZFRElUT1IQARIJCgVPV05FUhACEg4KClVOQVNTSUdORUQQYzoCGAEi8QUKCUFjY291bnRWMhIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBInCg9vcmdhbml6YXRpb25faWQYBCABKAlSDm9yZ2FuaXphdGlvbklkElsKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxIaCghkaXNhYmxlZBgHIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBrXAQoEUm9sZSJZCgtFbnZpcm9ubWVudBIaChZFbnZpcm9ubWVudF9VTkFTU0lHTkVEEAASFgoSRW52aXJvbm1lbnRfVklFV0VSEAESFgoSRW52aXJvbm1lbnRfRURJVE9SEAIidAoMT3JnYW5pemF0aW9uEhsKF09yZ2FuaXphdGlvbl9VTkFTU0lHTkVEEAASFwoTT3JnYW5pemF0aW9uX01FTUJFUhABEhYKEk9yZ2FuaXphdGlvbl9BRE1JThACEhYKEk9yZ2FuaXphdGlvbl9PV05FUhADGnsKD0Vudmlyb25tZW50Um9sZRIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBJBCgRyb2xlGAIgASgOMi0uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuRW52aXJvbm1lbnRSBHJvbGUi4AQKDkNvbnNvbGVBY2NvdW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCmF2YXRhcl91cmwYAyABKAlSCWF2YXRhclVybBImCg9pc19zeXN0ZW1fYWRtaW4YBCABKAhSDWlzU3lzdGVtQWRtaW4SRwoMb3JnYW5pemF0aW9uGAUgASgLMiMuYnVja2V0ZWVyLmVudmlyb25tZW50Lk9yZ2FuaXphdGlvblIMb3JnYW5pemF0aW9uElsKEW9yZ2FuaXphdGlvbl9yb2xlGAYgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlEl4KEWVudmlyb25tZW50X3JvbGVzGAcgAygLMjEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnQuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzGtYBCg9FbnZpcm9ubWVudFJvbGUSRgoLZW52aXJvbm1lbnQYASABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQSOAoHcHJvamVjdBgCIAEoCzIeLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Qcm9qZWN0Ugdwcm9qZWN0EkEKBHJvbGUYAyABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5FbnZpcm9ubWVudFIEcm9sZUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCpMGChtwcm90by9hY2NvdW50L2FwaV9rZXkucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90byK1AgoGQVBJS2V5Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEjIKBHJvbGUYAyABKA4yHi5idWNrZXRlZXIuYWNjb3VudC5BUElLZXkuUm9sZVIEcm9sZRIaCghkaXNhYmxlZBgEIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdCJ5CgRSb2xlEgsKB1VOS05PV04QABIOCgpTREtfQ0xJRU5UEAESDgoKU0RLX1NFUlZFUhACEhgKFFBVQkxJQ19BUElfUkVBRF9PTkxZEAMSFAoQUFVCTElDX0FQSV9XUklURRAEEhQKEFBVQkxJQ19BUElfQURNSU4QBSLIAgoRRW52aXJvbm1lbnRBUElLZXkSNwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJQgIYAVIUZW52aXJvbm1lbnROYW1lc3BhY2USMgoHYXBpX2tleRgCIAEoCzIZLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleVIGYXBpS2V5EjEKFGVudmlyb25tZW50X2Rpc2FibGVkGAMgASgIUhNlbnZpcm9ubWVudERpc2FibGVkEiEKCnByb2plY3RfaWQYBCABKAlCAhgBUglwcm9qZWN0SWQSRgoLZW52aXJvbm1lbnQYBSABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQSKAoQcHJvamVjdF91cmxfY29kZRgGIAEoCVIOcHJvamVjdFVybENvZGVCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwryCQobcHJvdG8vYWNjb3VudC9jb21tYW5kLnByb3RvEhFidWNrZXRlZXIuYWNjb3VudBobcHJvdG8vYWNjb3VudC9hY2NvdW50LnByb3RvGhtwcm90by9hY2NvdW50L2FwaV9rZXkucHJvdG8ipAIKFkNyZWF0ZUFjY291bnRWMkNvbW1hbmQSFAoFZW1haWwYASABKAlSBWVtYWlsEhIKBG5hbWUYAiABKAlSBG5hbWUSKAoQYXZhdGFyX2ltYWdlX3VybBgDIAEoCVIOYXZhdGFySW1hZ2VVcmwSWwoRb3JnYW5pemF0aW9uX3JvbGUYBCABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUSWQoRZW52aXJvbm1lbnRfcm9sZXMYBSADKAsyLC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzIjAKGkNoYW5nZUFjY291bnRWMk5hbWVDb21tYW5kEhIKBG5hbWUYASABKAlSBG5hbWUiUAokQ2hhbmdlQWNjb3VudFYyQXZhdGFySW1hZ2VVcmxDb21tYW5kEigKEGF2YXRhcl9pbWFnZV91cmwYASABKAlSDmF2YXRhckltYWdlVXJsImwKJkNoYW5nZUFjY291bnRWMk9yZ2FuaXphdGlvblJvbGVDb21tYW5kEkIKBHJvbGUYASABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SBHJvbGUipQIKJkNoYW5nZUFjY291bnRWMkVudmlyb25tZW50Um9sZXNDb21tYW5kEkIKBXJvbGVzGAEgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIFcm9sZXMSYgoKd3JpdGVfdHlwZRgCIAEoDjJDLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMkVudmlyb25tZW50Um9sZXNDb21tYW5kLldyaXRlVHlwZVIJd3JpdGVUeXBlIlMKCVdyaXRlVHlwZRIZChVXcml0ZVR5cGVfVU5TUEVDSUZJRUQQABIWChJXcml0ZVR5cGVfT1ZFUlJJREUQARITCg9Xcml0ZVR5cGVfUEFUQ0gQAiIYChZFbmFibGVBY2NvdW50VjJDb21tYW5kIhkKF0Rpc2FibGVBY2NvdW50VjJDb21tYW5kIhgKFkRlbGV0ZUFjY291bnRWMkNvbW1hbmQiXQoTQ3JlYXRlQVBJS2V5Q29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lEjIKBHJvbGUYAiABKA4yHi5idWNrZXRlZXIuYWNjb3VudC5BUElLZXkuUm9sZVIEcm9sZSItChdDaGFuZ2VBUElLZXlOYW1lQ29tbWFuZBISCgRuYW1lGAEgASgJUgRuYW1lIhUKE0VuYWJsZUFQSUtleUNvbW1hbmQiFgoURGlzYWJsZUFQSUtleUNvbW1hbmRCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwqGBAoeZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvEg9nb29nbGUucHJvdG9idWYiIwoLRG91YmxlVmFsdWUSFAoFdmFsdWUYASABKAFSBXZhbHVlIiIKCkZsb2F0VmFsdWUSFAoFdmFsdWUYASABKAJSBXZhbHVlIiIKCkludDY0VmFsdWUSFAoFdmFsdWUYASABKANSBXZhbHVlIiMKC1VJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgEUgV2YWx1ZSIiCgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZSIjCgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWUiIQoJQm9vbFZhbHVlEhQKBXZhbHVlGAEgASgIUgV2YWx1ZSIjCgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUiIgoKQnl0ZXNWYWx1ZRIUCgV2YWx1ZRgBIAEoDFIFdmFsdWVCgwEKE2NvbS5nb29nbGUucHJvdG9idWZCDVdyYXBwZXJzUHJvdG9QAVoxZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vd3JhcHBlcnNwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCoQ2Chtwcm90by9hY2NvdW50L3NlcnZpY2UucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50Gh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aG3Byb3RvL2FjY291bnQvYWNjb3VudC5wcm90bxobcHJvdG8vYWNjb3VudC9hcGlfa2V5LnByb3RvGhtwcm90by9hY2NvdW50L2NvbW1hbmQucHJvdG8aJHByb3RvL2Vudmlyb25tZW50L29yZ2FuaXphdGlvbi5wcm90byI3CgxHZXRNZVJlcXVlc3QSJwoPb3JnYW5pemF0aW9uX2lkGAEgASgJUg5vcmdhbml6YXRpb25JZCJMCg1HZXRNZVJlc3BvbnNlEjsKB2FjY291bnQYASABKAsyIS5idWNrZXRlZXIuYWNjb3VudC5Db25zb2xlQWNjb3VudFIHYWNjb3VudCIbChlHZXRNeU9yZ2FuaXphdGlvbnNSZXF1ZXN0IjgKIEdldE15T3JnYW5pemF0aW9uc0J5RW1haWxSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbCJnChpHZXRNeU9yZ2FuaXphdGlvbnNSZXNwb25zZRJJCg1vcmdhbml6YXRpb25zGAEgAygLMiMuYnVja2V0ZWVyLmVudmlyb25tZW50Lk9yZ2FuaXphdGlvblINb3JnYW5pemF0aW9ucyKGAQoWQ3JlYXRlQWNjb3VudFYyUmVxdWVzdBInCg9vcmdhbml6YXRpb25faWQYASABKAlSDm9yZ2FuaXphdGlvbklkEkMKB2NvbW1hbmQYAiABKAsyKS5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBY2NvdW50VjJDb21tYW5kUgdjb21tYW5kIlEKF0NyZWF0ZUFjY291bnRWMlJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQinAEKFkVuYWJsZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSQwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFjY291bnRWMkNvbW1hbmRSB2NvbW1hbmQiGQoXRW5hYmxlQWNjb3VudFYyUmVzcG9uc2UingEKF0Rpc2FibGVBY2NvdW50VjJSZXF1ZXN0EhQKBWVtYWlsGAEgASgJUgVlbWFpbBInCg9vcmdhbml6YXRpb25faWQYAiABKAlSDm9yZ2FuaXphdGlvbklkEkQKB2NvbW1hbmQYAyABKAsyKi5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQWNjb3VudFYyQ29tbWFuZFIHY29tbWFuZCIaChhEaXNhYmxlQWNjb3VudFYyUmVzcG9uc2UinAEKFkRlbGV0ZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSQwoHY29tbWFuZBgDIAEoCzIpLmJ1Y2tldGVlci5hY2NvdW50LkRlbGV0ZUFjY291bnRWMkNvbW1hbmRSB2NvbW1hbmQiGQoXRGVsZXRlQWNjb3VudFYyUmVzcG9uc2UitAQKFlVwZGF0ZUFjY291bnRWMlJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEicKD29yZ2FuaXphdGlvbl9pZBgCIAEoCVIOb3JnYW5pemF0aW9uSWQSXQoTY2hhbmdlX25hbWVfY29tbWFuZBgDIAEoCzItLmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMk5hbWVDb21tYW5kUhFjaGFuZ2VOYW1lQ29tbWFuZBJyChljaGFuZ2VfYXZhdGFyX3VybF9jb21tYW5kGAQgASgLMjcuYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQWNjb3VudFYyQXZhdGFySW1hZ2VVcmxDb21tYW5kUhZjaGFuZ2VBdmF0YXJVcmxDb21tYW5kEoIBCiBjaGFuZ2Vfb3JnYW5pemF0aW9uX3JvbGVfY29tbWFuZBgFIAEoCzI5LmJ1Y2tldGVlci5hY2NvdW50LkNoYW5nZUFjY291bnRWMk9yZ2FuaXphdGlvblJvbGVDb21tYW5kUh1jaGFuZ2VPcmdhbml6YXRpb25Sb2xlQ29tbWFuZBKCAQogY2hhbmdlX2Vudmlyb25tZW50X3JvbGVzX2NvbW1hbmQYBiABKAsyOS5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBY2NvdW50VjJFbnZpcm9ubWVudFJvbGVzQ29tbWFuZFIdY2hhbmdlRW52aXJvbm1lbnRSb2xlc0NvbW1hbmQiGQoXVXBkYXRlQWNjb3VudFYyUmVzcG9uc2UiVAoTR2V0QWNjb3VudFYyUmVxdWVzdBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSJwoPb3JnYW5pemF0aW9uX2lkGAIgASgJUg5vcmdhbml6YXRpb25JZCJOChRHZXRBY2NvdW50VjJSZXNwb25zZRI2CgdhY2NvdW50GAEgASgLMhwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyUgdhY2NvdW50ImEKIkdldEFjY291bnRWMkJ5RW52aXJvbm1lbnRJRFJlcXVlc3QSFAoFZW1haWwYASABKAlSBWVtYWlsEiUKDmVudmlyb25tZW50X2lkGAIgASgJUg1lbnZpcm9ubWVudElkIl0KI0dldEFjY291bnRWMkJ5RW52aXJvbm1lbnRJRFJlc3BvbnNlEjYKB2FjY291bnQYASABKAsyHC5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjJSB2FjY291bnQiwgUKFUxpc3RBY2NvdW50c1YyUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEicKD29yZ2FuaXphdGlvbl9pZBgDIAEoCVIOb3JnYW5pemF0aW9uSWQSSwoIb3JkZXJfYnkYBCABKA4yMC5idWNrZXRlZXIuYWNjb3VudC5MaXN0QWNjb3VudHNWMlJlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJgCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNy5idWNrZXRlZXIuYWNjb3VudC5MaXN0QWNjb3VudHNWMlJlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAYgASgJUg1zZWFyY2hLZXl3b3JkEjYKCGRpc2FibGVkGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVIIZGlzYWJsZWQSSAoRb3JnYW5pemF0aW9uX3JvbGUYCCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIQb3JnYW5pemF0aW9uUm9sZRJDCg5lbnZpcm9ubWVudF9pZBgJIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVINZW52aXJvbm1lbnRJZBJGChBlbnZpcm9ubWVudF9yb2xlGAogASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSD2Vudmlyb25tZW50Um9sZSJBCgdPcmRlckJ5EgsKB0RFRkFVTFQQABIJCgVFTUFJTBABEg4KCkNSRUFURURfQVQQAhIOCgpVUERBVEVEX0FUEAMiIwoOT3JkZXJEaXJlY3Rpb24SBwoDQVNDEAASCAoEREVTQxABIosBChZMaXN0QWNjb3VudHNWMlJlc3BvbnNlEjgKCGFjY291bnRzGAEgAygLMhwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyUghhY2NvdW50cxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudCKMAQoTQ3JlYXRlQVBJS2V5UmVxdWVzdBJACgdjb21tYW5kGAEgASgLMiYuYnVja2V0ZWVyLmFjY291bnQuQ3JlYXRlQVBJS2V5Q29tbWFuZFIHY29tbWFuZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAiABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIkoKFENyZWF0ZUFQSUtleVJlc3BvbnNlEjIKB2FwaV9rZXkYASABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleSKkAQoXQ2hhbmdlQVBJS2V5TmFtZVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkQKB2NvbW1hbmQYAiABKAsyKi5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBUElLZXlOYW1lQ29tbWFuZFIHY29tbWFuZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIhoKGENoYW5nZUFQSUtleU5hbWVSZXNwb25zZSKcAQoTRW5hYmxlQVBJS2V5UmVxdWVzdBIOCgJpZBgBIAEoCVICaWQSQAoHY29tbWFuZBgCIAEoCzImLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleUNvbW1hbmRSB2NvbW1hbmQSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAMgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZSIWChRFbmFibGVBUElLZXlSZXNwb25zZSKeAQoURGlzYWJsZUFQSUtleVJlcXVlc3QSDgoCaWQYASABKAlSAmlkEkEKB2NvbW1hbmQYAiABKAsyJy5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQVBJS2V5Q29tbWFuZFIHY29tbWFuZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIhcKFURpc2FibGVBUElLZXlSZXNwb25zZSJXChBHZXRBUElLZXlSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAiABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIkcKEUdldEFQSUtleVJlc3BvbnNlEjIKB2FwaV9rZXkYASABKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSBmFwaUtleSLtAwoSTGlzdEFQSUtleXNSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAMgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRJICghvcmRlcl9ieRgEIAEoDjItLmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5El0KD29yZGVyX2RpcmVjdGlvbhgFIAEoDjI0LmJ1Y2tldGVlci5hY2NvdW50Lkxpc3RBUElLZXlzUmVxdWVzdC5PcmRlckRpcmVjdGlvblIOb3JkZXJEaXJlY3Rpb24SJQoOc2VhcmNoX2tleXdvcmQYBiABKAlSDXNlYXJjaEtleXdvcmQSNgoIZGlzYWJsZWQYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlUghkaXNhYmxlZCJACgdPcmRlckJ5EgsKB0RFRkFVTFQQABIICgROQU1FEAESDgoKQ1JFQVRFRF9BVBACEg4KClVQREFURURfQVQQAyIjCg5PcmRlckRpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAEihAEKE0xpc3RBUElLZXlzUmVzcG9uc2USNAoIYXBpX2tleXMYASADKAsyGS5idWNrZXRlZXIuYWNjb3VudC5BUElLZXlSB2FwaUtleXMSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISHwoLdG90YWxfY291bnQYAyABKANSCnRvdGFsQ291bnQiPAoqR2V0QVBJS2V5QnlTZWFyY2hpbmdBbGxFbnZpcm9ubWVudHNSZXF1ZXN0Eg4KAmlkGAEgASgJUgJpZCKDAQorR2V0QVBJS2V5QnlTZWFyY2hpbmdBbGxFbnZpcm9ubWVudHNSZXNwb25zZRJUChNlbnZpcm9ubWVudF9hcGlfa2V5GAEgASgLMiQuYnVja2V0ZWVyLmFjY291bnQuRW52aXJvbm1lbnRBUElLZXlSEWVudmlyb25tZW50QXBpS2V5MqwPCg5BY2NvdW50U2VydmljZRJKCgVHZXRNZRIfLmJ1Y2tldGVlci5hY2NvdW50LkdldE1lUmVxdWVzdBogLmJ1Y2tldGVlci5hY2NvdW50LkdldE1lUmVzcG9uc2UScQoSR2V0TXlPcmdhbml6YXRpb25zEiwuYnVja2V0ZWVyLmFjY291bnQuR2V0TXlPcmdhbml6YXRpb25zUmVxdWVzdBotLmJ1Y2tldGVlci5hY2NvdW50LkdldE15T3JnYW5pemF0aW9uc1Jlc3BvbnNlEn8KGUdldE15T3JnYW5pemF0aW9uc0J5RW1haWwSMy5idWNrZXRlZXIuYWNjb3VudC5HZXRNeU9yZ2FuaXphdGlvbnNCeUVtYWlsUmVxdWVzdBotLmJ1Y2tldGVlci5hY2NvdW50LkdldE15T3JnYW5pemF0aW9uc1Jlc3BvbnNlEmgKD0NyZWF0ZUFjY291bnRWMhIpLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFjY291bnRWMlJlcXVlc3QaKi5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBY2NvdW50VjJSZXNwb25zZRJoCg9FbmFibGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5FbmFibGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuRW5hYmxlQWNjb3VudFYyUmVzcG9uc2USawoQRGlzYWJsZUFjY291bnRWMhIqLmJ1Y2tldGVlci5hY2NvdW50LkRpc2FibGVBY2NvdW50VjJSZXF1ZXN0GisuYnVja2V0ZWVyLmFjY291bnQuRGlzYWJsZUFjY291bnRWMlJlc3BvbnNlEmgKD1VwZGF0ZUFjY291bnRWMhIpLmJ1Y2tldGVlci5hY2NvdW50LlVwZGF0ZUFjY291bnRWMlJlcXVlc3QaKi5idWNrZXRlZXIuYWNjb3VudC5VcGRhdGVBY2NvdW50VjJSZXNwb25zZRJoCg9EZWxldGVBY2NvdW50VjISKS5idWNrZXRlZXIuYWNjb3VudC5EZWxldGVBY2NvdW50VjJSZXF1ZXN0GiouYnVja2V0ZWVyLmFjY291bnQuRGVsZXRlQWNjb3VudFYyUmVzcG9uc2USXwoMR2V0QWNjb3VudFYyEiYuYnVja2V0ZWVyLmFjY291bnQuR2V0QWNjb3VudFYyUmVxdWVzdBonLmJ1Y2tldGVlci5hY2NvdW50LkdldEFjY291bnRWMlJlc3BvbnNlEowBChtHZXRBY2NvdW50VjJCeUVudmlyb25tZW50SUQSNS5idWNrZXRlZXIuYWNjb3VudC5HZXRBY2NvdW50VjJCeUVudmlyb25tZW50SURSZXF1ZXN0GjYuYnVja2V0ZWVyLmFjY291bnQuR2V0QWNjb3VudFYyQnlFbnZpcm9ubWVudElEUmVzcG9uc2USZQoOTGlzdEFjY291bnRzVjISKC5idWNrZXRlZXIuYWNjb3VudC5MaXN0QWNjb3VudHNWMlJlcXVlc3QaKS5idWNrZXRlZXIuYWNjb3VudC5MaXN0QWNjb3VudHNWMlJlc3BvbnNlEl8KDENyZWF0ZUFQSUtleRImLmJ1Y2tldGVlci5hY2NvdW50LkNyZWF0ZUFQSUtleVJlcXVlc3QaJy5idWNrZXRlZXIuYWNjb3VudC5DcmVhdGVBUElLZXlSZXNwb25zZRJrChBDaGFuZ2VBUElLZXlOYW1lEiouYnVja2V0ZWVyLmFjY291bnQuQ2hhbmdlQVBJS2V5TmFtZVJlcXVlc3QaKy5idWNrZXRlZXIuYWNjb3VudC5DaGFuZ2VBUElLZXlOYW1lUmVzcG9uc2USXwoMRW5hYmxlQVBJS2V5EiYuYnVja2V0ZWVyLmFjY291bnQuRW5hYmxlQVBJS2V5UmVxdWVzdBonLmJ1Y2tldGVlci5hY2NvdW50LkVuYWJsZUFQSUtleVJlc3BvbnNlEmIKDURpc2FibGVBUElLZXkSJy5idWNrZXRlZXIuYWNjb3VudC5EaXNhYmxlQVBJS2V5UmVxdWVzdBooLmJ1Y2tldGVlci5hY2NvdW50LkRpc2FibGVBUElLZXlSZXNwb25zZRJWCglHZXRBUElLZXkSIy5idWNrZXRlZXIuYWNjb3VudC5HZXRBUElLZXlSZXF1ZXN0GiQuYnVja2V0ZWVyLmFjY291bnQuR2V0QVBJS2V5UmVzcG9uc2USXAoLTGlzdEFQSUtleXMSJS5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1JlcXVlc3QaJi5idWNrZXRlZXIuYWNjb3VudC5MaXN0QVBJS2V5c1Jlc3BvbnNlEqQBCiNHZXRBUElLZXlCeVNlYXJjaGluZ0FsbEVudmlyb25tZW50cxI9LmJ1Y2tldGVlci5hY2NvdW50LkdldEFQSUtleUJ5U2VhcmNoaW5nQWxsRW52aXJvbm1lbnRzUmVxdWVzdBo+LmJ1Y2tldGVlci5hY2NvdW50LkdldEFQSUtleUJ5U2VhcmNoaW5nQWxsRW52aXJvbm1lbnRzUmVzcG9uc2VCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMw== experimentcalculatorDescriptor: CtYBCh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiZwoJVmFyaWF0aW9uEg4KAmlkGAEgASgJUgJpZBIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUSEgoEbmFtZRgDIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb25CMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq8BwohcHJvdG8vZXhwZXJpbWVudC9leHBlcmltZW50LnByb3RvEhRidWNrZXRlZXIuZXhwZXJpbWVudBodcHJvdG8vZmVhdHVyZS92YXJpYXRpb24ucHJvdG8i0AUKCkV4cGVyaW1lbnQSDgoCaWQYASABKAlSAmlkEhsKB2dvYWxfaWQYAiABKAlCAhgBUgZnb2FsSWQSHQoKZmVhdHVyZV9pZBgDIAEoCVIJZmVhdHVyZUlkEicKD2ZlYXR1cmVfdmVyc2lvbhgEIAEoBVIOZmVhdHVyZVZlcnNpb24SPAoKdmFyaWF0aW9ucxgFIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIZCghzdGFydF9hdBgGIAEoA1IHc3RhcnRBdBIXCgdzdG9wX2F0GAcgASgDUgZzdG9wQXQSHAoHc3RvcHBlZBgIIAEoCEICGAFSB3N0b3BwZWQSIQoKc3RvcHBlZF9hdBgJIAEoA0ICMAFSCXN0b3BwZWRBdBIdCgpjcmVhdGVkX2F0GAogASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgLIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYDCABKAhSB2RlbGV0ZWQSGQoIZ29hbF9pZHMYDSADKAlSB2dvYWxJZHMSEgoEbmFtZRgOIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgPIAEoCVILZGVzY3JpcHRpb24SKgoRYmFzZV92YXJpYXRpb25faWQYECABKAlSD2Jhc2VWYXJpYXRpb25JZBI/CgZzdGF0dXMYEiABKA4yJy5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50LlN0YXR1c1IGc3RhdHVzEh4KCm1haW50YWluZXIYEyABKAlSCm1haW50YWluZXISGgoIYXJjaGl2ZWQYFCABKAhSCGFyY2hpdmVkIkIKBlN0YXR1cxILCgdXQUlUSU5HEAASCwoHUlVOTklORxABEgsKB1NUT1BQRUQQAhIRCg1GT1JDRV9TVE9QUEVEEANKBAgREBIiUQoLRXhwZXJpbWVudHMSQgoLZXhwZXJpbWVudHMYASADKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgtleHBlcmltZW50c0I0WjJnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZXhwZXJpbWVudGIGcHJvdG8zCuADCihwcm90by9leHBlcmltZW50Y2FsY3VsYXRvci9zZXJ2aWNlLnByb3RvEh5idWNrZXRlZXIuZXhwZXJpbWVudGNhbGN1bGF0b3IaIXByb3RvL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5wcm90byJ7ChBCYXRjaENhbGNSZXF1ZXN0EiUKDmVudmlyb25tZW50X2lkGAEgASgJUg1lbnZpcm9ubWVudElkEkAKCmV4cGVyaW1lbnQYAiABKAsyIC5idWNrZXRlZXIuZXhwZXJpbWVudC5FeHBlcmltZW50UgpleHBlcmltZW50IhMKEUJhdGNoQ2FsY1Jlc3BvbnNlMpYBChtFeHBlcmltZW50Q2FsY3VsYXRvclNlcnZpY2USdwoOQ2FsY0V4cGVyaW1lbnQSMC5idWNrZXRlZXIuZXhwZXJpbWVudGNhbGN1bGF0b3IuQmF0Y2hDYWxjUmVxdWVzdBoxLmJ1Y2tldGVlci5leHBlcmltZW50Y2FsY3VsYXRvci5CYXRjaENhbGNSZXNwb25zZSIAQj5aPGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9leHBlcmltZW50Y2FsY3VsYXRvcmIGcHJvdG8z auditlogDescriptor: CuQBChlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvEg9nb29nbGUucHJvdG9idWYiNgoDQW55EhkKCHR5cGVfdXJsGAEgASgJUgd0eXBlVXJsEhQKBXZhbHVlGAIgASgMUgV2YWx1ZUJ2ChNjb20uZ29vZ2xlLnByb3RvYnVmQghBbnlQcm90b1ABWixnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9hbnlwYqICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCoYECh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIjCgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWUiIgoKRmxvYXRWYWx1ZRIUCgV2YWx1ZRgBIAEoAlIFdmFsdWUiIgoKSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoA1IFdmFsdWUiIwoLVUludDY0VmFsdWUSFAoFdmFsdWUYASABKARSBXZhbHVlIiIKCkludDMyVmFsdWUSFAoFdmFsdWUYASABKAVSBXZhbHVlIiMKC1VJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgNUgV2YWx1ZSIhCglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVlIiMKC1N0cmluZ1ZhbHVlEhQKBXZhbHVlGAEgASgJUgV2YWx1ZSIiCgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZUKDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINV3JhcHBlcnNQcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi93cmFwcGVyc3Bi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKsgMKGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSLFAgoGQ2xhdXNlEg4KAmlkGAEgASgJUgJpZBIcCglhdHRyaWJ1dGUYAiABKAlSCWF0dHJpYnV0ZRI+CghvcGVyYXRvchgDIAEoDjIiLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3ISFgoGdmFsdWVzGAQgAygJUgZ2YWx1ZXMitAEKCE9wZXJhdG9yEgoKBkVRVUFMUxAAEgYKAklOEAESDQoJRU5EU19XSVRIEAISDwoLU1RBUlRTX1dJVEgQAxILCgdTRUdNRU5UEAQSCwoHR1JFQVRFUhAFEhQKEEdSRUFURVJfT1JfRVFVQUwQBhIICgRMRVNTEAcSEQoNTEVTU19PUl9FUVVBTBAIEgoKBkJFRk9SRRAJEgkKBUFGVEVSEAoSEAoMRkVBVFVSRV9GTEFHEAtCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2ZlYXR1cmViBnByb3RvMwq7BAoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiLQoNRml4ZWRTdHJhdGVneRIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbiKiAQoPUm9sbG91dFN0cmF0ZWd5EkwKCnZhcmlhdGlvbnMYASADKAsyLC5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3kuVmFyaWF0aW9uUgp2YXJpYXRpb25zGkEKCVZhcmlhdGlvbhIcCgl2YXJpYXRpb24YASABKAlSCXZhcmlhdGlvbhIWCgZ3ZWlnaHQYAiABKAVSBndlaWdodCL4AQoIU3RyYXRlZ3kSNAoEdHlwZRgBIAEoDjIgLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5LlR5cGVSBHR5cGUSRwoOZml4ZWRfc3RyYXRlZ3kYAiABKAsyIC5idWNrZXRlZXIuZmVhdHVyZS5GaXhlZFN0cmF0ZWd5Ug1maXhlZFN0cmF0ZWd5Ek0KEHJvbGxvdXRfc3RyYXRlZ3kYAyABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3lSD3JvbGxvdXRTdHJhdGVneSIeCgRUeXBlEgkKBUZJWEVEEAASCwoHUk9MTE9VVBABQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqQIKGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGnByb3RvL2ZlYXR1cmUvY2xhdXNlLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvIoQBCgRSdWxlEg4KAmlkGAEgASgJUgJpZBI3CghzdHJhdGVneRgCIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneRIzCgdjbGF1c2VzGAMgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgdjbGF1c2VzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqAEKGnByb3RvL2ZlYXR1cmUvdGFyZ2V0LnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSI8CgZUYXJnZXQSHAoJdmFyaWF0aW9uGAEgASgJUgl2YXJpYXRpb24SFAoFdXNlcnMYAiADKAlSBXVzZXJzQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMK1gEKHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvEhFidWNrZXRlZXIuZmVhdHVyZSJnCglWYXJpYXRpb24SDgoCaWQYASABKAlSAmlkEhQKBXZhbHVlGAIgASgJUgV2YWx1ZRISCgRuYW1lGAMgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCvQCCipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlIvcBChNGZWF0dXJlTGFzdFVzZWRJbmZvEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIYCgd2ZXJzaW9uGAIgASgFUgd2ZXJzaW9uEiAKDGxhc3RfdXNlZF9hdBgDIAEoA1IKbGFzdFVzZWRBdBIdCgpjcmVhdGVkX2F0GAQgASgDUgljcmVhdGVkQXQSMgoVY2xpZW50X29sZGVzdF92ZXJzaW9uGAUgASgJUhNjbGllbnRPbGRlc3RWZXJzaW9uEjIKFWNsaWVudF9sYXRlc3RfdmVyc2lvbhgGIAEoCVITY2xpZW50TGF0ZXN0VmVyc2lvbkIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCsIBCiBwcm90by9mZWF0dXJlL3ByZXJlcXVpc2l0ZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUiUAoMUHJlcmVxdWlzaXRlEh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKqgsKG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUaGHByb3RvL2ZlYXR1cmUvcnVsZS5wcm90bxoacHJvdG8vZmVhdHVyZS90YXJnZXQucHJvdG8aHXByb3RvL2ZlYXR1cmUvdmFyaWF0aW9uLnByb3RvGhxwcm90by9mZWF0dXJlL3N0cmF0ZWd5LnByb3RvGipwcm90by9mZWF0dXJlL2ZlYXR1cmVfbGFzdF91c2VkX2luZm8ucHJvdG8aIHByb3RvL2ZlYXR1cmUvcHJlcmVxdWlzaXRlLnByb3RvItIHCgdGZWF0dXJlEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEiAKC2Rlc2NyaXB0aW9uGAMgASgJUgtkZXNjcmlwdGlvbhIYCgdlbmFibGVkGAQgASgIUgdlbmFibGVkEhgKB2RlbGV0ZWQYBSABKAhSB2RlbGV0ZWQSOQoWZXZhbHVhdGlvbl91bmRlbGF5YWJsZRgGIAEoCEICGAFSFWV2YWx1YXRpb25VbmRlbGF5YWJsZRIQCgN0dGwYByABKAVSA3R0bBIYCgd2ZXJzaW9uGAggASgFUgd2ZXJzaW9uEh0KCmNyZWF0ZWRfYXQYCSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAogASgDUgl1cGRhdGVkQXQSPAoKdmFyaWF0aW9ucxgLIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIzCgd0YXJnZXRzGAwgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGA0gAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgOIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSIwoNb2ZmX3ZhcmlhdGlvbhgPIAEoCVIMb2ZmVmFyaWF0aW9uEhIKBHRhZ3MYECADKAlSBHRhZ3MSTAoObGFzdF91c2VkX2luZm8YESABKAsyJi5idWNrZXRlZXIuZmVhdHVyZS5GZWF0dXJlTGFzdFVzZWRJbmZvUgxsYXN0VXNlZEluZm8SHgoKbWFpbnRhaW5lchgSIAEoCVIKbWFpbnRhaW5lchJPCg52YXJpYXRpb25fdHlwZRgTIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRIaCghhcmNoaXZlZBgUIAEoCFIIYXJjaGl2ZWQSRQoNcHJlcmVxdWlzaXRlcxgVIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcxIjCg1zYW1wbGluZ19zZWVkGBYgASgJUgxzYW1wbGluZ1NlZWQiPgoNVmFyaWF0aW9uVHlwZRIKCgZTVFJJTkcQABILCgdCT09MRUFOEAESCgoGTlVNQkVSEAISCAoESlNPThADIlIKCEZlYXR1cmVzEjYKCGZlYXR1cmVzGAEgAygLMhouYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZVIIZmVhdHVyZXMSDgoCaWQYAiABKAlSAmlkIlMKA1RhZxIOCgJpZBgBIAEoCVICaWQSHQoKY3JlYXRlZF9hdBgCIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYAyABKANSCXVwZGF0ZWRBdEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCrUIChtwcm90by9mZWF0dXJlL3NlZ21lbnQucHJvdG8SEWJ1Y2tldGVlci5mZWF0dXJlGhhwcm90by9mZWF0dXJlL3J1bGUucHJvdG8aG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90byK0BAoHU2VnbWVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SLQoFcnVsZXMYBCADKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgVydWxlcxIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0EhwKB3ZlcnNpb24YByABKANCAhgBUgd2ZXJzaW9uEhgKB2RlbGV0ZWQYCCABKAhSB2RlbGV0ZWQSLgoTaW5jbHVkZWRfdXNlcl9jb3VudBgJIAEoA1IRaW5jbHVkZWRVc2VyQ291bnQSMgoTZXhjbHVkZWRfdXNlcl9jb3VudBgKIAEoA0ICGAFSEWV4Y2x1ZGVkVXNlckNvdW50EjkKBnN0YXR1cxgLIAEoDjIhLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnQuU3RhdHVzUgZzdGF0dXMSJwoQaXNfaW5fdXNlX3N0YXR1cxgMIAEoCFINaXNJblVzZVN0YXR1cxI2CghmZWF0dXJlcxgNIAMoCzIaLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmVSCGZlYXR1cmVzIj4KBlN0YXR1cxILCgdJTklUSUFMEAASDQoJVVBMT0FESU5HEAESDAoIU1VDRUVERUQQAhIKCgZGQUlMRUQQAyLUAQoLU2VnbWVudFVzZXISDgoCaWQYASABKAlSAmlkEh0KCnNlZ21lbnRfaWQYAiABKAlSCXNlZ21lbnRJZBIXCgd1c2VyX2lkGAMgASgJUgZ1c2VySWQSOgoFc3RhdGUYBCABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUSGAoHZGVsZXRlZBgFIAEoCFIHZGVsZXRlZCInCgVTdGF0ZRIMCghJTkNMVURFRBAAEhAKCEVYQ0xVREVEEAEaAggBIoIBCgxTZWdtZW50VXNlcnMSHQoKc2VnbWVudF9pZBgBIAEoCVIJc2VnbWVudElkEjQKBXVzZXJzGAIgAygLMh4uYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXJSBXVzZXJzEh0KCnVwZGF0ZWRfYXQYAyABKANSCXVwZGF0ZWRBdEIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZmVhdHVyZWIGcHJvdG8zCrkDCiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxIVYnVja2V0ZWVyLmVudmlyb25tZW50IrsCCg1FbnZpcm9ubWVudFYyEg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEhkKCHVybF9jb2RlGAMgASgJUgd1cmxDb2RlEiAKC2Rlc2NyaXB0aW9uGAQgASgJUgtkZXNjcmlwdGlvbhIdCgpwcm9qZWN0X2lkGAUgASgJUglwcm9qZWN0SWQSGgoIYXJjaGl2ZWQYBiABKAhSCGFyY2hpdmVkEh0KCmNyZWF0ZWRfYXQYByABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAggASgDUgl1cGRhdGVkQXQSJwoPb3JnYW5pemF0aW9uX2lkGAkgASgJUg5vcmdhbml6YXRpb25JZBInCg9yZXF1aXJlX2NvbW1lbnQYCiABKAhSDnJlcXVpcmVDb21tZW50QjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCqIDCh9wcm90by9lbnZpcm9ubWVudC9wcm9qZWN0LnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQiqAIKB1Byb2plY3QSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSFAoFdHJpYWwYBCABKAhSBXRyaWFsEiMKDWNyZWF0b3JfZW1haWwYBSABKAlSDGNyZWF0b3JFbWFpbBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhIKBG5hbWUYCCABKAlSBG5hbWUSGQoIdXJsX2NvZGUYCSABKAlSB3VybENvZGUSJwoPb3JnYW5pemF0aW9uX2lkGAogASgJUg5vcmdhbml6YXRpb25JZEI1WjNnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vZW52aXJvbm1lbnRiBnByb3RvMwqdAwokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvEhVidWNrZXRlZXIuZW52aXJvbm1lbnQingIKDE9yZ2FuaXphdGlvbhIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIUCgV0cmlhbBgHIAEoCFIFdHJpYWwSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBIhCgxzeXN0ZW1fYWRtaW4YCiABKAhSC3N5c3RlbUFkbWluQjVaM2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9lbnZpcm9ubWVudGIGcHJvdG8zCtwOChtwcm90by9hY2NvdW50L2FjY291bnQucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90bxofcHJvdG8vZW52aXJvbm1lbnQvcHJvamVjdC5wcm90bxokcHJvdG8vZW52aXJvbm1lbnQvb3JnYW5pemF0aW9uLnByb3RvIqsCCgdBY2NvdW50Eg4KAmlkGAEgASgJUgJpZBIUCgVlbWFpbBgCIAEoCVIFZW1haWwSEgoEbmFtZRgDIAEoCVIEbmFtZRIzCgRyb2xlGAQgASgOMh8uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudC5Sb2xlUgRyb2xlEhoKCGRpc2FibGVkGAUgASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhgKB2RlbGV0ZWQYCCABKAhSB2RlbGV0ZWQiOQoEUm9sZRIKCgZWSUVXRVIQABIKCgZFRElUT1IQARIJCgVPV05FUhACEg4KClVOQVNTSUdORUQQYzoCGAEi8QUKCUFjY291bnRWMhIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBInCg9vcmdhbml6YXRpb25faWQYBCABKAlSDm9yZ2FuaXphdGlvbklkElsKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxIaCghkaXNhYmxlZBgHIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdBrXAQoEUm9sZSJZCgtFbnZpcm9ubWVudBIaChZFbnZpcm9ubWVudF9VTkFTU0lHTkVEEAASFgoSRW52aXJvbm1lbnRfVklFV0VSEAESFgoSRW52aXJvbm1lbnRfRURJVE9SEAIidAoMT3JnYW5pemF0aW9uEhsKF09yZ2FuaXphdGlvbl9VTkFTU0lHTkVEEAASFwoTT3JnYW5pemF0aW9uX01FTUJFUhABEhYKEk9yZ2FuaXphdGlvbl9BRE1JThACEhYKEk9yZ2FuaXphdGlvbl9PV05FUhADGnsKD0Vudmlyb25tZW50Um9sZRIlCg5lbnZpcm9ubWVudF9pZBgBIAEoCVINZW52aXJvbm1lbnRJZBJBCgRyb2xlGAIgASgOMi0uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuRW52aXJvbm1lbnRSBHJvbGUi4AQKDkNvbnNvbGVBY2NvdW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCmF2YXRhcl91cmwYAyABKAlSCWF2YXRhclVybBImCg9pc19zeXN0ZW1fYWRtaW4YBCABKAhSDWlzU3lzdGVtQWRtaW4SRwoMb3JnYW5pemF0aW9uGAUgASgLMiMuYnVja2V0ZWVyLmVudmlyb25tZW50Lk9yZ2FuaXphdGlvblIMb3JnYW5pemF0aW9uElsKEW9yZ2FuaXphdGlvbl9yb2xlGAYgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlEl4KEWVudmlyb25tZW50X3JvbGVzGAcgAygLMjEuYnVja2V0ZWVyLmFjY291bnQuQ29uc29sZUFjY291bnQuRW52aXJvbm1lbnRSb2xlUhBlbnZpcm9ubWVudFJvbGVzGtYBCg9FbnZpcm9ubWVudFJvbGUSRgoLZW52aXJvbm1lbnQYASABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQSOAoHcHJvamVjdBgCIAEoCzIeLmJ1Y2tldGVlci5lbnZpcm9ubWVudC5Qcm9qZWN0Ugdwcm9qZWN0EkEKBHJvbGUYAyABKA4yLS5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5FbnZpcm9ubWVudFIEcm9sZUIxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYWNjb3VudGIGcHJvdG8zCpMGChtwcm90by9hY2NvdW50L2FwaV9rZXkucHJvdG8SEWJ1Y2tldGVlci5hY2NvdW50GiNwcm90by9lbnZpcm9ubWVudC9lbnZpcm9ubWVudC5wcm90byK1AgoGQVBJS2V5Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEjIKBHJvbGUYAyABKA4yHi5idWNrZXRlZXIuYWNjb3VudC5BUElLZXkuUm9sZVIEcm9sZRIaCghkaXNhYmxlZBgEIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgFIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYBiABKANSCXVwZGF0ZWRBdCJ5CgRSb2xlEgsKB1VOS05PV04QABIOCgpTREtfQ0xJRU5UEAESDgoKU0RLX1NFUlZFUhACEhgKFFBVQkxJQ19BUElfUkVBRF9PTkxZEAMSFAoQUFVCTElDX0FQSV9XUklURRAEEhQKEFBVQkxJQ19BUElfQURNSU4QBSLIAgoRRW52aXJvbm1lbnRBUElLZXkSNwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAEgASgJQgIYAVIUZW52aXJvbm1lbnROYW1lc3BhY2USMgoHYXBpX2tleRgCIAEoCzIZLmJ1Y2tldGVlci5hY2NvdW50LkFQSUtleVIGYXBpS2V5EjEKFGVudmlyb25tZW50X2Rpc2FibGVkGAMgASgIUhNlbnZpcm9ubWVudERpc2FibGVkEiEKCnByb2plY3RfaWQYBCABKAlCAhgBUglwcm9qZWN0SWQSRgoLZW52aXJvbm1lbnQYBSABKAsyJC5idWNrZXRlZXIuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRWMlILZW52aXJvbm1lbnQSKAoQcHJvamVjdF91cmxfY29kZRgGIAEoCVIOcHJvamVjdFVybENvZGVCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2FjY291bnRiBnByb3RvMwqaCwoacHJvdG8vYXV0b29wcy9jbGF1c2UucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIoYBCgZDbGF1c2USDgoCaWQYASABKAlSAmlkEiwKBmNsYXVzZRgCIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSBmNsYXVzZRI+CgthY3Rpb25fdHlwZRgDIAEoDjIdLmJ1Y2tldGVlci5hdXRvb3BzLkFjdGlvblR5cGVSCmFjdGlvblR5cGUi3wIKEk9wc0V2ZW50UmF0ZUNsYXVzZRIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkEhcKB2dvYWxfaWQYAyABKAlSBmdvYWxJZBIbCgltaW5fY291bnQYBCABKANSCG1pbkNvdW50EikKEHRocmVhZHNob2xkX3JhdGUYBSABKAFSD3RocmVhZHNob2xkUmF0ZRJKCghvcGVyYXRvchgGIAEoDjIuLmJ1Y2tldGVlci5hdXRvb3BzLk9wc0V2ZW50UmF0ZUNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3ISPgoLYWN0aW9uX3R5cGUYByABKA4yHS5idWNrZXRlZXIuYXV0b29wcy5BY3Rpb25UeXBlUgphY3Rpb25UeXBlIjMKCE9wZXJhdG9yEhQKEEdSRUFURVJfT1JfRVFVQUwQABIRCg1MRVNTX09SX0VRVUFMEAFKBAgBEAIiZAoORGF0ZXRpbWVDbGF1c2USEgoEdGltZRgBIAEoA1IEdGltZRI+CgthY3Rpb25fdHlwZRgCIAEoDjIdLmJ1Y2tldGVlci5hdXRvb3BzLkFjdGlvblR5cGVSCmFjdGlvblR5cGUilwEKGlByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlEh8KC3NjaGVkdWxlX2lkGAEgASgJUgpzY2hlZHVsZUlkEh0KCmV4ZWN1dGVfYXQYAiABKANSCWV4ZWN1dGVBdBIWCgZ3ZWlnaHQYAyABKAVSBndlaWdodBIhCgx0cmlnZ2VyZWRfYXQYBCABKANSC3RyaWdnZXJlZEF0IpgBCiZQcm9ncmVzc2l2ZVJvbGxvdXRNYW51YWxTY2hlZHVsZUNsYXVzZRJLCglzY2hlZHVsZXMYASADKAsyLS5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXRTY2hlZHVsZVIJc2NoZWR1bGVzEiEKDHZhcmlhdGlvbl9pZBgCIAEoCVILdmFyaWF0aW9uSWQi2AIKKFByb2dyZXNzaXZlUm9sbG91dFRlbXBsYXRlU2NoZWR1bGVDbGF1c2USSwoJc2NoZWR1bGVzGAEgAygLMi0uYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0U2NoZWR1bGVSCXNjaGVkdWxlcxJgCghpbnRlcnZhbBgCIAEoDjJELmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dFRlbXBsYXRlU2NoZWR1bGVDbGF1c2UuSW50ZXJ2YWxSCGludGVydmFsEh4KCmluY3JlbWVudHMYAyABKANSCmluY3JlbWVudHMSIQoMdmFyaWF0aW9uX2lkGAQgASgJUgt2YXJpYXRpb25JZCI6CghJbnRlcnZhbBILCgdVTktOT1dOEAASCgoGSE9VUkxZEAESCQoFREFJTFkQAhIKCgZXRUVLTFkQAyoyCgpBY3Rpb25UeXBlEgsKB1VOS05PV04QABIKCgZFTkFCTEUQARILCgdESVNBQkxFEAJCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMwr3BQohcHJvdG8vYXV0b29wcy9hdXRvX29wc19ydWxlLnByb3RvEhFidWNrZXRlZXIuYXV0b29wcxoacHJvdG8vYXV0b29wcy9jbGF1c2UucHJvdG8i8QIKC0F1dG9PcHNSdWxlEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSNQoIb3BzX3R5cGUYAyABKA4yGi5idWNrZXRlZXIuYXV0b29wcy5PcHNUeXBlUgdvcHNUeXBlEjMKB2NsYXVzZXMYBCADKAsyGS5idWNrZXRlZXIuYXV0b29wcy5DbGF1c2VSB2NsYXVzZXMSJQoMdHJpZ2dlcmVkX2F0GAYgASgDQgIYAVILdHJpZ2dlcmVkQXQSHQoKY3JlYXRlZF9hdBgHIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCCABKANSCXVwZGF0ZWRBdBIYCgdkZWxldGVkGAkgASgIUgdkZWxldGVkEkgKD2F1dG9fb3BzX3N0YXR1cxgKIAEoDjIgLmJ1Y2tldGVlci5hdXRvb3BzLkF1dG9PcHNTdGF0dXNSDWF1dG9PcHNTdGF0dXMiVAoMQXV0b09wc1J1bGVzEkQKDmF1dG9fb3BzX3J1bGVzGAEgAygLMh4uYnVja2V0ZWVyLmF1dG9vcHMuQXV0b09wc1J1bGVSDGF1dG9PcHNSdWxlcypYCgdPcHNUeXBlEhYKDkVOQUJMRV9GRUFUVVJFEAAaAggBEhcKD0RJU0FCTEVfRkVBVFVSRRABGgIIARIMCghTQ0hFRFVMRRACEg4KCkVWRU5UX1JBVEUQAypECg1BdXRvT3BzU3RhdHVzEgsKB1dBSVRJTkcQABILCgdSVU5OSU5HEAESDAoIRklOSVNIRUQQAhILCgdTVE9QUEVEEANCMVovZ2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2F1dG9vcHNiBnByb3RvMwrwAwoicHJvdG8vbm90aWZpY2F0aW9uL3JlY2lwaWVudC5wcm90bxIWYnVja2V0ZWVyLm5vdGlmaWNhdGlvbiK3AgoJUmVjaXBpZW50EjoKBHR5cGUYASABKA4yJi5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudC5UeXBlUgR0eXBlEmUKF3NsYWNrX2NoYW5uZWxfcmVjaXBpZW50GAIgASgLMi0uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TbGFja0NoYW5uZWxSZWNpcGllbnRSFXNsYWNrQ2hhbm5lbFJlY2lwaWVudBJGCghsYW5ndWFnZRgDIAEoDjIqLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uUmVjaXBpZW50Lkxhbmd1YWdlUghsYW5ndWFnZSIYCgRUeXBlEhAKDFNsYWNrQ2hhbm5lbBAAIiUKCExhbmd1YWdlEgsKB0VOR0xJU0gQABIMCghKQVBBTkVTRRABIjgKFVNsYWNrQ2hhbm5lbFJlY2lwaWVudBIfCgt3ZWJob29rX3VybBgBIAEoCVIKd2ViaG9va1VybEI2WjRnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vbm90aWZpY2F0aW9uYgZwcm90bzMK/QcKJXByb3RvL25vdGlmaWNhdGlvbi9zdWJzY3JpcHRpb24ucHJvdG8SFmJ1Y2tldGVlci5ub3RpZmljYXRpb24aInByb3RvL25vdGlmaWNhdGlvbi9yZWNpcGllbnQucHJvdG8i1wYKDFN1YnNjcmlwdGlvbhIOCgJpZBgBIAEoCVICaWQSHQoKY3JlYXRlZF9hdBgCIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYAyABKANSCXVwZGF0ZWRBdBIaCghkaXNhYmxlZBgEIAEoCFIIZGlzYWJsZWQSUgoMc291cmNlX3R5cGVzGAUgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSPwoJcmVjaXBpZW50GAYgASgLMiEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnRSCXJlY2lwaWVudBISCgRuYW1lGAcgASgJUgRuYW1lIrMECgpTb3VyY2VUeXBlEhgKFERPTUFJTl9FVkVOVF9GRUFUVVJFEAASFQoRRE9NQUlOX0VWRU5UX0dPQUwQARIbChdET01BSU5fRVZFTlRfRVhQRVJJTUVOVBACEhgKFERPTUFJTl9FVkVOVF9BQ0NPVU5UEAMSFwoTRE9NQUlOX0VWRU5UX0FQSUtFWRAEEhgKFERPTUFJTl9FVkVOVF9TRUdNRU5UEAUSHAoYRE9NQUlOX0VWRU5UX0VOVklST05NRU5UEAYSHgoaRE9NQUlOX0VWRU5UX0FETUlOX0FDQ09VTlQQBxIdChlET01BSU5fRVZFTlRfQVVUT09QU19SVUxFEAgSFQoRRE9NQUlOX0VWRU5UX1BVU0gQCRIdChlET01BSU5fRVZFTlRfU1VCU0NSSVBUSU9OEAoSIwofRE9NQUlOX0VWRU5UX0FETUlOX1NVQlNDUklQVElPThALEhgKFERPTUFJTl9FVkVOVF9QUk9KRUNUEAwSGAoURE9NQUlOX0VWRU5UX1dFQkhPT0sQDRIkCiBET01BSU5fRVZFTlRfUFJPR1JFU1NJVkVfUk9MTE9VVBAOEh0KGURPTUFJTl9FVkVOVF9PUkdBTklaQVRJT04QDxIdChlET01BSU5fRVZFTlRfRkxBR19UUklHR0VSEBASEQoNRkVBVFVSRV9TVEFMRRBkEhcKEkVYUEVSSU1FTlRfUlVOTklORxDIARIOCglNQVVfQ09VTlQQrAJCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL25vdGlmaWNhdGlvbmIGcHJvdG8zCvcFCidwcm90by9hdXRvb3BzL3Byb2dyZXNzaXZlX3JvbGxvdXQucHJvdG8SEWJ1Y2tldGVlci5hdXRvb3BzGhlnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIuIEChJQcm9ncmVzc2l2ZVJvbGxvdXQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIsCgZjbGF1c2UYAyABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgZjbGF1c2USRAoGc3RhdHVzGAQgASgOMiwuYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0YXR1c1IGc3RhdHVzEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQSPgoEdHlwZRgHIAEoDjIqLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5UeXBlUgR0eXBlEk4KCnN0b3BwZWRfYnkYCCABKA4yLy5idWNrZXRlZXIuYXV0b29wcy5Qcm9ncmVzc2l2ZVJvbGxvdXQuU3RvcHBlZEJ5UglzdG9wcGVkQnkSHQoKc3RvcHBlZF9hdBgJIAEoA1IJc3RvcHBlZEF0IjIKBFR5cGUSEwoPTUFOVUFMX1NDSEVEVUxFEAASFQoRVEVNUExBVEVfU0NIRURVTEUQASI9CgZTdGF0dXMSCwoHV0FJVElORxAAEgsKB1JVTk5JTkcQARIMCghGSU5JU0hFRBACEgsKB1NUT1BQRUQQAyJJCglTdG9wcGVkQnkSCwoHVU5LTk9XThAAEggKBFVTRVIQARIQCgxPUFNfU0NIRURVTEUQAhITCg9PUFNfS0lMTF9TV0lUQ0gQA0IxWi9naXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXV0b29wc2IGcHJvdG8zCqgFCiBwcm90by9mZWF0dXJlL2ZsYWdfdHJpZ2dlci5wcm90bxIRYnVja2V0ZWVyLmZlYXR1cmUitQQKC0ZsYWdUcmlnZ2VyEg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAMgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRI3CgR0eXBlGAQgASgOMiMuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuVHlwZVIEdHlwZRI9CgZhY3Rpb24YBSABKA4yJS5idWNrZXRlZXIuZmVhdHVyZS5GbGFnVHJpZ2dlci5BY3Rpb25SBmFjdGlvbhIgCgtkZXNjcmlwdGlvbhgGIAEoCVILZGVzY3JpcHRpb24SIwoNdHJpZ2dlcl9jb3VudBgHIAEoBVIMdHJpZ2dlckNvdW50EioKEWxhc3RfdHJpZ2dlcmVkX2F0GAggASgDUg9sYXN0VHJpZ2dlcmVkQXQSFAoFdG9rZW4YCSABKAlSBXRva2VuEhoKCGRpc2FibGVkGAogASgIUghkaXNhYmxlZBIdCgpjcmVhdGVkX2F0GAsgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgMIAEoA1IJdXBkYXRlZEF0IioKBFR5cGUSEAoMVHlwZV9VTktOT1dOEAASEAoMVHlwZV9XRUJIT09LEAEiOwoGQWN0aW9uEhIKDkFjdGlvbl9VTktOT1dOEAASDQoJQWN0aW9uX09OEAESDgoKQWN0aW9uX09GRhACQjFaL2dpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9mZWF0dXJlYgZwcm90bzMKjrYBCh5wcm90by9ldmVudC9kb21haW4vZXZlbnQucHJvdG8SFmJ1Y2tldGVlci5ldmVudC5kb21haW4aGWdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bxoacHJvdG8vZmVhdHVyZS9jbGF1c2UucHJvdG8aG3Byb3RvL2ZlYXR1cmUvZmVhdHVyZS5wcm90bxoYcHJvdG8vZmVhdHVyZS9ydWxlLnByb3RvGh1wcm90by9mZWF0dXJlL3ZhcmlhdGlvbi5wcm90bxoccHJvdG8vZmVhdHVyZS9zdHJhdGVneS5wcm90bxobcHJvdG8vZmVhdHVyZS9zZWdtZW50LnByb3RvGhpwcm90by9mZWF0dXJlL3RhcmdldC5wcm90bxobcHJvdG8vYWNjb3VudC9hY2NvdW50LnByb3RvGhtwcm90by9hY2NvdW50L2FwaV9rZXkucHJvdG8aIXByb3RvL2F1dG9vcHMvYXV0b19vcHNfcnVsZS5wcm90bxoacHJvdG8vYXV0b29wcy9jbGF1c2UucHJvdG8aJXByb3RvL25vdGlmaWNhdGlvbi9zdWJzY3JpcHRpb24ucHJvdG8aInByb3RvL25vdGlmaWNhdGlvbi9yZWNpcGllbnQucHJvdG8aIHByb3RvL2ZlYXR1cmUvcHJlcmVxdWlzaXRlLnByb3RvGidwcm90by9hdXRvb3BzL3Byb2dyZXNzaXZlX3JvbGxvdXQucHJvdG8aIHByb3RvL2ZlYXR1cmUvZmxhZ190cmlnZ2VyLnByb3RvIuUqCgVFdmVudBIOCgJpZBgBIAEoCVICaWQSHAoJdGltZXN0YW1wGAIgASgDUgl0aW1lc3RhbXASSQoLZW50aXR5X3R5cGUYAyABKA4yKC5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkV2ZW50LkVudGl0eVR5cGVSCmVudGl0eVR5cGUSGwoJZW50aXR5X2lkGAQgASgJUghlbnRpdHlJZBI2CgR0eXBlGAUgASgOMiIuYnVja2V0ZWVyLmV2ZW50LmRvbWFpbi5FdmVudC5UeXBlUgR0eXBlEjYKBmVkaXRvchgGIAEoCzIeLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRWRpdG9yUgZlZGl0b3ISKAoEZGF0YRgHIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlSBGRhdGESMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAggASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZRIkCg5pc19hZG1pbl9ldmVudBgJIAEoCFIMaXNBZG1pbkV2ZW50EjkKB29wdGlvbnMYCiABKAsyHy5idWNrZXRlZXIuZXZlbnQuZG9tYWluLk9wdGlvbnNSB29wdGlvbnMSHwoLZW50aXR5X2RhdGEYCyABKAlSCmVudGl0eURhdGESMAoUcHJldmlvdXNfZW50aXR5X2RhdGEYDCABKAlSEnByZXZpb3VzRW50aXR5RGF0YSKTAgoKRW50aXR5VHlwZRILCgdGRUFUVVJFEAASCAoER09BTBABEg4KCkVYUEVSSU1FTlQQAhILCgdBQ0NPVU5UEAMSCgoGQVBJS0VZEAQSCwoHU0VHTUVOVBAFEg8KC0VOVklST05NRU5UEAYSEQoNQURNSU5fQUNDT1VOVBAHEhAKDEFVVE9PUFNfUlVMRRAIEggKBFBVU0gQCRIQCgxTVUJTQ1JJUFRJT04QChIWChJBRE1JTl9TVUJTQ1JJUFRJT04QCxILCgdQUk9KRUNUEAwSFwoTUFJPR1JFU1NJVkVfUk9MTE9VVBAOEhAKDE9SR0FOSVpBVElPThAPEhAKDEZMQUdfVFJJR0dFUhAQIgQIDRANIqwkCgRUeXBlEgsKB1VOS05PV04QABITCg9GRUFUVVJFX0NSRUFURUQQARITCg9GRUFUVVJFX1JFTkFNRUQQAhITCg9GRUFUVVJFX0VOQUJMRUQQAxIUChBGRUFUVVJFX0RJU0FCTEVEEAQSEwoPRkVBVFVSRV9ERUxFVEVEEAUSHwobRkVBVFVSRV9ERVNDUklQVElPTl9DSEFOR0VEEAgSGwoXRkVBVFVSRV9WQVJJQVRJT05fQURERUQQCRIdChlGRUFUVVJFX1ZBUklBVElPTl9SRU1PVkVEEAoSIQodRkVBVFVSRV9PRkZfVkFSSUFUSU9OX0NIQU5HRUQQCxIbChdWQVJJQVRJT05fVkFMVUVfQ0hBTkdFRBAMEhoKFlZBUklBVElPTl9OQU1FX0NIQU5HRUQQDRIhCh1WQVJJQVRJT05fREVTQ1JJUFRJT05fQ0hBTkdFRBAOEhgKFFZBUklBVElPTl9VU0VSX0FEREVEEA8SGgoWVkFSSUFUSU9OX1VTRVJfUkVNT1ZFRBAQEhYKEkZFQVRVUkVfUlVMRV9BRERFRBAREiEKHUZFQVRVUkVfUlVMRV9TVFJBVEVHWV9DSEFOR0VEEBISGAoURkVBVFVSRV9SVUxFX0RFTEVURUQQExIVChFSVUxFX0NMQVVTRV9BRERFRBAUEhcKE1JVTEVfQ0xBVVNFX0RFTEVURUQQFRIfChtSVUxFX0ZJWEVEX1NUUkFURUdZX0NIQU5HRUQQFhIhCh1SVUxFX1JPTExPVVRfU1RSQVRFR1lfQ0hBTkdFRBAXEhwKGENMQVVTRV9BVFRSSUJVVEVfQ0hBTkdFRBAYEhsKF0NMQVVTRV9PUEVSQVRPUl9DSEFOR0VEEBkSFgoSQ0xBVVNFX1ZBTFVFX0FEREVEEBoSGAoUQ0xBVVNFX1ZBTFVFX1JFTU9WRUQQGxIkCiBGRUFUVVJFX0RFRkFVTFRfU1RSQVRFR1lfQ0hBTkdFRBAcEhUKEUZFQVRVUkVfVEFHX0FEREVEEB0SFwoTRkVBVFVSRV9UQUdfUkVNT1ZFRBAeEh8KG0ZFQVRVUkVfVkVSU0lPTl9JTkNSRU1FTlRFRBAfEhQKEEZFQVRVUkVfQVJDSElWRUQQIBISCg5GRUFUVVJFX0NMT05FRBAhEhYKEkZFQVRVUkVfVU5BUkNISVZFRBAjEhcKE1NBTVBMSU5HX1NFRURfUkVTRVQQIhIWChJQUkVSRVFVSVNJVEVfQURERUQQJBIYChRQUkVSRVFVSVNJVEVfUkVNT1ZFRBAlEiIKHlBSRVJFUVVJU0lURV9WQVJJQVRJT05fQ0hBTkdFRBAmEh8KG0ZFQVRVUkVfUlVMRVNfT1JERVJfQ0hBTkdFRBAnEhMKD0ZFQVRVUkVfVVBEQVRFRBAoEhAKDEdPQUxfQ1JFQVRFRBBkEhAKDEdPQUxfUkVOQU1FRBBlEhwKGEdPQUxfREVTQ1JJUFRJT05fQ0hBTkdFRBBmEhAKDEdPQUxfREVMRVRFRBBnEhEKDUdPQUxfQVJDSElWRUQQaBIXChJFWFBFUklNRU5UX0NSRUFURUQQyAESFwoSRVhQRVJJTUVOVF9TVE9QUEVEEMkBEiAKG0VYUEVSSU1FTlRfU1RBUlRfQVRfQ0hBTkdFRBDKARIfChpFWFBFUklNRU5UX1NUT1BfQVRfQ0hBTkdFRBDLARIXChJFWFBFUklNRU5UX0RFTEVURUQQzAESHgoZRVhQRVJJTUVOVF9QRVJJT0RfQ0hBTkdFRBDNARIcChdFWFBFUklNRU5UX05BTUVfQ0hBTkdFRBDOARIjCh5FWFBFUklNRU5UX0RFU0NSSVBUSU9OX0NIQU5HRUQQzwESFwoSRVhQRVJJTUVOVF9TVEFSVEVEENABEhgKE0VYUEVSSU1FTlRfRklOSVNIRUQQ0QESGAoTRVhQRVJJTUVOVF9BUkNISVZFRBDSARIYCg9BQ0NPVU5UX0NSRUFURUQQrAIaAggBEh0KFEFDQ09VTlRfUk9MRV9DSEFOR0VEEK0CGgIIARIYCg9BQ0NPVU5UX0VOQUJMRUQQrgIaAggBEhkKEEFDQ09VTlRfRElTQUJMRUQQrwIaAggBEhgKD0FDQ09VTlRfREVMRVRFRBCwAhoCCAESFwoSQUNDT1VOVF9WMl9DUkVBVEVEELECEhwKF0FDQ09VTlRfVjJfTkFNRV9DSEFOR0VEELICEigKI0FDQ09VTlRfVjJfQVZBVEFSX0lNQUdFX1VSTF9DSEFOR0VEELMCEikKJEFDQ09VTlRfVjJfT1JHQU5JWkFUSU9OX1JPTEVfQ0hBTkdFRBC0AhIpCiRBQ0NPVU5UX1YyX0VOVklST05NRU5UX1JPTEVTX0NIQU5HRUQQtQISFwoSQUNDT1VOVF9WMl9FTkFCTEVEELYCEhgKE0FDQ09VTlRfVjJfRElTQUJMRUQQtwISFwoSQUNDT1VOVF9WMl9ERUxFVEVEELgCEhMKDkFQSUtFWV9DUkVBVEVEEJADEhgKE0FQSUtFWV9OQU1FX0NIQU5HRUQQkQMSEwoOQVBJS0VZX0VOQUJMRUQQkgMSFAoPQVBJS0VZX0RJU0FCTEVEEJMDEhQKD1NFR01FTlRfQ1JFQVRFRBD0AxIUCg9TRUdNRU5UX0RFTEVURUQQ9QMSGQoUU0VHTUVOVF9OQU1FX0NIQU5HRUQQ9gMSIAobU0VHTUVOVF9ERVNDUklQVElPTl9DSEFOR0VEEPcDEhcKElNFR01FTlRfUlVMRV9BRERFRBD4AxIZChRTRUdNRU5UX1JVTEVfREVMRVRFRBD5AxIeChlTRUdNRU5UX1JVTEVfQ0xBVVNFX0FEREVEEPoDEiAKG1NFR01FTlRfUlVMRV9DTEFVU0VfREVMRVRFRBD7AxIlCiBTRUdNRU5UX0NMQVVTRV9BVFRSSUJVVEVfQ0hBTkdFRBD8AxIkCh9TRUdNRU5UX0NMQVVTRV9PUEVSQVRPUl9DSEFOR0VEEP0DEh8KGlNFR01FTlRfQ0xBVVNFX1ZBTFVFX0FEREVEEP4DEiEKHFNFR01FTlRfQ0xBVVNFX1ZBTFVFX1JFTU9WRUQQ/wMSFwoSU0VHTUVOVF9VU0VSX0FEREVEEIAEEhkKFFNFR01FTlRfVVNFUl9ERUxFVEVEEIEEEh4KGVNFR01FTlRfQlVMS19VUExPQURfVVNFUlMQggQSLQooU0VHTUVOVF9CVUxLX1VQTE9BRF9VU0VSU19TVEFUVVNfQ0hBTkdFRBCDBBIYChNFTlZJUk9OTUVOVF9DUkVBVEVEENgEEhgKE0VOVklST05NRU5UX1JFTkFNRUQQ2QQSJAofRU5WSVJPTk1FTlRfREVTQ1JJUFRJT05fQ0hBTkdFRBDaBBIYChNFTlZJUk9OTUVOVF9ERUxFVEVEENsEEhsKFkVOVklST05NRU5UX1YyX0NSRUFURUQQ3AQSGwoWRU5WSVJPTk1FTlRfVjJfUkVOQU1FRBDdBBInCiJFTlZJUk9OTUVOVF9WMl9ERVNDUklQVElPTl9DSEFOR0VEEN4EEhwKF0VOVklST05NRU5UX1YyX0FSQ0hJVkVEEN8EEh4KGUVOVklST05NRU5UX1YyX1VOQVJDSElWRUQQ4AQSKwomRU5WSVJPTk1FTlRfVjJfUkVRVUlSRV9DT01NRU5UX0NIQU5HRUQQ4QQSHgoVQURNSU5fQUNDT1VOVF9DUkVBVEVEELwFGgIIARIeChVBRE1JTl9BQ0NPVU5UX0VOQUJMRUQQvgUaAggBEh8KFkFETUlOX0FDQ09VTlRfRElTQUJMRUQQvwUaAggBEhkKFEFVVE9PUFNfUlVMRV9DUkVBVEVEEKAGEhkKFEFVVE9PUFNfUlVMRV9ERUxFVEVEEKEGEiIKHUFVVE9PUFNfUlVMRV9PUFNfVFlQRV9DSEFOR0VEEKIGEiAKG0FVVE9PUFNfUlVMRV9DTEFVU0VfREVMRVRFRBCjBhIqCiFBVVRPT1BTX1JVTEVfVFJJR0dFUkVEX0FUX0NIQU5HRUQQpAYaAggBEiAKG09QU19FVkVOVF9SQVRFX0NMQVVTRV9BRERFRBClBhIiCh1PUFNfRVZFTlRfUkFURV9DTEFVU0VfQ0hBTkdFRBCmBhIaChVEQVRFVElNRV9DTEFVU0VfQURERUQQpwYSHAoXREFURVRJTUVfQ0xBVVNFX0NIQU5HRUQQqAYSGQoUQVVUT09QU19SVUxFX1NUT1BQRUQQqQYSJAofQVVUT09QU19SVUxFX09QU19TVEFUVVNfQ0hBTkdFRBCqBhIRCgxQVVNIX0NSRUFURUQQhAcSEQoMUFVTSF9ERUxFVEVEEIUHEhQKD1BVU0hfVEFHU19BRERFRBCGBxIWChFQVVNIX1RBR1NfREVMRVRFRBCHBxIRCgxQVVNIX1JFTkFNRUQQiAcSGQoUU1VCU0NSSVBUSU9OX0NSRUFURUQQ6AcSGQoUU1VCU0NSSVBUSU9OX0RFTEVURUQQ6QcSGQoUU1VCU0NSSVBUSU9OX0VOQUJMRUQQ6gcSGgoVU1VCU0NSSVBUSU9OX0RJU0FCTEVEEOsHEiMKHlNVQlNDUklQVElPTl9TT1VSQ0VfVFlQRV9BRERFRBDsBxIlCiBTVUJTQ1JJUFRJT05fU09VUkNFX1RZUEVfREVMRVRFRBDtBxIZChRTVUJTQ1JJUFRJT05fUkVOQU1FRBDuBxIfChpBRE1JTl9TVUJTQ1JJUFRJT05fQ1JFQVRFRBDMCBIfChpBRE1JTl9TVUJTQ1JJUFRJT05fREVMRVRFRBDNCBIfChpBRE1JTl9TVUJTQ1JJUFRJT05fRU5BQkxFRBDOCBIgChtBRE1JTl9TVUJTQ1JJUFRJT05fRElTQUJMRUQQzwgSKQokQURNSU5fU1VCU0NSSVBUSU9OX1NPVVJDRV9UWVBFX0FEREVEENAIEisKJkFETUlOX1NVQlNDUklQVElPTl9TT1VSQ0VfVFlQRV9ERUxFVEVEENEIEh8KGkFETUlOX1NVQlNDUklQVElPTl9SRU5BTUVEENIIEhQKD1BST0pFQ1RfQ1JFQVRFRBCwCRIgChtQUk9KRUNUX0RFU0NSSVBUSU9OX0NIQU5HRUQQsQkSFAoPUFJPSkVDVF9FTkFCTEVEELIJEhUKEFBST0pFQ1RfRElTQUJMRUQQswkSGgoVUFJPSkVDVF9UUklBTF9DUkVBVEVEELQJEhwKF1BST0pFQ1RfVFJJQUxfQ09OVkVSVEVEELUJEhQKD1BST0pFQ1RfUkVOQU1FRBC2CRIgChtQUk9HUkVTU0lWRV9ST0xMT1VUX0NSRUFURUQQ+AoSIAobUFJPR1JFU1NJVkVfUk9MTE9VVF9ERUxFVEVEEPkKEjYKMVBST0dSRVNTSVZFX1JPTExPVVRfU0NIRURVTEVfVFJJR0dFUkVEX0FUX0NIQU5HRUQQ+goSIAobUFJPR1JFU1NJVkVfUk9MTE9VVF9TVE9QUEVEEPsKEhkKFE9SR0FOSVpBVElPTl9DUkVBVEVEENwLEh4KGU9SR0FOSVpBVElPTl9OQU1FX0NIQU5HRUQQ3QsSJQogT1JHQU5JWkFUSU9OX0RFU0NSSVBUSU9OX0NIQU5HRUQQ3gsSGQoUT1JHQU5JWkFUSU9OX0VOQUJMRUQQ3wsSGgoVT1JHQU5JWkFUSU9OX0RJU0FCTEVEEOALEhoKFU9SR0FOSVpBVElPTl9BUkNISVZFRBDhCxIcChdPUkdBTklaQVRJT05fVU5BUkNISVZFRBDiCxIhChxPUkdBTklaQVRJT05fVFJJQUxfQ09OVkVSVEVEEOMLEhkKFEZMQUdfVFJJR0dFUl9DUkVBVEVEEMEMEhcKEkZMQUdfVFJJR0dFUl9SRVNFVBDCDBIlCiBGTEFHX1RSSUdHRVJfREVTQ1JJUFRJT05fQ0hBTkdFRBDDDBIaChVGTEFHX1RSSUdHRVJfRElTQUJMRUQQxAwSGQoURkxBR19UUklHR0VSX0VOQUJMRUQQxQwSGQoURkxBR19UUklHR0VSX0RFTEVURUQQxgwSHwoaRkxBR19UUklHR0VSX1VTQUdFX1VQREFURUQQxwwiBgiUChCUCiIGCJUKEJUKIgYIlgoQlgoiBgiXChCXCiIGCJgKEJgKIgYImQoQmQoiPwoGRWRpdG9yEhQKBWVtYWlsGAEgASgJUgVlbWFpbBIZCghpc19hZG1pbhgDIAEoCFIHaXNBZG1pbkoECAIQAyJECgdPcHRpb25zEhgKB2NvbW1lbnQYASABKAlSB2NvbW1lbnQSHwoLbmV3X3ZlcnNpb24YAiABKAVSCm5ld1ZlcnNpb24i8wQKE0ZlYXR1cmVDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uEhIKBHVzZXIYBCABKAlSBHVzZXISPAoKdmFyaWF0aW9ucxgFIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxJYChpkZWZhdWx0X29uX3ZhcmlhdGlvbl9pbmRleBgGIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUhdkZWZhdWx0T25WYXJpYXRpb25JbmRleBJaChtkZWZhdWx0X29mZl92YXJpYXRpb25faW5kZXgYByABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVIYZGVmYXVsdE9mZlZhcmlhdGlvbkluZGV4Ek8KDnZhcmlhdGlvbl90eXBlGAggASgOMiguYnVja2V0ZWVyLmZlYXR1cmUuRmVhdHVyZS5WYXJpYXRpb25UeXBlUg12YXJpYXRpb25UeXBlEhIKBHRhZ3MYCSADKAlSBHRhZ3MSRQoNcHJlcmVxdWlzaXRlcxgKIAMoCzIfLmJ1Y2tldGVlci5mZWF0dXJlLlByZXJlcXVpc2l0ZVINcHJlcmVxdWlzaXRlcxItCgVydWxlcxgLIAMoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBXJ1bGVzEjMKB3RhcmdldHMYDCADKAsyGS5idWNrZXRlZXIuZmVhdHVyZS5UYXJnZXRSB3RhcmdldHMiZgoTRmVhdHVyZVVwZGF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSFgoEZGF0YRgCIAEoCUICGAFSBGRhdGESJwoNcHJldmlvdXNfZGF0YRgDIAEoCUICGAFSDHByZXZpb3VzRGF0YSIlChNGZWF0dXJlRW5hYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCImChRGZWF0dXJlRGlzYWJsZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiJgoURmVhdHVyZUFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIigKFkZlYXR1cmVVbmFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiUKE0ZlYXR1cmVEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIi0KG0V2YWx1YXRpb25EZWxheWFibGVTZXRFdmVudBIOCgJpZBgBIAEoCVICaWQiLwodRXZhbHVhdGlvblVuZGVsYXlhYmxlU2V0RXZlbnQSDgoCaWQYASABKAlSAmlkIjkKE0ZlYXR1cmVSZW5hbWVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiUgoeRmVhdHVyZURlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iVgofRmVhdHVyZU9mZlZhcmlhdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIwoNb2ZmX3ZhcmlhdGlvbhgCIAEoCVIMb2ZmVmFyaWF0aW9uImgKGkZlYXR1cmVWYXJpYXRpb25BZGRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBI6Cgl2YXJpYXRpb24YAiABKAsyHC5idWNrZXRlZXIuZmVhdHVyZS5WYXJpYXRpb25SCXZhcmlhdGlvbiJRChxGZWF0dXJlVmFyaWF0aW9uUmVtb3ZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIhCgx2YXJpYXRpb25faWQYAiABKAlSC3ZhcmlhdGlvbklkImEKGlZhcmlhdGlvblZhbHVlQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSFAoFdmFsdWUYAyABKAlSBXZhbHVlIl4KGVZhcmlhdGlvbk5hbWVDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEg4KAmlkGAIgASgJUgJpZBISCgRuYW1lGAMgASgJUgRuYW1lInMKIFZhcmlhdGlvbkRlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uIlwKF1ZhcmlhdGlvblVzZXJBZGRlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSEgoEdXNlchgDIAEoCVIEdXNlciJeChlWYXJpYXRpb25Vc2VyUmVtb3ZlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIOCgJpZBgCIAEoCVICaWQSEgoEdXNlchgDIAEoCVIEdXNlciJUChVGZWF0dXJlUnVsZUFkZGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEisKBHJ1bGUYAiABKAsyFy5idWNrZXRlZXIuZmVhdHVyZS5SdWxlUgRydWxlIpEBCh5GZWF0dXJlQ2hhbmdlUnVsZVN0cmF0ZWd5RXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI3CghzdHJhdGVneRgDIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5UghzdHJhdGVneSJZCh1GZWF0dXJlUnVsZXNPcmRlckNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSGQoIcnVsZV9pZHMYAiADKAlSB3J1bGVJZHMiQgoXRmVhdHVyZVJ1bGVEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCKYAQogRmVhdHVyZUZpeGVkU3RyYXRlZ3lDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBI8CghzdHJhdGVneRgDIAEoCzIgLmJ1Y2tldGVlci5mZWF0dXJlLkZpeGVkU3RyYXRlZ3lSCHN0cmF0ZWd5IpwBCiJGZWF0dXJlUm9sbG91dFN0cmF0ZWd5Q2hhbmdlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSPgoIc3RyYXRlZ3kYAyABKAsyIi5idWNrZXRlZXIuZmVhdHVyZS5Sb2xsb3V0U3RyYXRlZ3lSCHN0cmF0ZWd5IoEBChRSdWxlQ2xhdXNlQWRkZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEjEKBmNsYXVzZRgDIAEoCzIZLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZVIGY2xhdXNlImAKFlJ1bGVDbGF1c2VEZWxldGVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQigwEKG0NsYXVzZUF0dHJpYnV0ZUNoYW5nZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEg4KAmlkGAMgASgJUgJpZBIcCglhdHRyaWJ1dGUYBCABKAlSCWF0dHJpYnV0ZSKkAQoaQ2xhdXNlT3BlcmF0b3JDaGFuZ2VkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQSPgoIb3BlcmF0b3IYBCABKA4yIi5idWNrZXRlZXIuZmVhdHVyZS5DbGF1c2UuT3BlcmF0b3JSCG9wZXJhdG9yInUKFUNsYXVzZVZhbHVlQWRkZWRFdmVudBIdCgpmZWF0dXJlX2lkGAEgASgJUglmZWF0dXJlSWQSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEg4KAmlkGAMgASgJUgJpZBIUCgV2YWx1ZRgEIAEoCVIFdmFsdWUidwoXQ2xhdXNlVmFsdWVSZW1vdmVkRXZlbnQSHQoKZmVhdHVyZV9pZBgBIAEoCVIJZmVhdHVyZUlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIOCgJpZBgDIAEoCVICaWQSFAoFdmFsdWUYBCABKAlSBXZhbHVlIm0KIkZlYXR1cmVEZWZhdWx0U3RyYXRlZ3lDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEjcKCHN0cmF0ZWd5GAIgASgLMhsuYnVja2V0ZWVyLmZlYXR1cmUuU3RyYXRlZ3lSCHN0cmF0ZWd5IjgKFEZlYXR1cmVUYWdBZGRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIQCgN0YWcYAiABKAlSA3RhZyI6ChZGZWF0dXJlVGFnUmVtb3ZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIQCgN0YWcYAiABKAlSA3RhZyJKCh5GZWF0dXJlVmVyc2lvbkluY3JlbWVudGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhgKB3ZlcnNpb24YAiABKAVSB3ZlcnNpb24itQQKEkZlYXR1cmVDbG9uZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SPAoKdmFyaWF0aW9ucxgEIAMoCzIcLmJ1Y2tldGVlci5mZWF0dXJlLlZhcmlhdGlvblIKdmFyaWF0aW9ucxIzCgd0YXJnZXRzGAUgAygLMhkuYnVja2V0ZWVyLmZlYXR1cmUuVGFyZ2V0Ugd0YXJnZXRzEi0KBXJ1bGVzGAYgAygLMhcuYnVja2V0ZWVyLmZlYXR1cmUuUnVsZVIFcnVsZXMSRgoQZGVmYXVsdF9zdHJhdGVneRgHIAEoCzIbLmJ1Y2tldGVlci5mZWF0dXJlLlN0cmF0ZWd5Ug9kZWZhdWx0U3RyYXRlZ3kSIwoNb2ZmX3ZhcmlhdGlvbhgIIAEoCVIMb2ZmVmFyaWF0aW9uEhIKBHRhZ3MYCSADKAlSBHRhZ3MSHgoKbWFpbnRhaW5lchgKIAEoCVIKbWFpbnRhaW5lchJPCg52YXJpYXRpb25fdHlwZRgLIAEoDjIoLmJ1Y2tldGVlci5mZWF0dXJlLkZlYXR1cmUuVmFyaWF0aW9uVHlwZVINdmFyaWF0aW9uVHlwZRJFCg1wcmVyZXF1aXNpdGVzGAwgAygLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUg1wcmVyZXF1aXNpdGVzIkQKHUZlYXR1cmVTYW1wbGluZ1NlZWRSZXNldEV2ZW50EiMKDXNhbXBsaW5nX3NlZWQYASABKAlSDHNhbXBsaW5nU2VlZCKwAQoQR29hbENyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgDIAEoCVILZGVzY3JpcHRpb24SGAoHZGVsZXRlZBgEIAEoCFIHZGVsZXRlZBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0IjYKEEdvYWxSZW5hbWVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiTwobR29hbERlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iIwoRR29hbEFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiIKEEdvYWxEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIvMDChZFeHBlcmltZW50Q3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSJwoPZmVhdHVyZV92ZXJzaW9uGAMgASgFUg5mZWF0dXJlVmVyc2lvbhI8Cgp2YXJpYXRpb25zGAQgAygLMhwuYnVja2V0ZWVyLmZlYXR1cmUuVmFyaWF0aW9uUgp2YXJpYXRpb25zEhsKB2dvYWxfaWQYBSABKAlCAhgBUgZnb2FsSWQSGQoIc3RhcnRfYXQYBiABKANSB3N0YXJ0QXQSFwoHc3RvcF9hdBgHIAEoA1IGc3RvcEF0EhgKB3N0b3BwZWQYCCABKAhSB3N0b3BwZWQSHQoKc3RvcHBlZF9hdBgJIAEoA1IJc3RvcHBlZEF0Eh0KCmNyZWF0ZWRfYXQYCiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAsgASgDUgl1cGRhdGVkQXQSGQoIZ29hbF9pZHMYDCADKAlSB2dvYWxJZHMSEgoEbmFtZRgNIAEoCVIEbmFtZRIgCgtkZXNjcmlwdGlvbhgOIAEoCVILZGVzY3JpcHRpb24SKgoRYmFzZV92YXJpYXRpb25faWQYDyABKAlSD2Jhc2VWYXJpYXRpb25JZCJHChZFeHBlcmltZW50U3RvcHBlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpzdG9wcGVkX2F0GAIgASgDUglzdG9wcGVkQXQiKQoXRXhwZXJpbWVudEFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIigKFkV4cGVyaW1lbnREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIkoKHUV4cGVyaW1lbnRTdGFydEF0Q2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIZCghzdGFydF9hdBgCIAEoA1IHc3RhcnRBdCJHChxFeHBlcmltZW50U3RvcEF0Q2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIXCgdzdG9wX2F0GAIgASgDUgZzdG9wQXQiYgocRXhwZXJpbWVudFBlcmlvZENoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSGQoIc3RhcnRfYXQYAiABKANSB3N0YXJ0QXQSFwoHc3RvcF9hdBgDIAEoA1IGc3RvcEF0IkAKGkV4cGVyaW1lbnROYW1lQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIlUKIUV4cGVyaW1lbnREZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIhgKFkV4cGVyaW1lbnRTdGFydGVkRXZlbnQiGQoXRXhwZXJpbWVudEZpbmlzaGVkRXZlbnQipgMKFUFjY291bnRWMkNyZWF0ZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSEgoEbmFtZRgCIAEoCVIEbmFtZRIoChBhdmF0YXJfaW1hZ2VfdXJsGAMgASgJUg5hdmF0YXJJbWFnZVVybBInCg9vcmdhbml6YXRpb25faWQYBCABKAlSDm9yZ2FuaXphdGlvbklkElsKEW9yZ2FuaXphdGlvbl9yb2xlGAUgASgOMi4uYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLlJvbGUuT3JnYW5pemF0aW9uUhBvcmdhbml6YXRpb25Sb2xlElkKEWVudmlyb25tZW50X3JvbGVzGAYgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcxIaCghkaXNhYmxlZBgHIAEoCFIIZGlzYWJsZWQSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdCJFChlBY2NvdW50VjJOYW1lQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBISCgRuYW1lGAIgASgJUgRuYW1lImUKI0FjY291bnRWMkF2YXRhckltYWdlVVJMQ2hhbmdlZEV2ZW50EhQKBWVtYWlsGAEgASgJUgVlbWFpbBIoChBhdmF0YXJfaW1hZ2VfdXJsGAIgASgJUg5hdmF0YXJJbWFnZVVybCKaAQolQWNjb3VudFYyT3JnYW5pemF0aW9uUm9sZUNoYW5nZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwSWwoRb3JnYW5pemF0aW9uX3JvbGUYAiABKA4yLi5idWNrZXRlZXIuYWNjb3VudC5BY2NvdW50VjIuUm9sZS5Pcmdhbml6YXRpb25SEG9yZ2FuaXphdGlvblJvbGUimAEKJUFjY291bnRWMkVudmlyb25tZW50Um9sZXNDaGFuZ2VkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsElkKEWVudmlyb25tZW50X3JvbGVzGAIgAygLMiwuYnVja2V0ZWVyLmFjY291bnQuQWNjb3VudFYyLkVudmlyb25tZW50Um9sZVIQZW52aXJvbm1lbnRSb2xlcyItChVBY2NvdW50VjJFbmFibGVkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsIi4KFkFjY291bnRWMkRpc2FibGVkRXZlbnQSFAoFZW1haWwYASABKAlSBWVtYWlsIi0KFUFjY291bnRWMkRlbGV0ZWRFdmVudBIUCgVlbWFpbBgBIAEoCVIFZW1haWwixgEKEkFQSUtleUNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIyCgRyb2xlGAMgASgOMh4uYnVja2V0ZWVyLmFjY291bnQuQVBJS2V5LlJvbGVSBHJvbGUSGgoIZGlzYWJsZWQYBCABKAhSCGRpc2FibGVkEh0KCmNyZWF0ZWRfYXQYBSABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAYgASgDUgl1cGRhdGVkQXQiPAoWQVBJS2V5TmFtZUNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIkChJBUElLZXlFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIiUKE0FQSUtleURpc2FibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIlsKE1NlZ21lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YAyABKAlSC2Rlc2NyaXB0aW9uIiUKE1NlZ21lbnREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIj0KF1NlZ21lbnROYW1lQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lIlIKHlNlZ21lbnREZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIlQKFVNlZ21lbnRSdWxlQWRkZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSKwoEcnVsZRgCIAEoCzIXLmJ1Y2tldGVlci5mZWF0dXJlLlJ1bGVSBHJ1bGUiQgoXU2VnbWVudFJ1bGVEZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZCKIAQobU2VnbWVudFJ1bGVDbGF1c2VBZGRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSMQoGY2xhdXNlGAMgASgLMhkuYnVja2V0ZWVyLmZlYXR1cmUuQ2xhdXNlUgZjbGF1c2UidAodU2VnbWVudFJ1bGVDbGF1c2VEZWxldGVkRXZlbnQSHQoKc2VnbWVudF9pZBgBIAEoCVIJc2VnbWVudElkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIbCgljbGF1c2VfaWQYAyABKAlSCGNsYXVzZUlkIpcBCiJTZWdtZW50Q2xhdXNlQXR0cmlidXRlQ2hhbmdlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIcCglhdHRyaWJ1dGUYBCABKAlSCWF0dHJpYnV0ZSK4AQohU2VnbWVudENsYXVzZU9wZXJhdG9yQ2hhbmdlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBI+CghvcGVyYXRvchgEIAEoDjIiLmJ1Y2tldGVlci5mZWF0dXJlLkNsYXVzZS5PcGVyYXRvclIIb3BlcmF0b3IiiQEKHFNlZ21lbnRDbGF1c2VWYWx1ZUFkZGVkRXZlbnQSHQoKc2VnbWVudF9pZBgBIAEoCVIJc2VnbWVudElkEhcKB3J1bGVfaWQYAiABKAlSBnJ1bGVJZBIbCgljbGF1c2VfaWQYAyABKAlSCGNsYXVzZUlkEhQKBXZhbHVlGAQgASgJUgV2YWx1ZSKLAQoeU2VnbWVudENsYXVzZVZhbHVlUmVtb3ZlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIXCgdydWxlX2lkGAIgASgJUgZydWxlSWQSGwoJY2xhdXNlX2lkGAMgASgJUghjbGF1c2VJZBIUCgV2YWx1ZRgEIAEoCVIFdmFsdWUijQEKFVNlZ21lbnRVc2VyQWRkZWRFdmVudBIdCgpzZWdtZW50X2lkGAEgASgJUglzZWdtZW50SWQSGQoIdXNlcl9pZHMYAiADKAlSB3VzZXJJZHMSOgoFc3RhdGUYAyABKA4yJC5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50VXNlci5TdGF0ZVIFc3RhdGUijwEKF1NlZ21lbnRVc2VyRGVsZXRlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBIZCgh1c2VyX2lkcxgCIAMoCVIHdXNlcklkcxI6CgVzdGF0ZRgDIAEoDjIkLmJ1Y2tldGVlci5mZWF0dXJlLlNlZ21lbnRVc2VyLlN0YXRlUgVzdGF0ZSKzAQobU2VnbWVudEJ1bGtVcGxvYWRVc2Vyc0V2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBI5CgZzdGF0dXMYAiABKA4yIS5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50LlN0YXR1c1IGc3RhdHVzEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlItYBCihTZWdtZW50QnVsa1VwbG9hZFVzZXJzU3RhdHVzQ2hhbmdlZEV2ZW50Eh0KCnNlZ21lbnRfaWQYASABKAlSCXNlZ21lbnRJZBI5CgZzdGF0dXMYAiABKA4yIS5idWNrZXRlZXIuZmVhdHVyZS5TZWdtZW50LlN0YXR1c1IGc3RhdHVzEjoKBXN0YXRlGAMgASgOMiQuYnVja2V0ZWVyLmZlYXR1cmUuU2VnbWVudFVzZXIuU3RhdGVSBXN0YXRlEhQKBWNvdW50GAQgASgDUgVjb3VudCL0AQoXRW52aXJvbm1lbnRDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhwKCW5hbWVzcGFjZRgCIAEoCVIJbmFtZXNwYWNlEhIKBG5hbWUYAyABKAlSBG5hbWUSIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uEhgKB2RlbGV0ZWQYBSABKAhSB2RlbGV0ZWQSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYByABKANSCXVwZGF0ZWRBdBIdCgpwcm9qZWN0X2lkGAggASgJUglwcm9qZWN0SWQiPQoXRW52aXJvbm1lbnRSZW5hbWVkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiVgoiRW52aXJvbm1lbnREZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIkcKF0Vudmlyb25tZW50RGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIcCgluYW1lc3BhY2UYAiABKAlSCW5hbWVzcGFjZSKeAgoZRW52aXJvbm1lbnRWMkNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SHQoKcHJvamVjdF9pZBgFIAEoCVIJcHJvamVjdElkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIdCgpjcmVhdGVkX2F0GAcgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgIIAEoA1IJdXBkYXRlZEF0EicKD3JlcXVpcmVfY29tbWVudBgJIAEoCFIOcmVxdWlyZUNvbW1lbnQigAEKGUVudmlyb25tZW50VjJSZW5hbWVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCnByb2plY3RfaWQYAiABKAlSCXByb2plY3RJZBIZCghvbGRfbmFtZRgDIAEoCVIHb2xkTmFtZRIZCghuZXdfbmFtZRgEIAEoCVIHbmV3TmFtZSK7AQokRW52aXJvbm1lbnRWMkRlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBISCgRuYW1lGAIgASgJUgRuYW1lEh0KCnByb2plY3RfaWQYAyABKAlSCXByb2plY3RJZBInCg9vbGRfZGVzY3JpcHRpb24YBCABKAlSDm9sZERlc2NyaXB0aW9uEicKD25ld19kZXNjcmlwdGlvbhgFIAEoCVIObmV3RGVzY3JpcHRpb24ilQEKJ0Vudmlyb25tZW50VjJSZXF1aXJlQ29tbWVudENoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpwcm9qZWN0X2lkGAMgASgJUglwcm9qZWN0SWQSJwoPcmVxdWlyZV9jb21tZW50GAQgASgIUg5yZXF1aXJlQ29tbWVudCJfChpFbnZpcm9ubWVudFYyQXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpwcm9qZWN0X2lkGAMgASgJUglwcm9qZWN0SWQiYQocRW52aXJvbm1lbnRWMlVuYXJjaGl2ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIdCgpwcm9qZWN0X2lkGAMgASgJUglwcm9qZWN0SWQiygIKF0F1dG9PcHNSdWxlQ3JlYXRlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBI1CghvcHNfdHlwZRgCIAEoDjIaLmJ1Y2tldGVlci5hdXRvb3BzLk9wc1R5cGVSB29wc1R5cGUSMwoHY2xhdXNlcxgDIAMoCzIZLmJ1Y2tldGVlci5hdXRvb3BzLkNsYXVzZVIHY2xhdXNlcxIlCgx0cmlnZ2VyZWRfYXQYBCABKANCAhgBUgt0cmlnZ2VyZWRBdBIdCgpjcmVhdGVkX2F0GAUgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgGIAEoA1IJdXBkYXRlZEF0Ej8KCm9wc19zdGF0dXMYByABKA4yIC5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzU3RhdHVzUglvcHNTdGF0dXMiGQoXQXV0b09wc1J1bGVTdG9wcGVkRXZlbnQiGQoXQXV0b09wc1J1bGVEZWxldGVkRXZlbnQiVwoeQXV0b09wc1J1bGVPcHNUeXBlQ2hhbmdlZEV2ZW50EjUKCG9wc190eXBlGAEgASgOMhouYnVja2V0ZWVyLmF1dG9vcHMuT3BzVHlwZVIHb3BzVHlwZSIkCiJBdXRvT3BzUnVsZVRyaWdnZXJlZEF0Q2hhbmdlZEV2ZW50ImMKIEF1dG9PcHNSdWxlT3BzU3RhdHVzQ2hhbmdlZEV2ZW50Ej8KCm9wc19zdGF0dXMYASABKA4yIC5idWNrZXRlZXIuYXV0b29wcy5BdXRvT3BzU3RhdHVzUglvcHNTdGF0dXMilQEKHE9wc0V2ZW50UmF0ZUNsYXVzZUFkZGVkRXZlbnQSGwoJY2xhdXNlX2lkGAEgASgJUghjbGF1c2VJZBJYChVvcHNfZXZlbnRfcmF0ZV9jbGF1c2UYAiABKAsyJS5idWNrZXRlZXIuYXV0b29wcy5PcHNFdmVudFJhdGVDbGF1c2VSEm9wc0V2ZW50UmF0ZUNsYXVzZSKXAQoeT3BzRXZlbnRSYXRlQ2xhdXNlQ2hhbmdlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQSWAoVb3BzX2V2ZW50X3JhdGVfY2xhdXNlGAIgASgLMiUuYnVja2V0ZWVyLmF1dG9vcHMuT3BzRXZlbnRSYXRlQ2xhdXNlUhJvcHNFdmVudFJhdGVDbGF1c2UiPAodQXV0b09wc1J1bGVDbGF1c2VEZWxldGVkRXZlbnQSGwoJY2xhdXNlX2lkGAEgASgJUghjbGF1c2VJZCKDAQoYRGF0ZXRpbWVDbGF1c2VBZGRlZEV2ZW50EhsKCWNsYXVzZV9pZBgBIAEoCVIIY2xhdXNlSWQSSgoPZGF0ZXRpbWVfY2xhdXNlGAIgASgLMiEuYnVja2V0ZWVyLmF1dG9vcHMuRGF0ZXRpbWVDbGF1c2VSDmRhdGV0aW1lQ2xhdXNlIoUBChpEYXRldGltZUNsYXVzZUNoYW5nZWRFdmVudBIbCgljbGF1c2VfaWQYASABKAlSCGNsYXVzZUlkEkoKD2RhdGV0aW1lX2NsYXVzZRgCIAEoCzIhLmJ1Y2tldGVlci5hdXRvb3BzLkRhdGV0aW1lQ2xhdXNlUg5kYXRldGltZUNsYXVzZSJaChBQdXNoQ3JlYXRlZEV2ZW50Eh4KC2ZjbV9hcGlfa2V5GAIgASgJUglmY21BcGlLZXkSEgoEdGFncxgDIAMoCVIEdGFncxISCgRuYW1lGAQgASgJUgRuYW1lIhIKEFB1c2hEZWxldGVkRXZlbnQiKAoSUHVzaFRhZ3NBZGRlZEV2ZW50EhIKBHRhZ3MYAiADKAlSBHRhZ3MiKgoUUHVzaFRhZ3NEZWxldGVkRXZlbnQSEgoEdGFncxgCIAMoCVIEdGFncyImChBQdXNoUmVuYW1lZEV2ZW50EhIKBG5hbWUYAiABKAlSBG5hbWUiwwEKGFN1YnNjcmlwdGlvbkNyZWF0ZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcxI/CglyZWNpcGllbnQYAiABKAsyIS5idWNrZXRlZXIubm90aWZpY2F0aW9uLlJlY2lwaWVudFIJcmVjaXBpZW50EhIKBG5hbWUYAyABKAlSBG5hbWUiGgoYU3Vic2NyaXB0aW9uRGVsZXRlZEV2ZW50IhoKGFN1YnNjcmlwdGlvbkVuYWJsZWRFdmVudCIbChlTdWJzY3JpcHRpb25EaXNhYmxlZEV2ZW50IncKIVN1YnNjcmlwdGlvblNvdXJjZVR5cGVzQWRkZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyJ5CiNTdWJzY3JpcHRpb25Tb3VyY2VUeXBlc0RlbGV0ZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyIuChhTdWJzY3JpcHRpb25SZW5hbWVkRXZlbnQSEgoEbmFtZRgBIAEoCVIEbmFtZSLIAQodQWRtaW5TdWJzY3JpcHRpb25DcmVhdGVkRXZlbnQSUgoMc291cmNlX3R5cGVzGAEgAygOMi8uYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5TdWJzY3JpcHRpb24uU291cmNlVHlwZVILc291cmNlVHlwZXMSPwoJcmVjaXBpZW50GAIgASgLMiEuYnVja2V0ZWVyLm5vdGlmaWNhdGlvbi5SZWNpcGllbnRSCXJlY2lwaWVudBISCgRuYW1lGAMgASgJUgRuYW1lIh8KHUFkbWluU3Vic2NyaXB0aW9uRGVsZXRlZEV2ZW50Ih8KHUFkbWluU3Vic2NyaXB0aW9uRW5hYmxlZEV2ZW50IiAKHkFkbWluU3Vic2NyaXB0aW9uRGlzYWJsZWRFdmVudCJ8CiZBZG1pblN1YnNjcmlwdGlvblNvdXJjZVR5cGVzQWRkZWRFdmVudBJSCgxzb3VyY2VfdHlwZXMYASADKA4yLy5idWNrZXRlZXIubm90aWZpY2F0aW9uLlN1YnNjcmlwdGlvbi5Tb3VyY2VUeXBlUgtzb3VyY2VUeXBlcyJ+CihBZG1pblN1YnNjcmlwdGlvblNvdXJjZVR5cGVzRGVsZXRlZEV2ZW50ElIKDHNvdXJjZV90eXBlcxgBIAMoDjIvLmJ1Y2tldGVlci5ub3RpZmljYXRpb24uU3Vic2NyaXB0aW9uLlNvdXJjZVR5cGVSC3NvdXJjZVR5cGVzIjMKHUFkbWluU3Vic2NyaXB0aW9uUmVuYW1lZEV2ZW50EhIKBG5hbWUYASABKAlSBG5hbWUiiwIKE1Byb2plY3RDcmVhdGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEiAKC2Rlc2NyaXB0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSFAoFdHJpYWwYBCABKAhSBXRyaWFsEiMKDWNyZWF0b3JfZW1haWwYBSABKAlSDGNyZWF0b3JFbWFpbBIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgHIAEoA1IJdXBkYXRlZEF0EhIKBG5hbWUYCCABKAlSBG5hbWUSGQoIdXJsX2NvZGUYCSABKAlSB3VybENvZGUiUgoeUHJvamVjdERlc2NyaXB0aW9uQ2hhbmdlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIgCgtkZXNjcmlwdGlvbhgCIAEoCVILZGVzY3JpcHRpb24iOQoTUHJvamVjdFJlbmFtZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZSIlChNQcm9qZWN0RW5hYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCImChRQcm9qZWN0RGlzYWJsZWRFdmVudBIOCgJpZBgBIAEoCVICaWQikAIKGFByb2plY3RUcmlhbENyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uEhoKCGRpc2FibGVkGAMgASgIUghkaXNhYmxlZBIUCgV0cmlhbBgEIAEoCFIFdHJpYWwSIwoNY3JlYXRvcl9lbWFpbBgFIAEoCVIMY3JlYXRvckVtYWlsEh0KCmNyZWF0ZWRfYXQYBiABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAcgASgDUgl1cGRhdGVkQXQSEgoEbmFtZRgIIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgJIAEoCVIHdXJsQ29kZSIsChpQcm9qZWN0VHJpYWxDb252ZXJ0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQiXQoWUHJlcmVxdWlzaXRlQWRkZWRFdmVudBJDCgxwcmVyZXF1aXNpdGUYASABKAsyHy5idWNrZXRlZXIuZmVhdHVyZS5QcmVyZXF1aXNpdGVSDHByZXJlcXVpc2l0ZSJoCiFQcmVyZXF1aXNpdGVWYXJpYXRpb25DaGFuZ2VkRXZlbnQSQwoMcHJlcmVxdWlzaXRlGAEgASgLMh8uYnVja2V0ZWVyLmZlYXR1cmUuUHJlcmVxdWlzaXRlUgxwcmVyZXF1aXNpdGUiOQoYUHJlcmVxdWlzaXRlUmVtb3ZlZEV2ZW50Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZCL7AQoeUHJvZ3Jlc3NpdmVSb2xsb3V0Q3JlYXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSLAoGY2xhdXNlGAMgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueVIGY2xhdXNlEh0KCmNyZWF0ZWRfYXQYBCABKANSCWNyZWF0ZWRBdBIdCgp1cGRhdGVkX2F0GAUgASgDUgl1cGRhdGVkQXQSPgoEdHlwZRgGIAEoDjIqLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5UeXBlUgR0eXBlIuUBCh5Qcm9ncmVzc2l2ZVJvbGxvdXRTdG9wcGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEkQKBnN0YXR1cxgCIAEoDjIsLmJ1Y2tldGVlci5hdXRvb3BzLlByb2dyZXNzaXZlUm9sbG91dC5TdGF0dXNSBnN0YXR1cxJOCgpzdG9wcGVkX2J5GAMgASgOMi8uYnVja2V0ZWVyLmF1dG9vcHMuUHJvZ3Jlc3NpdmVSb2xsb3V0LlN0b3BwZWRCeVIJc3RvcHBlZEJ5Eh0KCnN0b3BwZWRfYXQYBCABKANSCXN0b3BwZWRBdCIwCh5Qcm9ncmVzc2l2ZVJvbGxvdXREZWxldGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIlQKMVByb2dyZXNzaXZlUm9sbG91dFNjaGVkdWxlVHJpZ2dlcmVkQXRDaGFuZ2VkRXZlbnQSHwoLc2NoZWR1bGVfaWQYASABKAlSCnNjaGVkdWxlSWQihwIKGE9yZ2FuaXphdGlvbkNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRIZCgh1cmxfY29kZRgDIAEoCVIHdXJsQ29kZRIgCgtkZXNjcmlwdGlvbhgEIAEoCVILZGVzY3JpcHRpb24SGgoIZGlzYWJsZWQYBSABKAhSCGRpc2FibGVkEhoKCGFyY2hpdmVkGAYgASgIUghhcmNoaXZlZBIUCgV0cmlhbBgHIAEoCFIFdHJpYWwSHQoKY3JlYXRlZF9hdBgIIAEoA1IJY3JlYXRlZEF0Eh0KCnVwZGF0ZWRfYXQYCSABKANSCXVwZGF0ZWRBdCJXCiNPcmdhbml6YXRpb25EZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSIAoLZGVzY3JpcHRpb24YAiABKAlSC2Rlc2NyaXB0aW9uIkIKHE9yZ2FuaXphdGlvbk5hbWVDaGFuZ2VkRXZlbnQSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUiKgoYT3JnYW5pemF0aW9uRW5hYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCIrChlPcmdhbml6YXRpb25EaXNhYmxlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCIrChlPcmdhbml6YXRpb25BcmNoaXZlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZCItChtPcmdhbml6YXRpb25VbmFyY2hpdmVkRXZlbnQSDgoCaWQYASABKAlSAmlkIjEKH09yZ2FuaXphdGlvblRyaWFsQ29udmVydGVkRXZlbnQSDgoCaWQYASABKAlSAmlkIusCChdGbGFnVHJpZ2dlckNyZWF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USNwoEdHlwZRgEIAEoDjIjLmJ1Y2tldGVlci5mZWF0dXJlLkZsYWdUcmlnZ2VyLlR5cGVSBHR5cGUSPQoGYWN0aW9uGAUgASgOMiUuYnVja2V0ZWVyLmZlYXR1cmUuRmxhZ1RyaWdnZXIuQWN0aW9uUgZhY3Rpb24SIAoLZGVzY3JpcHRpb24YBiABKAlSC2Rlc2NyaXB0aW9uEhQKBXRva2VuGAcgASgJUgV0b2tlbhIdCgpjcmVhdGVkX2F0GAggASgDUgljcmVhdGVkQXQSHQoKdXBkYXRlZF9hdBgJIAEoA1IJdXBkYXRlZEF0IpEBChVGbGFnVHJpZ2dlclJlc2V0RXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlEhQKBXRva2VuGAQgASgJUgV0b2tlbiKqAQoiRmxhZ1RyaWdnZXJEZXNjcmlwdGlvbkNoYW5nZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USIAoLZGVzY3JpcHRpb24YBCABKAlSC2Rlc2NyaXB0aW9uIn4KGEZsYWdUcmlnZ2VyRGlzYWJsZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2UifQoXRmxhZ1RyaWdnZXJFbmFibGVkRXZlbnQSDgoCaWQYASABKAlSAmlkEh0KCmZlYXR1cmVfaWQYAiABKAlSCWZlYXR1cmVJZBIzChVlbnZpcm9ubWVudF9uYW1lc3BhY2UYAyABKAlSFGVudmlyb25tZW50TmFtZXNwYWNlIn0KF0ZsYWdUcmlnZ2VyRGVsZXRlZEV2ZW50Eg4KAmlkGAEgASgJUgJpZBIdCgpmZWF0dXJlX2lkGAIgASgJUglmZWF0dXJlSWQSMwoVZW52aXJvbm1lbnRfbmFtZXNwYWNlGAMgASgJUhRlbnZpcm9ubWVudE5hbWVzcGFjZSLTAQocRmxhZ1RyaWdnZXJVc2FnZVVwZGF0ZWRFdmVudBIOCgJpZBgBIAEoCVICaWQSHQoKZmVhdHVyZV9pZBgCIAEoCVIJZmVhdHVyZUlkEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USKgoRbGFzdF90cmlnZ2VyZWRfYXQYBCABKANSD2xhc3RUcmlnZ2VyZWRBdBIjCg10cmlnZ2VyX3RpbWVzGAUgASgFUgx0cmlnZ2VyVGltZXNCNlo0Z2l0aHViLmNvbS9idWNrZXRlZXItaW8vYnVja2V0ZWVyL3Byb3RvL2V2ZW50L2RvbWFpbmIGcHJvdG8zCsoBCipwcm90by9ldmVudC9kb21haW4vbG9jYWxpemVkX21lc3NhZ2UucHJvdG8SFmJ1Y2tldGVlci5ldmVudC5kb21haW4iRAoQTG9jYWxpemVkTWVzc2FnZRIWCgZsb2NhbGUYASABKAlSBmxvY2FsZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlQjZaNGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9ldmVudC9kb21haW5iBnByb3RvMwr6BQodcHJvdG8vYXVkaXRsb2cvYXVkaXRsb2cucHJvdG8SEmJ1Y2tldGVlci5hdWRpdGxvZxoZZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bxoecHJvdG8vZXZlbnQvZG9tYWluL2V2ZW50LnByb3RvGipwcm90by9ldmVudC9kb21haW4vbG9jYWxpemVkX21lc3NhZ2UucHJvdG8ioQQKCEF1ZGl0TG9nEg4KAmlkGAEgASgJUgJpZBIcCgl0aW1lc3RhbXAYAiABKANSCXRpbWVzdGFtcBJJCgtlbnRpdHlfdHlwZRgDIAEoDjIoLmJ1Y2tldGVlci5ldmVudC5kb21haW4uRXZlbnQuRW50aXR5VHlwZVIKZW50aXR5VHlwZRIbCgllbnRpdHlfaWQYBCABKAlSCGVudGl0eUlkEjYKBHR5cGUYBSABKA4yIi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkV2ZW50LlR5cGVSBHR5cGUSKgoFZXZlbnQYBiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55UgVldmVudBI2CgZlZGl0b3IYByABKAsyHi5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkVkaXRvclIGZWRpdG9yEjkKB29wdGlvbnMYCCABKAsyHy5idWNrZXRlZXIuZXZlbnQuZG9tYWluLk9wdGlvbnNSB29wdGlvbnMSVQoRbG9jYWxpemVkX21lc3NhZ2UYCSABKAsyKC5idWNrZXRlZXIuZXZlbnQuZG9tYWluLkxvY2FsaXplZE1lc3NhZ2VSEGxvY2FsaXplZE1lc3NhZ2USHwoLZW50aXR5X2RhdGEYCiABKAlSCmVudGl0eURhdGESMAoUcHJldmlvdXNfZW50aXR5X2RhdGEYCyABKAlSEnByZXZpb3VzRW50aXR5RGF0YUIyWjBnaXRodWIuY29tL2J1Y2tldGVlci1pby9idWNrZXRlZXIvcHJvdG8vYXVkaXRsb2diBnByb3RvMwqwEwoccHJvdG8vYXVkaXRsb2cvc2VydmljZS5wcm90bxISYnVja2V0ZWVyLmF1ZGl0bG9nGh5nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8aHXByb3RvL2F1ZGl0bG9nL2F1ZGl0bG9nLnByb3RvIoQEChRMaXN0QXVkaXRMb2dzUmVxdWVzdBIbCglwYWdlX3NpemUYASABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgDIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USSwoIb3JkZXJfYnkYBCABKA4yMC5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEF1ZGl0TG9nc1JlcXVlc3QuT3JkZXJCeVIHb3JkZXJCeRJgCg9vcmRlcl9kaXJlY3Rpb24YBSABKA4yNy5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEF1ZGl0TG9nc1JlcXVlc3QuT3JkZXJEaXJlY3Rpb25SDm9yZGVyRGlyZWN0aW9uEiUKDnNlYXJjaF9rZXl3b3JkGAYgASgJUg1zZWFyY2hLZXl3b3JkEhIKBGZyb20YByABKANSBGZyb20SDgoCdG8YCCABKANSAnRvEjwKC2VudGl0eV90eXBlGAkgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVSCmVudGl0eVR5cGUiJQoHT3JkZXJCeRILCgdERUZBVUxUEAASDQoJVElNRVNUQU1QEAEiIwoOT3JkZXJEaXJlY3Rpb24SCAoEREVTQxAAEgcKA0FTQxABIo0BChVMaXN0QXVkaXRMb2dzUmVzcG9uc2USOwoKYXVkaXRfbG9ncxgBIAMoCzIcLmJ1Y2tldGVlci5hdWRpdGxvZy5BdWRpdExvZ1IJYXVkaXRMb2dzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50It4DChlMaXN0QWRtaW5BdWRpdExvZ3NSZXF1ZXN0EhsKCXBhZ2Vfc2l6ZRgBIAEoA1IIcGFnZVNpemUSFgoGY3Vyc29yGAIgASgJUgZjdXJzb3ISUAoIb3JkZXJfYnkYAyABKA4yNS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEFkbWluQXVkaXRMb2dzUmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmUKD29yZGVyX2RpcmVjdGlvbhgEIAEoDjI8LmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0QWRtaW5BdWRpdExvZ3NSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgFIAEoCVINc2VhcmNoS2V5d29yZBISCgRmcm9tGAYgASgDUgRmcm9tEg4KAnRvGAcgASgDUgJ0bxI8CgtlbnRpdHlfdHlwZRgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlUgplbnRpdHlUeXBlIiUKB09yZGVyQnkSCwoHREVGQVVMVBAAEg0KCVRJTUVTVEFNUBABIiMKDk9yZGVyRGlyZWN0aW9uEggKBERFU0MQABIHCgNBU0MQASKSAQoaTGlzdEFkbWluQXVkaXRMb2dzUmVzcG9uc2USOwoKYXVkaXRfbG9ncxgBIAMoCzIcLmJ1Y2tldGVlci5hdWRpdGxvZy5BdWRpdExvZ1IJYXVkaXRMb2dzEhYKBmN1cnNvchgCIAEoCVIGY3Vyc29yEh8KC3RvdGFsX2NvdW50GAMgASgDUgp0b3RhbENvdW50IvQDChlMaXN0RmVhdHVyZUhpc3RvcnlSZXF1ZXN0Eh0KCmZlYXR1cmVfaWQYASABKAlSCWZlYXR1cmVJZBIbCglwYWdlX3NpemUYAiABKANSCHBhZ2VTaXplEhYKBmN1cnNvchgDIAEoCVIGY3Vyc29yEjMKFWVudmlyb25tZW50X25hbWVzcGFjZRgEIAEoCVIUZW52aXJvbm1lbnROYW1lc3BhY2USUAoIb3JkZXJfYnkYBSABKA4yNS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEZlYXR1cmVIaXN0b3J5UmVxdWVzdC5PcmRlckJ5UgdvcmRlckJ5EmUKD29yZGVyX2RpcmVjdGlvbhgGIAEoDjI8LmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0RmVhdHVyZUhpc3RvcnlSZXF1ZXN0Lk9yZGVyRGlyZWN0aW9uUg5vcmRlckRpcmVjdGlvbhIlCg5zZWFyY2hfa2V5d29yZBgHIAEoCVINc2VhcmNoS2V5d29yZBISCgRmcm9tGAggASgDUgRmcm9tEg4KAnRvGAkgASgDUgJ0byIlCgdPcmRlckJ5EgsKB0RFRkFVTFQQABINCglUSU1FU1RBTVAQASIjCg5PcmRlckRpcmVjdGlvbhIICgRERVNDEAASBwoDQVNDEAEikgEKGkxpc3RGZWF0dXJlSGlzdG9yeVJlc3BvbnNlEjsKCmF1ZGl0X2xvZ3MYASADKAsyHC5idWNrZXRlZXIuYXVkaXRsb2cuQXVkaXRMb2dSCWF1ZGl0TG9ncxIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIfCgt0b3RhbF9jb3VudBgDIAEoA1IKdG90YWxDb3VudDLnAgoPQXVkaXRMb2dTZXJ2aWNlEmYKDUxpc3RBdWRpdExvZ3MSKC5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEF1ZGl0TG9nc1JlcXVlc3QaKS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEF1ZGl0TG9nc1Jlc3BvbnNlIgASdQoSTGlzdEFkbWluQXVkaXRMb2dzEi0uYnVja2V0ZWVyLmF1ZGl0bG9nLkxpc3RBZG1pbkF1ZGl0TG9nc1JlcXVlc3QaLi5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEFkbWluQXVkaXRMb2dzUmVzcG9uc2UiABJ1ChJMaXN0RmVhdHVyZUhpc3RvcnkSLS5idWNrZXRlZXIuYXVkaXRsb2cuTGlzdEZlYXR1cmVIaXN0b3J5UmVxdWVzdBouLmJ1Y2tldGVlci5hdWRpdGxvZy5MaXN0RmVhdHVyZUhpc3RvcnlSZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vYnVja2V0ZWVyLWlvL2J1Y2tldGVlci9wcm90by9hdWRpdGxvZ2IGcHJvdG8z + config: + grpcPort: 9000 + httpPort: 9003 + adminPort: 8001 + resources: {} service: - externalPort: 9000 -ingress: - host: - staticIPName: + type: NodePort + grpcPort: 9000 + httpPort: 9003 health: livenessProbe: initialDelaySeconds: 10 @@ -46,18 +131,9 @@ health: periodSeconds: 3 failureThreshold: 2 resources: {} -affinity: {} -nodeSelector: {} -pdb: - enabled: - maxUnavailable: 50% -hpa: - enabled: - minReplicas: - maxReplicas: - metrics: - cpu: - targetAverageUtilization: -tolerations: [] serviceAccount: annotations: {} +ingress: + name: web + host: + staticIPName: diff --git a/manifests/bucketeer/values.dev.yaml b/manifests/bucketeer/values.dev.yaml index 8d2886dcf..92c75e00b 100644 --- a/manifests/bucketeer/values.dev.yaml +++ b/manifests/bucketeer/values.dev.yaml @@ -21,7 +21,7 @@ migration: # First revision dbBaseline: "20240626022133" -backend: +web: env: gcpEnabled: false cloudService: hcv @@ -55,11 +55,15 @@ backend: tls: service: secret: bucketeer-service-cert - cert: - key: - issuer: - secret: bucketeer-service-cert - cert: + bucketeerJP: + secrets: + - hosts: + - web-gateway.bucketeer.io + secretName: bucketeer-service-cert + + ingress: + host: web-gateway.bucketeer.io + serviceToken: secret: bucketeer-service-token oauth: @@ -117,20 +121,6 @@ api-gateway: ingress: host: api-gateway.bucketeer.io -web-gateway: - env: - gcpEnabled: false - tls: - bucketeerJP: - secrets: - - hosts: - - web-gateway.bucketeer.io - secretName: bucketeer-service-cert - service: - secret: bucketeer-service-cert - ingress: - host: web-gateway.bucketeer.io - batch-server: env: @@ -192,7 +182,7 @@ batch-server: cronjob: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 1 - webGatewayAddress: https://web-gateway.default.svc.cluster.local:9000 + webGatewayAddress: https://web.default.svc.cluster.local:9003 jobs: - name: experiment-status-updater jobId: ExperimentStatusUpdater @@ -428,32 +418,3 @@ subscriber: flushSize: 100 flushInterval: 10 flushTimeout: 10 - - -experiment-calculator: - env: - gcpEnabled: false - profile: false - project: bucketeer-test - stanHost: localhost - stanPort: 8080 - mysqlUser: bucketeer - mysqlPass: bucketeer - mysqlHost: localenv-mysql-headless.default.svc.cluster.local - mysqlPort: 3306 - mysqlDbName: bucketeer - environmentService: localhost:9001 - experimentService: localhost:9001 - eventCounterService: localhost:9001 - logLevel: info - port: 9090 - metricsPort: 9002 - traceSamplingProbability: 0.001 - timezone: UTC - tls: - service: - secret: bucketeer-service-cert - cert: - key: - serviceToken: - secret: bucketeer-service-token \ No newline at end of file diff --git a/pkg/backend/cmd/server/server.go b/pkg/web/cmd/server/server.go similarity index 100% rename from pkg/backend/cmd/server/server.go rename to pkg/web/cmd/server/server.go diff --git a/pkg/backend/cmd/server/web_console.go b/pkg/web/cmd/server/web_console.go similarity index 100% rename from pkg/backend/cmd/server/web_console.go rename to pkg/web/cmd/server/web_console.go diff --git a/tools/gen/descriptor.sh b/tools/gen/descriptor.sh index 5ca37ba25..250d5cbd1 100644 --- a/tools/gen/descriptor.sh +++ b/tools/gen/descriptor.sh @@ -33,7 +33,7 @@ encoded_descriptor=$(cat ${DESCRIPTOR_PATH}/gateway/${descriptor_file} | base64 yq eval ".envoy.descriptor = \"${encoded_descriptor}\"" -i ${api_gateway_values_path} # web-gateway -web_gateway_values_path="./manifests/bucketeer/charts/web-gateway/values.yaml" +web_gateway_values_path="./manifests/bucketeer/charts/web/values.yaml" proto_descriptor_dirnames=$(find ${DESCRIPTOR_PATH} -name "$descriptor_file" -not -path "**/gateway/*" -print0 | xargs -0 -n1 dirname | awk -F/ '{print $NF}') for service_name in $proto_descriptor_dirnames do