-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(deps): update helm release cost-analyzer to v2.5.1 #899
Open
renovate
wants to merge
2
commits into
main
Choose a base branch
from
renovate/cost-analyzer-2.x
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Changes Default Valuesdiff -U 4 -r out-default-values/target/kubecost_cost-analyzer_default-values.out out-default-values/pr/kubecost_cost-analyzer_default-values.out
--- out-default-values/target/kubecost_cost-analyzer_default-values.out 2024-12-06 17:43:41.748488493 +0000
+++ out-default-values/pr/kubecost_cost-analyzer_default-values.out 2024-12-06 17:43:16.032171875 +0000
@@ -2,11 +2,12 @@
# zone: cluster.local (use only if your DNS server doesn't live in the same zone as kubecost)
prometheus:
enabled: true # Kubecost depends on Prometheus data, it is not optional. When enabled: false, Prometheus will not be installed and you must configure your own Prometheus to scrape kubecost as well as provide the fqdn below. -- Warning: Before changing this setting, please read to understand the risks https://docs.kubecost.com/install-and-configure/install/custom-prom
fqdn: http://cost-analyzer-prometheus-server.default.svc # example address of a prometheus to connect to. Include protocol (http:// or https://) Ignored if enabled: true
- # insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
+ insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
# queryServiceBasicAuthSecretName: dbsecret # kubectl create secret generic dbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD
# queryServiceBearerTokenSecretName: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN
+ kubeRBACProxy: false # If true, kubecost will use kube-rbac-proxy to authenticate with in cluster Prometheus for openshift
grafana:
enabled: true # If false, Grafana will not be installed
domainName: cost-analyzer-grafana.default.svc # example grafana domain Ignored if enabled: true
@@ -53,8 +54,10 @@
# or `global.prometheus.fqdn=http://{{ template "cost-analyzer.fullname" . }}-mimir-proxy.{{ .Release.Namespace }}.svc:8085/prometheus'
# Learn more at https://grafana.com/docs/mimir/latest/operators-guide/secure/authentication-and-authorization/#without-an-authenticating-reverse-proxy
mimirProxy:
enabled: false
+ ## Annotations to be added to the Mimir Proxy deployment template
+ annotations: {}
name: mimir-proxy
image: nginxinc/nginx-unprivileged
port: 8085
mimirEndpoint: $mimir_endpoint # Your Mimir query endpoint. If your Mimir query endpoint is http://example.com/prometheus, replace $mimir_endpoint with http://example.com/
@@ -62,11 +65,10 @@
# basicAuth:
# username: user
# password: pwd
- # Azure Monitor Managed Service for Prometheus
- # See https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/azure-monitor/essentials/prometheus-metrics-overview.md for information
- # and https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines for more information on setting this up
+ ## Azure Monitor Managed Service for Prometheus
+ ## Ref: https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines
ammsp:
enabled: false
prometheusServerEndpoint: http://localhost:8081/
remoteWriteService: $<AMMSP_METRICS_INGESTION_ENDPOINT>
@@ -83,76 +85,68 @@
identityType: userAssigned
aadClientId: $<AZURE_MANAGED_IDENTITY_CLIENT_ID>
aadTenantId: $<AZURE_MANAGED_IDENTITY_TENANT_ID>
+ ## Kubecost Alerting
+ ## Ref: http://docs.kubecost.com/alerts
notifications:
- # Kubecost alerting configuration
- # Ref: http://docs.kubecost.com/alerts
# alertConfigs:
- # frontendUrl: http://localhost:9090 # optional, used for linkbacks
- # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts
- # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Microsoft Teams alerts
- # globalAlertEmails:
- # - [email protected]
- # - [email protected]
- # globalEmailSubject: Custom Subject
- # Alerts generated by kubecost, about cluster data
- # alerts:
- # Daily namespace budget alert on namespace `kubecost`
- # - type: budget # supported: budget, recurringUpdate
- # threshold: 50 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: namespace
- # filter: kubecost
- # ownerContact: # optional, overrides globalAlertEmails default
- # - [email protected]
- # - [email protected]
- # # optional, used for alert-specific Slack and Microsoft Teams alerts
- # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
- # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX
-
- # Daily cluster budget alert on cluster `cluster-one`
- # - type: budget
- # threshold: 200.8 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: cluster
- # filter: cluster-one # does not accept csv
-
- # Recurring weekly update (weeklyUpdate alert)
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: '*'
-
- # Recurring weekly namespace update on kubecost namespace
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: kubecost
-
- # Spend Change Alert
- # - type: spendChange # change relative to moving avg
- # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
- # window: 1d # accepts ‘d’, ‘h’
- # baselineWindow: 30d # previous window, offset by window
- # aggregation: namespace
- # filter: kubecost, default # accepts csv
-
- # Health Score Alert
- # - type: health # Alerts when health score changes by a threshold
- # window: 10m
- # threshold: 5 # Send Alert if health scores changes by 5 or more
-
- # Kubecost Health Diagnostic
- # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
- # window: 10m
+ # frontendUrl: http://localhost:9090 # Optional
+ # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalAlertEmails:
+ # - [email protected]
+ # - [email protected]
+ # globalEmailSubject: Custom Subject
+ # alerts:
+ # # Daily namespace budget alert on namespace `kubecost`
+ # - type: budget # supported: budget, recurringUpdate
+ # threshold: 50 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: namespace
+ # filter: kubecost
+ # ownerContact: # optional, overrides globalAlertEmails default
+ # - [email protected]
+ # - [email protected]
+ # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # # Daily cluster budget alert on cluster `cluster-one`
+ # - type: budget
+ # threshold: 200.8 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: cluster
+ # filter: cluster-one # does not accept csv
+ # # Recurring weekly update (weeklyUpdate alert)
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: '*'
+ # # Recurring weekly namespace update on kubecost namespace
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: kubecost
+ # # Spend Change Alert
+ # - type: spendChange # change relative to moving avg
+ # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
+ # window: 1d # accepts ‘d’, ‘h’
+ # baselineWindow: 30d # previous window, offset by window
+ # aggregation: namespace
+ # filter: kubecost, default # accepts csv
+ # # Health Score Alert
+ # - type: health # Alerts when health score changes by a threshold
+ # window: 10m
+ # threshold: 5 # Send Alert if health scores changes by 5 or more
+ # # Kubecost Health Diagnostic
+ # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
+ # window: 10m
alertmanager: # Supply an alertmanager FQDN to receive notifications from the app.
enabled: false # If true, allow kubecost to write to your alertmanager
fqdn: http://cost-analyzer-prometheus-server.default.svc # example fqdn. Ignored if prometheus.enabled: true
- # Set saved Cost Allocation report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ ## Kubecost Saved Reports
+ ## Ref: http://docs.kubecost.com/saved-reports
savedReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Saved Report 0"
@@ -160,35 +154,32 @@
aggregateBy: "namespace"
chartDisplay: "category"
idle: "separate"
rate: "cumulative"
- accumulate: false # daily resolution
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ accumulate: false # daily resolution
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "cluster" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "dev"
- title: "Example Saved Report 1"
window: "month"
aggregateBy: "controllerKind"
chartDisplay: "category"
idle: "share"
rate: "monthly"
accumulate: false
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "namespace" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "kubecost"
- title: "Example Saved Report 2"
window: "2020-11-11T00:00:00Z,2020-12-09T23:59:59Z"
aggregateBy: "service"
chartDisplay: "category"
idle: "hide"
rate: "daily"
accumulate: true # entire window resolution
- filters: [] # if no filters, specify empty array
-
- # Set saved Asset report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ filters: [] # if no filters, specify empty array
assetReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Asset Report 0"
@@ -197,11 +188,8 @@
accumulate: false # daily resolution
filters:
- property: "cluster"
value: "cluster-one"
-
- # Set saved Cloud Cost report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
cloudCostReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Cloud Cost Report 0"
@@ -214,8 +202,12 @@
podAnnotations: {}
# iam.amazonaws.com/role: role-arn
+ # Annotations to be added for all controllers (StatefulSets, Deployments, DaemonSets)
+ annotations: {}
+ # iam.amazonaws.com/role: role-arn
+
# Applies these labels to all Deployments, StatefulSets, DaemonSets, and their pod templates.
additionalLabels: {}
securityContext:
@@ -242,8 +234,15 @@
route:
enabled: false # Create an OpenShift Route.
annotations: {} # Add annotations to the Route.
# host: kubecost.apps.okd4.example.com # Add a custom host for your Route.
+
+ # OPTIONAL. The following configs only to be enabled when using a Prometheus instance already installed in the cluster.
+ createMonitoringClusterRoleBinding: false # Create a ClusterRoleBinding to grant the Kubecost serviceaccount access to query Prometheus.
+ createMonitoringResourceReaderRoleBinding: false # Create a Role and Role Binding to allow Prometheus to list and watch Kubecost resources.
+ monitoringServiceAccountName: prometheus-k8s # Name of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+ monitoringServiceAccountNamespace: openshift-monitoring # Namespace of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+
# Create Security Context Constraint resources for the DaemonSets requiring additional privileges.
scc:
nodeExporter: false # Creates an SCC for Prometheus Node Exporter. This requires Node Exporter be enabled.
networkCosts: false # Creates an SCC for Kubecost network-costs. This requires network-costs be enabled.
@@ -258,18 +257,24 @@
skipSanityChecks: false # If true, skip all sanity/existence checks for resources like Secrets.
## Kubecost Integrations
## Ref: https://docs.kubecost.com/integrations
- ##
integrations:
+ turbonomic:
+ enabled: false # Set to true to enable the Turbonomic integration
+ clientId: "" # Client ID generated from the OAuth Client created
+ clientSecret: "" # Client Secret generated from the OAuth Client created
+ role: "" # Role that the OAuth Client was created with (e.g. ADMINISTRATOR, SITE_ADMIN, etc.)
+ host: "" # URL to your turbonomic API. EG: https://turbonomic.example.com/
+ insecureClient: false # Do not verify certificate
postgres:
enabled: false
- runInterval: "12h" # How frequently to run the integration.
- databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
- databasePort: "" # REQUIRED. ex: 5432
- databaseName: "" # REQUIRED. ex: postgres
- databaseUser: "" # REQUIRED. ex: myusername
- databasePassword: "" # REQUIRED. ex: mypassword
+ runInterval: "12h" # How frequently to run the integration.
+ databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
+ databasePort: "" # REQUIRED. ex: 5432
+ databaseName: "" # REQUIRED. ex: postgres
+ databaseUser: "" # REQUIRED. ex: myusername
+ databasePassword: "" # REQUIRED. ex: mypassword
databaseSecretName: "" # OPTIONAL. Specify your own k8s secret containing the above credentials. Must have key "creds.json".
## Configure what Postgres table to write to, and what parameters to pass
## when querying Kubecost's APIs. Ensure all parameters are enclosed in
@@ -303,8 +308,12 @@
# nameOverride: ""
## Provide a full name override option for the chart.
# fullnameOverride: ""
+## Provide additional labels for the chart.
+# chartLabels:
+# app.kubernetes.io/name: kubecost-cost-analyzer
+
## This flag is only required for users upgrading to a new version of Kubecost.
## The flag is used to ensure users are aware of important
## (potentially breaking) changes included in the new version.
##
@@ -322,79 +331,77 @@
region: "us-east-1"
URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI
csvAccessCredentials: pricing-schema-access-secret
-# SAML integration for user management and RBAC, enterprise key required
-# Ref: https://github.com/kubecost/docs/blob/main/user-management.md
+## Kubecost SAML (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-saml
saml:
enabled: false
- # secretName: "kubecost-authzero"
- # metadataSecretName: "kubecost-authzero-metadata" # One of metadataSecretName or idpMetadataURL must be set. defaults to metadataURL if set
- # idpMetadataURL: "https://dev-elu2z98r.auth0.com/samlp/metadata/c6nY4M37rBP0qSO1IYIqBPPyIPxLS8v2"
- # appRootURL: "http://localhost:9090" # sample URL
- # authTimeout: 1440 # number of minutes the JWT will be valid
- # redirectURL: "https://dev-elu2z98r.auth0.com/v2/logout" # callback URL redirected to after logout
- # audienceURI: "http://localhost:9090" # by convention, the same as the appRootURL, but any string uniquely identifying kubecost to your samp IDP. Optional if you follow the convention
- # nameIDFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" If your SAML provider requires a specific nameid format
- # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
- # encryptionCertSecret: "kubecost-saml-cert" # k8s secret where the x509 certificate used to encrypt an Okta saml response is stored
- # decryptionKeySecret: "kubecost-sank-decryption-key" # k8s secret where the private key associated with the encryptionCertSecret is stored
- # authSecret: "random-string" # value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
- # authSecretName: "kubecost-saml-secret" # name of k8s secret where the authSecret will be stored, defaults to "kubecost-saml-secret" if not provided
+ # secretName: ""
+ # metadataSecretName: "" # One of metadataSecretName or idpMetadataURL must be set. Defaults to idpMetadataURL if set.
+ # idpMetadataURL: ""
+ # appRootURL: ""
+ # authTimeout: 1440 # Number of minutes the JWT will be valid
+ # redirectURL: "" # Callback URL redirected to after logout
+ # audienceURI: "" # Usually the same as the appRootURL. Optionally any string uniquely identifying kubecost to your SAML IDP.
+ # nameIDFormat: "" # If your SAML provider requires a specific nameid format
+ # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
+ # encryptionCertSecret: "" # K8s secret storing the x509 certificate used to encrypt an Okta SAML response
+ # decryptionKeySecret: "" # K8s secret storing the private key associated with the encryptionCertSecret
+ # authSecret: "" # Value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
+ # authSecretName: "" # Name of K8s secret where the authSecret will be stored. Defaults to "kubecost-saml-secret" if not provided.
rbac:
enabled: false
# groups:
# - name: admin
- # enabled: false # if admin is disabled, all SAML users will be able to make configuration changes to the kubecost frontend
- # assertionName: "http://schemas.auth0.com/userType" # a SAML Assertion, one of whose elements has a value that matches on of the values in assertionValues
+ # enabled: false # If admin is disabled, all SAML users will be able to make configuration changes to the Kubecost frontend
+ # assertionName: ""
# assertionValues:
# - "admin"
# - "superusers"
# - name: readonly
- # enabled: false # if readonly is disabled, all users authorized on SAML will default to readonly
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: false # If readonly is disabled, all users authorized on SAML will default to readonly
+ # assertionName: ""
# assertionValues:
# - "readonly"
# - name: editor
- # enabled: true # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: true # If editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # assertionName: ""
# assertionValues:
# - "editor"
+## Kubecost OIDC (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-oidc
oidc:
enabled: false
- clientID: "" # application/client client_id parameter obtained from provider, used to make requests to server
- clientSecret: "" # application/client client_secret parameter obtained from provider, used to make requests to server
- # secretName: "kubecost-oidc-secret" # k8s secret where clientsecret will be stored
- # For use to provide a custom OIDC Secret. Overrides the usage of oidc.clientSecret and oidc.secretName.
- # Should contain the field directly.
- # Can be created using raw k8s secrets, external secrets, sealed secrets, or any other method.
+ clientID: "" # Application client_id parameter obtained from provider. Used to make requests to server.
+ clientSecret: "" # Application/client client_secret parameter obtained from provider. Used to make requests to server.
+ secretName: "kubecost-oidc-secret" # K8s secret where clientsecret will be stored
existingCustomSecret:
enabled: false
- name: "" # name of the secret containing the client secret
-
- # authURL: "https://my.auth.server/authorize" # endpoint for login to auth server
- # loginRedirectURL: "http://my.kubecost.url/model/oidc/authorize" # Kubecost url configured in provider for redirect after authentication
- # discoveryURL: "https://my.auth.server/.well-known/openid-configuration" # url for OIDC endpoint discovery
- skipOnlineTokenValidation: false # if true, will skip accessing OIDC introspection endpoint for online token verification, and instead try to locally validate JWT claims
- useClientSecretPost: false # if true, client secret will specifically only use client_secret_post method, otherwise it will attempt to send the secret in both the header and the body.
- # hostedDomain: "example.com" # optional, blocks access to the auth domain specified in the hd claim of the provider ID token
+ name: "" # Name of an existing clientSecret. Overrides the usage of oidc.clientSecret and oidc.secretName.
+ authURL: "" # Authorization endpoint for your identity provider
+ loginRedirectURL: "" # Kubecost URL endpoint which handles auth flow
+ discoveryURL: "" # Your identity provider's endpoint sharing OIDC configuration
+ skipOnlineTokenValidation: false # If true, validate JWT claims locally
+ useClientSecretPost: false # If true, only use client_secret_post method. Otherwise attempt to send the secret in both the header and the body.
+ hostedDomain: "" # Optional, blocks access to the auth domain specified in the hd claim of the provider ID token
rbac:
enabled: false
# groups:
- # - name: admin
- # enabled: false # if admin is disabled, all authenticated users will be able to make configuration changes to the kubecost frontend
- # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
- # claimValues: # Kubecost matches these strings with the roles created in your identity provider
+ # - name: admin # Admins have permissions to edit Kubecost settings and save reports
+ # enabled: false
+ # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
+ # claimValues: # Kubecost matches these strings with the roles created in your identity provider
# - "admin"
# - "superusers"
- # - name: readonly
- # enabled: false # if readonly is disabled, all authenticated users will default to readonly
- # claimName: "roles"
+ # - name: readonly # Readonly users do not have permissions to edit Kubecost settings or save reports.
+ # enabled: false
+ # claimName: "roles"
# claimValues:
# - "readonly"
- # - name: editor
- # enabled: false # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # - name: editor # Editors have permissions to edit reports/alerts and act as readers otherwise
+ # enabled: false
# claimName: "roles"
# claimValues:
# - "editor"
@@ -435,25 +442,14 @@
resources:
requests:
cpu: "10m"
memory: "55Mi"
- # limits:
- # cpu: "100m"
- # memory: "256Mi"
deploymentStrategy: {}
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
-
- # Define a readiness probe for the Kubecost frontend container.
readinessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
failureThreshold: 6
-
- # Define a liveness probe for the Kubecost frontend container.
livenessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
@@ -495,49 +491,8 @@
# emitNamespaceAnnotations: false
# emitKsmV1Metrics: true # emit all KSM metrics in KSM v1.
# emitKsmV1MetricsOnly: false # emit only the KSM metrics missing from KSM v2. Advanced users only.
- # Optional
- # The metrics exporter is a separate deployment and service (for prometheus scrape auto-discovery)
- # which emits metrics cost-model relies on. Enabling this deployment also removes the KSM dependency
- # from the cost-model. If the deployment is not enabled, the metrics will continue to be emitted from
- # the cost-model.
- exporter:
- enabled: false
- port: 9005
- # Adds the default Prometheus scrape annotations to the metrics exporter service.
- # Set to false and use service.annotations (below) to set custom scrape annotations.
- prometheusScrape: true
- resources: {}
- # requests:
- # cpu: "200m"
- # memory: "55Mi"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- tolerations: []
-
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
- affinity: {}
-
- service:
- annotations: {}
-
- # Service Monitor for Kubecost Metrics
- serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors.
- enabled: false
- additionalLabels: {}
- metricRelabelings: []
- relabelings: []
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
- priorityClassName: ""
- additionalLabels: {}
- nodeSelector: {}
- extraArgs: []
-
sigV4Proxy:
image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest
imagePullPolicy: IfNotPresent
name: aps
@@ -549,9 +504,8 @@
# - name: AWS_ACCESS_KEY_ID
# value: <access_key>
# - name: AWS_SECRET_ACCESS_KEY
# value: <secret_key>
- # Optional resource requests and limits for the sigV4proxy container.
resources: {}
kubecostModel:
image: "gcr.io/kubecost1/cost-model"
@@ -559,17 +513,14 @@
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for cost-model.
# fullImageName:
+ # Log level for the cost model container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
+ logLevel: info
+
# securityContext:
# readOnlyRootFilesystem: true
- # Build local cost allocation cache
- warmCache: false
- # Run allocation ETL pipelines
- etl: true
- # Enable the ETL filestore backing storage
- etlFileStoreEnabled: true
# The total number of days the ETL pipelines will build
# Set to 0 to disable daily ETL (not recommended)
etlDailyStoreDurationDays: 91
# The total number of hours the ETL pipelines will build
@@ -695,16 +646,13 @@
# limits:
# cpu: "800m"
# memory: "256Mi"
- # Define a readiness probe for the Kubecost cost-model container.
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the Kubecost cost-model container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -712,43 +660,18 @@
extraArgs: []
# Optional. A list of extra environment variables to be added to the cost-model container.
# extraEnv:
- # - name: LOG_LEVEL
- # value: trace
# - name: LOG_FORMAT
# value: json
# # When false, Kubecost will not show Asset costs for local disks physically
# # attached to nodes (e.g. ephemeral storage). This needs to be applied to
# # each cluster monitored.
# - name: ASSET_INCLUDE_LOCAL_DISK_COST
# value: "true"
- # creates an ingress directly to the model container, for API access
- ingress:
- enabled: false
- # className: nginx
- labels:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- annotations:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- paths: ["/"]
- pathType: ImplementationSpecific
- hosts:
- - cost-analyzer-model.local
- tls: []
- # - secretName: cost-analyzer-model-tls
- # hosts:
- # - cost-analyzer-model.local
utcOffset: "+00:00"
- # Optional - add extra ports to the cost-model container. For kubecost development purposes only - not recommended for users.
extraPorts: []
- # - name: debug
- # port: 40000
- # targetPort: 40000
- # containerPort: 40000
## etlUtils is a utility typically used by Enterprise customers transitioning
## from v1 to v2 of Kubecost. It translates the data from the "/etl" dir of the
## bucket, to the "/federated" dir of the bucket.
@@ -760,8 +683,10 @@
resources: {}
env: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added to etlutils deployment
+ annotations: {}
affinity: {}
# Basic Kubecost ingress, more examples available at https://docs.kubecost.com/install-and-configure/install/ingress-examples
ingress:
@@ -782,77 +707,25 @@
# hosts:
# - cost-analyzer.local
nodeSelector: {}
-
tolerations: []
-# - key: "key"
-# operator: "Equal|Exists"
-# value: "value"
-# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
topologySpreadConstraints: []
-
-# If true, creates a PriorityClass to be used by the cost-analyzer pod
priority:
enabled: false
- name: "" # Provide name of existing priority class only. If left blank, upstream chart will create one from default template.
-
-# If true, enable creation of NetworkPolicy resources.
-networkPolicy:
- enabled: false
- denyEgress: true # create a network policy that denies egress from kubecost
- sameNamespace: true # Set to true if cost analyzer and prometheus are on the same namespace
-# namespace: kubecost # Namespace where prometheus is installed
-
- # Cost-analyzer specific vars using the new template
- costAnalyzer:
- enabled: false # If true, create a network policy for cost-analyzer
- annotations: {} # annotations to be added to the network policy
- additionalLabels: {} # additional labels to be added to the network policy
- # Examples rules:
- # ingressRules:
- # - selectors: # allow ingress from self on all ports
- # - podSelector:
- # matchLabels:
- # app.kubernetes.io/name: cost-analyzer
- # - selectors: # allow egress access to prometheus
- # - namespaceSelector:
- # matchLabels:
- # name: prometheus
- # podSelector:
- # matchLabels:
- # app: prometheus
- # ports:
- # - protocol: TCP
- # port: 9090
- # egressRules:
- # - selectors: # restrict egress to inside cluster
- # - namespaceSelector: {}
-
-## @param extraVolumes A list of volumes to be added to the pod
-##
+ name: ""
extraVolumes: []
-## @param extraVolumeMounts A list of volume mounts to be added to the pod
-##
extraVolumeMounts: []
# Define persistence volume for cost-analyzer, more information at https://docs.kubecost.com/install-and-configure/install/storage
persistentVolume:
size: 32Gi
- dbSize: 32.0Gi
enabled: true # Note that setting this to false means configurations will be wiped out on pod restart.
# storageClass: "-" #
# existingClaim: kubecost-cost-analyzer # a claim in the same namespace as kubecost
labels: {}
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- # Enables a separate PV specifically for ETL data. This should be avoided, but
- # is kept for legacy compatibility.
- dbPVEnabled: false
service:
type: ClusterIP
port: 9090
@@ -873,20 +746,15 @@
rbac:
create: true # Create the RBAC resources for Prometheus.
- ## Define serviceAccount names for components. Defaults to component's fully qualified name.
- ##
serviceAccounts:
alertmanager:
create: true
name:
nodeExporter:
create: true
name:
- pushgateway:
- create: true
- name:
server:
create: true
name:
## Prometheus server ServiceAccount annotations.
@@ -897,9 +765,8 @@
##
# selfsignedCertConfigMapName: ""
imagePullSecrets:
- # - name: "image-pull-secret"
extraScrapeConfigs: |
- job_name: kubecost
honor_labels: true
@@ -939,9 +806,9 @@
{{- end }}
## Enables scraping of NVIDIA GPU metrics via dcgm-exporter. Scrapes all
## endpoints which contain "dcgm-exporter" in labels "app",
## "app.kubernetes.io/component", or "app.kubernetes.io/name" with a case
- ## insensitive match.
+ ## insensitive match. The label must be present on the K8s service endpoints and not just pods.
## Refs:
## https://github.com/NVIDIA/gpu-operator/blob/d4316a415bbd684ce8416a88042305fc1a093aa4/assets/state-dcgm-exporter/0600_service.yaml#L7
## https://github.com/NVIDIA/dcgm-exporter/blob/54fd1ca137c66511a87a720390613680b9bdabdd/deployment/templates/service.yaml#L23
- job_name: kubecost-dcgm-exporter
@@ -961,381 +828,122 @@
## Provide a full name override for the Prometheus server.
# fullnameOverride: ""
- ## Prometheus server container name
- ##
enabled: true
name: server
sidecarContainers:
strategy:
type: Recreate
rollingUpdate: null
-
- ## Prometheus server container image
- ##
image:
repository: quay.io/prometheus/prometheus
tag: v2.55.1
pullPolicy: IfNotPresent
-
- ## prometheus server priorityClassName
- ##
priorityClassName: ""
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
- ## Maybe same with Ingress host name
baseURL: ""
-
- ## Additional server container environment variables
- ##
- ## You specify this manually like you would a raw deployment manifest.
- ## This means you can bind in environment variables from secrets.
- ##
- ## e.g. static environment variable:
- ## - name: DEMO_GREETING
- ## value: "Hello from the environment"
- ##
- ## e.g. secret environment variable:
- ## - name: USERNAME
- ## valueFrom:
- ## secretKeyRef:
- ## name: mysecret
- ## key: username
env: []
-
extraFlags:
- web.enable-lifecycle
- ## web.enable-admin-api flag controls access to the administrative HTTP API which includes functionality such as
- ## deleting time series. This is disabled by default.
- # - web.enable-admin-api
- ##
- ## storage.tsdb.no-lockfile flag controls BD locking
- # - storage.tsdb.no-lockfile
- ##
- ## storage.tsdb.wal-compression flag enables compression of the write-ahead log (WAL)
- # - storage.tsdb.wal-compression
-
- ## Path to a configuration file on prometheus server container FS
configPath: /etc/config/prometheus.yml
-
global:
- ## How frequently to scrape targets by default
- ##
scrape_interval: 1m
- ## How long until a scrape request times out
- ##
scrape_timeout: 60s
- ## How frequently to evaluate rules
- ##
evaluation_interval: 1m
external_labels:
cluster_id: cluster-one # Each cluster should have a unique ID
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
- ##
remoteWrite: {}
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
- ##
remoteRead: {}
-
- ## Additional Prometheus server container arguments
- ##
extraArgs:
query.max-concurrency: 1
query.max-samples: 100000000
-
- ## Additional InitContainers to initialize the pod
- ##
extraInitContainers: []
-
- ## Additional Prometheus server Volume mounts
- ##
extraVolumeMounts: []
-
- ## Additional Prometheus server Volumes
- ##
extraVolumes: []
-
- ## Additional Prometheus server hostPath mounts
- ##
extraHostPathMounts: []
- # - name: certs-dir
- # mountPath: /etc/kubernetes/certs
- # subPath: ""
- # hostPath: /etc/kubernetes/certs
- # readOnly: true
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # subPath: ""
- # configMap: certs-configmap
- # readOnly: true
-
- ## Additional Prometheus server Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: prom-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.server.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/server-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
ingress:
- ## If true, Prometheus server Ingress will be created
- ##
enabled: false
# className: nginx
-
- ## Prometheus server Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## Prometheus server Ingress additional labels
- ##
extraLabels: {}
-
- ## Prometheus server Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - prometheus.domain.com
- # - domain.com/prometheus
-
- ## PathType determines the interpretation of the Path matching
pathType: "Prefix"
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## Prometheus server Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-server-tls
- # hosts:
- # - prometheus.domain.com
-
- ## Server Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for Prometheus server pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, Prometheus server will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## Prometheus server data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## Prometheus server data Persistent Volume annotations
- ##
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- ## Prometheus server data Persistent Volume existing claim name
- ## Requires server.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## Prometheus server data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## Prometheus server data Persistent Volume size
- ##
size: 32Gi
-
- ## Prometheus server data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## Prometheus server data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of Prometheus server data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
emptyDir:
sizeLimit: ""
-
- ## Annotations to be added to Prometheus server pods
- ##
podAnnotations: {}
- # iam.amazonaws.com/role: prometheus
-
- ## Annotations to be added to the Prometheus Server deployment
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to Prometheus server pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Prometheus AlertManager configuration
- ##
alertmanagers: []
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
annotations: {}
labels: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
servicePort: 80
-
- ## Prometheus server readiness and liveness probe initial delay and timeout
- ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
- ##
readinessProbeInitialDelay: 5
readinessProbeTimeout: 3
readinessProbeFailureThreshold: 3
readinessProbeSuccessThreshold: 1
livenessProbeInitialDelay: 5
livenessProbeTimeout: 3
livenessProbeFailureThreshold: 3
livenessProbeSuccessThreshold: 1
-
- ## Prometheus server resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 500m
- # memory: 512Mi
- # requests:
- # cpu: 500m
- # memory: 512Mi
-
- ## Vertical Pod Autoscaler config
- ## Ref: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
verticalAutoscaler:
- ## If true a VPA object will be created for the controller (either StatefulSet or Deployment, based on above configs)
enabled: false
## Optional. Defaults to "Auto" if not specified.
# updateMode: "Auto"
## Mandatory. Without, VPA will not be created.
# containerPolicies:
# - containerName: 'prometheus-server'
-
- ## Security context to be added to server pods
- ##
securityContext: {}
- # runAsUser: 1001
- # runAsNonRoot: true
- # runAsGroup: 1001
- # fsGroup: 1001
-
containerSecurityContext: {}
-
service:
annotations: {}
labels: {}
clusterIP: ""
- # nodePort: ""
-
- ## List of IP addresses at which the Prometheus server service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
sessionAffinity: None
type: ClusterIP
-
- ## Enable gRPC port on service to allow auto discovery with thanos-querier
gRPC:
enabled: false
servicePort: 10901
- # nodePort: 10901
-
- ## If using a statefulSet (statefulSet.enabled=true), configure the
- ## service to connect to a specific replica to have a consistent view
- ## of the data.
statefulsetReplica:
enabled: false
replica: 0
-
- ## Prometheus server pod termination grace period
- ##
terminationGracePeriodSeconds: 300
## Prometheus data retention period (default if not specified is 97 hours)
##
@@ -1366,292 +974,92 @@
# retentionSize: should be significantly greater than the storage used in the number of hours set in etlHourlyStoreDurationHours
# Install Prometheus Alert Manager
alertmanager:
- ## If false, alertmanager will not be installed
- ##
enabled: false
-
## Provide a full name override for Prometheus alertmanager.
# fullnameOverride: ""
-
strategy:
type: Recreate
rollingUpdate: null
-
- ## alertmanager container name
- ##
name: alertmanager
-
- ## alertmanager container image
- ##
image:
repository: quay.io/prometheus/alertmanager
tag: v0.27.0
pullPolicy: IfNotPresent
-
- ## alertmanager priorityClassName
- ##
priorityClassName: ""
-
- ## Additional alertmanager container arguments
- ##
extraArgs: {}
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
baseURL: "http://localhost:9093"
-
- ## Additional alertmanager container environment variable
- ## For instance to add a http_proxy
- ##
extraEnv: {}
-
- ## Additional alertmanager Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: alertmanager-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
- ## The name of a secret in the same kubernetes namespace which contains the Alertmanager config
- ## Defining configFromSecret will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configFromSecret: ""
-
- ## The configuration file name to be loaded to alertmanager
- ## Must match the key within configuration loaded from ConfigMap/Secret
- ##
configFileName: alertmanager.yml
-
ingress:
- ## If true, alertmanager Ingress will be created
- ##
enabled: false
-
- ## alertmanager Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## alertmanager Ingress additional labels
- ##
extraLabels: {}
-
- ## alertmanager Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - alertmanager.domain.com
- # - domain.com/alertmanager
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## alertmanager Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - alertmanager.domain.com
-
- ## Alertmanager Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for alertmanager scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for alertmanager pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, alertmanager will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## alertmanager data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## alertmanager data Persistent Volume Claim annotations
- ##
annotations: {}
-
- ## alertmanager data Persistent Volume existing claim name
- ## Requires alertmanager.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## alertmanager data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## alertmanager data Persistent Volume size
- ##
size: 2Gi
-
- ## alertmanager data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## alertmanager data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of alertmanager data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
- ## Annotations to be added to alertmanager pods
- ##
podAnnotations: {}
- ## Tell prometheus to use a specific set of alertmanager pods
- ## instead of all alertmanager pods found in the same namespace
- ## Useful if you deploy multiple releases within the same namespace
- ##
- ## prometheus.io/probe: alertmanager-teamA
-
- ## Labels to be added to Prometheus AlertManager pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
+ annotations: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
servicePort: 80
-
- ## alertmanager resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to alertmanager pods
- ##
securityContext:
runAsUser: 1001
runAsNonRoot: true
runAsGroup: 1001
fsGroup: 1001
-
service:
annotations: {}
labels: {}
clusterIP: ""
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
- ## List of IP addresses at which the alertmanager service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
# nodePort: 30000
sessionAffinity: None
type: ClusterIP
- # Define a custom scheduler for Alertmanager pods
- # schedulerName: default-scheduler
-
- ## alertmanager ConfigMap entries
- ##
alertmanagerFiles:
alertmanager.yml:
global: {}
- # slack_api_url: ''
-
receivers:
- name: default-receiver
- # slack_configs:
- # - channel: '@you'
- # send_resolved: true
-
route:
group_wait: 10s
group_interval: 5m
receiver: default-receiver
@@ -1659,87 +1067,32 @@
## Monitors ConfigMap changes and POSTs to a URL
configmapReload:
prometheus:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
-
- ## configmap-reload container securityContext
containerSecurityContext: {}
alertmanager:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # node-export must be disabled if there is an existing daemonset: https://guide.kubecost.com/hc/en-us/articles/4407601830679-Troubleshoot-Install#a-name-node-exporter-a-issue-failedscheduling-kubecost-prometheus-node-exporter
nodeExporter:
## If false, node-exporter will not be installed.
## This is disabled by default in Kubecost 2.0, though it can be enabled as needed.
##
@@ -1747,346 +1100,59 @@
## Provide a full name override for node exporter.
# fullnameOverride: ""
- ## If true, node-exporter pods share the host network namespace
- ##
hostNetwork: true
-
- ## If true, node-exporter pods share the host PID namespace
- ##
hostPID: true
-
- ## node-exporter dns policy
- ##
dnsPolicy: ClusterFirstWithHostNet
-
- ## node-exporter container name
- ##
name: node-exporter
-
- ## node-exporter container image
- ##
image:
repository: prom/node-exporter
tag: v1.8.2
pullPolicy: IfNotPresent
-
- ## node-exporter priorityClassName
- ##
priorityClassName: ""
-
- ## Custom Update Strategy
- ##
updateStrategy:
type: RollingUpdate
-
- ## Additional node-exporter container arguments
- ##
extraArgs: {}
-
- ## Additional node-exporter hostPath mounts
- ##
extraHostPathMounts: []
- # - name: textfile-dir
- # mountPath: /srv/txt_collector
- # hostPath: /var/lib/node-exporter
- # readOnly: true
- # mountPropagation: HostToContainer
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # configMap: certs-configmap
- # readOnly: true
-
- ## Set a custom affinity for node-exporter
- ##
# affinity:
-
- ## Node tolerations for node-exporter scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for node-exporter pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Annotations to be added to node-exporter pods
- ##
podAnnotations: {}
-
- ## Annotations to be added to the node-exporter DaemonSet
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to node-exporter pods
- ##
+ annotations: {}
pod:
labels: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## node-exporter resource limits & requests
- ## Ref: https://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 200m
- # memory: 50Mi
- # requests:
- # cpu: 100m
- # memory: 30Mi
-
- ## Security context to be added to node-exporter pods
- ##
securityContext: {}
- # runAsUser: 0
-
service:
annotations:
prometheus.io/scrape: "true"
labels: {}
-
- # Exposed as a headless service:
- # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
clusterIP: None
-
- ## List of IP addresses at which the node-exporter service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
hostPort: 9100
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 9100
type: ClusterIP
- # Install Prometheus Push Gateway.
- pushgateway:
- ## If false, pushgateway will not be installed
- ##
- enabled: false
-
- ## Provide a full name override for Prometheus push gateway.
- # fullnameOverride: ""
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
- # schedulerName:
-
- ## pushgateway container name
- ##
- name: pushgateway
-
- ## pushgateway container image
- ##
- image:
- repository: prom/pushgateway
- tag: v1.9.0
- pullPolicy: IfNotPresent
-
- ## pushgateway priorityClassName
- ##
- priorityClassName: ""
-
- ## Additional pushgateway container arguments
- ##
- ## for example: persistence.file: /data/pushgateway.data
- extraArgs: {}
-
- ingress:
- ## If true, pushgateway Ingress will be created
- ##
- enabled: false
-
- ## pushgateway Ingress annotations
- ##
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## pushgateway Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
- hosts: []
- # - pushgateway.domain.com
- # - domain.com/pushgateway
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
- extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## pushgateway Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
- tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - pushgateway.domain.com
-
- ## Node tolerations for pushgateway scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
- tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for pushgateway pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
- nodeSelector: {}
-
- ## Annotations to be added to pushgateway pods
- ##
- podAnnotations: {}
-
- replicaCount: 1
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
- podDisruptionBudget:
- enabled: false
- maxUnavailable: 1
-
- ## pushgateway resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
- resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to push-gateway pods
- ##
- securityContext:
- runAsUser: 1001
- runAsNonRoot: true
-
- service:
- annotations:
- prometheus.io/probe: pushgateway
- labels: {}
- clusterIP: ""
-
- ## List of IP addresses at which the pushgateway service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
- externalIPs: []
-
- loadBalancerIP: ""
- loadBalancerSourceRanges: []
- servicePort: 9091
- type: ClusterIP
-
- strategy:
- type: Recreate
- rollingUpdate: null
-
-
- persistentVolume:
- ## If true, pushgateway will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
- enabled: true
-
- ## pushgateway data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
- accessModes:
- - ReadWriteOnce
-
- ## pushgateway data Persistent Volume Claim annotations
- ##
- annotations: {}
-
- ## pushgateway data Persistent Volume existing claim name
- ## Requires pushgateway.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
- existingClaim: ""
-
- ## pushgateway data Persistent Volume mount root path
- ##
- mountPath: /data
-
- ## pushgateway data Persistent Volume size
- ##
- size: 2Gi
-
- ## pushgateway data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
- # storageClass: "-"
-
- ## pushgateway data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
- # volumeBindingMode: ""
-
- ## Subdirectory of pushgateway data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
- subPath: ""
-
serverFiles:
## Alerts configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
alerting_rules.yml: {}
- # groups:
- # - name: Instances
- # rules:
- # - alert: InstanceDown
- # expr: up == 0
- # for: 5m
- # labels:
- # severity: page
- # annotations:
- # description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.'
- # summary: 'Instance {{ $labels.instance }} down'
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use alerting_rules.yml
- alerts: {}
## Records configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/
recording_rules.yml: {}
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use recording_rules.yml
prometheus.yml:
rule_files:
- /etc/config/recording_rules.yml
- /etc/config/alerting_rules.yml
- ## Below two files are DEPRECATED will be removed from this default values file
- - /etc/config/rules
- - /etc/config/alerts
scrape_configs:
- job_name: prometheus
static_configs:
@@ -2098,9 +1164,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes-cadvisor'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2159,9 +1224,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2252,21 +1316,8 @@
metric_relabel_configs:
- source_labels: [__name__]
regex: (container_cpu_allocation|container_cpu_usage_seconds_total|container_fs_limit_bytes|container_fs_writes_bytes_total|container_gpu_allocation|container_memory_allocation_bytes|container_memory_usage_bytes|container_memory_working_set_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|DCGM_FI_DEV_GPU_UTIL|deployment_match_labels|kube_daemonset_status_desired_number_scheduled|kube_daemonset_status_number_ready|kube_deployment_spec_replicas|kube_deployment_status_replicas|kube_deployment_status_replicas_available|kube_job_status_failed|kube_namespace_annotations|kube_namespace_labels|kube_node_info|kube_node_labels|kube_node_status_allocatable|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_memory_bytes|kube_node_status_capacity|kube_node_status_capacity_cpu_cores|kube_node_status_capacity_memory_bytes|kube_node_status_condition|kube_persistentvolume_capacity_bytes|kube_persistentvolume_status_phase|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_pod_container_info|kube_pod_container_resource_limits|kube_pod_container_resource_limits_cpu_cores|kube_pod_container_resource_limits_memory_bytes|kube_pod_container_resource_requests|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests_memory_bytes|kube_pod_container_status_restarts_total|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_labels|kube_pod_owner|kube_pod_status_phase|kube_replicaset_owner|kube_statefulset_replicas|kube_statefulset_status_replicas|kubecost_cluster_info|kubecost_cluster_management_cost|kubecost_cluster_memory_working_set_bytes|kubecost_load_balancer_cost|kubecost_network_internet_egress_cost|kubecost_network_region_egress_cost|kubecost_network_zone_egress_cost|kubecost_node_is_spot|kubecost_pod_network_egress_bytes_total|node_cpu_hourly_cost|node_cpu_seconds_total|node_disk_reads_completed|node_disk_reads_completed_total|node_disk_writes_completed|node_disk_writes_completed_total|node_filesystem_device_error|node_gpu_count|node_gpu_hourly_cost|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_network_transmit_bytes_total|node_ram_hourly_cost|node_total_hourly_cost|pod_pvc_allocation|pv_hourly_cost|service_selector_labels|statefulSet_match_labels|kubecost_pv_info|up)
action: keep
-
-
- # prometheus.yml: # Sample block -- enable if using an in cluster durable store.
- # remote_write:
- # - url: "http://pgprometheus-adapter:9201/write"
- # write_relabel_configs:
- # - source_labels: [__name__]
- # regex: 'container_.*_allocation|container_.*_allocation_bytes|.*_hourly_cost|kube_pod_container_resource_requests{resource="memory", unit="byte"}|container_memory_working_set_bytes|kube_pod_container_resource_requests{resource="cpu", unit="core"}|kube_pod_container_resource_requests|pod_pvc_allocation|kube_namespace_labels|kube_pod_labels'
- # action: keep
- # queue_config:
- # max_samples_per_send: 1000
- # remote_read:
- # - url: "http://pgprometheus-adapter:9201/read"
rules:
groups:
- name: CPU
rules:
@@ -2307,13 +1358,10 @@
# regex: (.+)\d+
# target_label: dc
networkPolicy:
- ## Enable creation of NetworkPolicy resources.
- ##
enabled: false
-
## Optional daemonset to more accurately attribute network costs to the correct workload
## https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration
networkCosts:
enabled: false
@@ -2332,14 +1380,15 @@
# Traffic Logging will enable logging the top 5 destinations for each source
# every 30 minutes.
trafficLogging: true
+ # Log level for the network cost containers. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# Port will set both the containerPort and hostPort to this value.
# These must be identical due to network-costs being run on hostNetwork
port: 3001
- # this daemonset can use significant resources on large clusters: https://guide.kubecost.com/hc/en-us/articles/4407595973527-Network-Traffic-Cost-Allocation
+ # this daemonset can use significant resources on large clusters: https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/cost-allocation/network-allocation
resources:
limits: # remove the limits by setting cpu: null
cpu: 500m # can be less, will depend on cluster size
# memory: it is not recommended to set a memory limit
@@ -2410,75 +1459,41 @@
# ips:
# - "15.128.15.2"
# - "20.0.0.0/8"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
service:
annotations: {}
labels: {}
-
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- ## PodMonitor
- ## Allows scraping of network metrics from a dedicated prometheus operator setup
podMonitor:
enabled: false
additionalLabels: {}
- # match the default extraScrapeConfig
additionalLabels: {}
nodeSelector: {}
+ # Annotations to be added to network cost daemonset template and pod template annotations
annotations: {}
healthCheckProbes: {}
- # readinessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
- # livenessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
additionalSecurityContext: {}
- # readOnlyRootFilesystem: true
## Kubecost Deployment Configuration
## Used for HA mode in Business & Enterprise tier
##
kubecostDeployment:
replicas: 1
- # deploymentStrategy:
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
labels: {}
annotations: {}
-
## Kubecost Forecasting forecasts future cost patterns based on historical
## patterns observed by Kubecost.
forecasting:
enabled: true
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for the forecasting
# container.
- # Example: fullImageName: gcr.io/kubecost1/forecasting:v0.0.1
- fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.18
imagePullPolicy: IfNotPresent
# Resource specification block for the forecasting container.
resources:
@@ -2494,30 +1509,20 @@
# -t is the worker timeout which primarily affects model training time;
# if it is not high enough, training workers may die mid training
"GUNICORN_CMD_ARGS": "--log-level info -t 1200"
- # Define a priority class for the forecasting Deployment.
priority:
enabled: false
name: ""
-
- # Define a nodeSelector for the forecasting Deployment.
nodeSelector: {}
-
- # Define tolerations for the forecasting Deployment.
tolerations: []
-
- # Define Pod affinity for the forecasting Deployment.
+ annotations: {}
affinity: {}
-
- # Define a readiness probe for the forecasting container
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the forecasting container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -2545,8 +1550,9 @@
# Replicas sets the number of Aggregator replicas. It only has an effect if
# `deployMethod: "statefulset"`
replicas: 1
+ # Log level for the aggregator container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# stagingEmptyDirSizeLimit changes how large the "staging"
# /var/configs/waterfowl emptyDir is. It only takes effect in StatefulSet
@@ -2673,8 +1679,11 @@
## Define tolerations for the aggregator pod
# tolerations: []
+ ## Annotations to be added for aggregator deployment or statefulset
+ # annotations: {}
+
## Define Pod affinity for the aggregator pod
# affinity: {}
## Define extra volumes for the aggregator pod
@@ -2737,9 +1746,8 @@
jaeger:
enabled: false
image: jaegertracing/all-in-one
imageVersion: latest
- # containerSecurityContext:
service:
labels: {}
@@ -2785,8 +1793,10 @@
securityContext: {}
containerSecurityContext: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added for diagnostics Deployment.
+ annotations: {}
affinity: {}
## Provide a full name override for the diagnostics Deployment.
# diagnosticsFullnameOverride: ""
@@ -2797,14 +1807,16 @@
image:
repository: gcr.io/kubecost1/cluster-controller
tag: v0.16.9
imagePullPolicy: IfNotPresent
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Set custom tolerations for the cluster controller.
tolerations: []
+
+ ## Annotations to be added for cluster controller template
+ annotations: {}
resources: {}
+ affinity: {}
+ nodeSelector: {}
actionConfigs:
# this configures the Kubecost Cluster Turndown action
# for more details, see documentation at https://github.com/kubecost/cluster-turndown/tree/develop?tab=readme-ov-file#setting-a-turndown-schedule
clusterTurndown: []
@@ -2950,12 +1962,12 @@
# initChownDataImage ensures all Kubecost filepath permissions on PV or local storage are set up correctly.
initChownDataImage: "busybox" # Supports a fully qualified Docker image, e.g. registry.hub.docker.com/library/busybox:latest
initChownData:
resources: {}
- # requests:
- # cpu: "50m"
- # memory: "20Mi"
+## Kubecost's Bundled Grafana
+## You can access it by visiting http://kubecost.me.com/grafana/
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/custom-grafana
grafana:
# namespace_datasources: kubecost # override the default namespace here
# namespace_dashboards: kubecost # override the default namespace here
rbac:
@@ -2987,106 +1999,45 @@
# prometheusType: Prometheus
# prometheusVersion: 2.35.0
# timeInterval: 1m
- ## Number of replicas for the Grafana deployment
replicas: 1
-
- ## Deployment strategy for the Grafana deployment
deploymentStrategy: RollingUpdate
-
- ## Readiness probe for the Grafana deployment
readinessProbe:
httpGet:
path: /api/health
port: 3000
-
- ## Liveness probe for the Grafana deployment
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 60
timeoutSeconds: 30
failureThreshold: 10
-
- ## Container image settings for the Grafana deployment
image:
repository: grafana/grafana
tag: 11.3.1
pullPolicy: IfNotPresent
-
- ## Optionally specify an array of imagePullSecrets.
- ## Secrets must be manually created in the namespace.
# pullSecrets:
- # - myRegistrKeySecretName
-
- ## Pod-level security context for the Grafana deployment. Recommended let global defaults take effect.
securityContext: {}
- # runAsUser: 472
- # fsGroup: 472
-
- ## PriorityClassName for the Grafana deployment
priorityClassName: ""
## Container image settings for Grafana initContainer used to download dashboards. Will only be used when dashboards are present.
downloadDashboardsImage:
repository: curlimages/curl
tag: latest
pullPolicy: IfNotPresent
-
- ## Pod Annotations for the Grafana deployment
podAnnotations: {}
-
- ## Deployment annotations for the Grafana deployment
annotations: {}
-
- ## Expose the Grafana service to be accessed from outside the cluster (LoadBalancer service).
- ## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
service:
type: ClusterIP
port: 80
annotations: {}
labels: {}
-
- ## This template is not needed and is not supported.
- ## It is here for backwards compatibility.
- ## Kubecost exposes grafana by default with the
- ## top level ingress template under /grafana/
- ingress:
- enabled: false
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- labels: {}
- path: /
- pathType: Prefix
- hosts:
- - chart-example.local
- tls: []
- # - secretName: chart-example-tls
- # hosts:
- # - chart-example.local
-
- ## Resource requests and limits for the Grafana deployment
resources: {}
- # limits:
- # cpu: 100m
- # memory: 128Mi
- # requests:
- # cpu: 100m
- # memory: 128Mi
-
- ## Node labels for pod assignment of the Grafana deployment
nodeSelector: {}
-
- ## Tolerations for pod assignment of the Grafana deployment
tolerations: []
-
- ## Affinity for pod assignment of the Grafana deployment
affinity: {}
-
- ## Enable persistence using Persistent Volume Claims of the Grafana deployment
persistence:
enabled: false
# storageClassName: default
# accessModes:
@@ -3094,117 +2045,18 @@
# size: 10Gi
# annotations: {}
# subPath: ""
# existingClaim:
-
- ## Admin user for Grafana
adminUser: admin
-
- ## Admin password for Grafana
adminPassword: strongpassword
-
- ## Use an alternate scheduler for the Grafana deployment
# schedulerName:
-
- ## Extra environment variables that will be passed onto Grafana deployment pods
env: {}
-
- ## The name of a secret for Grafana in the same Kubernetes namespace which contain values to be added to the environment
- ## This can be useful for auth tokens, etc
envFromSecret: ""
-
- ## Additional Grafana server secret mounts
- ## Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # secretName: grafana-secret-files
- # readOnly: true
-
- ## List of Grafana plugins
plugins: []
- # - digrich-bubblechart-panel
- # - grafana-clock-panel
-
- ## Grafana dashboard providers
- ## ref: http://docs.grafana.org/administration/provisioning/#dashboards
- ##
- ## `path` must be /var/lib/grafana/dashboards/<provider_name>
- ##
dashboardProviders: {}
- # dashboardproviders.yaml:
- # apiVersion: 1
- # providers:
- # - name: 'default'
- # orgId: 1
- # folder: ''
- # type: file
- # disableDeletion: false
- # editable: true
- # options:
- # path: /var/lib/grafana/dashboards/default
-
- ## Configure Grafana dashboard to import
- ## NOTE: To use dashboards you must also enable/configure dashboardProviders
- ## ref: https://grafana.com/dashboards
- ##
- ## dashboards per provider, use provider name as key.
- ##
dashboards: {}
- # default:
- # prometheus-stats:
- # gnetId: 3662
- # revision: 2
- # datasource: Prometheus
-
- ## Reference to external Grafana ConfigMap per provider. Use provider name as key and ConfiMap name as value.
- ## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both.
- ## ConfigMap data example:
- ##
- ## data:
- ## example-dashboard.json: |
- ## RAW_JSON
- ##
dashboardsConfigMaps: {}
- # default: ""
-
- ## LDAP Authentication for Grafana can be enabled with the following values on grafana.ini
- ## NOTE: Grafana will fail to start if the value for ldap.toml is invalid
- # auth.ldap:
- # enabled: true
- # allow_sign_up: true
- # config_file: /etc/grafana/ldap.toml
-
- ## Grafana's LDAP configuration
- ## Templated by the template in _helpers.tpl
- ## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#auth-ldap
- ## ref: http://docs.grafana.org/installation/ldap/#configuration
- ldap:
- # `existingSecret` is a reference to an existing secret containing the ldap configuration
- # for Grafana in a key `ldap-toml`.
- existingSecret: ""
- # `config` is the content of `ldap.toml` that will be stored in the created secret
- config: ""
- # config: |-
- # verbose_logging = true
-
- # [[servers]]
- # host = "my-ldap-server"
- # port = 636
- # use_ssl = true
- # start_tls = false
- # ssl_skip_verify = false
- # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com"
-
- ## Grafana's SMTP configuration
- ## NOTE: To enable, grafana.ini must be configured with smtp.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#smtp
- smtp:
- # `existingSecret` is a reference to an existing secret containing the smtp configuration
- # for Grafana in keys `user` and `password`.
- existingSecret: ""
-
## Grafana sidecars that collect the configmaps with specified label and stores the included files them into the respective folders
## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards
sidecar:
image:
@@ -3226,9 +2078,8 @@
enabled: false
error_throttle_sleep: 0
# label that the configmaps with datasources are marked with
label: grafana_datasource
-
## Grafana's primary configuration
## NOTE: values in map will be converted to ini format
## ref: http://docs.grafana.org/installation/configuration/
##
@@ -3256,21 +2107,15 @@
serviceAccount:
create: true # Set this to false if you're bringing your own service account.
annotations: {}
- # name: kc-test
awsstore:
useAwsStore: false
- imageNameAndVersion: gcr.io/kubecost1/awsstore:latest # Name and version of the container image for AWSStore.
+ imageNameAndVersion: gcr.io/kubecost1/awsstore:latest
createServiceAccount: false
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Use a custom nodeSelector for AWSStore.
nodeSelector: {}
- # kubernetes.io/arch: amd64
- ## Annotations for the AWSStore ServiceAccount.
annotations: {}
## Federated ETL Architecture
## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl
@@ -3331,9 +2176,9 @@
# address: http://cluster-a.kubecost.com:9090
# # Optional authentication credentials - only basic auth is currently supported.
# auth:
# type: basic
-# # Secret name should be a secret formatted based on: https://github.com/kubecost/docs/blob/main/ingress-examples.md
+# # Secret name should be a secret formatted based on: https://github.com/kubecost/poc-common-configurations/tree/main/ingress-examples
# secretName: cluster-a-auth
# # Or pass auth directly as base64 encoded user:pass
# data: YWRtaW46YWRtaW4=
# # Or user and pass directly
@@ -3369,10 +2214,10 @@
# gpuLabel: gpu
# gpuLabelValue: true
# alibabaServiceKeyName: ""
# alibabaServiceKeyPassword: ""
-# awsServiceKeyName: ACCESSKEYID
-# awsServiceKeyPassword: fakepassword # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName
+# awsServiceKeyName: ""
+# awsServiceKeyPassword: ""
# awsSpotDataRegion: us-east-1
# awsSpotDataBucket: spot-data-feed-s3-bucket
# awsSpotDataPrefix: dev
# athenaProjectID: "530337586277" # The AWS AccountID where the Athena CUR is. Generally your masterpayer account
@@ -3551,4 +2396,8 @@
# host: kubecost.kubecost.svc.cluster.local
# port:
# number: 80
+# -- Optional override for the image used for the basic health test container
+# basicHealth:
+# fullImageName: alpine/k8s:1.26.9
+ |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-06 17:43:41.504486300 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-06 17:43:15.788168596 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 7760ff29110f1aefc999b34a78e81fb32523e969ea55220a065f31bfee83b9e6
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.0"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.0
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJlbmFibGVkIjp0cnVlLCJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInBhdGhUeXBlIjoiSW1wbGVtZW50YXRpb25TcGVjaWZpYyIsInBhdGhzIjpbIi8iXSwidGxzIjpbeyJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsRGFpbHlTdG9yZUR1cmF0aW9uRGF5cyI6OTEsImV0bEhvdXJseVN0b3JlRHVyYXRpb25Ib3VycyI6NDksImV0bFJlYWRPbmx5TW9kZSI6ZmFsc2UsImV4dHJhQXJncyI6W10sImV4dHJhUG9ydHMiOltdLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvY29zdC1tb2RlbCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJsb2dMZXZlbCI6ImluZm8iLCJtYXhRdWVyeUNvbmN1cnJlbmN5Ijo1LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIyMDBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXRjT2Zmc2V0IjoiKzAwOjAwIn0sImt1YmVjb3N0UHJvZHVjdENvbmZpZ3MiOnsiY2x1c3Rlck5hbWUiOiJzeC1jbnAtb3NzIERlbW8iLCJjbHVzdGVyUHJvZmlsZSI6ImRldmVsb3BtZW50IiwiY3VycmVuY3lDb2RlIjoiRVVSIiwiY3VzdG9tUHJpY2VzRW5hYmxlZCI6dHJ1ZSwiZGVmYXVsdE1vZGVsUHJpY2luZyI6eyJDUFUiOiIyOC4wIiwiR1BVIjoiNjkzLjUwIiwiUkFNIjoiMy4wOSIsImVuYWJsZWQiOnRydWUsImludGVybmV0TmV0d29ya0VncmVzcyI6IjAuMTIiLCJyZWdpb25OZXR3b3JrRWdyZXNzIjoiMC4wMSIsInNwb3RDUFUiOiI0Ljg2Iiwic3BvdEdQVSI6IjIyNS4wIiwic3BvdFJBTSI6IjAuNjUiLCJzdG9yYWdlIjoiMC4wNCIsInpvbmVOZXR3b3JrRWdyZXNzIjoiMC4wMSJ9fSwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhbm5vdGF0aW9ucyI6e30sImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLiBUaGUgbGFiZWwgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBLOHMgc2VydmljZSBlbmRwb2ludHMgYW5kIG5vdCBqdXN0IHBvZHMuXG4jIyBSZWZzOlxuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9ncHUtb3BlcmF0b3IvYmxvYi9kNDMxNmE0MTViYmQ2ODRjZTg0MTZhODgwNDIzMDVmYzFhMDkzYWE0L2Fzc2V0cy9zdGF0ZS1kY2dtLWV4cG9ydGVyLzA2MDBfc2VydmljZS55YW1sI0w3XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2RjZ20tZXhwb3J0ZXIvYmxvYi81NGZkMWNhMTM3YzY2NTExYTg3YTcyMDM5MDYxMzY4MGI5YmRhYmRkL2RlcGxveW1lbnQvdGVtcGxhdGVzL3NlcnZpY2UueWFtbCNMMjNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWRjZ20tZXhwb3J0ZXJcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogZW5kcG9pbnRzXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwLCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fY29tcG9uZW50LCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICg/aSkoLipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLiopXG4iLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhZmZpbml0eSI6e30sImFsZXJ0bWFuYWdlcnMiOltdLCJhbm5vdGF0aW9ucyI6e30sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiXSwic2NyYXBlX2NvbmZpZ3MiOlt7ImpvYl9uYW1lIjoicHJvbWV0aGV1cyIsInN0YXRpY19jb25maWdzIjpbeyJ0YXJnZXRzIjpbImxvY2FsaG9zdDo5MDkwIl19XX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2Rlcy1jYWR2aXNvciIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfc3BlY19jcHVfc2hhcmVzfGNvbnRhaW5lcl9zcGVjX21lbW9yeV9saW1pdF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNhZHZpc29yX3ZlcnNpb25faW5mb3xrdWJlY29zdF9wdl9pbmZvKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJjb250YWluZXIiXSwidGFyZ2V0X2xhYmVsIjoiY29udGFpbmVyX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbInBvZCJdLCJ0YXJnZXRfbGFiZWwiOiJwb2RfbmFtZSJ9XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzL2NhZHZpc29yIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGt1YmVsZXRfdm9sdW1lX3N0YXRzX3VzZWRfYnl0ZXMpIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcyIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtc2VydmljZS1lbmRwb2ludHMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJlbmRwb2ludHMifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X2FsbG9jYXRpb258Y29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9ncHVfYWxsb2NhdGlvbnxjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXN8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8RENHTV9GSV9ERVZfR1BVX1VUSUx8ZGVwbG95bWVudF9tYXRjaF9sYWJlbHN8a3ViZV9kYWVtb25zZXRfc3RhdHVzX2Rlc2lyZWRfbnVtYmVyX3NjaGVkdWxlZHxrdWJlX2RhZW1vbnNldF9zdGF0dXNfbnVtYmVyX3JlYWR5fGt1YmVfZGVwbG95bWVudF9zcGVjX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc19hdmFpbGFibGV8a3ViZV9qb2Jfc3RhdHVzX2ZhaWxlZHxrdWJlX25hbWVzcGFjZV9hbm5vdGF0aW9uc3xrdWJlX25hbWVzcGFjZV9sYWJlbHN8a3ViZV9ub2RlX2luZm98a3ViZV9ub2RlX2xhYmVsc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHl8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jb25kaXRpb258a3ViZV9wZXJzaXN0ZW50dm9sdW1lX2NhcGFjaXR5X2J5dGVzfGt1YmVfcGVyc2lzdGVudHZvbHVtZV9zdGF0dXNfcGhhc2V8a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1faW5mb3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9yZXNvdXJjZV9yZXF1ZXN0c19zdG9yYWdlX2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9pbmZvfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Jlc3RhcnRzX3RvdGFsfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcnVubmluZ3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Rlcm1pbmF0ZWRfcmVhc29ufGt1YmVfcG9kX2xhYmVsc3xrdWJlX3BvZF9vd25lcnxrdWJlX3BvZF9zdGF0dXNfcGhhc2V8a3ViZV9yZXBsaWNhc2V0X293bmVyfGt1YmVfc3RhdGVmdWxzZXRfcmVwbGljYXN8a3ViZV9zdGF0ZWZ1bHNldF9zdGF0dXNfcmVwbGljYXN8a3ViZWNvc3RfY2x1c3Rlcl9pbmZvfGt1YmVjb3N0X2NsdXN0ZXJfbWFuYWdlbWVudF9jb3N0fGt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGt1YmVjb3N0X2xvYWRfYmFsYW5jZXJfY29zdHxrdWJlY29zdF9uZXR3b3JrX2ludGVybmV0X2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfcmVnaW9uX2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfem9uZV9lZ3Jlc3NfY29zdHxrdWJlY29zdF9ub2RlX2lzX3Nwb3R8a3ViZWNvc3RfcG9kX25ldHdvcmtfZWdyZXNzX2J5dGVzX3RvdGFsfG5vZGVfY3B1X2hvdXJseV9jb3N0fG5vZGVfY3B1X3NlY29uZHNfdG90YWx8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkX3RvdGFsfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkX3RvdGFsfG5vZGVfZmlsZXN5c3RlbV9kZXZpY2VfZXJyb3J8bm9kZV9ncHVfY291bnR8bm9kZV9ncHVfaG91cmx5X2Nvc3R8bm9kZV9tZW1vcnlfQnVmZmVyc19ieXRlc3xub2RlX21lbW9yeV9DYWNoZWRfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtQXZhaWxhYmxlX2J5dGVzfG5vZGVfbWVtb3J5X01lbUZyZWVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtVG90YWxfYnl0ZXN8bm9kZV9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfG5vZGVfcmFtX2hvdXJseV9jb3N0fG5vZGVfdG90YWxfaG91cmx5X2Nvc3R8cG9kX3B2Y19hbGxvY2F0aW9ufHB2X2hvdXJseV9jb3N0fHNlcnZpY2Vfc2VsZWN0b3JfbGFiZWxzfHN0YXRlZnVsU2V0X21hdGNoX2xhYmVsc3xrdWJlY29zdF9wdl9pbmZvfHVwKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6dHJ1ZSwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY3JhcGUiXX0seyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoLipub2RlLWV4cG9ydGVyfGt1YmVjb3N0LW5ldHdvcmstY29zdHMpIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19lbmRwb2ludHNfbmFtZSJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihodHRwcz8pIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY2hlbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19zY2hlbWVfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcGF0aCJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoW146XSspKD86OlxcZCspPzsoXFxkKykiLCJyZXBsYWNlbWVudCI6IiQxOiQyIiwic291cmNlX2xhYmVscyI6WyJfX2FkZHJlc3NfXyIsIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BvcnQiXSwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2xhYmVsXyguKykifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25hbWVzcGFjZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWVzcGFjZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfcG9kX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25vZGUifV19XX0sInJlY29yZGluZ19ydWxlcy55bWwiOnt9LCJydWxlcyI6eyJncm91cHMiOlt7Im5hbWUiOiJDUFUiLCJydWxlcyI6W3siZXhwciI6InN1bShyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkpIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2U6cmF0ZTVtIn0seyJleHByIjoicmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2Vfbm9zdW06cmF0ZTVtIn0seyJleHByIjoiYXZnKGlyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiUE9EXCIsIGNvbnRhaW5lciE9XCJcIn1bNW1dKSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9jcHVfdXNhZ2VfaXJhdGUifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9XX0seyJuYW1lIjoiU2F2aW5ncyIsInJ1bGVzIjpbeyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifV19XX19LCJzZXJ2aWNlQWNjb3VudHMiOnsiYWxlcnRtYW5hZ2VyIjp7ImNyZWF0ZSI6dHJ1ZX0sIm5vZGVFeHBvcnRlciI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9fX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.0
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.0
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.0
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-06 17:43:41.504486300 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.0";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.0",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-06 17:43:15.788168596 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-06 17:43:41.504486300 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-06 17:43:41.504486300 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-06 17:43:41.504486300 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-06 17:43:41.504486300 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-06 17:43:41.504486300 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-06 17:43:15.784168541 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-06 17:43:15.788168596 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-06 17:43:15.788168596 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-06 17:43:41.508486336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-06 17:43:15.788168596 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-06 17:43:15.648166713 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-06 17:43:15.648166713 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 7760ff29110f1aefc999b34a78e81fb32523e969ea55220a065f31bfee83b9e6
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.0"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.0
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LW1hbmFnZXIuaW8vY2x1c3Rlci1pc3N1ZXIiOiJsZXRzZW5jcnlwdC1zdGFnaW5nIn0sImNsYXNzTmFtZSI6Im5naW54IiwiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1ldHJpY3MiOnt9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsRmlsZVN0b3JlRW5hYmxlZCI6dHJ1ZSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAiLCJ3YXJtQ2FjaGUiOmZhbHNlfSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJQVkVuYWJsZWQiOmZhbHNlLCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJkZXBsb3ltZW50QW5ub3RhdGlvbnMiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJhbGVydHMiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9ydWxlcyIsIi9ldGMvY29uZmlnL2FsZXJ0cyJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInB1c2hnYXRld2F5Ijp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicmVwb3J0aW5nIjp7ImVycm9yUmVwb3J0aW5nIjp0cnVlLCJsb2dDb2xsZWN0aW9uIjp0cnVlLCJwcm9kdWN0QW5hbHl0aWNzIjp0cnVlLCJ2YWx1ZXNSZXBvcnRpbmciOnRydWV9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwibm9kZVBvcnQiOnt9LCJwb3J0Ijo5MDkwLCJ0YXJnZXRQb3J0Ijo5MDkwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiYW5ub3RhdGlvbnMiOnsiY2VydC1tYW5hZ2VyLmlvL2NsdXN0ZXItaXNzdWVyIjoibGV0c2VuY3J5cHQtc3RhZ2luZyJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwicGF0aFR5cGUiOiJJbXBsZW1lbnRhdGlvblNwZWNpZmljIiwicGF0aHMiOlsiLyJdLCJ0bHMiOlt7Imhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwic2VjcmV0TmFtZSI6Imt1YmVjb3N0LXNlcnZlci10bHMifV19LCJpbml0Q2hvd25EYXRhIjp7InJlc291cmNlcyI6e319LCJpbml0Q2hvd25EYXRhSW1hZ2UiOiJidXN5Ym94Iiwia3ViZWNvc3REZXBsb3ltZW50Ijp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwicmVwbGljYXMiOjF9LCJrdWJlY29zdEZyb250ZW5kIjp7ImRlcGxveU1ldGhvZCI6InNpbmdsZXBvZCIsImRlcGxveW1lbnRTdHJhdGVneSI6e30sImVuYWJsZWQiOnRydWUsImhhUmVwbGljYXMiOjIsImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9mcm9udGVuZCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImlwdjYiOnsiZW5hYmxlZCI6dHJ1ZX0sImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMTBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXNlRGVmYXVsdEZxZG4iOmZhbHNlfSwia3ViZWNvc3RNb2RlbCI6eyJjb250YWluZXJTdGF0c0VuYWJsZWQiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibG9nTGV2ZWwiOiJpbmZvIiwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCJ9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC4gVGhlIGxhYmVsIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgSzhzIHNlcnZpY2UgZW5kcG9pbnRzIGFuZCBub3QganVzdCBwb2RzLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYW5ub3RhdGlvbnMiOnt9LCJiYXNlVVJMIjoiIiwiY29uZmlnTWFwT3ZlcnJpZGVOYW1lIjoiIiwiY29uZmlnUGF0aCI6Ii9ldGMvY29uZmlnL3Byb21ldGhldXMueW1sIiwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7fSwiZW1wdHlEaXIiOnsic2l6ZUxpbWl0IjoiIn0sImVuYWJsZWQiOnRydWUsImVudiI6W10sImV4dHJhQXJncyI6eyJxdWVyeS5tYXgtY29uY3VycmVuY3kiOjEsInF1ZXJ5Lm1heC1zYW1wbGVzIjoxMDAwMDAwMDB9LCJleHRyYUNvbmZpZ21hcE1vdW50cyI6W10sImV4dHJhRmxhZ3MiOlsid2ViLmVuYWJsZS1saWZlY3ljbGUiXSwiZXh0cmFIb3N0UGF0aE1vdW50cyI6W10sImV4dHJhSW5pdENvbnRhaW5lcnMiOltdLCJleHRyYVNlY3JldE1vdW50cyI6W10sImV4dHJhVm9sdW1lTW91bnRzIjpbXSwiZXh0cmFWb2x1bWVzIjpbXSwiZ2xvYmFsIjp7ImV2YWx1YXRpb25faW50ZXJ2YWwiOiIxbSIsImV4dGVybmFsX2xhYmVscyI6eyJjbHVzdGVyX2lkIjoic3gtY25wLW9zcyJ9LCJzY3JhcGVfaW50ZXJ2YWwiOiIxbSIsInNjcmFwZV90aW1lb3V0IjoiNjBzIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoicXVheS5pby9wcm9tZXRoZXVzL3Byb21ldGhldXMiLCJ0YWciOiJ2Mi41NS4xIn0sImxpdmVuZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJsaXZlbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJsaXZlbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwibGl2ZW5lc3NQcm9iZVRpbWVvdXQiOjMsIm5hbWUiOiJzZXJ2ZXIiLCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFjY2Vzc01vZGVzIjpbIlJlYWRXcml0ZU9uY2UiXSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJleGlzdGluZ0NsYWltIjoiIiwibW91bnRQYXRoIjoiL2RhdGEiLCJzaXplIjoiMzJHaSIsInN1YlBhdGgiOiIifSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwb2RMYWJlbHMiOnt9LCJwcmVmaXhVUkwiOiIiLCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInJlYWRpbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywicmVhZGluZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsInJlYWRpbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwicmVhZGluZXNzUHJvYmVUaW1lb3V0IjozLCJyZW1vdGVSZWFkIjp7fSwicmVtb3RlV3JpdGUiOnt9LCJyZXBsaWNhQ291bnQiOjEsInJlc291cmNlcyI6e30sInJldGVudGlvbiI6Ijk3aCIsInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJjbHVzdGVySVAiOiIiLCJleHRlcm5hbElQcyI6W10sImxhYmVscyI6e30sImxvYWRCYWxhbmNlcklQIjoiIiwibG9hZEJhbGFuY2VyU291cmNlUmFuZ2VzIjpbXSwic2VydmljZVBvcnQiOjgwLCJzZXNzaW9uQWZmaW5pdHkiOiJOb25lIiwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzdHJhdGVneSI6eyJ0eXBlIjoiUmVjcmVhdGUifSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjMwMCwidG9sZXJhdGlvbnMiOltdfSwic2VydmVyRmlsZXMiOnsiYWxlcnRpbmdfcnVsZXMueW1sIjp7fSwicHJvbWV0aGV1cy55bWwiOnsicnVsZV9maWxlcyI6WyIvZXRjL2NvbmZpZy9yZWNvcmRpbmdfcnVsZXMueW1sIiwiL2V0Yy9jb25maWcvYWxlcnRpbmdfcnVsZXMueW1sIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.0
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.0
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.0
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.0";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.0",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-06 17:43:15.648166713 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-06 17:43:15.648166713 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-06 17:43:15.644166660 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-06 17:43:15.648166713 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-06 17:43:15.648166713 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-06 17:43:41.368485077 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-06 17:43:15.648166713 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 3200005267ed0d35ec8656b0c4da50d94bf7156275304458eccd802ce21d54ee
+ checksum/configs: f5644bce519dbf7deac8f870f851206981f1d3ecd6835c299655d8cf3e3003df
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.0"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.0
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifSwiZ3JhZmFuYVVSTCI6Imh0dHBzOi8vZ3JhZmFuYS5sYWIuc3V4ZXNzaXQuazhzLmNsb3VkLnVpYmsuYWMuYXQifSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJhZGRpdGlvbmFsU2VjdXJpdHlDb250ZXh0Ijp7fSwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImNvbmZpZyI6eyJkZXN0aW5hdGlvbnMiOnsiY3Jvc3MtcmVnaW9uIjpbXSwiZGlyZWN0LWNsYXNzaWZpY2F0aW9uIjpbXSwiaW4tcmVnaW9uIjpbXSwiaW4tem9uZSI6WyIxMjcuMC4wLjAvOCIsIjE2OS4yNTQuMC4wLzE2IiwiMTAuMC4wLjAvOCIsIjE3Mi4xNi4wLjAvMTIiLCIxOTIuMTY4LjAuMC8xNiJdLCJpbnRlcm5ldCI6W119LCJzZXJ2aWNlcyI6eyJhbWF6b24td2ViLXNlcnZpY2VzIjp0cnVlLCJhenVyZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZSwiZ29vZ2xlLWNsb3VkLXNlcnZpY2VzIjp0cnVlfX0sImVuYWJsZWQiOnRydWUsImV4dHJhQXJncyI6W10sImhlYWx0aENoZWNrUHJvYmVzIjp7fSwiaW1hZ2UiOnsicmVwb3NpdG9yeSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbmV0d29yay1jb3N0cyIsInRhZyI6InYwLjE3LjYifSwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibG9nTGV2ZWwiOiJpbmZvIiwibm9kZVNlbGVjdG9yIjp7fSwicG9ydCI6MzAwMSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJwcm9tZXRoZXVzU2NyYXBlIjpmYWxzZSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MDBtIn0sInJlcXVlc3RzIjp7ImNwdSI6IjUwbSIsIm1lbW9yeSI6IjIwTWkifX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9fSwidG9sZXJhdGlvbnMiOltdLCJ0cmFmZmljTG9nZ2luZyI6dHJ1ZSwidXBkYXRlU3RyYXRlZ3kiOnsidHlwZSI6IlJvbGxpbmdVcGRhdGUifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJwcm9tZXRoZXVzUnVsZSI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNlcnZpY2VNb25pdG9yIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJuZXR3b3JrQ29zdHMiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWUsImludGVydmFsIjoiMW0iLCJtZXRyaWNSZWxhYmVsaW5ncyI6W10sInJlbGFiZWxpbmdzIjpbXSwic2NyYXBlVGltZW91dCI6IjEwcyJ9LCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJzZWN1cml0eUNvbnRleHQiOnsiZnNHcm91cCI6MTAwMSwiZnNHcm91cENoYW5nZVBvbGljeSI6Ik9uUm9vdE1pc21hdGNoIiwicnVuQXNHcm91cCI6MTAwMSwicnVuQXNOb25Sb290Ijp0cnVlLCJydW5Bc1VzZXIiOjEwMDEsInNlY2NvbXBQcm9maWxlIjp7InR5cGUiOiJSdW50aW1lRGVmYXVsdCJ9fX0sImdyYWZhbmEiOnsiYWRtaW5QYXNzd29yZCI6InN0cm9uZ3Bhc3N3b3JkIiwiYWRtaW5Vc2VyIjoiYWRtaW4iLCJhZmZpbml0eSI6e30sImFubm90YXRpb25zIjp7fSwiZGFzaGJvYXJkUHJvdmlkZXJzIjp7fSwiZGFzaGJvYXJkcyI6e30sImRhc2hib2FyZHNDb25maWdNYXBzIjp7fSwiZGVwbG95bWVudFN0cmF0ZWd5IjoiUm9sbGluZ1VwZGF0ZSIsImRvd25sb2FkRGFzaGJvYXJkc0ltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiY3VybGltYWdlcy9jdXJsIiwidGFnIjoibGF0ZXN0In0sImVudiI6e30sImVudkZyb21TZWNyZXQiOiIiLCJleHRyYVNlY3JldE1vdW50cyI6W10sImdyYWZhbmEuaW5pIjp7ImFuYWx5dGljcyI6eyJjaGVja19mb3JfdXBkYXRlcyI6dHJ1ZX0sImF1dGguYW5vbnltb3VzIjp7ImVuYWJsZWQiOnRydWUsIm9yZ19uYW1lIjoiTWFpbiBPcmcuIiwib3JnX3JvbGUiOiJFZGl0b3IifSwiZ3JhZmFuYV9uZXQiOnsidXJsIjoiaHR0cHM6Ly9ncmFmYW5hLm5ldCJ9LCJsb2ciOnsibW9kZSI6ImNvbnNvbGUifSwicGF0aHMiOnsiZGF0YSI6Ii92YXIvbGliL2dyYWZhbmEvZGF0YSIsImxvZ3MiOiIvdmFyL2xvZy9ncmFmYW5hIiwicGx1Z2lucyI6Ii92YXIvbGliL2dyYWZhbmEvcGx1Z2lucyIsInByb3Zpc2lvbmluZyI6Ii9ldGMvZ3JhZmFuYS9wcm92aXNpb25pbmcifSwic2VydmVyIjp7InJvb3RfdXJsIjoiJShwcm90b2NvbClzOi8vJShkb21haW4pczolKGh0dHBfcG9ydClzL2dyYWZhbmEiLCJzZXJ2ZV9mcm9tX3N1Yl9wYXRoIjpmYWxzZX19LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdyYWZhbmEvZ3JhZmFuYSIsInRhZyI6IjExLjMuMSJ9LCJsaXZlbmVzc1Byb2JlIjp7ImZhaWx1cmVUaHJlc2hvbGQiOjEwLCJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjo2MCwidGltZW91dFNlY29uZHMiOjMwfSwibm9kZVNlbGVjdG9yIjp7fSwicGx1Z2lucyI6W10sInBvZEFubm90YXRpb25zIjp7fSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9hcGkvaGVhbHRoIiwicG9ydCI6MzAwMH19LCJyZXBsaWNhcyI6MSwicmVzb3VyY2VzIjp7fSwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInBvcnQiOjgwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImNyZWF0ZSI6dHJ1ZSwibmFtZSI6IiJ9LCJzaWRlY2FyIjp7ImRhc2hib2FyZHMiOnsiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlcnJvcl90aHJvdHRsZV9zbGVlcCI6MCwiZm9sZGVyIjoiL3RtcC9kYXNoYm9hcmRzIiwibGFiZWwiOiJncmFmYW5hX2Rhc2hib2FyZCIsImxhYmVsVmFsdWUiOiIxIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ2hjci5pby9raXdpZ3JpZC9rOHMtc2lkZWNhciIsInRhZyI6IjEuMjguMCJ9LCJyZXNvdXJjZXMiOnt9fSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sImxvZ0xldmVsIjoiaW5mbyIsIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAifSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn0sImdyYWZhbmFVUkwiOiJodHRwczovL2dyYWZhbmEubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0In0sIm5ldHdvcmtDb3N0cyI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiYWRkaXRpb25hbFNlY3VyaXR5Q29udGV4dCI6e30sImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJjb25maWciOnsiZGVzdGluYXRpb25zIjp7ImNyb3NzLXJlZ2lvbiI6W10sImRpcmVjdC1jbGFzc2lmaWNhdGlvbiI6W10sImluLXJlZ2lvbiI6W10sImluLXpvbmUiOlsiMTI3LjAuMC4wLzgiLCIxNjkuMjU0LjAuMC8xNiIsIjEwLjAuMC4wLzgiLCIxNzIuMTYuMC4wLzEyIiwiMTkyLjE2OC4wLjAvMTYiXSwiaW50ZXJuZXQiOltdfSwic2VydmljZXMiOnsiYW1hem9uLXdlYi1zZXJ2aWNlcyI6dHJ1ZSwiYXp1cmUtY2xvdWQtc2VydmljZXMiOnRydWUsImdvb2dsZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZX19LCJlbmFibGVkIjp0cnVlLCJleHRyYUFyZ3MiOltdLCJoZWFsdGhDaGVja1Byb2JlcyI6e30sImltYWdlIjp7InJlcG9zaXRvcnkiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW5ldHdvcmstY29zdHMiLCJ0YWciOiJ2MC4xNy42In0sImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxvZ0xldmVsIjoiaW5mbyIsIm5vZGVTZWxlY3RvciI6e30sInBvcnQiOjMwMDEsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicHJvbWV0aGV1c1NjcmFwZSI6ZmFsc2UsInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiNTAwbSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiI1MG0iLCJtZW1vcnkiOiIyME1pIn19LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fX0sInRvbGVyYXRpb25zIjpbXSwidHJhZmZpY0xvZ2dpbmciOnRydWUsInVwZGF0ZVN0cmF0ZWd5Ijp7InR5cGUiOiJSb2xsaW5nVXBkYXRlIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJTaXplIjoiNUdpIiwiZW5hYmxlZCI6dHJ1ZSwibGFiZWxzIjp7fSwic2l6ZSI6IjVHaSJ9LCJwcm9tZXRoZXVzIjp7ImFsZXJ0bWFuYWdlckZpbGVzIjp7ImFsZXJ0bWFuYWdlci55bWwiOnsiZ2xvYmFsIjp7fSwicmVjZWl2ZXJzIjpbeyJuYW1lIjoiZGVmYXVsdC1yZWNlaXZlciJ9XSwicm91dGUiOnsiZ3JvdXBfaW50ZXJ2YWwiOiI1bSIsImdyb3VwX3dhaXQiOiIxMHMiLCJyZWNlaXZlciI6ImRlZmF1bHQtcmVjZWl2ZXIiLCJyZXBlYXRfaW50ZXJ2YWwiOiIzaCJ9fX0sImNvbmZpZ21hcFJlbG9hZCI6e30sImV4dHJhU2NyYXBlQ29uZmlncyI6Ii0gam9iX25hbWU6IGt1YmVjb3N0XG4gIGhvbm9yX2xhYmVsczogdHJ1ZVxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImNvc3QtYW5hbHl6ZXIuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAgcG9ydDogOTAwM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtbmV0d29ya2luZ1xuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBwb2RcbiAgcmVsYWJlbF9jb25maWdzOlxuICAjIFNjcmFwZSBvbmx5IHRoZSB0aGUgdGFyZ2V0cyBtYXRjaGluZyB0aGUgZm9sbG93aW5nIG1ldGFkYXRhXG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2luc3RhbmNlXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIGt1YmVjb3N0XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAgbmV0d29yay1jb3N0c1xuLSBqb2JfbmFtZToga3ViZWNvc3QtYWdncmVnYXRvclxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImFnZ3JlZ2F0b3Iuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAge3stIGlmIG9yIC5WYWx1ZXMuc2FtbC5lbmFibGVkIC5WYWx1ZXMub2lkYy5lbmFibGVkIH19XG4gICAgcG9ydDogOTAwOFxuICAgIHt7LSBlbHNlIH19XG4gICAgcG9ydDogOTAwNFxuICAgIHt7LSBlbmQgfX1cbiMjIEVuYWJsZXMgc2NyYXBpbmcgb2YgTlZJRElBIEdQVSBtZXRyaWNzIHZpYSBkY2dtLWV4cG9ydGVyLiBTY3JhcGVzIGFsbFxuIyMgZW5kcG9pbnRzIHdoaWNoIGNvbnRhaW4gXCJkY2dtLWV4cG9ydGVyXCIgaW4gbGFiZWxzIFwiYXBwXCIsXG4jIyBcImFwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudFwiLCBvciBcImFwcC5rdWJlcm5ldGVzLmlvL25hbWVcIiB3aXRoIGEgY2FzZVxuIyMgaW5zZW5zaXRpdmUgbWF0Y2guIFRoZSBsYWJlbCBtdXN0IGJlIHByZXNlbnQgb24gdGhlIEs4cyBzZXJ2aWNlIGVuZHBvaW50cyBhbmQgbm90IGp1c3QgcG9kcy5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImFubm90YXRpb25zIjp7fSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicHJvbWV0aGV1c1J1bGUiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWV9LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzZXJ2aWNlTW9uaXRvciI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJ2YWwiOiIxbSIsIm1ldHJpY1JlbGFiZWxpbmdzIjpbXSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwicmVsYWJlbGluZ3MiOltdLCJzY3JhcGVUaW1lb3V0IjoiMTBzIn0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -190,9 +173,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.0
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -240,9 +223,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.0
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -294,9 +277,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.0
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.0";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.0",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -5,11 +5,10 @@
metadata:
name: network-costs-config
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -7,9 +7,9 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
clusterIP: None
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -7,23 +7,25 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
+ annotations:
spec:
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: release-name-network-costs
template:
metadata:
+ annotations:
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
hostNetwork: true
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -4,11 +4,11 @@
kind: ConfigMap
metadata:
name: app-configs
namespace: default
- labels:
+ labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
@@ -24,8 +23,7 @@
matchNames:
- default
selector:
matchLabels:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-06 17:43:41.640487522 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-06 17:43:15.920170370 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-network-costs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-06 17:43:41.644487558 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-06 17:43:15.924170424 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi |
no dashboards anymore? |
renovate
bot
changed the title
chore(deps): update helm release cost-analyzer to v2.5.0
chore(deps): update helm release cost-analyzer to v2.5.1
Dec 17, 2024
renovate
bot
force-pushed
the
renovate/cost-analyzer-2.x
branch
from
December 17, 2024 19:42
9ac1034
to
24ca950
Compare
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-17 19:43:01.978452609 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-17 19:42:35.664219338 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 45f899ca0f060cb78b76717b768816a257756505a52b46a72a552cbed367f9ce
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJlbmFibGVkIjp0cnVlLCJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInBhdGhUeXBlIjoiSW1wbGVtZW50YXRpb25TcGVjaWZpYyIsInBhdGhzIjpbIi8iXSwidGxzIjpbeyJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjEifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsRGFpbHlTdG9yZUR1cmF0aW9uRGF5cyI6OTEsImV0bEhvdXJseVN0b3JlRHVyYXRpb25Ib3VycyI6NDksImV0bFJlYWRPbmx5TW9kZSI6ZmFsc2UsImV4dHJhQXJncyI6W10sImV4dHJhUG9ydHMiOltdLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvY29zdC1tb2RlbCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJsb2dMZXZlbCI6ImluZm8iLCJtYXhRdWVyeUNvbmN1cnJlbmN5Ijo1LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIyMDBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXRjT2Zmc2V0IjoiKzAwOjAwIn0sImt1YmVjb3N0UHJvZHVjdENvbmZpZ3MiOnsiY2x1c3Rlck5hbWUiOiJzeC1jbnAtb3NzIERlbW8iLCJjbHVzdGVyUHJvZmlsZSI6ImRldmVsb3BtZW50IiwiY3VycmVuY3lDb2RlIjoiRVVSIiwiY3VzdG9tUHJpY2VzRW5hYmxlZCI6dHJ1ZSwiZGVmYXVsdE1vZGVsUHJpY2luZyI6eyJDUFUiOiIyOC4wIiwiR1BVIjoiNjkzLjUwIiwiUkFNIjoiMy4wOSIsImVuYWJsZWQiOnRydWUsImludGVybmV0TmV0d29ya0VncmVzcyI6IjAuMTIiLCJyZWdpb25OZXR3b3JrRWdyZXNzIjoiMC4wMSIsInNwb3RDUFUiOiI0Ljg2Iiwic3BvdEdQVSI6IjIyNS4wIiwic3BvdFJBTSI6IjAuNjUiLCJzdG9yYWdlIjoiMC4wNCIsInpvbmVOZXR3b3JrRWdyZXNzIjoiMC4wMSJ9fSwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhbm5vdGF0aW9ucyI6e30sImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLiBUaGUgbGFiZWwgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBLOHMgc2VydmljZSBlbmRwb2ludHMgYW5kIG5vdCBqdXN0IHBvZHMuXG4jIyBSZWZzOlxuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9ncHUtb3BlcmF0b3IvYmxvYi9kNDMxNmE0MTViYmQ2ODRjZTg0MTZhODgwNDIzMDVmYzFhMDkzYWE0L2Fzc2V0cy9zdGF0ZS1kY2dtLWV4cG9ydGVyLzA2MDBfc2VydmljZS55YW1sI0w3XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2RjZ20tZXhwb3J0ZXIvYmxvYi81NGZkMWNhMTM3YzY2NTExYTg3YTcyMDM5MDYxMzY4MGI5YmRhYmRkL2RlcGxveW1lbnQvdGVtcGxhdGVzL3NlcnZpY2UueWFtbCNMMjNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWRjZ20tZXhwb3J0ZXJcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogZW5kcG9pbnRzXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwLCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fY29tcG9uZW50LCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICg/aSkoLipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLiopXG4iLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhZmZpbml0eSI6e30sImFsZXJ0bWFuYWdlcnMiOltdLCJhbm5vdGF0aW9ucyI6e30sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiXSwic2NyYXBlX2NvbmZpZ3MiOlt7ImpvYl9uYW1lIjoicHJvbWV0aGV1cyIsInN0YXRpY19jb25maWdzIjpbeyJ0YXJnZXRzIjpbImxvY2FsaG9zdDo5MDkwIl19XX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2Rlcy1jYWR2aXNvciIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfc3BlY19jcHVfc2hhcmVzfGNvbnRhaW5lcl9zcGVjX21lbW9yeV9saW1pdF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNhZHZpc29yX3ZlcnNpb25faW5mb3xrdWJlY29zdF9wdl9pbmZvKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJjb250YWluZXIiXSwidGFyZ2V0X2xhYmVsIjoiY29udGFpbmVyX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbInBvZCJdLCJ0YXJnZXRfbGFiZWwiOiJwb2RfbmFtZSJ9XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzL2NhZHZpc29yIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGt1YmVsZXRfdm9sdW1lX3N0YXRzX3VzZWRfYnl0ZXMpIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcyIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtc2VydmljZS1lbmRwb2ludHMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJlbmRwb2ludHMifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X2FsbG9jYXRpb258Y29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9ncHVfYWxsb2NhdGlvbnxjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXN8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8RENHTV9GSV9ERVZfR1BVX1VUSUx8ZGVwbG95bWVudF9tYXRjaF9sYWJlbHN8a3ViZV9kYWVtb25zZXRfc3RhdHVzX2Rlc2lyZWRfbnVtYmVyX3NjaGVkdWxlZHxrdWJlX2RhZW1vbnNldF9zdGF0dXNfbnVtYmVyX3JlYWR5fGt1YmVfZGVwbG95bWVudF9zcGVjX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc19hdmFpbGFibGV8a3ViZV9qb2Jfc3RhdHVzX2ZhaWxlZHxrdWJlX25hbWVzcGFjZV9hbm5vdGF0aW9uc3xrdWJlX25hbWVzcGFjZV9sYWJlbHN8a3ViZV9ub2RlX2luZm98a3ViZV9ub2RlX2xhYmVsc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHl8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jb25kaXRpb258a3ViZV9wZXJzaXN0ZW50dm9sdW1lX2NhcGFjaXR5X2J5dGVzfGt1YmVfcGVyc2lzdGVudHZvbHVtZV9zdGF0dXNfcGhhc2V8a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1faW5mb3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9yZXNvdXJjZV9yZXF1ZXN0c19zdG9yYWdlX2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9pbmZvfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Jlc3RhcnRzX3RvdGFsfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcnVubmluZ3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Rlcm1pbmF0ZWRfcmVhc29ufGt1YmVfcG9kX2xhYmVsc3xrdWJlX3BvZF9vd25lcnxrdWJlX3BvZF9zdGF0dXNfcGhhc2V8a3ViZV9yZXBsaWNhc2V0X293bmVyfGt1YmVfc3RhdGVmdWxzZXRfcmVwbGljYXN8a3ViZV9zdGF0ZWZ1bHNldF9zdGF0dXNfcmVwbGljYXN8a3ViZWNvc3RfY2x1c3Rlcl9pbmZvfGt1YmVjb3N0X2NsdXN0ZXJfbWFuYWdlbWVudF9jb3N0fGt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGt1YmVjb3N0X2xvYWRfYmFsYW5jZXJfY29zdHxrdWJlY29zdF9uZXR3b3JrX2ludGVybmV0X2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfcmVnaW9uX2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfem9uZV9lZ3Jlc3NfY29zdHxrdWJlY29zdF9ub2RlX2lzX3Nwb3R8a3ViZWNvc3RfcG9kX25ldHdvcmtfZWdyZXNzX2J5dGVzX3RvdGFsfG5vZGVfY3B1X2hvdXJseV9jb3N0fG5vZGVfY3B1X3NlY29uZHNfdG90YWx8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkX3RvdGFsfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkX3RvdGFsfG5vZGVfZmlsZXN5c3RlbV9kZXZpY2VfZXJyb3J8bm9kZV9ncHVfY291bnR8bm9kZV9ncHVfaG91cmx5X2Nvc3R8bm9kZV9tZW1vcnlfQnVmZmVyc19ieXRlc3xub2RlX21lbW9yeV9DYWNoZWRfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtQXZhaWxhYmxlX2J5dGVzfG5vZGVfbWVtb3J5X01lbUZyZWVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtVG90YWxfYnl0ZXN8bm9kZV9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfG5vZGVfcmFtX2hvdXJseV9jb3N0fG5vZGVfdG90YWxfaG91cmx5X2Nvc3R8cG9kX3B2Y19hbGxvY2F0aW9ufHB2X2hvdXJseV9jb3N0fHNlcnZpY2Vfc2VsZWN0b3JfbGFiZWxzfHN0YXRlZnVsU2V0X21hdGNoX2xhYmVsc3xrdWJlY29zdF9wdl9pbmZvfHVwKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6dHJ1ZSwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY3JhcGUiXX0seyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoLipub2RlLWV4cG9ydGVyfGt1YmVjb3N0LW5ldHdvcmstY29zdHMpIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19lbmRwb2ludHNfbmFtZSJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihodHRwcz8pIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY2hlbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19zY2hlbWVfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcGF0aCJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoW146XSspKD86OlxcZCspPzsoXFxkKykiLCJyZXBsYWNlbWVudCI6IiQxOiQyIiwic291cmNlX2xhYmVscyI6WyJfX2FkZHJlc3NfXyIsIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BvcnQiXSwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2xhYmVsXyguKykifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25hbWVzcGFjZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWVzcGFjZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfcG9kX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25vZGUifV19XX0sInJlY29yZGluZ19ydWxlcy55bWwiOnt9LCJydWxlcyI6eyJncm91cHMiOlt7Im5hbWUiOiJDUFUiLCJydWxlcyI6W3siZXhwciI6InN1bShyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkpIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2U6cmF0ZTVtIn0seyJleHByIjoicmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2Vfbm9zdW06cmF0ZTVtIn0seyJleHByIjoiYXZnKGlyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiUE9EXCIsIGNvbnRhaW5lciE9XCJcIn1bNW1dKSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9jcHVfdXNhZ2VfaXJhdGUifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9XX0seyJuYW1lIjoiU2F2aW5ncyIsInJ1bGVzIjpbeyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifV19XX19LCJzZXJ2aWNlQWNjb3VudHMiOnsiYWxlcnRtYW5hZ2VyIjp7ImNyZWF0ZSI6dHJ1ZX0sIm5vZGVFeHBvcnRlciI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9fX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-17 19:43:01.978452609 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-17 19:42:35.664219338 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-17 19:43:01.982452643 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-17 19:43:01.978452609 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-17 19:42:35.664219338 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-17 19:43:01.978452609 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-17 19:42:35.664219338 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-17 19:43:01.978452609 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-17 19:42:35.664219338 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-17 19:43:01.978452609 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-17 19:42:35.664219338 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-17 19:43:01.981452634 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-17 19:42:35.666219356 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-17 19:43:01.982452643 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-17 19:42:35.667219365 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-17 19:43:02.257454950 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-17 19:42:35.937221795 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Default Valuesdiff -U 4 -r out-default-values/target/kubecost_cost-analyzer_default-values.out out-default-values/pr/kubecost_cost-analyzer_default-values.out
--- out-default-values/target/kubecost_cost-analyzer_default-values.out 2024-12-17 19:43:02.370455898 +0000
+++ out-default-values/pr/kubecost_cost-analyzer_default-values.out 2024-12-17 19:42:36.044222759 +0000
@@ -2,11 +2,12 @@
# zone: cluster.local (use only if your DNS server doesn't live in the same zone as kubecost)
prometheus:
enabled: true # Kubecost depends on Prometheus data, it is not optional. When enabled: false, Prometheus will not be installed and you must configure your own Prometheus to scrape kubecost as well as provide the fqdn below. -- Warning: Before changing this setting, please read to understand the risks https://docs.kubecost.com/install-and-configure/install/custom-prom
fqdn: http://cost-analyzer-prometheus-server.default.svc # example address of a prometheus to connect to. Include protocol (http:// or https://) Ignored if enabled: true
- # insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
+ insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
# queryServiceBasicAuthSecretName: dbsecret # kubectl create secret generic dbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD
# queryServiceBearerTokenSecretName: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN
+ kubeRBACProxy: false # If true, kubecost will use kube-rbac-proxy to authenticate with in cluster Prometheus for openshift
grafana:
enabled: true # If false, Grafana will not be installed
domainName: cost-analyzer-grafana.default.svc # example grafana domain Ignored if enabled: true
@@ -53,8 +54,10 @@
# or `global.prometheus.fqdn=http://{{ template "cost-analyzer.fullname" . }}-mimir-proxy.{{ .Release.Namespace }}.svc:8085/prometheus'
# Learn more at https://grafana.com/docs/mimir/latest/operators-guide/secure/authentication-and-authorization/#without-an-authenticating-reverse-proxy
mimirProxy:
enabled: false
+ ## Annotations to be added to the Mimir Proxy deployment template
+ annotations: {}
name: mimir-proxy
image: nginxinc/nginx-unprivileged
port: 8085
mimirEndpoint: $mimir_endpoint # Your Mimir query endpoint. If your Mimir query endpoint is http://example.com/prometheus, replace $mimir_endpoint with http://example.com/
@@ -62,11 +65,10 @@
# basicAuth:
# username: user
# password: pwd
- # Azure Monitor Managed Service for Prometheus
- # See https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/azure-monitor/essentials/prometheus-metrics-overview.md for information
- # and https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines for more information on setting this up
+ ## Azure Monitor Managed Service for Prometheus
+ ## Ref: https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines
ammsp:
enabled: false
prometheusServerEndpoint: http://localhost:8081/
remoteWriteService: $<AMMSP_METRICS_INGESTION_ENDPOINT>
@@ -83,76 +85,68 @@
identityType: userAssigned
aadClientId: $<AZURE_MANAGED_IDENTITY_CLIENT_ID>
aadTenantId: $<AZURE_MANAGED_IDENTITY_TENANT_ID>
+ ## Kubecost Alerting
+ ## Ref: http://docs.kubecost.com/alerts
notifications:
- # Kubecost alerting configuration
- # Ref: http://docs.kubecost.com/alerts
# alertConfigs:
- # frontendUrl: http://localhost:9090 # optional, used for linkbacks
- # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts
- # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Microsoft Teams alerts
- # globalAlertEmails:
- # - [email protected]
- # - [email protected]
- # globalEmailSubject: Custom Subject
- # Alerts generated by kubecost, about cluster data
- # alerts:
- # Daily namespace budget alert on namespace `kubecost`
- # - type: budget # supported: budget, recurringUpdate
- # threshold: 50 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: namespace
- # filter: kubecost
- # ownerContact: # optional, overrides globalAlertEmails default
- # - [email protected]
- # - [email protected]
- # # optional, used for alert-specific Slack and Microsoft Teams alerts
- # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
- # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX
-
- # Daily cluster budget alert on cluster `cluster-one`
- # - type: budget
- # threshold: 200.8 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: cluster
- # filter: cluster-one # does not accept csv
-
- # Recurring weekly update (weeklyUpdate alert)
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: '*'
-
- # Recurring weekly namespace update on kubecost namespace
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: kubecost
-
- # Spend Change Alert
- # - type: spendChange # change relative to moving avg
- # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
- # window: 1d # accepts ‘d’, ‘h’
- # baselineWindow: 30d # previous window, offset by window
- # aggregation: namespace
- # filter: kubecost, default # accepts csv
-
- # Health Score Alert
- # - type: health # Alerts when health score changes by a threshold
- # window: 10m
- # threshold: 5 # Send Alert if health scores changes by 5 or more
-
- # Kubecost Health Diagnostic
- # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
- # window: 10m
+ # frontendUrl: http://localhost:9090 # Optional
+ # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalAlertEmails:
+ # - [email protected]
+ # - [email protected]
+ # globalEmailSubject: Custom Subject
+ # alerts:
+ # # Daily namespace budget alert on namespace `kubecost`
+ # - type: budget # supported: budget, recurringUpdate
+ # threshold: 50 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: namespace
+ # filter: kubecost
+ # ownerContact: # optional, overrides globalAlertEmails default
+ # - [email protected]
+ # - [email protected]
+ # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # # Daily cluster budget alert on cluster `cluster-one`
+ # - type: budget
+ # threshold: 200.8 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: cluster
+ # filter: cluster-one # does not accept csv
+ # # Recurring weekly update (weeklyUpdate alert)
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: '*'
+ # # Recurring weekly namespace update on kubecost namespace
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: kubecost
+ # # Spend Change Alert
+ # - type: spendChange # change relative to moving avg
+ # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
+ # window: 1d # accepts ‘d’, ‘h’
+ # baselineWindow: 30d # previous window, offset by window
+ # aggregation: namespace
+ # filter: kubecost, default # accepts csv
+ # # Health Score Alert
+ # - type: health # Alerts when health score changes by a threshold
+ # window: 10m
+ # threshold: 5 # Send Alert if health scores changes by 5 or more
+ # # Kubecost Health Diagnostic
+ # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
+ # window: 10m
alertmanager: # Supply an alertmanager FQDN to receive notifications from the app.
enabled: false # If true, allow kubecost to write to your alertmanager
fqdn: http://cost-analyzer-prometheus-server.default.svc # example fqdn. Ignored if prometheus.enabled: true
- # Set saved Cost Allocation report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ ## Kubecost Saved Reports
+ ## Ref: http://docs.kubecost.com/saved-reports
savedReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Saved Report 0"
@@ -160,35 +154,32 @@
aggregateBy: "namespace"
chartDisplay: "category"
idle: "separate"
rate: "cumulative"
- accumulate: false # daily resolution
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ accumulate: false # daily resolution
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "cluster" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "dev"
- title: "Example Saved Report 1"
window: "month"
aggregateBy: "controllerKind"
chartDisplay: "category"
idle: "share"
rate: "monthly"
accumulate: false
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "namespace" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "kubecost"
- title: "Example Saved Report 2"
window: "2020-11-11T00:00:00Z,2020-12-09T23:59:59Z"
aggregateBy: "service"
chartDisplay: "category"
idle: "hide"
rate: "daily"
accumulate: true # entire window resolution
- filters: [] # if no filters, specify empty array
-
- # Set saved Asset report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ filters: [] # if no filters, specify empty array
assetReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Asset Report 0"
@@ -197,11 +188,8 @@
accumulate: false # daily resolution
filters:
- property: "cluster"
value: "cluster-one"
-
- # Set saved Cloud Cost report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
cloudCostReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Cloud Cost Report 0"
@@ -214,8 +202,12 @@
podAnnotations: {}
# iam.amazonaws.com/role: role-arn
+ # Annotations to be added for all controllers (StatefulSets, Deployments, DaemonSets)
+ annotations: {}
+ # iam.amazonaws.com/role: role-arn
+
# Applies these labels to all Deployments, StatefulSets, DaemonSets, and their pod templates.
additionalLabels: {}
securityContext:
@@ -233,8 +225,25 @@
capabilities:
drop:
- ALL
+ # Installs custom CA certificates onto Kubecost pods
+ updateCaTrust:
+ enabled: false # Set to true to enable the init container for updating CA trust
+ # Security context settings for the init container.
+ securityContext:
+ runAsUser: 0
+ runAsGroup: 0
+ runAsNonRoot: false
+ allowPrivilegeEscalation: false
+ readOnlyRootFilesystem: true
+ seccompProfile:
+ type: RuntimeDefault
+ caCertsSecret: ca-certs-secret # The name of the Secret containing custom CA certificates to mount to the cost-model container.
+ # caCertsConfig: ca-certs-config # The name of the ConfigMap containing the CA trust configuration.
+ resources: {} # Resource requests and limits for the init container.
+ caCertsMountPath: /etc/pki/ca-trust/source/anchors # The path where the custom CA certificates will be mounted in the init container
+
# Platforms is a higher-level abstraction for platform-specific values and settings.
platforms:
# Deploying to OpenShift (OCP) requires enabling this option.
openshift:
@@ -242,8 +251,15 @@
route:
enabled: false # Create an OpenShift Route.
annotations: {} # Add annotations to the Route.
# host: kubecost.apps.okd4.example.com # Add a custom host for your Route.
+
+ # OPTIONAL. The following configs only to be enabled when using a Prometheus instance already installed in the cluster.
+ createMonitoringClusterRoleBinding: false # Create a ClusterRoleBinding to grant the Kubecost serviceaccount access to query Prometheus.
+ createMonitoringResourceReaderRoleBinding: false # Create a Role and Role Binding to allow Prometheus to list and watch Kubecost resources.
+ monitoringServiceAccountName: prometheus-k8s # Name of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+ monitoringServiceAccountNamespace: openshift-monitoring # Namespace of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+
# Create Security Context Constraint resources for the DaemonSets requiring additional privileges.
scc:
nodeExporter: false # Creates an SCC for Prometheus Node Exporter. This requires Node Exporter be enabled.
networkCosts: false # Creates an SCC for Kubecost network-costs. This requires network-costs be enabled.
@@ -258,18 +274,24 @@
skipSanityChecks: false # If true, skip all sanity/existence checks for resources like Secrets.
## Kubecost Integrations
## Ref: https://docs.kubecost.com/integrations
- ##
integrations:
+ turbonomic:
+ enabled: false # Set to true to enable the Turbonomic integration
+ clientId: "" # Client ID generated from the OAuth Client created
+ clientSecret: "" # Client Secret generated from the OAuth Client created
+ role: "" # Role that the OAuth Client was created with (e.g. ADMINISTRATOR, SITE_ADMIN, etc.)
+ host: "" # URL to your turbonomic API. EG: https://turbonomic.example.com/
+ insecureClient: false # Do not verify certificate
postgres:
enabled: false
- runInterval: "12h" # How frequently to run the integration.
- databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
- databasePort: "" # REQUIRED. ex: 5432
- databaseName: "" # REQUIRED. ex: postgres
- databaseUser: "" # REQUIRED. ex: myusername
- databasePassword: "" # REQUIRED. ex: mypassword
+ runInterval: "12h" # How frequently to run the integration.
+ databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
+ databasePort: "" # REQUIRED. ex: 5432
+ databaseName: "" # REQUIRED. ex: postgres
+ databaseUser: "" # REQUIRED. ex: myusername
+ databasePassword: "" # REQUIRED. ex: mypassword
databaseSecretName: "" # OPTIONAL. Specify your own k8s secret containing the above credentials. Must have key "creds.json".
## Configure what Postgres table to write to, and what parameters to pass
## when querying Kubecost's APIs. Ensure all parameters are enclosed in
@@ -303,8 +325,12 @@
# nameOverride: ""
## Provide a full name override option for the chart.
# fullnameOverride: ""
+## Provide additional labels for the chart.
+# chartLabels:
+# app.kubernetes.io/name: kubecost-cost-analyzer
+
## This flag is only required for users upgrading to a new version of Kubecost.
## The flag is used to ensure users are aware of important
## (potentially breaking) changes included in the new version.
##
@@ -322,79 +348,77 @@
region: "us-east-1"
URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI
csvAccessCredentials: pricing-schema-access-secret
-# SAML integration for user management and RBAC, enterprise key required
-# Ref: https://github.com/kubecost/docs/blob/main/user-management.md
+## Kubecost SAML (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-saml
saml:
enabled: false
- # secretName: "kubecost-authzero"
- # metadataSecretName: "kubecost-authzero-metadata" # One of metadataSecretName or idpMetadataURL must be set. defaults to metadataURL if set
- # idpMetadataURL: "https://dev-elu2z98r.auth0.com/samlp/metadata/c6nY4M37rBP0qSO1IYIqBPPyIPxLS8v2"
- # appRootURL: "http://localhost:9090" # sample URL
- # authTimeout: 1440 # number of minutes the JWT will be valid
- # redirectURL: "https://dev-elu2z98r.auth0.com/v2/logout" # callback URL redirected to after logout
- # audienceURI: "http://localhost:9090" # by convention, the same as the appRootURL, but any string uniquely identifying kubecost to your samp IDP. Optional if you follow the convention
- # nameIDFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" If your SAML provider requires a specific nameid format
- # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
- # encryptionCertSecret: "kubecost-saml-cert" # k8s secret where the x509 certificate used to encrypt an Okta saml response is stored
- # decryptionKeySecret: "kubecost-sank-decryption-key" # k8s secret where the private key associated with the encryptionCertSecret is stored
- # authSecret: "random-string" # value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
- # authSecretName: "kubecost-saml-secret" # name of k8s secret where the authSecret will be stored, defaults to "kubecost-saml-secret" if not provided
+ # secretName: ""
+ # metadataSecretName: "" # One of metadataSecretName or idpMetadataURL must be set. Defaults to idpMetadataURL if set.
+ # idpMetadataURL: ""
+ # appRootURL: ""
+ # authTimeout: 1440 # Number of minutes the JWT will be valid
+ # redirectURL: "" # Callback URL redirected to after logout
+ # audienceURI: "" # Usually the same as the appRootURL. Optionally any string uniquely identifying kubecost to your SAML IDP.
+ # nameIDFormat: "" # If your SAML provider requires a specific nameid format
+ # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
+ # encryptionCertSecret: "" # K8s secret storing the x509 certificate used to encrypt an Okta SAML response
+ # decryptionKeySecret: "" # K8s secret storing the private key associated with the encryptionCertSecret
+ # authSecret: "" # Value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
+ # authSecretName: "" # Name of K8s secret where the authSecret will be stored. Defaults to "kubecost-saml-secret" if not provided.
rbac:
enabled: false
# groups:
# - name: admin
- # enabled: false # if admin is disabled, all SAML users will be able to make configuration changes to the kubecost frontend
- # assertionName: "http://schemas.auth0.com/userType" # a SAML Assertion, one of whose elements has a value that matches on of the values in assertionValues
+ # enabled: false # If admin is disabled, all SAML users will be able to make configuration changes to the Kubecost frontend
+ # assertionName: ""
# assertionValues:
# - "admin"
# - "superusers"
# - name: readonly
- # enabled: false # if readonly is disabled, all users authorized on SAML will default to readonly
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: false # If readonly is disabled, all users authorized on SAML will default to readonly
+ # assertionName: ""
# assertionValues:
# - "readonly"
# - name: editor
- # enabled: true # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: true # If editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # assertionName: ""
# assertionValues:
# - "editor"
+## Kubecost OIDC (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-oidc
oidc:
enabled: false
- clientID: "" # application/client client_id parameter obtained from provider, used to make requests to server
- clientSecret: "" # application/client client_secret parameter obtained from provider, used to make requests to server
- # secretName: "kubecost-oidc-secret" # k8s secret where clientsecret will be stored
- # For use to provide a custom OIDC Secret. Overrides the usage of oidc.clientSecret and oidc.secretName.
- # Should contain the field directly.
- # Can be created using raw k8s secrets, external secrets, sealed secrets, or any other method.
+ clientID: "" # Application client_id parameter obtained from provider. Used to make requests to server.
+ clientSecret: "" # Application/client client_secret parameter obtained from provider. Used to make requests to server.
+ secretName: "kubecost-oidc-secret" # K8s secret where clientsecret will be stored
existingCustomSecret:
enabled: false
- name: "" # name of the secret containing the client secret
-
- # authURL: "https://my.auth.server/authorize" # endpoint for login to auth server
- # loginRedirectURL: "http://my.kubecost.url/model/oidc/authorize" # Kubecost url configured in provider for redirect after authentication
- # discoveryURL: "https://my.auth.server/.well-known/openid-configuration" # url for OIDC endpoint discovery
- skipOnlineTokenValidation: false # if true, will skip accessing OIDC introspection endpoint for online token verification, and instead try to locally validate JWT claims
- useClientSecretPost: false # if true, client secret will specifically only use client_secret_post method, otherwise it will attempt to send the secret in both the header and the body.
- # hostedDomain: "example.com" # optional, blocks access to the auth domain specified in the hd claim of the provider ID token
+ name: "" # Name of an existing clientSecret. Overrides the usage of oidc.clientSecret and oidc.secretName.
+ authURL: "" # Authorization endpoint for your identity provider
+ loginRedirectURL: "" # Kubecost URL endpoint which handles auth flow
+ discoveryURL: "" # Your identity provider's endpoint sharing OIDC configuration
+ skipOnlineTokenValidation: false # If true, validate JWT claims locally
+ useClientSecretPost: false # If true, only use client_secret_post method. Otherwise attempt to send the secret in both the header and the body.
+ hostedDomain: "" # Optional, blocks access to the auth domain specified in the hd claim of the provider ID token
rbac:
enabled: false
# groups:
- # - name: admin
- # enabled: false # if admin is disabled, all authenticated users will be able to make configuration changes to the kubecost frontend
- # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
- # claimValues: # Kubecost matches these strings with the roles created in your identity provider
+ # - name: admin # Admins have permissions to edit Kubecost settings and save reports
+ # enabled: false
+ # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
+ # claimValues: # Kubecost matches these strings with the roles created in your identity provider
# - "admin"
# - "superusers"
- # - name: readonly
- # enabled: false # if readonly is disabled, all authenticated users will default to readonly
- # claimName: "roles"
+ # - name: readonly # Readonly users do not have permissions to edit Kubecost settings or save reports.
+ # enabled: false
+ # claimName: "roles"
# claimValues:
# - "readonly"
- # - name: editor
- # enabled: false # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # - name: editor # Editors have permissions to edit reports/alerts and act as readers otherwise
+ # enabled: false
# claimName: "roles"
# claimValues:
# - "editor"
@@ -435,25 +459,14 @@
resources:
requests:
cpu: "10m"
memory: "55Mi"
- # limits:
- # cpu: "100m"
- # memory: "256Mi"
deploymentStrategy: {}
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
-
- # Define a readiness probe for the Kubecost frontend container.
readinessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
failureThreshold: 6
-
- # Define a liveness probe for the Kubecost frontend container.
livenessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
@@ -495,49 +508,8 @@
# emitNamespaceAnnotations: false
# emitKsmV1Metrics: true # emit all KSM metrics in KSM v1.
# emitKsmV1MetricsOnly: false # emit only the KSM metrics missing from KSM v2. Advanced users only.
- # Optional
- # The metrics exporter is a separate deployment and service (for prometheus scrape auto-discovery)
- # which emits metrics cost-model relies on. Enabling this deployment also removes the KSM dependency
- # from the cost-model. If the deployment is not enabled, the metrics will continue to be emitted from
- # the cost-model.
- exporter:
- enabled: false
- port: 9005
- # Adds the default Prometheus scrape annotations to the metrics exporter service.
- # Set to false and use service.annotations (below) to set custom scrape annotations.
- prometheusScrape: true
- resources: {}
- # requests:
- # cpu: "200m"
- # memory: "55Mi"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- tolerations: []
-
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
- affinity: {}
-
- service:
- annotations: {}
-
- # Service Monitor for Kubecost Metrics
- serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors.
- enabled: false
- additionalLabels: {}
- metricRelabelings: []
- relabelings: []
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
- priorityClassName: ""
- additionalLabels: {}
- nodeSelector: {}
- extraArgs: []
-
sigV4Proxy:
image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest
imagePullPolicy: IfNotPresent
name: aps
@@ -549,9 +521,8 @@
# - name: AWS_ACCESS_KEY_ID
# value: <access_key>
# - name: AWS_SECRET_ACCESS_KEY
# value: <secret_key>
- # Optional resource requests and limits for the sigV4proxy container.
resources: {}
kubecostModel:
image: "gcr.io/kubecost1/cost-model"
@@ -559,17 +530,14 @@
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for cost-model.
# fullImageName:
+ # Log level for the cost model container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
+ logLevel: info
+
# securityContext:
# readOnlyRootFilesystem: true
- # Build local cost allocation cache
- warmCache: false
- # Run allocation ETL pipelines
- etl: true
- # Enable the ETL filestore backing storage
- etlFileStoreEnabled: true
# The total number of days the ETL pipelines will build
# Set to 0 to disable daily ETL (not recommended)
etlDailyStoreDurationDays: 91
# The total number of hours the ETL pipelines will build
@@ -695,16 +663,13 @@
# limits:
# cpu: "800m"
# memory: "256Mi"
- # Define a readiness probe for the Kubecost cost-model container.
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the Kubecost cost-model container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -712,43 +677,18 @@
extraArgs: []
# Optional. A list of extra environment variables to be added to the cost-model container.
# extraEnv:
- # - name: LOG_LEVEL
- # value: trace
# - name: LOG_FORMAT
# value: json
# # When false, Kubecost will not show Asset costs for local disks physically
# # attached to nodes (e.g. ephemeral storage). This needs to be applied to
# # each cluster monitored.
# - name: ASSET_INCLUDE_LOCAL_DISK_COST
# value: "true"
- # creates an ingress directly to the model container, for API access
- ingress:
- enabled: false
- # className: nginx
- labels:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- annotations:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- paths: ["/"]
- pathType: ImplementationSpecific
- hosts:
- - cost-analyzer-model.local
- tls: []
- # - secretName: cost-analyzer-model-tls
- # hosts:
- # - cost-analyzer-model.local
utcOffset: "+00:00"
- # Optional - add extra ports to the cost-model container. For kubecost development purposes only - not recommended for users.
extraPorts: []
- # - name: debug
- # port: 40000
- # targetPort: 40000
- # containerPort: 40000
## etlUtils is a utility typically used by Enterprise customers transitioning
## from v1 to v2 of Kubecost. It translates the data from the "/etl" dir of the
## bucket, to the "/federated" dir of the bucket.
@@ -760,8 +700,10 @@
resources: {}
env: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added to etlutils deployment
+ annotations: {}
affinity: {}
# Basic Kubecost ingress, more examples available at https://docs.kubecost.com/install-and-configure/install/ingress-examples
ingress:
@@ -782,77 +724,25 @@
# hosts:
# - cost-analyzer.local
nodeSelector: {}
-
tolerations: []
-# - key: "key"
-# operator: "Equal|Exists"
-# value: "value"
-# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
topologySpreadConstraints: []
-
-# If true, creates a PriorityClass to be used by the cost-analyzer pod
priority:
enabled: false
- name: "" # Provide name of existing priority class only. If left blank, upstream chart will create one from default template.
-
-# If true, enable creation of NetworkPolicy resources.
-networkPolicy:
- enabled: false
- denyEgress: true # create a network policy that denies egress from kubecost
- sameNamespace: true # Set to true if cost analyzer and prometheus are on the same namespace
-# namespace: kubecost # Namespace where prometheus is installed
-
- # Cost-analyzer specific vars using the new template
- costAnalyzer:
- enabled: false # If true, create a network policy for cost-analyzer
- annotations: {} # annotations to be added to the network policy
- additionalLabels: {} # additional labels to be added to the network policy
- # Examples rules:
- # ingressRules:
- # - selectors: # allow ingress from self on all ports
- # - podSelector:
- # matchLabels:
- # app.kubernetes.io/name: cost-analyzer
- # - selectors: # allow egress access to prometheus
- # - namespaceSelector:
- # matchLabels:
- # name: prometheus
- # podSelector:
- # matchLabels:
- # app: prometheus
- # ports:
- # - protocol: TCP
- # port: 9090
- # egressRules:
- # - selectors: # restrict egress to inside cluster
- # - namespaceSelector: {}
-
-## @param extraVolumes A list of volumes to be added to the pod
-##
+ name: ""
extraVolumes: []
-## @param extraVolumeMounts A list of volume mounts to be added to the pod
-##
extraVolumeMounts: []
# Define persistence volume for cost-analyzer, more information at https://docs.kubecost.com/install-and-configure/install/storage
persistentVolume:
size: 32Gi
- dbSize: 32.0Gi
enabled: true # Note that setting this to false means configurations will be wiped out on pod restart.
# storageClass: "-" #
# existingClaim: kubecost-cost-analyzer # a claim in the same namespace as kubecost
labels: {}
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- # Enables a separate PV specifically for ETL data. This should be avoided, but
- # is kept for legacy compatibility.
- dbPVEnabled: false
service:
type: ClusterIP
port: 9090
@@ -873,20 +763,15 @@
rbac:
create: true # Create the RBAC resources for Prometheus.
- ## Define serviceAccount names for components. Defaults to component's fully qualified name.
- ##
serviceAccounts:
alertmanager:
create: true
name:
nodeExporter:
create: true
name:
- pushgateway:
- create: true
- name:
server:
create: true
name:
## Prometheus server ServiceAccount annotations.
@@ -897,9 +782,8 @@
##
# selfsignedCertConfigMapName: ""
imagePullSecrets:
- # - name: "image-pull-secret"
extraScrapeConfigs: |
- job_name: kubecost
honor_labels: true
@@ -939,9 +823,9 @@
{{- end }}
## Enables scraping of NVIDIA GPU metrics via dcgm-exporter. Scrapes all
## endpoints which contain "dcgm-exporter" in labels "app",
## "app.kubernetes.io/component", or "app.kubernetes.io/name" with a case
- ## insensitive match.
+ ## insensitive match. The label must be present on the K8s service endpoints and not just pods.
## Refs:
## https://github.com/NVIDIA/gpu-operator/blob/d4316a415bbd684ce8416a88042305fc1a093aa4/assets/state-dcgm-exporter/0600_service.yaml#L7
## https://github.com/NVIDIA/dcgm-exporter/blob/54fd1ca137c66511a87a720390613680b9bdabdd/deployment/templates/service.yaml#L23
- job_name: kubecost-dcgm-exporter
@@ -961,381 +845,122 @@
## Provide a full name override for the Prometheus server.
# fullnameOverride: ""
- ## Prometheus server container name
- ##
enabled: true
name: server
sidecarContainers:
strategy:
type: Recreate
rollingUpdate: null
-
- ## Prometheus server container image
- ##
image:
repository: quay.io/prometheus/prometheus
tag: v2.55.1
pullPolicy: IfNotPresent
-
- ## prometheus server priorityClassName
- ##
priorityClassName: ""
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
- ## Maybe same with Ingress host name
baseURL: ""
-
- ## Additional server container environment variables
- ##
- ## You specify this manually like you would a raw deployment manifest.
- ## This means you can bind in environment variables from secrets.
- ##
- ## e.g. static environment variable:
- ## - name: DEMO_GREETING
- ## value: "Hello from the environment"
- ##
- ## e.g. secret environment variable:
- ## - name: USERNAME
- ## valueFrom:
- ## secretKeyRef:
- ## name: mysecret
- ## key: username
env: []
-
extraFlags:
- web.enable-lifecycle
- ## web.enable-admin-api flag controls access to the administrative HTTP API which includes functionality such as
- ## deleting time series. This is disabled by default.
- # - web.enable-admin-api
- ##
- ## storage.tsdb.no-lockfile flag controls BD locking
- # - storage.tsdb.no-lockfile
- ##
- ## storage.tsdb.wal-compression flag enables compression of the write-ahead log (WAL)
- # - storage.tsdb.wal-compression
-
- ## Path to a configuration file on prometheus server container FS
configPath: /etc/config/prometheus.yml
-
global:
- ## How frequently to scrape targets by default
- ##
scrape_interval: 1m
- ## How long until a scrape request times out
- ##
scrape_timeout: 60s
- ## How frequently to evaluate rules
- ##
evaluation_interval: 1m
external_labels:
cluster_id: cluster-one # Each cluster should have a unique ID
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
- ##
remoteWrite: {}
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
- ##
remoteRead: {}
-
- ## Additional Prometheus server container arguments
- ##
extraArgs:
query.max-concurrency: 1
query.max-samples: 100000000
-
- ## Additional InitContainers to initialize the pod
- ##
extraInitContainers: []
-
- ## Additional Prometheus server Volume mounts
- ##
extraVolumeMounts: []
-
- ## Additional Prometheus server Volumes
- ##
extraVolumes: []
-
- ## Additional Prometheus server hostPath mounts
- ##
extraHostPathMounts: []
- # - name: certs-dir
- # mountPath: /etc/kubernetes/certs
- # subPath: ""
- # hostPath: /etc/kubernetes/certs
- # readOnly: true
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # subPath: ""
- # configMap: certs-configmap
- # readOnly: true
-
- ## Additional Prometheus server Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: prom-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.server.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/server-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
ingress:
- ## If true, Prometheus server Ingress will be created
- ##
enabled: false
# className: nginx
-
- ## Prometheus server Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## Prometheus server Ingress additional labels
- ##
extraLabels: {}
-
- ## Prometheus server Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - prometheus.domain.com
- # - domain.com/prometheus
-
- ## PathType determines the interpretation of the Path matching
pathType: "Prefix"
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## Prometheus server Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-server-tls
- # hosts:
- # - prometheus.domain.com
-
- ## Server Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for Prometheus server pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, Prometheus server will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## Prometheus server data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## Prometheus server data Persistent Volume annotations
- ##
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- ## Prometheus server data Persistent Volume existing claim name
- ## Requires server.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## Prometheus server data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## Prometheus server data Persistent Volume size
- ##
size: 32Gi
-
- ## Prometheus server data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## Prometheus server data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of Prometheus server data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
emptyDir:
sizeLimit: ""
-
- ## Annotations to be added to Prometheus server pods
- ##
podAnnotations: {}
- # iam.amazonaws.com/role: prometheus
-
- ## Annotations to be added to the Prometheus Server deployment
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to Prometheus server pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Prometheus AlertManager configuration
- ##
alertmanagers: []
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
annotations: {}
labels: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
servicePort: 80
-
- ## Prometheus server readiness and liveness probe initial delay and timeout
- ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
- ##
readinessProbeInitialDelay: 5
readinessProbeTimeout: 3
readinessProbeFailureThreshold: 3
readinessProbeSuccessThreshold: 1
livenessProbeInitialDelay: 5
livenessProbeTimeout: 3
livenessProbeFailureThreshold: 3
livenessProbeSuccessThreshold: 1
-
- ## Prometheus server resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 500m
- # memory: 512Mi
- # requests:
- # cpu: 500m
- # memory: 512Mi
-
- ## Vertical Pod Autoscaler config
- ## Ref: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
verticalAutoscaler:
- ## If true a VPA object will be created for the controller (either StatefulSet or Deployment, based on above configs)
enabled: false
## Optional. Defaults to "Auto" if not specified.
# updateMode: "Auto"
## Mandatory. Without, VPA will not be created.
# containerPolicies:
# - containerName: 'prometheus-server'
-
- ## Security context to be added to server pods
- ##
securityContext: {}
- # runAsUser: 1001
- # runAsNonRoot: true
- # runAsGroup: 1001
- # fsGroup: 1001
-
containerSecurityContext: {}
-
service:
annotations: {}
labels: {}
clusterIP: ""
- # nodePort: ""
-
- ## List of IP addresses at which the Prometheus server service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
sessionAffinity: None
type: ClusterIP
-
- ## Enable gRPC port on service to allow auto discovery with thanos-querier
gRPC:
enabled: false
servicePort: 10901
- # nodePort: 10901
-
- ## If using a statefulSet (statefulSet.enabled=true), configure the
- ## service to connect to a specific replica to have a consistent view
- ## of the data.
statefulsetReplica:
enabled: false
replica: 0
-
- ## Prometheus server pod termination grace period
- ##
terminationGracePeriodSeconds: 300
## Prometheus data retention period (default if not specified is 97 hours)
##
@@ -1366,292 +991,92 @@
# retentionSize: should be significantly greater than the storage used in the number of hours set in etlHourlyStoreDurationHours
# Install Prometheus Alert Manager
alertmanager:
- ## If false, alertmanager will not be installed
- ##
enabled: false
-
## Provide a full name override for Prometheus alertmanager.
# fullnameOverride: ""
-
strategy:
type: Recreate
rollingUpdate: null
-
- ## alertmanager container name
- ##
name: alertmanager
-
- ## alertmanager container image
- ##
image:
repository: quay.io/prometheus/alertmanager
tag: v0.27.0
pullPolicy: IfNotPresent
-
- ## alertmanager priorityClassName
- ##
priorityClassName: ""
-
- ## Additional alertmanager container arguments
- ##
extraArgs: {}
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
baseURL: "http://localhost:9093"
-
- ## Additional alertmanager container environment variable
- ## For instance to add a http_proxy
- ##
extraEnv: {}
-
- ## Additional alertmanager Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: alertmanager-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
- ## The name of a secret in the same kubernetes namespace which contains the Alertmanager config
- ## Defining configFromSecret will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configFromSecret: ""
-
- ## The configuration file name to be loaded to alertmanager
- ## Must match the key within configuration loaded from ConfigMap/Secret
- ##
configFileName: alertmanager.yml
-
ingress:
- ## If true, alertmanager Ingress will be created
- ##
enabled: false
-
- ## alertmanager Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## alertmanager Ingress additional labels
- ##
extraLabels: {}
-
- ## alertmanager Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - alertmanager.domain.com
- # - domain.com/alertmanager
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## alertmanager Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - alertmanager.domain.com
-
- ## Alertmanager Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for alertmanager scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for alertmanager pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, alertmanager will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## alertmanager data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## alertmanager data Persistent Volume Claim annotations
- ##
annotations: {}
-
- ## alertmanager data Persistent Volume existing claim name
- ## Requires alertmanager.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## alertmanager data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## alertmanager data Persistent Volume size
- ##
size: 2Gi
-
- ## alertmanager data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## alertmanager data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of alertmanager data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
- ## Annotations to be added to alertmanager pods
- ##
podAnnotations: {}
- ## Tell prometheus to use a specific set of alertmanager pods
- ## instead of all alertmanager pods found in the same namespace
- ## Useful if you deploy multiple releases within the same namespace
- ##
- ## prometheus.io/probe: alertmanager-teamA
-
- ## Labels to be added to Prometheus AlertManager pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
+ annotations: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
servicePort: 80
-
- ## alertmanager resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to alertmanager pods
- ##
securityContext:
runAsUser: 1001
runAsNonRoot: true
runAsGroup: 1001
fsGroup: 1001
-
service:
annotations: {}
labels: {}
clusterIP: ""
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
- ## List of IP addresses at which the alertmanager service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
# nodePort: 30000
sessionAffinity: None
type: ClusterIP
- # Define a custom scheduler for Alertmanager pods
- # schedulerName: default-scheduler
-
- ## alertmanager ConfigMap entries
- ##
alertmanagerFiles:
alertmanager.yml:
global: {}
- # slack_api_url: ''
-
receivers:
- name: default-receiver
- # slack_configs:
- # - channel: '@you'
- # send_resolved: true
-
route:
group_wait: 10s
group_interval: 5m
receiver: default-receiver
@@ -1659,87 +1084,32 @@
## Monitors ConfigMap changes and POSTs to a URL
configmapReload:
prometheus:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
-
- ## configmap-reload container securityContext
containerSecurityContext: {}
alertmanager:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # node-export must be disabled if there is an existing daemonset: https://guide.kubecost.com/hc/en-us/articles/4407601830679-Troubleshoot-Install#a-name-node-exporter-a-issue-failedscheduling-kubecost-prometheus-node-exporter
nodeExporter:
## If false, node-exporter will not be installed.
## This is disabled by default in Kubecost 2.0, though it can be enabled as needed.
##
@@ -1747,346 +1117,59 @@
## Provide a full name override for node exporter.
# fullnameOverride: ""
- ## If true, node-exporter pods share the host network namespace
- ##
hostNetwork: true
-
- ## If true, node-exporter pods share the host PID namespace
- ##
hostPID: true
-
- ## node-exporter dns policy
- ##
dnsPolicy: ClusterFirstWithHostNet
-
- ## node-exporter container name
- ##
name: node-exporter
-
- ## node-exporter container image
- ##
image:
repository: prom/node-exporter
tag: v1.8.2
pullPolicy: IfNotPresent
-
- ## node-exporter priorityClassName
- ##
priorityClassName: ""
-
- ## Custom Update Strategy
- ##
updateStrategy:
type: RollingUpdate
-
- ## Additional node-exporter container arguments
- ##
extraArgs: {}
-
- ## Additional node-exporter hostPath mounts
- ##
extraHostPathMounts: []
- # - name: textfile-dir
- # mountPath: /srv/txt_collector
- # hostPath: /var/lib/node-exporter
- # readOnly: true
- # mountPropagation: HostToContainer
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # configMap: certs-configmap
- # readOnly: true
-
- ## Set a custom affinity for node-exporter
- ##
# affinity:
-
- ## Node tolerations for node-exporter scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for node-exporter pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Annotations to be added to node-exporter pods
- ##
podAnnotations: {}
-
- ## Annotations to be added to the node-exporter DaemonSet
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to node-exporter pods
- ##
+ annotations: {}
pod:
labels: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## node-exporter resource limits & requests
- ## Ref: https://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 200m
- # memory: 50Mi
- # requests:
- # cpu: 100m
- # memory: 30Mi
-
- ## Security context to be added to node-exporter pods
- ##
securityContext: {}
- # runAsUser: 0
-
service:
annotations:
prometheus.io/scrape: "true"
labels: {}
-
- # Exposed as a headless service:
- # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
clusterIP: None
-
- ## List of IP addresses at which the node-exporter service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
hostPort: 9100
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 9100
type: ClusterIP
- # Install Prometheus Push Gateway.
- pushgateway:
- ## If false, pushgateway will not be installed
- ##
- enabled: false
-
- ## Provide a full name override for Prometheus push gateway.
- # fullnameOverride: ""
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
- # schedulerName:
-
- ## pushgateway container name
- ##
- name: pushgateway
-
- ## pushgateway container image
- ##
- image:
- repository: prom/pushgateway
- tag: v1.9.0
- pullPolicy: IfNotPresent
-
- ## pushgateway priorityClassName
- ##
- priorityClassName: ""
-
- ## Additional pushgateway container arguments
- ##
- ## for example: persistence.file: /data/pushgateway.data
- extraArgs: {}
-
- ingress:
- ## If true, pushgateway Ingress will be created
- ##
- enabled: false
-
- ## pushgateway Ingress annotations
- ##
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## pushgateway Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
- hosts: []
- # - pushgateway.domain.com
- # - domain.com/pushgateway
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
- extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## pushgateway Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
- tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - pushgateway.domain.com
-
- ## Node tolerations for pushgateway scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
- tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for pushgateway pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
- nodeSelector: {}
-
- ## Annotations to be added to pushgateway pods
- ##
- podAnnotations: {}
-
- replicaCount: 1
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
- podDisruptionBudget:
- enabled: false
- maxUnavailable: 1
-
- ## pushgateway resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
- resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to push-gateway pods
- ##
- securityContext:
- runAsUser: 1001
- runAsNonRoot: true
-
- service:
- annotations:
- prometheus.io/probe: pushgateway
- labels: {}
- clusterIP: ""
-
- ## List of IP addresses at which the pushgateway service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
- externalIPs: []
-
- loadBalancerIP: ""
- loadBalancerSourceRanges: []
- servicePort: 9091
- type: ClusterIP
-
- strategy:
- type: Recreate
- rollingUpdate: null
-
-
- persistentVolume:
- ## If true, pushgateway will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
- enabled: true
-
- ## pushgateway data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
- accessModes:
- - ReadWriteOnce
-
- ## pushgateway data Persistent Volume Claim annotations
- ##
- annotations: {}
-
- ## pushgateway data Persistent Volume existing claim name
- ## Requires pushgateway.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
- existingClaim: ""
-
- ## pushgateway data Persistent Volume mount root path
- ##
- mountPath: /data
-
- ## pushgateway data Persistent Volume size
- ##
- size: 2Gi
-
- ## pushgateway data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
- # storageClass: "-"
-
- ## pushgateway data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
- # volumeBindingMode: ""
-
- ## Subdirectory of pushgateway data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
- subPath: ""
-
serverFiles:
## Alerts configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
alerting_rules.yml: {}
- # groups:
- # - name: Instances
- # rules:
- # - alert: InstanceDown
- # expr: up == 0
- # for: 5m
- # labels:
- # severity: page
- # annotations:
- # description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.'
- # summary: 'Instance {{ $labels.instance }} down'
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use alerting_rules.yml
- alerts: {}
## Records configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/
recording_rules.yml: {}
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use recording_rules.yml
prometheus.yml:
rule_files:
- /etc/config/recording_rules.yml
- /etc/config/alerting_rules.yml
- ## Below two files are DEPRECATED will be removed from this default values file
- - /etc/config/rules
- - /etc/config/alerts
scrape_configs:
- job_name: prometheus
static_configs:
@@ -2098,9 +1181,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes-cadvisor'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2159,9 +1241,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2252,21 +1333,8 @@
metric_relabel_configs:
- source_labels: [__name__]
regex: (container_cpu_allocation|container_cpu_usage_seconds_total|container_fs_limit_bytes|container_fs_writes_bytes_total|container_gpu_allocation|container_memory_allocation_bytes|container_memory_usage_bytes|container_memory_working_set_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|DCGM_FI_DEV_GPU_UTIL|deployment_match_labels|kube_daemonset_status_desired_number_scheduled|kube_daemonset_status_number_ready|kube_deployment_spec_replicas|kube_deployment_status_replicas|kube_deployment_status_replicas_available|kube_job_status_failed|kube_namespace_annotations|kube_namespace_labels|kube_node_info|kube_node_labels|kube_node_status_allocatable|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_memory_bytes|kube_node_status_capacity|kube_node_status_capacity_cpu_cores|kube_node_status_capacity_memory_bytes|kube_node_status_condition|kube_persistentvolume_capacity_bytes|kube_persistentvolume_status_phase|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_pod_container_info|kube_pod_container_resource_limits|kube_pod_container_resource_limits_cpu_cores|kube_pod_container_resource_limits_memory_bytes|kube_pod_container_resource_requests|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests_memory_bytes|kube_pod_container_status_restarts_total|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_labels|kube_pod_owner|kube_pod_status_phase|kube_replicaset_owner|kube_statefulset_replicas|kube_statefulset_status_replicas|kubecost_cluster_info|kubecost_cluster_management_cost|kubecost_cluster_memory_working_set_bytes|kubecost_load_balancer_cost|kubecost_network_internet_egress_cost|kubecost_network_region_egress_cost|kubecost_network_zone_egress_cost|kubecost_node_is_spot|kubecost_pod_network_egress_bytes_total|node_cpu_hourly_cost|node_cpu_seconds_total|node_disk_reads_completed|node_disk_reads_completed_total|node_disk_writes_completed|node_disk_writes_completed_total|node_filesystem_device_error|node_gpu_count|node_gpu_hourly_cost|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_network_transmit_bytes_total|node_ram_hourly_cost|node_total_hourly_cost|pod_pvc_allocation|pv_hourly_cost|service_selector_labels|statefulSet_match_labels|kubecost_pv_info|up)
action: keep
-
-
- # prometheus.yml: # Sample block -- enable if using an in cluster durable store.
- # remote_write:
- # - url: "http://pgprometheus-adapter:9201/write"
- # write_relabel_configs:
- # - source_labels: [__name__]
- # regex: 'container_.*_allocation|container_.*_allocation_bytes|.*_hourly_cost|kube_pod_container_resource_requests{resource="memory", unit="byte"}|container_memory_working_set_bytes|kube_pod_container_resource_requests{resource="cpu", unit="core"}|kube_pod_container_resource_requests|pod_pvc_allocation|kube_namespace_labels|kube_pod_labels'
- # action: keep
- # queue_config:
- # max_samples_per_send: 1000
- # remote_read:
- # - url: "http://pgprometheus-adapter:9201/read"
rules:
groups:
- name: CPU
rules:
@@ -2307,13 +1375,10 @@
# regex: (.+)\d+
# target_label: dc
networkPolicy:
- ## Enable creation of NetworkPolicy resources.
- ##
enabled: false
-
## Optional daemonset to more accurately attribute network costs to the correct workload
## https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration
networkCosts:
enabled: false
@@ -2332,14 +1397,15 @@
# Traffic Logging will enable logging the top 5 destinations for each source
# every 30 minutes.
trafficLogging: true
+ # Log level for the network cost containers. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# Port will set both the containerPort and hostPort to this value.
# These must be identical due to network-costs being run on hostNetwork
port: 3001
- # this daemonset can use significant resources on large clusters: https://guide.kubecost.com/hc/en-us/articles/4407595973527-Network-Traffic-Cost-Allocation
+ # this daemonset can use significant resources on large clusters: https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/cost-allocation/network-allocation
resources:
limits: # remove the limits by setting cpu: null
cpu: 500m # can be less, will depend on cluster size
# memory: it is not recommended to set a memory limit
@@ -2410,75 +1476,41 @@
# ips:
# - "15.128.15.2"
# - "20.0.0.0/8"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
service:
annotations: {}
labels: {}
-
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- ## PodMonitor
- ## Allows scraping of network metrics from a dedicated prometheus operator setup
podMonitor:
enabled: false
additionalLabels: {}
- # match the default extraScrapeConfig
additionalLabels: {}
nodeSelector: {}
+ # Annotations to be added to network cost daemonset template and pod template annotations
annotations: {}
healthCheckProbes: {}
- # readinessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
- # livenessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
additionalSecurityContext: {}
- # readOnlyRootFilesystem: true
## Kubecost Deployment Configuration
## Used for HA mode in Business & Enterprise tier
##
kubecostDeployment:
replicas: 1
- # deploymentStrategy:
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
labels: {}
annotations: {}
-
## Kubecost Forecasting forecasts future cost patterns based on historical
## patterns observed by Kubecost.
forecasting:
enabled: true
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for the forecasting
# container.
- # Example: fullImageName: gcr.io/kubecost1/forecasting:v0.0.1
- fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.18
imagePullPolicy: IfNotPresent
# Resource specification block for the forecasting container.
resources:
@@ -2494,30 +1526,20 @@
# -t is the worker timeout which primarily affects model training time;
# if it is not high enough, training workers may die mid training
"GUNICORN_CMD_ARGS": "--log-level info -t 1200"
- # Define a priority class for the forecasting Deployment.
priority:
enabled: false
name: ""
-
- # Define a nodeSelector for the forecasting Deployment.
nodeSelector: {}
-
- # Define tolerations for the forecasting Deployment.
tolerations: []
-
- # Define Pod affinity for the forecasting Deployment.
+ annotations: {}
affinity: {}
-
- # Define a readiness probe for the forecasting container
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the forecasting container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -2545,8 +1567,9 @@
# Replicas sets the number of Aggregator replicas. It only has an effect if
# `deployMethod: "statefulset"`
replicas: 1
+ # Log level for the aggregator container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# stagingEmptyDirSizeLimit changes how large the "staging"
# /var/configs/waterfowl emptyDir is. It only takes effect in StatefulSet
@@ -2673,8 +1696,11 @@
## Define tolerations for the aggregator pod
# tolerations: []
+ ## Annotations to be added for aggregator deployment or statefulset
+ # annotations: {}
+
## Define Pod affinity for the aggregator pod
# affinity: {}
## Define extra volumes for the aggregator pod
@@ -2737,9 +1763,8 @@
jaeger:
enabled: false
image: jaegertracing/all-in-one
imageVersion: latest
- # containerSecurityContext:
service:
labels: {}
@@ -2785,8 +1810,10 @@
securityContext: {}
containerSecurityContext: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added for diagnostics Deployment.
+ annotations: {}
affinity: {}
## Provide a full name override for the diagnostics Deployment.
# diagnosticsFullnameOverride: ""
@@ -2797,14 +1824,16 @@
image:
repository: gcr.io/kubecost1/cluster-controller
tag: v0.16.9
imagePullPolicy: IfNotPresent
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Set custom tolerations for the cluster controller.
tolerations: []
+
+ ## Annotations to be added for cluster controller template
+ annotations: {}
resources: {}
+ affinity: {}
+ nodeSelector: {}
actionConfigs:
# this configures the Kubecost Cluster Turndown action
# for more details, see documentation at https://github.com/kubecost/cluster-turndown/tree/develop?tab=readme-ov-file#setting-a-turndown-schedule
clusterTurndown: []
@@ -2950,12 +1979,12 @@
# initChownDataImage ensures all Kubecost filepath permissions on PV or local storage are set up correctly.
initChownDataImage: "busybox" # Supports a fully qualified Docker image, e.g. registry.hub.docker.com/library/busybox:latest
initChownData:
resources: {}
- # requests:
- # cpu: "50m"
- # memory: "20Mi"
+## Kubecost's Bundled Grafana
+## You can access it by visiting http://kubecost.me.com/grafana/
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/custom-grafana
grafana:
# namespace_datasources: kubecost # override the default namespace here
# namespace_dashboards: kubecost # override the default namespace here
rbac:
@@ -2987,106 +2016,45 @@
# prometheusType: Prometheus
# prometheusVersion: 2.35.0
# timeInterval: 1m
- ## Number of replicas for the Grafana deployment
replicas: 1
-
- ## Deployment strategy for the Grafana deployment
deploymentStrategy: RollingUpdate
-
- ## Readiness probe for the Grafana deployment
readinessProbe:
httpGet:
path: /api/health
port: 3000
-
- ## Liveness probe for the Grafana deployment
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 60
timeoutSeconds: 30
failureThreshold: 10
-
- ## Container image settings for the Grafana deployment
image:
repository: grafana/grafana
tag: 11.3.1
pullPolicy: IfNotPresent
-
- ## Optionally specify an array of imagePullSecrets.
- ## Secrets must be manually created in the namespace.
# pullSecrets:
- # - myRegistrKeySecretName
-
- ## Pod-level security context for the Grafana deployment. Recommended let global defaults take effect.
securityContext: {}
- # runAsUser: 472
- # fsGroup: 472
-
- ## PriorityClassName for the Grafana deployment
priorityClassName: ""
## Container image settings for Grafana initContainer used to download dashboards. Will only be used when dashboards are present.
downloadDashboardsImage:
repository: curlimages/curl
tag: latest
pullPolicy: IfNotPresent
-
- ## Pod Annotations for the Grafana deployment
podAnnotations: {}
-
- ## Deployment annotations for the Grafana deployment
annotations: {}
-
- ## Expose the Grafana service to be accessed from outside the cluster (LoadBalancer service).
- ## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
service:
type: ClusterIP
port: 80
annotations: {}
labels: {}
-
- ## This template is not needed and is not supported.
- ## It is here for backwards compatibility.
- ## Kubecost exposes grafana by default with the
- ## top level ingress template under /grafana/
- ingress:
- enabled: false
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- labels: {}
- path: /
- pathType: Prefix
- hosts:
- - chart-example.local
- tls: []
- # - secretName: chart-example-tls
- # hosts:
- # - chart-example.local
-
- ## Resource requests and limits for the Grafana deployment
resources: {}
- # limits:
- # cpu: 100m
- # memory: 128Mi
- # requests:
- # cpu: 100m
- # memory: 128Mi
-
- ## Node labels for pod assignment of the Grafana deployment
nodeSelector: {}
-
- ## Tolerations for pod assignment of the Grafana deployment
tolerations: []
-
- ## Affinity for pod assignment of the Grafana deployment
affinity: {}
-
- ## Enable persistence using Persistent Volume Claims of the Grafana deployment
persistence:
enabled: false
# storageClassName: default
# accessModes:
@@ -3094,123 +2062,24 @@
# size: 10Gi
# annotations: {}
# subPath: ""
# existingClaim:
-
- ## Admin user for Grafana
adminUser: admin
-
- ## Admin password for Grafana
adminPassword: strongpassword
-
- ## Use an alternate scheduler for the Grafana deployment
# schedulerName:
-
- ## Extra environment variables that will be passed onto Grafana deployment pods
env: {}
-
- ## The name of a secret for Grafana in the same Kubernetes namespace which contain values to be added to the environment
- ## This can be useful for auth tokens, etc
envFromSecret: ""
-
- ## Additional Grafana server secret mounts
- ## Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # secretName: grafana-secret-files
- # readOnly: true
-
- ## List of Grafana plugins
plugins: []
- # - digrich-bubblechart-panel
- # - grafana-clock-panel
-
- ## Grafana dashboard providers
- ## ref: http://docs.grafana.org/administration/provisioning/#dashboards
- ##
- ## `path` must be /var/lib/grafana/dashboards/<provider_name>
- ##
dashboardProviders: {}
- # dashboardproviders.yaml:
- # apiVersion: 1
- # providers:
- # - name: 'default'
- # orgId: 1
- # folder: ''
- # type: file
- # disableDeletion: false
- # editable: true
- # options:
- # path: /var/lib/grafana/dashboards/default
-
- ## Configure Grafana dashboard to import
- ## NOTE: To use dashboards you must also enable/configure dashboardProviders
- ## ref: https://grafana.com/dashboards
- ##
- ## dashboards per provider, use provider name as key.
- ##
dashboards: {}
- # default:
- # prometheus-stats:
- # gnetId: 3662
- # revision: 2
- # datasource: Prometheus
-
- ## Reference to external Grafana ConfigMap per provider. Use provider name as key and ConfiMap name as value.
- ## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both.
- ## ConfigMap data example:
- ##
- ## data:
- ## example-dashboard.json: |
- ## RAW_JSON
- ##
dashboardsConfigMaps: {}
- # default: ""
-
- ## LDAP Authentication for Grafana can be enabled with the following values on grafana.ini
- ## NOTE: Grafana will fail to start if the value for ldap.toml is invalid
- # auth.ldap:
- # enabled: true
- # allow_sign_up: true
- # config_file: /etc/grafana/ldap.toml
-
- ## Grafana's LDAP configuration
- ## Templated by the template in _helpers.tpl
- ## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#auth-ldap
- ## ref: http://docs.grafana.org/installation/ldap/#configuration
- ldap:
- # `existingSecret` is a reference to an existing secret containing the ldap configuration
- # for Grafana in a key `ldap-toml`.
- existingSecret: ""
- # `config` is the content of `ldap.toml` that will be stored in the created secret
- config: ""
- # config: |-
- # verbose_logging = true
-
- # [[servers]]
- # host = "my-ldap-server"
- # port = 636
- # use_ssl = true
- # start_tls = false
- # ssl_skip_verify = false
- # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com"
-
- ## Grafana's SMTP configuration
- ## NOTE: To enable, grafana.ini must be configured with smtp.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#smtp
- smtp:
- # `existingSecret` is a reference to an existing secret containing the smtp configuration
- # for Grafana in keys `user` and `password`.
- existingSecret: ""
-
## Grafana sidecars that collect the configmaps with specified label and stores the included files them into the respective folders
## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards
sidecar:
image:
repository: ghcr.io/kiwigrid/k8s-sidecar
- tag: 1.28.0
+ tag: 1.28.1
pullPolicy: IfNotPresent
resources: {}
dashboards:
enabled: true
@@ -3226,9 +2095,8 @@
enabled: false
error_throttle_sleep: 0
# label that the configmaps with datasources are marked with
label: grafana_datasource
-
## Grafana's primary configuration
## NOTE: values in map will be converted to ini format
## ref: http://docs.grafana.org/installation/configuration/
##
@@ -3256,21 +2124,15 @@
serviceAccount:
create: true # Set this to false if you're bringing your own service account.
annotations: {}
- # name: kc-test
awsstore:
useAwsStore: false
- imageNameAndVersion: gcr.io/kubecost1/awsstore:latest # Name and version of the container image for AWSStore.
+ imageNameAndVersion: gcr.io/kubecost1/awsstore:latest
createServiceAccount: false
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Use a custom nodeSelector for AWSStore.
nodeSelector: {}
- # kubernetes.io/arch: amd64
- ## Annotations for the AWSStore ServiceAccount.
annotations: {}
## Federated ETL Architecture
## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl
@@ -3331,9 +2193,9 @@
# address: http://cluster-a.kubecost.com:9090
# # Optional authentication credentials - only basic auth is currently supported.
# auth:
# type: basic
-# # Secret name should be a secret formatted based on: https://github.com/kubecost/docs/blob/main/ingress-examples.md
+# # Secret name should be a secret formatted based on: https://github.com/kubecost/poc-common-configurations/tree/main/ingress-examples
# secretName: cluster-a-auth
# # Or pass auth directly as base64 encoded user:pass
# data: YWRtaW46YWRtaW4=
# # Or user and pass directly
@@ -3369,10 +2231,10 @@
# gpuLabel: gpu
# gpuLabelValue: true
# alibabaServiceKeyName: ""
# alibabaServiceKeyPassword: ""
-# awsServiceKeyName: ACCESSKEYID
-# awsServiceKeyPassword: fakepassword # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName
+# awsServiceKeyName: ""
+# awsServiceKeyPassword: ""
# awsSpotDataRegion: us-east-1
# awsSpotDataBucket: spot-data-feed-s3-bucket
# awsSpotDataPrefix: dev
# athenaProjectID: "530337586277" # The AWS AccountID where the Athena CUR is. Generally your masterpayer account
@@ -3551,4 +2413,8 @@
# host: kubecost.kubecost.svc.cluster.local
# port:
# number: 80
+# -- Optional override for the image used for the basic health test container
+# basicHealth:
+# fullImageName: alpine/k8s:1.26.9
+ |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 45f899ca0f060cb78b76717b768816a257756505a52b46a72a552cbed367f9ce
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LW1hbmFnZXIuaW8vY2x1c3Rlci1pc3N1ZXIiOiJsZXRzZW5jcnlwdC1zdGFnaW5nIn0sImNsYXNzTmFtZSI6Im5naW54IiwiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1ldHJpY3MiOnt9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsRmlsZVN0b3JlRW5hYmxlZCI6dHJ1ZSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAiLCJ3YXJtQ2FjaGUiOmZhbHNlfSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJQVkVuYWJsZWQiOmZhbHNlLCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJkZXBsb3ltZW50QW5ub3RhdGlvbnMiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJhbGVydHMiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9ydWxlcyIsIi9ldGMvY29uZmlnL2FsZXJ0cyJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInB1c2hnYXRld2F5Ijp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicmVwb3J0aW5nIjp7ImVycm9yUmVwb3J0aW5nIjp0cnVlLCJsb2dDb2xsZWN0aW9uIjp0cnVlLCJwcm9kdWN0QW5hbHl0aWNzIjp0cnVlLCJ2YWx1ZXNSZXBvcnRpbmciOnRydWV9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwibm9kZVBvcnQiOnt9LCJwb3J0Ijo5MDkwLCJ0YXJnZXRQb3J0Ijo5MDkwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjEifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiYW5ub3RhdGlvbnMiOnsiY2VydC1tYW5hZ2VyLmlvL2NsdXN0ZXItaXNzdWVyIjoibGV0c2VuY3J5cHQtc3RhZ2luZyJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwicGF0aFR5cGUiOiJJbXBsZW1lbnRhdGlvblNwZWNpZmljIiwicGF0aHMiOlsiLyJdLCJ0bHMiOlt7Imhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwic2VjcmV0TmFtZSI6Imt1YmVjb3N0LXNlcnZlci10bHMifV19LCJpbml0Q2hvd25EYXRhIjp7InJlc291cmNlcyI6e319LCJpbml0Q2hvd25EYXRhSW1hZ2UiOiJidXN5Ym94Iiwia3ViZWNvc3REZXBsb3ltZW50Ijp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwicmVwbGljYXMiOjF9LCJrdWJlY29zdEZyb250ZW5kIjp7ImRlcGxveU1ldGhvZCI6InNpbmdsZXBvZCIsImRlcGxveW1lbnRTdHJhdGVneSI6e30sImVuYWJsZWQiOnRydWUsImhhUmVwbGljYXMiOjIsImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9mcm9udGVuZCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImlwdjYiOnsiZW5hYmxlZCI6dHJ1ZX0sImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMTBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXNlRGVmYXVsdEZxZG4iOmZhbHNlfSwia3ViZWNvc3RNb2RlbCI6eyJjb250YWluZXJTdGF0c0VuYWJsZWQiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibG9nTGV2ZWwiOiJpbmZvIiwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCJ9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC4gVGhlIGxhYmVsIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgSzhzIHNlcnZpY2UgZW5kcG9pbnRzIGFuZCBub3QganVzdCBwb2RzLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYW5ub3RhdGlvbnMiOnt9LCJiYXNlVVJMIjoiIiwiY29uZmlnTWFwT3ZlcnJpZGVOYW1lIjoiIiwiY29uZmlnUGF0aCI6Ii9ldGMvY29uZmlnL3Byb21ldGhldXMueW1sIiwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7fSwiZW1wdHlEaXIiOnsic2l6ZUxpbWl0IjoiIn0sImVuYWJsZWQiOnRydWUsImVudiI6W10sImV4dHJhQXJncyI6eyJxdWVyeS5tYXgtY29uY3VycmVuY3kiOjEsInF1ZXJ5Lm1heC1zYW1wbGVzIjoxMDAwMDAwMDB9LCJleHRyYUNvbmZpZ21hcE1vdW50cyI6W10sImV4dHJhRmxhZ3MiOlsid2ViLmVuYWJsZS1saWZlY3ljbGUiXSwiZXh0cmFIb3N0UGF0aE1vdW50cyI6W10sImV4dHJhSW5pdENvbnRhaW5lcnMiOltdLCJleHRyYVNlY3JldE1vdW50cyI6W10sImV4dHJhVm9sdW1lTW91bnRzIjpbXSwiZXh0cmFWb2x1bWVzIjpbXSwiZ2xvYmFsIjp7ImV2YWx1YXRpb25faW50ZXJ2YWwiOiIxbSIsImV4dGVybmFsX2xhYmVscyI6eyJjbHVzdGVyX2lkIjoic3gtY25wLW9zcyJ9LCJzY3JhcGVfaW50ZXJ2YWwiOiIxbSIsInNjcmFwZV90aW1lb3V0IjoiNjBzIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoicXVheS5pby9wcm9tZXRoZXVzL3Byb21ldGhldXMiLCJ0YWciOiJ2Mi41NS4xIn0sImxpdmVuZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJsaXZlbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJsaXZlbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwibGl2ZW5lc3NQcm9iZVRpbWVvdXQiOjMsIm5hbWUiOiJzZXJ2ZXIiLCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFjY2Vzc01vZGVzIjpbIlJlYWRXcml0ZU9uY2UiXSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJleGlzdGluZ0NsYWltIjoiIiwibW91bnRQYXRoIjoiL2RhdGEiLCJzaXplIjoiMzJHaSIsInN1YlBhdGgiOiIifSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwb2RMYWJlbHMiOnt9LCJwcmVmaXhVUkwiOiIiLCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInJlYWRpbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywicmVhZGluZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsInJlYWRpbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwicmVhZGluZXNzUHJvYmVUaW1lb3V0IjozLCJyZW1vdGVSZWFkIjp7fSwicmVtb3RlV3JpdGUiOnt9LCJyZXBsaWNhQ291bnQiOjEsInJlc291cmNlcyI6e30sInJldGVudGlvbiI6Ijk3aCIsInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJjbHVzdGVySVAiOiIiLCJleHRlcm5hbElQcyI6W10sImxhYmVscyI6e30sImxvYWRCYWxhbmNlcklQIjoiIiwibG9hZEJhbGFuY2VyU291cmNlUmFuZ2VzIjpbXSwic2VydmljZVBvcnQiOjgwLCJzZXNzaW9uQWZmaW5pdHkiOiJOb25lIiwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzdHJhdGVneSI6eyJ0eXBlIjoiUmVjcmVhdGUifSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjMwMCwidG9sZXJhdGlvbnMiOltdfSwic2VydmVyRmlsZXMiOnsiYWxlcnRpbmdfcnVsZXMueW1sIjp7fSwicHJvbWV0aGV1cy55bWwiOnsicnVsZV9maWxlcyI6WyIvZXRjL2NvbmZpZy9yZWNvcmRpbmdfcnVsZXMueW1sIiwiL2V0Yy9jb25maWcvYWxlcnRpbmdfcnVsZXMueW1sIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-17 19:43:02.257454950 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-17 19:42:35.937221795 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-17 19:43:02.257454950 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-17 19:42:35.937221795 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-17 19:43:02.259454966 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-17 19:42:35.939221814 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-17 19:43:02.257454950 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-17 19:42:35.937221795 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-17 19:43:02.258454958 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-17 19:42:35.937221795 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-17 19:43:02.258454958 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-17 19:42:35.938221804 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-17 19:43:02.260454975 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-17 19:42:35.940221823 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-17 19:42:35.801220571 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-17 19:42:35.801220571 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-17 19:42:35.801220571 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-17 19:42:35.801220571 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 3200005267ed0d35ec8656b0c4da50d94bf7156275304458eccd802ce21d54ee
+ checksum/configs: 464ddc3eced704ef4072987b48e0134bc01babb9294f4d818dec7f9eed8943a9
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifSwiZ3JhZmFuYVVSTCI6Imh0dHBzOi8vZ3JhZmFuYS5sYWIuc3V4ZXNzaXQuazhzLmNsb3VkLnVpYmsuYWMuYXQifSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJhZGRpdGlvbmFsU2VjdXJpdHlDb250ZXh0Ijp7fSwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImNvbmZpZyI6eyJkZXN0aW5hdGlvbnMiOnsiY3Jvc3MtcmVnaW9uIjpbXSwiZGlyZWN0LWNsYXNzaWZpY2F0aW9uIjpbXSwiaW4tcmVnaW9uIjpbXSwiaW4tem9uZSI6WyIxMjcuMC4wLjAvOCIsIjE2OS4yNTQuMC4wLzE2IiwiMTAuMC4wLjAvOCIsIjE3Mi4xNi4wLjAvMTIiLCIxOTIuMTY4LjAuMC8xNiJdLCJpbnRlcm5ldCI6W119LCJzZXJ2aWNlcyI6eyJhbWF6b24td2ViLXNlcnZpY2VzIjp0cnVlLCJhenVyZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZSwiZ29vZ2xlLWNsb3VkLXNlcnZpY2VzIjp0cnVlfX0sImVuYWJsZWQiOnRydWUsImV4dHJhQXJncyI6W10sImhlYWx0aENoZWNrUHJvYmVzIjp7fSwiaW1hZ2UiOnsicmVwb3NpdG9yeSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbmV0d29yay1jb3N0cyIsInRhZyI6InYwLjE3LjYifSwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibG9nTGV2ZWwiOiJpbmZvIiwibm9kZVNlbGVjdG9yIjp7fSwicG9ydCI6MzAwMSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJwcm9tZXRoZXVzU2NyYXBlIjpmYWxzZSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MDBtIn0sInJlcXVlc3RzIjp7ImNwdSI6IjUwbSIsIm1lbW9yeSI6IjIwTWkifX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9fSwidG9sZXJhdGlvbnMiOltdLCJ0cmFmZmljTG9nZ2luZyI6dHJ1ZSwidXBkYXRlU3RyYXRlZ3kiOnsidHlwZSI6IlJvbGxpbmdVcGRhdGUifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJwcm9tZXRoZXVzUnVsZSI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNlcnZpY2VNb25pdG9yIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJuZXR3b3JrQ29zdHMiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWUsImludGVydmFsIjoiMW0iLCJtZXRyaWNSZWxhYmVsaW5ncyI6W10sInJlbGFiZWxpbmdzIjpbXSwic2NyYXBlVGltZW91dCI6IjEwcyJ9LCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJzZWN1cml0eUNvbnRleHQiOnsiZnNHcm91cCI6MTAwMSwiZnNHcm91cENoYW5nZVBvbGljeSI6Ik9uUm9vdE1pc21hdGNoIiwicnVuQXNHcm91cCI6MTAwMSwicnVuQXNOb25Sb290Ijp0cnVlLCJydW5Bc1VzZXIiOjEwMDEsInNlY2NvbXBQcm9maWxlIjp7InR5cGUiOiJSdW50aW1lRGVmYXVsdCJ9fX0sImdyYWZhbmEiOnsiYWRtaW5QYXNzd29yZCI6InN0cm9uZ3Bhc3N3b3JkIiwiYWRtaW5Vc2VyIjoiYWRtaW4iLCJhZmZpbml0eSI6e30sImFubm90YXRpb25zIjp7fSwiZGFzaGJvYXJkUHJvdmlkZXJzIjp7fSwiZGFzaGJvYXJkcyI6e30sImRhc2hib2FyZHNDb25maWdNYXBzIjp7fSwiZGVwbG95bWVudFN0cmF0ZWd5IjoiUm9sbGluZ1VwZGF0ZSIsImRvd25sb2FkRGFzaGJvYXJkc0ltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiY3VybGltYWdlcy9jdXJsIiwidGFnIjoibGF0ZXN0In0sImVudiI6e30sImVudkZyb21TZWNyZXQiOiIiLCJleHRyYVNlY3JldE1vdW50cyI6W10sImdyYWZhbmEuaW5pIjp7ImFuYWx5dGljcyI6eyJjaGVja19mb3JfdXBkYXRlcyI6dHJ1ZX0sImF1dGguYW5vbnltb3VzIjp7ImVuYWJsZWQiOnRydWUsIm9yZ19uYW1lIjoiTWFpbiBPcmcuIiwib3JnX3JvbGUiOiJFZGl0b3IifSwiZ3JhZmFuYV9uZXQiOnsidXJsIjoiaHR0cHM6Ly9ncmFmYW5hLm5ldCJ9LCJsb2ciOnsibW9kZSI6ImNvbnNvbGUifSwicGF0aHMiOnsiZGF0YSI6Ii92YXIvbGliL2dyYWZhbmEvZGF0YSIsImxvZ3MiOiIvdmFyL2xvZy9ncmFmYW5hIiwicGx1Z2lucyI6Ii92YXIvbGliL2dyYWZhbmEvcGx1Z2lucyIsInByb3Zpc2lvbmluZyI6Ii9ldGMvZ3JhZmFuYS9wcm92aXNpb25pbmcifSwic2VydmVyIjp7InJvb3RfdXJsIjoiJShwcm90b2NvbClzOi8vJShkb21haW4pczolKGh0dHBfcG9ydClzL2dyYWZhbmEiLCJzZXJ2ZV9mcm9tX3N1Yl9wYXRoIjpmYWxzZX19LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdyYWZhbmEvZ3JhZmFuYSIsInRhZyI6IjExLjMuMSJ9LCJsaXZlbmVzc1Byb2JlIjp7ImZhaWx1cmVUaHJlc2hvbGQiOjEwLCJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjo2MCwidGltZW91dFNlY29uZHMiOjMwfSwibm9kZVNlbGVjdG9yIjp7fSwicGx1Z2lucyI6W10sInBvZEFubm90YXRpb25zIjp7fSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9hcGkvaGVhbHRoIiwicG9ydCI6MzAwMH19LCJyZXBsaWNhcyI6MSwicmVzb3VyY2VzIjp7fSwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInBvcnQiOjgwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImNyZWF0ZSI6dHJ1ZSwibmFtZSI6IiJ9LCJzaWRlY2FyIjp7ImRhc2hib2FyZHMiOnsiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlcnJvcl90aHJvdHRsZV9zbGVlcCI6MCwiZm9sZGVyIjoiL3RtcC9kYXNoYm9hcmRzIiwibGFiZWwiOiJncmFmYW5hX2Rhc2hib2FyZCIsImxhYmVsVmFsdWUiOiIxIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ2hjci5pby9raXdpZ3JpZC9rOHMtc2lkZWNhciIsInRhZyI6IjEuMjguMSJ9LCJyZXNvdXJjZXMiOnt9fSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sImxvZ0xldmVsIjoiaW5mbyIsIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAifSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn0sImdyYWZhbmFVUkwiOiJodHRwczovL2dyYWZhbmEubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0In0sIm5ldHdvcmtDb3N0cyI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiYWRkaXRpb25hbFNlY3VyaXR5Q29udGV4dCI6e30sImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJjb25maWciOnsiZGVzdGluYXRpb25zIjp7ImNyb3NzLXJlZ2lvbiI6W10sImRpcmVjdC1jbGFzc2lmaWNhdGlvbiI6W10sImluLXJlZ2lvbiI6W10sImluLXpvbmUiOlsiMTI3LjAuMC4wLzgiLCIxNjkuMjU0LjAuMC8xNiIsIjEwLjAuMC4wLzgiLCIxNzIuMTYuMC4wLzEyIiwiMTkyLjE2OC4wLjAvMTYiXSwiaW50ZXJuZXQiOltdfSwic2VydmljZXMiOnsiYW1hem9uLXdlYi1zZXJ2aWNlcyI6dHJ1ZSwiYXp1cmUtY2xvdWQtc2VydmljZXMiOnRydWUsImdvb2dsZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZX19LCJlbmFibGVkIjp0cnVlLCJleHRyYUFyZ3MiOltdLCJoZWFsdGhDaGVja1Byb2JlcyI6e30sImltYWdlIjp7InJlcG9zaXRvcnkiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW5ldHdvcmstY29zdHMiLCJ0YWciOiJ2MC4xNy42In0sImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxvZ0xldmVsIjoiaW5mbyIsIm5vZGVTZWxlY3RvciI6e30sInBvcnQiOjMwMDEsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicHJvbWV0aGV1c1NjcmFwZSI6ZmFsc2UsInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiNTAwbSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiI1MG0iLCJtZW1vcnkiOiIyME1pIn19LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fX0sInRvbGVyYXRpb25zIjpbXSwidHJhZmZpY0xvZ2dpbmciOnRydWUsInVwZGF0ZVN0cmF0ZWd5Ijp7InR5cGUiOiJSb2xsaW5nVXBkYXRlIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJTaXplIjoiNUdpIiwiZW5hYmxlZCI6dHJ1ZSwibGFiZWxzIjp7fSwic2l6ZSI6IjVHaSJ9LCJwcm9tZXRoZXVzIjp7ImFsZXJ0bWFuYWdlckZpbGVzIjp7ImFsZXJ0bWFuYWdlci55bWwiOnsiZ2xvYmFsIjp7fSwicmVjZWl2ZXJzIjpbeyJuYW1lIjoiZGVmYXVsdC1yZWNlaXZlciJ9XSwicm91dGUiOnsiZ3JvdXBfaW50ZXJ2YWwiOiI1bSIsImdyb3VwX3dhaXQiOiIxMHMiLCJyZWNlaXZlciI6ImRlZmF1bHQtcmVjZWl2ZXIiLCJyZXBlYXRfaW50ZXJ2YWwiOiIzaCJ9fX0sImNvbmZpZ21hcFJlbG9hZCI6e30sImV4dHJhU2NyYXBlQ29uZmlncyI6Ii0gam9iX25hbWU6IGt1YmVjb3N0XG4gIGhvbm9yX2xhYmVsczogdHJ1ZVxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImNvc3QtYW5hbHl6ZXIuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAgcG9ydDogOTAwM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtbmV0d29ya2luZ1xuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBwb2RcbiAgcmVsYWJlbF9jb25maWdzOlxuICAjIFNjcmFwZSBvbmx5IHRoZSB0aGUgdGFyZ2V0cyBtYXRjaGluZyB0aGUgZm9sbG93aW5nIG1ldGFkYXRhXG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2luc3RhbmNlXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIGt1YmVjb3N0XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAgbmV0d29yay1jb3N0c1xuLSBqb2JfbmFtZToga3ViZWNvc3QtYWdncmVnYXRvclxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImFnZ3JlZ2F0b3Iuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAge3stIGlmIG9yIC5WYWx1ZXMuc2FtbC5lbmFibGVkIC5WYWx1ZXMub2lkYy5lbmFibGVkIH19XG4gICAgcG9ydDogOTAwOFxuICAgIHt7LSBlbHNlIH19XG4gICAgcG9ydDogOTAwNFxuICAgIHt7LSBlbmQgfX1cbiMjIEVuYWJsZXMgc2NyYXBpbmcgb2YgTlZJRElBIEdQVSBtZXRyaWNzIHZpYSBkY2dtLWV4cG9ydGVyLiBTY3JhcGVzIGFsbFxuIyMgZW5kcG9pbnRzIHdoaWNoIGNvbnRhaW4gXCJkY2dtLWV4cG9ydGVyXCIgaW4gbGFiZWxzIFwiYXBwXCIsXG4jIyBcImFwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudFwiLCBvciBcImFwcC5rdWJlcm5ldGVzLmlvL25hbWVcIiB3aXRoIGEgY2FzZVxuIyMgaW5zZW5zaXRpdmUgbWF0Y2guIFRoZSBsYWJlbCBtdXN0IGJlIHByZXNlbnQgb24gdGhlIEs4cyBzZXJ2aWNlIGVuZHBvaW50cyBhbmQgbm90IGp1c3QgcG9kcy5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImFubm90YXRpb25zIjp7fSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicHJvbWV0aGV1c1J1bGUiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWV9LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzZXJ2aWNlTW9uaXRvciI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJ2YWwiOiIxbSIsIm1ldHJpY1JlbGFiZWxpbmdzIjpbXSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwicmVsYWJlbGluZ3MiOltdLCJzY3JhcGVUaW1lb3V0IjoiMTBzIn0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -190,9 +173,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -240,9 +223,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -294,9 +277,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-17 19:43:02.119453792 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -5,11 +5,10 @@
metadata:
name: network-costs-config
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2024-12-17 19:42:35.801220571 +0000
@@ -7,9 +7,9 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
clusterIP: None
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -7,23 +7,25 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
+ annotations:
spec:
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: release-name-network-costs
template:
metadata:
+ annotations:
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
hostNetwork: true
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2024-12-17 19:43:02.119453792 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-17 19:42:35.801220571 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -4,11 +4,11 @@
kind: ConfigMap
metadata:
name: app-configs
namespace: default
- labels:
+ labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-17 19:42:35.801220571 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2024-12-17 19:43:02.119453792 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
@@ -24,8 +23,7 @@
matchNames:
- default
selector:
matchLabels:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-17 19:43:02.116453767 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-17 19:42:35.799220553 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-17 19:43:02.119453792 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-17 19:43:02.118453783 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2024-12-17 19:43:02.119453792 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-network-costs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-17 19:43:02.119453792 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-17 19:42:35.802220580 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi |
Changes Default Valuesdiff -U 4 -r out-default-values/target/kubecost_cost-analyzer_default-values.out out-default-values/pr/kubecost_cost-analyzer_default-values.out
--- out-default-values/target/kubecost_cost-analyzer_default-values.out 2024-12-31 06:35:45.623602882 +0000
+++ out-default-values/pr/kubecost_cost-analyzer_default-values.out 2024-12-31 06:35:17.398119873 +0000
@@ -2,11 +2,12 @@
# zone: cluster.local (use only if your DNS server doesn't live in the same zone as kubecost)
prometheus:
enabled: true # Kubecost depends on Prometheus data, it is not optional. When enabled: false, Prometheus will not be installed and you must configure your own Prometheus to scrape kubecost as well as provide the fqdn below. -- Warning: Before changing this setting, please read to understand the risks https://docs.kubecost.com/install-and-configure/install/custom-prom
fqdn: http://cost-analyzer-prometheus-server.default.svc # example address of a prometheus to connect to. Include protocol (http:// or https://) Ignored if enabled: true
- # insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
+ insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
# queryServiceBasicAuthSecretName: dbsecret # kubectl create secret generic dbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD
# queryServiceBearerTokenSecretName: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN
+ kubeRBACProxy: false # If true, kubecost will use kube-rbac-proxy to authenticate with in cluster Prometheus for openshift
grafana:
enabled: true # If false, Grafana will not be installed
domainName: cost-analyzer-grafana.default.svc # example grafana domain Ignored if enabled: true
@@ -53,8 +54,10 @@
# or `global.prometheus.fqdn=http://{{ template "cost-analyzer.fullname" . }}-mimir-proxy.{{ .Release.Namespace }}.svc:8085/prometheus'
# Learn more at https://grafana.com/docs/mimir/latest/operators-guide/secure/authentication-and-authorization/#without-an-authenticating-reverse-proxy
mimirProxy:
enabled: false
+ ## Annotations to be added to the Mimir Proxy deployment template
+ annotations: {}
name: mimir-proxy
image: nginxinc/nginx-unprivileged
port: 8085
mimirEndpoint: $mimir_endpoint # Your Mimir query endpoint. If your Mimir query endpoint is http://example.com/prometheus, replace $mimir_endpoint with http://example.com/
@@ -62,11 +65,10 @@
# basicAuth:
# username: user
# password: pwd
- # Azure Monitor Managed Service for Prometheus
- # See https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/azure-monitor/essentials/prometheus-metrics-overview.md for information
- # and https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines for more information on setting this up
+ ## Azure Monitor Managed Service for Prometheus
+ ## Ref: https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines
ammsp:
enabled: false
prometheusServerEndpoint: http://localhost:8081/
remoteWriteService: $<AMMSP_METRICS_INGESTION_ENDPOINT>
@@ -83,76 +85,68 @@
identityType: userAssigned
aadClientId: $<AZURE_MANAGED_IDENTITY_CLIENT_ID>
aadTenantId: $<AZURE_MANAGED_IDENTITY_TENANT_ID>
+ ## Kubecost Alerting
+ ## Ref: http://docs.kubecost.com/alerts
notifications:
- # Kubecost alerting configuration
- # Ref: http://docs.kubecost.com/alerts
# alertConfigs:
- # frontendUrl: http://localhost:9090 # optional, used for linkbacks
- # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts
- # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Microsoft Teams alerts
- # globalAlertEmails:
- # - [email protected]
- # - [email protected]
- # globalEmailSubject: Custom Subject
- # Alerts generated by kubecost, about cluster data
- # alerts:
- # Daily namespace budget alert on namespace `kubecost`
- # - type: budget # supported: budget, recurringUpdate
- # threshold: 50 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: namespace
- # filter: kubecost
- # ownerContact: # optional, overrides globalAlertEmails default
- # - [email protected]
- # - [email protected]
- # # optional, used for alert-specific Slack and Microsoft Teams alerts
- # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
- # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX
-
- # Daily cluster budget alert on cluster `cluster-one`
- # - type: budget
- # threshold: 200.8 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: cluster
- # filter: cluster-one # does not accept csv
-
- # Recurring weekly update (weeklyUpdate alert)
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: '*'
-
- # Recurring weekly namespace update on kubecost namespace
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: kubecost
-
- # Spend Change Alert
- # - type: spendChange # change relative to moving avg
- # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
- # window: 1d # accepts ‘d’, ‘h’
- # baselineWindow: 30d # previous window, offset by window
- # aggregation: namespace
- # filter: kubecost, default # accepts csv
-
- # Health Score Alert
- # - type: health # Alerts when health score changes by a threshold
- # window: 10m
- # threshold: 5 # Send Alert if health scores changes by 5 or more
-
- # Kubecost Health Diagnostic
- # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
- # window: 10m
+ # frontendUrl: http://localhost:9090 # Optional
+ # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalAlertEmails:
+ # - [email protected]
+ # - [email protected]
+ # globalEmailSubject: Custom Subject
+ # alerts:
+ # # Daily namespace budget alert on namespace `kubecost`
+ # - type: budget # supported: budget, recurringUpdate
+ # threshold: 50 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: namespace
+ # filter: kubecost
+ # ownerContact: # optional, overrides globalAlertEmails default
+ # - [email protected]
+ # - [email protected]
+ # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # # Daily cluster budget alert on cluster `cluster-one`
+ # - type: budget
+ # threshold: 200.8 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: cluster
+ # filter: cluster-one # does not accept csv
+ # # Recurring weekly update (weeklyUpdate alert)
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: '*'
+ # # Recurring weekly namespace update on kubecost namespace
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: kubecost
+ # # Spend Change Alert
+ # - type: spendChange # change relative to moving avg
+ # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
+ # window: 1d # accepts ‘d’, ‘h’
+ # baselineWindow: 30d # previous window, offset by window
+ # aggregation: namespace
+ # filter: kubecost, default # accepts csv
+ # # Health Score Alert
+ # - type: health # Alerts when health score changes by a threshold
+ # window: 10m
+ # threshold: 5 # Send Alert if health scores changes by 5 or more
+ # # Kubecost Health Diagnostic
+ # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
+ # window: 10m
alertmanager: # Supply an alertmanager FQDN to receive notifications from the app.
enabled: false # If true, allow kubecost to write to your alertmanager
fqdn: http://cost-analyzer-prometheus-server.default.svc # example fqdn. Ignored if prometheus.enabled: true
- # Set saved Cost Allocation report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ ## Kubecost Saved Reports
+ ## Ref: http://docs.kubecost.com/saved-reports
savedReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Saved Report 0"
@@ -160,35 +154,32 @@
aggregateBy: "namespace"
chartDisplay: "category"
idle: "separate"
rate: "cumulative"
- accumulate: false # daily resolution
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ accumulate: false # daily resolution
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "cluster" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "dev"
- title: "Example Saved Report 1"
window: "month"
aggregateBy: "controllerKind"
chartDisplay: "category"
idle: "share"
rate: "monthly"
accumulate: false
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "namespace" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "kubecost"
- title: "Example Saved Report 2"
window: "2020-11-11T00:00:00Z,2020-12-09T23:59:59Z"
aggregateBy: "service"
chartDisplay: "category"
idle: "hide"
rate: "daily"
accumulate: true # entire window resolution
- filters: [] # if no filters, specify empty array
-
- # Set saved Asset report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ filters: [] # if no filters, specify empty array
assetReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Asset Report 0"
@@ -197,11 +188,8 @@
accumulate: false # daily resolution
filters:
- property: "cluster"
value: "cluster-one"
-
- # Set saved Cloud Cost report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
cloudCostReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Cloud Cost Report 0"
@@ -214,8 +202,12 @@
podAnnotations: {}
# iam.amazonaws.com/role: role-arn
+ # Annotations to be added for all controllers (StatefulSets, Deployments, DaemonSets)
+ annotations: {}
+ # iam.amazonaws.com/role: role-arn
+
# Applies these labels to all Deployments, StatefulSets, DaemonSets, and their pod templates.
additionalLabels: {}
securityContext:
@@ -233,8 +225,25 @@
capabilities:
drop:
- ALL
+ # Installs custom CA certificates onto Kubecost pods
+ updateCaTrust:
+ enabled: false # Set to true to enable the init container for updating CA trust
+ # Security context settings for the init container.
+ securityContext:
+ runAsUser: 0
+ runAsGroup: 0
+ runAsNonRoot: false
+ allowPrivilegeEscalation: false
+ readOnlyRootFilesystem: true
+ seccompProfile:
+ type: RuntimeDefault
+ caCertsSecret: ca-certs-secret # The name of the Secret containing custom CA certificates to mount to the cost-model container.
+ # caCertsConfig: ca-certs-config # The name of the ConfigMap containing the CA trust configuration.
+ resources: {} # Resource requests and limits for the init container.
+ caCertsMountPath: /etc/pki/ca-trust/source/anchors # The path where the custom CA certificates will be mounted in the init container
+
# Platforms is a higher-level abstraction for platform-specific values and settings.
platforms:
# Deploying to OpenShift (OCP) requires enabling this option.
openshift:
@@ -242,8 +251,15 @@
route:
enabled: false # Create an OpenShift Route.
annotations: {} # Add annotations to the Route.
# host: kubecost.apps.okd4.example.com # Add a custom host for your Route.
+
+ # OPTIONAL. The following configs only to be enabled when using a Prometheus instance already installed in the cluster.
+ createMonitoringClusterRoleBinding: false # Create a ClusterRoleBinding to grant the Kubecost serviceaccount access to query Prometheus.
+ createMonitoringResourceReaderRoleBinding: false # Create a Role and Role Binding to allow Prometheus to list and watch Kubecost resources.
+ monitoringServiceAccountName: prometheus-k8s # Name of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+ monitoringServiceAccountNamespace: openshift-monitoring # Namespace of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+
# Create Security Context Constraint resources for the DaemonSets requiring additional privileges.
scc:
nodeExporter: false # Creates an SCC for Prometheus Node Exporter. This requires Node Exporter be enabled.
networkCosts: false # Creates an SCC for Kubecost network-costs. This requires network-costs be enabled.
@@ -258,18 +274,24 @@
skipSanityChecks: false # If true, skip all sanity/existence checks for resources like Secrets.
## Kubecost Integrations
## Ref: https://docs.kubecost.com/integrations
- ##
integrations:
+ turbonomic:
+ enabled: false # Set to true to enable the Turbonomic integration
+ clientId: "" # Client ID generated from the OAuth Client created
+ clientSecret: "" # Client Secret generated from the OAuth Client created
+ role: "" # Role that the OAuth Client was created with (e.g. ADMINISTRATOR, SITE_ADMIN, etc.)
+ host: "" # URL to your turbonomic API. EG: https://turbonomic.example.com/
+ insecureClient: false # Do not verify certificate
postgres:
enabled: false
- runInterval: "12h" # How frequently to run the integration.
- databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
- databasePort: "" # REQUIRED. ex: 5432
- databaseName: "" # REQUIRED. ex: postgres
- databaseUser: "" # REQUIRED. ex: myusername
- databasePassword: "" # REQUIRED. ex: mypassword
+ runInterval: "12h" # How frequently to run the integration.
+ databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
+ databasePort: "" # REQUIRED. ex: 5432
+ databaseName: "" # REQUIRED. ex: postgres
+ databaseUser: "" # REQUIRED. ex: myusername
+ databasePassword: "" # REQUIRED. ex: mypassword
databaseSecretName: "" # OPTIONAL. Specify your own k8s secret containing the above credentials. Must have key "creds.json".
## Configure what Postgres table to write to, and what parameters to pass
## when querying Kubecost's APIs. Ensure all parameters are enclosed in
@@ -303,8 +325,12 @@
# nameOverride: ""
## Provide a full name override option for the chart.
# fullnameOverride: ""
+## Provide additional labels for the chart.
+# chartLabels:
+# app.kubernetes.io/name: kubecost-cost-analyzer
+
## This flag is only required for users upgrading to a new version of Kubecost.
## The flag is used to ensure users are aware of important
## (potentially breaking) changes included in the new version.
##
@@ -322,79 +348,77 @@
region: "us-east-1"
URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI
csvAccessCredentials: pricing-schema-access-secret
-# SAML integration for user management and RBAC, enterprise key required
-# Ref: https://github.com/kubecost/docs/blob/main/user-management.md
+## Kubecost SAML (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-saml
saml:
enabled: false
- # secretName: "kubecost-authzero"
- # metadataSecretName: "kubecost-authzero-metadata" # One of metadataSecretName or idpMetadataURL must be set. defaults to metadataURL if set
- # idpMetadataURL: "https://dev-elu2z98r.auth0.com/samlp/metadata/c6nY4M37rBP0qSO1IYIqBPPyIPxLS8v2"
- # appRootURL: "http://localhost:9090" # sample URL
- # authTimeout: 1440 # number of minutes the JWT will be valid
- # redirectURL: "https://dev-elu2z98r.auth0.com/v2/logout" # callback URL redirected to after logout
- # audienceURI: "http://localhost:9090" # by convention, the same as the appRootURL, but any string uniquely identifying kubecost to your samp IDP. Optional if you follow the convention
- # nameIDFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" If your SAML provider requires a specific nameid format
- # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
- # encryptionCertSecret: "kubecost-saml-cert" # k8s secret where the x509 certificate used to encrypt an Okta saml response is stored
- # decryptionKeySecret: "kubecost-sank-decryption-key" # k8s secret where the private key associated with the encryptionCertSecret is stored
- # authSecret: "random-string" # value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
- # authSecretName: "kubecost-saml-secret" # name of k8s secret where the authSecret will be stored, defaults to "kubecost-saml-secret" if not provided
+ # secretName: ""
+ # metadataSecretName: "" # One of metadataSecretName or idpMetadataURL must be set. Defaults to idpMetadataURL if set.
+ # idpMetadataURL: ""
+ # appRootURL: ""
+ # authTimeout: 1440 # Number of minutes the JWT will be valid
+ # redirectURL: "" # Callback URL redirected to after logout
+ # audienceURI: "" # Usually the same as the appRootURL. Optionally any string uniquely identifying kubecost to your SAML IDP.
+ # nameIDFormat: "" # If your SAML provider requires a specific nameid format
+ # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
+ # encryptionCertSecret: "" # K8s secret storing the x509 certificate used to encrypt an Okta SAML response
+ # decryptionKeySecret: "" # K8s secret storing the private key associated with the encryptionCertSecret
+ # authSecret: "" # Value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
+ # authSecretName: "" # Name of K8s secret where the authSecret will be stored. Defaults to "kubecost-saml-secret" if not provided.
rbac:
enabled: false
# groups:
# - name: admin
- # enabled: false # if admin is disabled, all SAML users will be able to make configuration changes to the kubecost frontend
- # assertionName: "http://schemas.auth0.com/userType" # a SAML Assertion, one of whose elements has a value that matches on of the values in assertionValues
+ # enabled: false # If admin is disabled, all SAML users will be able to make configuration changes to the Kubecost frontend
+ # assertionName: ""
# assertionValues:
# - "admin"
# - "superusers"
# - name: readonly
- # enabled: false # if readonly is disabled, all users authorized on SAML will default to readonly
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: false # If readonly is disabled, all users authorized on SAML will default to readonly
+ # assertionName: ""
# assertionValues:
# - "readonly"
# - name: editor
- # enabled: true # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: true # If editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # assertionName: ""
# assertionValues:
# - "editor"
+## Kubecost OIDC (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-oidc
oidc:
enabled: false
- clientID: "" # application/client client_id parameter obtained from provider, used to make requests to server
- clientSecret: "" # application/client client_secret parameter obtained from provider, used to make requests to server
- # secretName: "kubecost-oidc-secret" # k8s secret where clientsecret will be stored
- # For use to provide a custom OIDC Secret. Overrides the usage of oidc.clientSecret and oidc.secretName.
- # Should contain the field directly.
- # Can be created using raw k8s secrets, external secrets, sealed secrets, or any other method.
+ clientID: "" # Application client_id parameter obtained from provider. Used to make requests to server.
+ clientSecret: "" # Application/client client_secret parameter obtained from provider. Used to make requests to server.
+ secretName: "kubecost-oidc-secret" # K8s secret where clientsecret will be stored
existingCustomSecret:
enabled: false
- name: "" # name of the secret containing the client secret
-
- # authURL: "https://my.auth.server/authorize" # endpoint for login to auth server
- # loginRedirectURL: "http://my.kubecost.url/model/oidc/authorize" # Kubecost url configured in provider for redirect after authentication
- # discoveryURL: "https://my.auth.server/.well-known/openid-configuration" # url for OIDC endpoint discovery
- skipOnlineTokenValidation: false # if true, will skip accessing OIDC introspection endpoint for online token verification, and instead try to locally validate JWT claims
- useClientSecretPost: false # if true, client secret will specifically only use client_secret_post method, otherwise it will attempt to send the secret in both the header and the body.
- # hostedDomain: "example.com" # optional, blocks access to the auth domain specified in the hd claim of the provider ID token
+ name: "" # Name of an existing clientSecret. Overrides the usage of oidc.clientSecret and oidc.secretName.
+ authURL: "" # Authorization endpoint for your identity provider
+ loginRedirectURL: "" # Kubecost URL endpoint which handles auth flow
+ discoveryURL: "" # Your identity provider's endpoint sharing OIDC configuration
+ skipOnlineTokenValidation: false # If true, validate JWT claims locally
+ useClientSecretPost: false # If true, only use client_secret_post method. Otherwise attempt to send the secret in both the header and the body.
+ hostedDomain: "" # Optional, blocks access to the auth domain specified in the hd claim of the provider ID token
rbac:
enabled: false
# groups:
- # - name: admin
- # enabled: false # if admin is disabled, all authenticated users will be able to make configuration changes to the kubecost frontend
- # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
- # claimValues: # Kubecost matches these strings with the roles created in your identity provider
+ # - name: admin # Admins have permissions to edit Kubecost settings and save reports
+ # enabled: false
+ # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
+ # claimValues: # Kubecost matches these strings with the roles created in your identity provider
# - "admin"
# - "superusers"
- # - name: readonly
- # enabled: false # if readonly is disabled, all authenticated users will default to readonly
- # claimName: "roles"
+ # - name: readonly # Readonly users do not have permissions to edit Kubecost settings or save reports.
+ # enabled: false
+ # claimName: "roles"
# claimValues:
# - "readonly"
- # - name: editor
- # enabled: false # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # - name: editor # Editors have permissions to edit reports/alerts and act as readers otherwise
+ # enabled: false
# claimName: "roles"
# claimValues:
# - "editor"
@@ -435,25 +459,14 @@
resources:
requests:
cpu: "10m"
memory: "55Mi"
- # limits:
- # cpu: "100m"
- # memory: "256Mi"
deploymentStrategy: {}
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
-
- # Define a readiness probe for the Kubecost frontend container.
readinessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
failureThreshold: 6
-
- # Define a liveness probe for the Kubecost frontend container.
livenessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
@@ -495,49 +508,8 @@
# emitNamespaceAnnotations: false
# emitKsmV1Metrics: true # emit all KSM metrics in KSM v1.
# emitKsmV1MetricsOnly: false # emit only the KSM metrics missing from KSM v2. Advanced users only.
- # Optional
- # The metrics exporter is a separate deployment and service (for prometheus scrape auto-discovery)
- # which emits metrics cost-model relies on. Enabling this deployment also removes the KSM dependency
- # from the cost-model. If the deployment is not enabled, the metrics will continue to be emitted from
- # the cost-model.
- exporter:
- enabled: false
- port: 9005
- # Adds the default Prometheus scrape annotations to the metrics exporter service.
- # Set to false and use service.annotations (below) to set custom scrape annotations.
- prometheusScrape: true
- resources: {}
- # requests:
- # cpu: "200m"
- # memory: "55Mi"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- tolerations: []
-
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
- affinity: {}
-
- service:
- annotations: {}
-
- # Service Monitor for Kubecost Metrics
- serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors.
- enabled: false
- additionalLabels: {}
- metricRelabelings: []
- relabelings: []
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
- priorityClassName: ""
- additionalLabels: {}
- nodeSelector: {}
- extraArgs: []
-
sigV4Proxy:
image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest
imagePullPolicy: IfNotPresent
name: aps
@@ -549,9 +521,8 @@
# - name: AWS_ACCESS_KEY_ID
# value: <access_key>
# - name: AWS_SECRET_ACCESS_KEY
# value: <secret_key>
- # Optional resource requests and limits for the sigV4proxy container.
resources: {}
kubecostModel:
image: "gcr.io/kubecost1/cost-model"
@@ -559,17 +530,14 @@
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for cost-model.
# fullImageName:
+ # Log level for the cost model container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
+ logLevel: info
+
# securityContext:
# readOnlyRootFilesystem: true
- # Build local cost allocation cache
- warmCache: false
- # Run allocation ETL pipelines
- etl: true
- # Enable the ETL filestore backing storage
- etlFileStoreEnabled: true
# The total number of days the ETL pipelines will build
# Set to 0 to disable daily ETL (not recommended)
etlDailyStoreDurationDays: 91
# The total number of hours the ETL pipelines will build
@@ -695,16 +663,13 @@
# limits:
# cpu: "800m"
# memory: "256Mi"
- # Define a readiness probe for the Kubecost cost-model container.
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the Kubecost cost-model container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -712,43 +677,18 @@
extraArgs: []
# Optional. A list of extra environment variables to be added to the cost-model container.
# extraEnv:
- # - name: LOG_LEVEL
- # value: trace
# - name: LOG_FORMAT
# value: json
# # When false, Kubecost will not show Asset costs for local disks physically
# # attached to nodes (e.g. ephemeral storage). This needs to be applied to
# # each cluster monitored.
# - name: ASSET_INCLUDE_LOCAL_DISK_COST
# value: "true"
- # creates an ingress directly to the model container, for API access
- ingress:
- enabled: false
- # className: nginx
- labels:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- annotations:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- paths: ["/"]
- pathType: ImplementationSpecific
- hosts:
- - cost-analyzer-model.local
- tls: []
- # - secretName: cost-analyzer-model-tls
- # hosts:
- # - cost-analyzer-model.local
utcOffset: "+00:00"
- # Optional - add extra ports to the cost-model container. For kubecost development purposes only - not recommended for users.
extraPorts: []
- # - name: debug
- # port: 40000
- # targetPort: 40000
- # containerPort: 40000
## etlUtils is a utility typically used by Enterprise customers transitioning
## from v1 to v2 of Kubecost. It translates the data from the "/etl" dir of the
## bucket, to the "/federated" dir of the bucket.
@@ -760,8 +700,10 @@
resources: {}
env: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added to etlutils deployment
+ annotations: {}
affinity: {}
# Basic Kubecost ingress, more examples available at https://docs.kubecost.com/install-and-configure/install/ingress-examples
ingress:
@@ -782,77 +724,25 @@
# hosts:
# - cost-analyzer.local
nodeSelector: {}
-
tolerations: []
-# - key: "key"
-# operator: "Equal|Exists"
-# value: "value"
-# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
topologySpreadConstraints: []
-
-# If true, creates a PriorityClass to be used by the cost-analyzer pod
priority:
enabled: false
- name: "" # Provide name of existing priority class only. If left blank, upstream chart will create one from default template.
-
-# If true, enable creation of NetworkPolicy resources.
-networkPolicy:
- enabled: false
- denyEgress: true # create a network policy that denies egress from kubecost
- sameNamespace: true # Set to true if cost analyzer and prometheus are on the same namespace
-# namespace: kubecost # Namespace where prometheus is installed
-
- # Cost-analyzer specific vars using the new template
- costAnalyzer:
- enabled: false # If true, create a network policy for cost-analyzer
- annotations: {} # annotations to be added to the network policy
- additionalLabels: {} # additional labels to be added to the network policy
- # Examples rules:
- # ingressRules:
- # - selectors: # allow ingress from self on all ports
- # - podSelector:
- # matchLabels:
- # app.kubernetes.io/name: cost-analyzer
- # - selectors: # allow egress access to prometheus
- # - namespaceSelector:
- # matchLabels:
- # name: prometheus
- # podSelector:
- # matchLabels:
- # app: prometheus
- # ports:
- # - protocol: TCP
- # port: 9090
- # egressRules:
- # - selectors: # restrict egress to inside cluster
- # - namespaceSelector: {}
-
-## @param extraVolumes A list of volumes to be added to the pod
-##
+ name: ""
extraVolumes: []
-## @param extraVolumeMounts A list of volume mounts to be added to the pod
-##
extraVolumeMounts: []
# Define persistence volume for cost-analyzer, more information at https://docs.kubecost.com/install-and-configure/install/storage
persistentVolume:
size: 32Gi
- dbSize: 32.0Gi
enabled: true # Note that setting this to false means configurations will be wiped out on pod restart.
# storageClass: "-" #
# existingClaim: kubecost-cost-analyzer # a claim in the same namespace as kubecost
labels: {}
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- # Enables a separate PV specifically for ETL data. This should be avoided, but
- # is kept for legacy compatibility.
- dbPVEnabled: false
service:
type: ClusterIP
port: 9090
@@ -873,20 +763,15 @@
rbac:
create: true # Create the RBAC resources for Prometheus.
- ## Define serviceAccount names for components. Defaults to component's fully qualified name.
- ##
serviceAccounts:
alertmanager:
create: true
name:
nodeExporter:
create: true
name:
- pushgateway:
- create: true
- name:
server:
create: true
name:
## Prometheus server ServiceAccount annotations.
@@ -897,9 +782,8 @@
##
# selfsignedCertConfigMapName: ""
imagePullSecrets:
- # - name: "image-pull-secret"
extraScrapeConfigs: |
- job_name: kubecost
honor_labels: true
@@ -939,9 +823,9 @@
{{- end }}
## Enables scraping of NVIDIA GPU metrics via dcgm-exporter. Scrapes all
## endpoints which contain "dcgm-exporter" in labels "app",
## "app.kubernetes.io/component", or "app.kubernetes.io/name" with a case
- ## insensitive match.
+ ## insensitive match. The label must be present on the K8s service endpoints and not just pods.
## Refs:
## https://github.com/NVIDIA/gpu-operator/blob/d4316a415bbd684ce8416a88042305fc1a093aa4/assets/state-dcgm-exporter/0600_service.yaml#L7
## https://github.com/NVIDIA/dcgm-exporter/blob/54fd1ca137c66511a87a720390613680b9bdabdd/deployment/templates/service.yaml#L23
- job_name: kubecost-dcgm-exporter
@@ -961,381 +845,122 @@
## Provide a full name override for the Prometheus server.
# fullnameOverride: ""
- ## Prometheus server container name
- ##
enabled: true
name: server
sidecarContainers:
strategy:
type: Recreate
rollingUpdate: null
-
- ## Prometheus server container image
- ##
image:
repository: quay.io/prometheus/prometheus
tag: v2.55.1
pullPolicy: IfNotPresent
-
- ## prometheus server priorityClassName
- ##
priorityClassName: ""
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
- ## Maybe same with Ingress host name
baseURL: ""
-
- ## Additional server container environment variables
- ##
- ## You specify this manually like you would a raw deployment manifest.
- ## This means you can bind in environment variables from secrets.
- ##
- ## e.g. static environment variable:
- ## - name: DEMO_GREETING
- ## value: "Hello from the environment"
- ##
- ## e.g. secret environment variable:
- ## - name: USERNAME
- ## valueFrom:
- ## secretKeyRef:
- ## name: mysecret
- ## key: username
env: []
-
extraFlags:
- web.enable-lifecycle
- ## web.enable-admin-api flag controls access to the administrative HTTP API which includes functionality such as
- ## deleting time series. This is disabled by default.
- # - web.enable-admin-api
- ##
- ## storage.tsdb.no-lockfile flag controls BD locking
- # - storage.tsdb.no-lockfile
- ##
- ## storage.tsdb.wal-compression flag enables compression of the write-ahead log (WAL)
- # - storage.tsdb.wal-compression
-
- ## Path to a configuration file on prometheus server container FS
configPath: /etc/config/prometheus.yml
-
global:
- ## How frequently to scrape targets by default
- ##
scrape_interval: 1m
- ## How long until a scrape request times out
- ##
scrape_timeout: 60s
- ## How frequently to evaluate rules
- ##
evaluation_interval: 1m
external_labels:
cluster_id: cluster-one # Each cluster should have a unique ID
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
- ##
remoteWrite: {}
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
- ##
remoteRead: {}
-
- ## Additional Prometheus server container arguments
- ##
extraArgs:
query.max-concurrency: 1
query.max-samples: 100000000
-
- ## Additional InitContainers to initialize the pod
- ##
extraInitContainers: []
-
- ## Additional Prometheus server Volume mounts
- ##
extraVolumeMounts: []
-
- ## Additional Prometheus server Volumes
- ##
extraVolumes: []
-
- ## Additional Prometheus server hostPath mounts
- ##
extraHostPathMounts: []
- # - name: certs-dir
- # mountPath: /etc/kubernetes/certs
- # subPath: ""
- # hostPath: /etc/kubernetes/certs
- # readOnly: true
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # subPath: ""
- # configMap: certs-configmap
- # readOnly: true
-
- ## Additional Prometheus server Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: prom-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.server.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/server-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
ingress:
- ## If true, Prometheus server Ingress will be created
- ##
enabled: false
# className: nginx
-
- ## Prometheus server Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## Prometheus server Ingress additional labels
- ##
extraLabels: {}
-
- ## Prometheus server Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - prometheus.domain.com
- # - domain.com/prometheus
-
- ## PathType determines the interpretation of the Path matching
pathType: "Prefix"
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## Prometheus server Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-server-tls
- # hosts:
- # - prometheus.domain.com
-
- ## Server Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for Prometheus server pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, Prometheus server will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## Prometheus server data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## Prometheus server data Persistent Volume annotations
- ##
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- ## Prometheus server data Persistent Volume existing claim name
- ## Requires server.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## Prometheus server data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## Prometheus server data Persistent Volume size
- ##
size: 32Gi
-
- ## Prometheus server data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## Prometheus server data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of Prometheus server data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
emptyDir:
sizeLimit: ""
-
- ## Annotations to be added to Prometheus server pods
- ##
podAnnotations: {}
- # iam.amazonaws.com/role: prometheus
-
- ## Annotations to be added to the Prometheus Server deployment
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to Prometheus server pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Prometheus AlertManager configuration
- ##
alertmanagers: []
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
annotations: {}
labels: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
servicePort: 80
-
- ## Prometheus server readiness and liveness probe initial delay and timeout
- ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
- ##
readinessProbeInitialDelay: 5
readinessProbeTimeout: 3
readinessProbeFailureThreshold: 3
readinessProbeSuccessThreshold: 1
livenessProbeInitialDelay: 5
livenessProbeTimeout: 3
livenessProbeFailureThreshold: 3
livenessProbeSuccessThreshold: 1
-
- ## Prometheus server resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 500m
- # memory: 512Mi
- # requests:
- # cpu: 500m
- # memory: 512Mi
-
- ## Vertical Pod Autoscaler config
- ## Ref: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
verticalAutoscaler:
- ## If true a VPA object will be created for the controller (either StatefulSet or Deployment, based on above configs)
enabled: false
## Optional. Defaults to "Auto" if not specified.
# updateMode: "Auto"
## Mandatory. Without, VPA will not be created.
# containerPolicies:
# - containerName: 'prometheus-server'
-
- ## Security context to be added to server pods
- ##
securityContext: {}
- # runAsUser: 1001
- # runAsNonRoot: true
- # runAsGroup: 1001
- # fsGroup: 1001
-
containerSecurityContext: {}
-
service:
annotations: {}
labels: {}
clusterIP: ""
- # nodePort: ""
-
- ## List of IP addresses at which the Prometheus server service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
sessionAffinity: None
type: ClusterIP
-
- ## Enable gRPC port on service to allow auto discovery with thanos-querier
gRPC:
enabled: false
servicePort: 10901
- # nodePort: 10901
-
- ## If using a statefulSet (statefulSet.enabled=true), configure the
- ## service to connect to a specific replica to have a consistent view
- ## of the data.
statefulsetReplica:
enabled: false
replica: 0
-
- ## Prometheus server pod termination grace period
- ##
terminationGracePeriodSeconds: 300
## Prometheus data retention period (default if not specified is 97 hours)
##
@@ -1366,292 +991,92 @@
# retentionSize: should be significantly greater than the storage used in the number of hours set in etlHourlyStoreDurationHours
# Install Prometheus Alert Manager
alertmanager:
- ## If false, alertmanager will not be installed
- ##
enabled: false
-
## Provide a full name override for Prometheus alertmanager.
# fullnameOverride: ""
-
strategy:
type: Recreate
rollingUpdate: null
-
- ## alertmanager container name
- ##
name: alertmanager
-
- ## alertmanager container image
- ##
image:
repository: quay.io/prometheus/alertmanager
tag: v0.27.0
pullPolicy: IfNotPresent
-
- ## alertmanager priorityClassName
- ##
priorityClassName: ""
-
- ## Additional alertmanager container arguments
- ##
extraArgs: {}
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
baseURL: "http://localhost:9093"
-
- ## Additional alertmanager container environment variable
- ## For instance to add a http_proxy
- ##
extraEnv: {}
-
- ## Additional alertmanager Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: alertmanager-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
- ## The name of a secret in the same kubernetes namespace which contains the Alertmanager config
- ## Defining configFromSecret will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configFromSecret: ""
-
- ## The configuration file name to be loaded to alertmanager
- ## Must match the key within configuration loaded from ConfigMap/Secret
- ##
configFileName: alertmanager.yml
-
ingress:
- ## If true, alertmanager Ingress will be created
- ##
enabled: false
-
- ## alertmanager Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## alertmanager Ingress additional labels
- ##
extraLabels: {}
-
- ## alertmanager Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - alertmanager.domain.com
- # - domain.com/alertmanager
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## alertmanager Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - alertmanager.domain.com
-
- ## Alertmanager Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for alertmanager scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for alertmanager pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, alertmanager will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## alertmanager data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## alertmanager data Persistent Volume Claim annotations
- ##
annotations: {}
-
- ## alertmanager data Persistent Volume existing claim name
- ## Requires alertmanager.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## alertmanager data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## alertmanager data Persistent Volume size
- ##
size: 2Gi
-
- ## alertmanager data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## alertmanager data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of alertmanager data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
- ## Annotations to be added to alertmanager pods
- ##
podAnnotations: {}
- ## Tell prometheus to use a specific set of alertmanager pods
- ## instead of all alertmanager pods found in the same namespace
- ## Useful if you deploy multiple releases within the same namespace
- ##
- ## prometheus.io/probe: alertmanager-teamA
-
- ## Labels to be added to Prometheus AlertManager pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
+ annotations: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
servicePort: 80
-
- ## alertmanager resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to alertmanager pods
- ##
securityContext:
runAsUser: 1001
runAsNonRoot: true
runAsGroup: 1001
fsGroup: 1001
-
service:
annotations: {}
labels: {}
clusterIP: ""
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
- ## List of IP addresses at which the alertmanager service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
# nodePort: 30000
sessionAffinity: None
type: ClusterIP
- # Define a custom scheduler for Alertmanager pods
- # schedulerName: default-scheduler
-
- ## alertmanager ConfigMap entries
- ##
alertmanagerFiles:
alertmanager.yml:
global: {}
- # slack_api_url: ''
-
receivers:
- name: default-receiver
- # slack_configs:
- # - channel: '@you'
- # send_resolved: true
-
route:
group_wait: 10s
group_interval: 5m
receiver: default-receiver
@@ -1659,87 +1084,32 @@
## Monitors ConfigMap changes and POSTs to a URL
configmapReload:
prometheus:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
-
- ## configmap-reload container securityContext
containerSecurityContext: {}
alertmanager:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # node-export must be disabled if there is an existing daemonset: https://guide.kubecost.com/hc/en-us/articles/4407601830679-Troubleshoot-Install#a-name-node-exporter-a-issue-failedscheduling-kubecost-prometheus-node-exporter
nodeExporter:
## If false, node-exporter will not be installed.
## This is disabled by default in Kubecost 2.0, though it can be enabled as needed.
##
@@ -1747,346 +1117,59 @@
## Provide a full name override for node exporter.
# fullnameOverride: ""
- ## If true, node-exporter pods share the host network namespace
- ##
hostNetwork: true
-
- ## If true, node-exporter pods share the host PID namespace
- ##
hostPID: true
-
- ## node-exporter dns policy
- ##
dnsPolicy: ClusterFirstWithHostNet
-
- ## node-exporter container name
- ##
name: node-exporter
-
- ## node-exporter container image
- ##
image:
repository: prom/node-exporter
tag: v1.8.2
pullPolicy: IfNotPresent
-
- ## node-exporter priorityClassName
- ##
priorityClassName: ""
-
- ## Custom Update Strategy
- ##
updateStrategy:
type: RollingUpdate
-
- ## Additional node-exporter container arguments
- ##
extraArgs: {}
-
- ## Additional node-exporter hostPath mounts
- ##
extraHostPathMounts: []
- # - name: textfile-dir
- # mountPath: /srv/txt_collector
- # hostPath: /var/lib/node-exporter
- # readOnly: true
- # mountPropagation: HostToContainer
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # configMap: certs-configmap
- # readOnly: true
-
- ## Set a custom affinity for node-exporter
- ##
# affinity:
-
- ## Node tolerations for node-exporter scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for node-exporter pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Annotations to be added to node-exporter pods
- ##
podAnnotations: {}
-
- ## Annotations to be added to the node-exporter DaemonSet
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to node-exporter pods
- ##
+ annotations: {}
pod:
labels: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## node-exporter resource limits & requests
- ## Ref: https://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 200m
- # memory: 50Mi
- # requests:
- # cpu: 100m
- # memory: 30Mi
-
- ## Security context to be added to node-exporter pods
- ##
securityContext: {}
- # runAsUser: 0
-
service:
annotations:
prometheus.io/scrape: "true"
labels: {}
-
- # Exposed as a headless service:
- # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
clusterIP: None
-
- ## List of IP addresses at which the node-exporter service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
hostPort: 9100
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 9100
type: ClusterIP
- # Install Prometheus Push Gateway.
- pushgateway:
- ## If false, pushgateway will not be installed
- ##
- enabled: false
-
- ## Provide a full name override for Prometheus push gateway.
- # fullnameOverride: ""
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
- # schedulerName:
-
- ## pushgateway container name
- ##
- name: pushgateway
-
- ## pushgateway container image
- ##
- image:
- repository: prom/pushgateway
- tag: v1.9.0
- pullPolicy: IfNotPresent
-
- ## pushgateway priorityClassName
- ##
- priorityClassName: ""
-
- ## Additional pushgateway container arguments
- ##
- ## for example: persistence.file: /data/pushgateway.data
- extraArgs: {}
-
- ingress:
- ## If true, pushgateway Ingress will be created
- ##
- enabled: false
-
- ## pushgateway Ingress annotations
- ##
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## pushgateway Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
- hosts: []
- # - pushgateway.domain.com
- # - domain.com/pushgateway
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
- extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## pushgateway Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
- tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - pushgateway.domain.com
-
- ## Node tolerations for pushgateway scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
- tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for pushgateway pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
- nodeSelector: {}
-
- ## Annotations to be added to pushgateway pods
- ##
- podAnnotations: {}
-
- replicaCount: 1
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
- podDisruptionBudget:
- enabled: false
- maxUnavailable: 1
-
- ## pushgateway resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
- resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to push-gateway pods
- ##
- securityContext:
- runAsUser: 1001
- runAsNonRoot: true
-
- service:
- annotations:
- prometheus.io/probe: pushgateway
- labels: {}
- clusterIP: ""
-
- ## List of IP addresses at which the pushgateway service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
- externalIPs: []
-
- loadBalancerIP: ""
- loadBalancerSourceRanges: []
- servicePort: 9091
- type: ClusterIP
-
- strategy:
- type: Recreate
- rollingUpdate: null
-
-
- persistentVolume:
- ## If true, pushgateway will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
- enabled: true
-
- ## pushgateway data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
- accessModes:
- - ReadWriteOnce
-
- ## pushgateway data Persistent Volume Claim annotations
- ##
- annotations: {}
-
- ## pushgateway data Persistent Volume existing claim name
- ## Requires pushgateway.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
- existingClaim: ""
-
- ## pushgateway data Persistent Volume mount root path
- ##
- mountPath: /data
-
- ## pushgateway data Persistent Volume size
- ##
- size: 2Gi
-
- ## pushgateway data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
- # storageClass: "-"
-
- ## pushgateway data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
- # volumeBindingMode: ""
-
- ## Subdirectory of pushgateway data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
- subPath: ""
-
serverFiles:
## Alerts configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
alerting_rules.yml: {}
- # groups:
- # - name: Instances
- # rules:
- # - alert: InstanceDown
- # expr: up == 0
- # for: 5m
- # labels:
- # severity: page
- # annotations:
- # description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.'
- # summary: 'Instance {{ $labels.instance }} down'
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use alerting_rules.yml
- alerts: {}
## Records configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/
recording_rules.yml: {}
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use recording_rules.yml
prometheus.yml:
rule_files:
- /etc/config/recording_rules.yml
- /etc/config/alerting_rules.yml
- ## Below two files are DEPRECATED will be removed from this default values file
- - /etc/config/rules
- - /etc/config/alerts
scrape_configs:
- job_name: prometheus
static_configs:
@@ -2098,9 +1181,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes-cadvisor'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2159,9 +1241,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2252,21 +1333,8 @@
metric_relabel_configs:
- source_labels: [__name__]
regex: (container_cpu_allocation|container_cpu_usage_seconds_total|container_fs_limit_bytes|container_fs_writes_bytes_total|container_gpu_allocation|container_memory_allocation_bytes|container_memory_usage_bytes|container_memory_working_set_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|DCGM_FI_DEV_GPU_UTIL|deployment_match_labels|kube_daemonset_status_desired_number_scheduled|kube_daemonset_status_number_ready|kube_deployment_spec_replicas|kube_deployment_status_replicas|kube_deployment_status_replicas_available|kube_job_status_failed|kube_namespace_annotations|kube_namespace_labels|kube_node_info|kube_node_labels|kube_node_status_allocatable|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_memory_bytes|kube_node_status_capacity|kube_node_status_capacity_cpu_cores|kube_node_status_capacity_memory_bytes|kube_node_status_condition|kube_persistentvolume_capacity_bytes|kube_persistentvolume_status_phase|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_pod_container_info|kube_pod_container_resource_limits|kube_pod_container_resource_limits_cpu_cores|kube_pod_container_resource_limits_memory_bytes|kube_pod_container_resource_requests|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests_memory_bytes|kube_pod_container_status_restarts_total|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_labels|kube_pod_owner|kube_pod_status_phase|kube_replicaset_owner|kube_statefulset_replicas|kube_statefulset_status_replicas|kubecost_cluster_info|kubecost_cluster_management_cost|kubecost_cluster_memory_working_set_bytes|kubecost_load_balancer_cost|kubecost_network_internet_egress_cost|kubecost_network_region_egress_cost|kubecost_network_zone_egress_cost|kubecost_node_is_spot|kubecost_pod_network_egress_bytes_total|node_cpu_hourly_cost|node_cpu_seconds_total|node_disk_reads_completed|node_disk_reads_completed_total|node_disk_writes_completed|node_disk_writes_completed_total|node_filesystem_device_error|node_gpu_count|node_gpu_hourly_cost|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_network_transmit_bytes_total|node_ram_hourly_cost|node_total_hourly_cost|pod_pvc_allocation|pv_hourly_cost|service_selector_labels|statefulSet_match_labels|kubecost_pv_info|up)
action: keep
-
-
- # prometheus.yml: # Sample block -- enable if using an in cluster durable store.
- # remote_write:
- # - url: "http://pgprometheus-adapter:9201/write"
- # write_relabel_configs:
- # - source_labels: [__name__]
- # regex: 'container_.*_allocation|container_.*_allocation_bytes|.*_hourly_cost|kube_pod_container_resource_requests{resource="memory", unit="byte"}|container_memory_working_set_bytes|kube_pod_container_resource_requests{resource="cpu", unit="core"}|kube_pod_container_resource_requests|pod_pvc_allocation|kube_namespace_labels|kube_pod_labels'
- # action: keep
- # queue_config:
- # max_samples_per_send: 1000
- # remote_read:
- # - url: "http://pgprometheus-adapter:9201/read"
rules:
groups:
- name: CPU
rules:
@@ -2307,13 +1375,10 @@
# regex: (.+)\d+
# target_label: dc
networkPolicy:
- ## Enable creation of NetworkPolicy resources.
- ##
enabled: false
-
## Optional daemonset to more accurately attribute network costs to the correct workload
## https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration
networkCosts:
enabled: false
@@ -2332,14 +1397,15 @@
# Traffic Logging will enable logging the top 5 destinations for each source
# every 30 minutes.
trafficLogging: true
+ # Log level for the network cost containers. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# Port will set both the containerPort and hostPort to this value.
# These must be identical due to network-costs being run on hostNetwork
port: 3001
- # this daemonset can use significant resources on large clusters: https://guide.kubecost.com/hc/en-us/articles/4407595973527-Network-Traffic-Cost-Allocation
+ # this daemonset can use significant resources on large clusters: https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/cost-allocation/network-allocation
resources:
limits: # remove the limits by setting cpu: null
cpu: 500m # can be less, will depend on cluster size
# memory: it is not recommended to set a memory limit
@@ -2410,75 +1476,41 @@
# ips:
# - "15.128.15.2"
# - "20.0.0.0/8"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
service:
annotations: {}
labels: {}
-
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- ## PodMonitor
- ## Allows scraping of network metrics from a dedicated prometheus operator setup
podMonitor:
enabled: false
additionalLabels: {}
- # match the default extraScrapeConfig
additionalLabels: {}
nodeSelector: {}
+ # Annotations to be added to network cost daemonset template and pod template annotations
annotations: {}
healthCheckProbes: {}
- # readinessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
- # livenessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
additionalSecurityContext: {}
- # readOnlyRootFilesystem: true
## Kubecost Deployment Configuration
## Used for HA mode in Business & Enterprise tier
##
kubecostDeployment:
replicas: 1
- # deploymentStrategy:
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
labels: {}
annotations: {}
-
## Kubecost Forecasting forecasts future cost patterns based on historical
## patterns observed by Kubecost.
forecasting:
enabled: true
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for the forecasting
# container.
- # Example: fullImageName: gcr.io/kubecost1/forecasting:v0.0.1
- fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.18
imagePullPolicy: IfNotPresent
# Resource specification block for the forecasting container.
resources:
@@ -2494,30 +1526,20 @@
# -t is the worker timeout which primarily affects model training time;
# if it is not high enough, training workers may die mid training
"GUNICORN_CMD_ARGS": "--log-level info -t 1200"
- # Define a priority class for the forecasting Deployment.
priority:
enabled: false
name: ""
-
- # Define a nodeSelector for the forecasting Deployment.
nodeSelector: {}
-
- # Define tolerations for the forecasting Deployment.
tolerations: []
-
- # Define Pod affinity for the forecasting Deployment.
+ annotations: {}
affinity: {}
-
- # Define a readiness probe for the forecasting container
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the forecasting container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -2545,8 +1567,9 @@
# Replicas sets the number of Aggregator replicas. It only has an effect if
# `deployMethod: "statefulset"`
replicas: 1
+ # Log level for the aggregator container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# stagingEmptyDirSizeLimit changes how large the "staging"
# /var/configs/waterfowl emptyDir is. It only takes effect in StatefulSet
@@ -2673,8 +1696,11 @@
## Define tolerations for the aggregator pod
# tolerations: []
+ ## Annotations to be added for aggregator deployment or statefulset
+ # annotations: {}
+
## Define Pod affinity for the aggregator pod
# affinity: {}
## Define extra volumes for the aggregator pod
@@ -2737,9 +1763,8 @@
jaeger:
enabled: false
image: jaegertracing/all-in-one
imageVersion: latest
- # containerSecurityContext:
service:
labels: {}
@@ -2785,8 +1810,10 @@
securityContext: {}
containerSecurityContext: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added for diagnostics Deployment.
+ annotations: {}
affinity: {}
## Provide a full name override for the diagnostics Deployment.
# diagnosticsFullnameOverride: ""
@@ -2797,14 +1824,16 @@
image:
repository: gcr.io/kubecost1/cluster-controller
tag: v0.16.9
imagePullPolicy: IfNotPresent
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Set custom tolerations for the cluster controller.
tolerations: []
+
+ ## Annotations to be added for cluster controller template
+ annotations: {}
resources: {}
+ affinity: {}
+ nodeSelector: {}
actionConfigs:
# this configures the Kubecost Cluster Turndown action
# for more details, see documentation at https://github.com/kubecost/cluster-turndown/tree/develop?tab=readme-ov-file#setting-a-turndown-schedule
clusterTurndown: []
@@ -2950,12 +1979,12 @@
# initChownDataImage ensures all Kubecost filepath permissions on PV or local storage are set up correctly.
initChownDataImage: "busybox" # Supports a fully qualified Docker image, e.g. registry.hub.docker.com/library/busybox:latest
initChownData:
resources: {}
- # requests:
- # cpu: "50m"
- # memory: "20Mi"
+## Kubecost's Bundled Grafana
+## You can access it by visiting http://kubecost.me.com/grafana/
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/custom-grafana
grafana:
# namespace_datasources: kubecost # override the default namespace here
# namespace_dashboards: kubecost # override the default namespace here
rbac:
@@ -2987,106 +2016,45 @@
# prometheusType: Prometheus
# prometheusVersion: 2.35.0
# timeInterval: 1m
- ## Number of replicas for the Grafana deployment
replicas: 1
-
- ## Deployment strategy for the Grafana deployment
deploymentStrategy: RollingUpdate
-
- ## Readiness probe for the Grafana deployment
readinessProbe:
httpGet:
path: /api/health
port: 3000
-
- ## Liveness probe for the Grafana deployment
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 60
timeoutSeconds: 30
failureThreshold: 10
-
- ## Container image settings for the Grafana deployment
image:
repository: grafana/grafana
tag: 11.3.1
pullPolicy: IfNotPresent
-
- ## Optionally specify an array of imagePullSecrets.
- ## Secrets must be manually created in the namespace.
# pullSecrets:
- # - myRegistrKeySecretName
-
- ## Pod-level security context for the Grafana deployment. Recommended let global defaults take effect.
securityContext: {}
- # runAsUser: 472
- # fsGroup: 472
-
- ## PriorityClassName for the Grafana deployment
priorityClassName: ""
## Container image settings for Grafana initContainer used to download dashboards. Will only be used when dashboards are present.
downloadDashboardsImage:
repository: curlimages/curl
tag: latest
pullPolicy: IfNotPresent
-
- ## Pod Annotations for the Grafana deployment
podAnnotations: {}
-
- ## Deployment annotations for the Grafana deployment
annotations: {}
-
- ## Expose the Grafana service to be accessed from outside the cluster (LoadBalancer service).
- ## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
service:
type: ClusterIP
port: 80
annotations: {}
labels: {}
-
- ## This template is not needed and is not supported.
- ## It is here for backwards compatibility.
- ## Kubecost exposes grafana by default with the
- ## top level ingress template under /grafana/
- ingress:
- enabled: false
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- labels: {}
- path: /
- pathType: Prefix
- hosts:
- - chart-example.local
- tls: []
- # - secretName: chart-example-tls
- # hosts:
- # - chart-example.local
-
- ## Resource requests and limits for the Grafana deployment
resources: {}
- # limits:
- # cpu: 100m
- # memory: 128Mi
- # requests:
- # cpu: 100m
- # memory: 128Mi
-
- ## Node labels for pod assignment of the Grafana deployment
nodeSelector: {}
-
- ## Tolerations for pod assignment of the Grafana deployment
tolerations: []
-
- ## Affinity for pod assignment of the Grafana deployment
affinity: {}
-
- ## Enable persistence using Persistent Volume Claims of the Grafana deployment
persistence:
enabled: false
# storageClassName: default
# accessModes:
@@ -3094,123 +2062,24 @@
# size: 10Gi
# annotations: {}
# subPath: ""
# existingClaim:
-
- ## Admin user for Grafana
adminUser: admin
-
- ## Admin password for Grafana
adminPassword: strongpassword
-
- ## Use an alternate scheduler for the Grafana deployment
# schedulerName:
-
- ## Extra environment variables that will be passed onto Grafana deployment pods
env: {}
-
- ## The name of a secret for Grafana in the same Kubernetes namespace which contain values to be added to the environment
- ## This can be useful for auth tokens, etc
envFromSecret: ""
-
- ## Additional Grafana server secret mounts
- ## Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # secretName: grafana-secret-files
- # readOnly: true
-
- ## List of Grafana plugins
plugins: []
- # - digrich-bubblechart-panel
- # - grafana-clock-panel
-
- ## Grafana dashboard providers
- ## ref: http://docs.grafana.org/administration/provisioning/#dashboards
- ##
- ## `path` must be /var/lib/grafana/dashboards/<provider_name>
- ##
dashboardProviders: {}
- # dashboardproviders.yaml:
- # apiVersion: 1
- # providers:
- # - name: 'default'
- # orgId: 1
- # folder: ''
- # type: file
- # disableDeletion: false
- # editable: true
- # options:
- # path: /var/lib/grafana/dashboards/default
-
- ## Configure Grafana dashboard to import
- ## NOTE: To use dashboards you must also enable/configure dashboardProviders
- ## ref: https://grafana.com/dashboards
- ##
- ## dashboards per provider, use provider name as key.
- ##
dashboards: {}
- # default:
- # prometheus-stats:
- # gnetId: 3662
- # revision: 2
- # datasource: Prometheus
-
- ## Reference to external Grafana ConfigMap per provider. Use provider name as key and ConfiMap name as value.
- ## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both.
- ## ConfigMap data example:
- ##
- ## data:
- ## example-dashboard.json: |
- ## RAW_JSON
- ##
dashboardsConfigMaps: {}
- # default: ""
-
- ## LDAP Authentication for Grafana can be enabled with the following values on grafana.ini
- ## NOTE: Grafana will fail to start if the value for ldap.toml is invalid
- # auth.ldap:
- # enabled: true
- # allow_sign_up: true
- # config_file: /etc/grafana/ldap.toml
-
- ## Grafana's LDAP configuration
- ## Templated by the template in _helpers.tpl
- ## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#auth-ldap
- ## ref: http://docs.grafana.org/installation/ldap/#configuration
- ldap:
- # `existingSecret` is a reference to an existing secret containing the ldap configuration
- # for Grafana in a key `ldap-toml`.
- existingSecret: ""
- # `config` is the content of `ldap.toml` that will be stored in the created secret
- config: ""
- # config: |-
- # verbose_logging = true
-
- # [[servers]]
- # host = "my-ldap-server"
- # port = 636
- # use_ssl = true
- # start_tls = false
- # ssl_skip_verify = false
- # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com"
-
- ## Grafana's SMTP configuration
- ## NOTE: To enable, grafana.ini must be configured with smtp.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#smtp
- smtp:
- # `existingSecret` is a reference to an existing secret containing the smtp configuration
- # for Grafana in keys `user` and `password`.
- existingSecret: ""
-
## Grafana sidecars that collect the configmaps with specified label and stores the included files them into the respective folders
## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards
sidecar:
image:
repository: ghcr.io/kiwigrid/k8s-sidecar
- tag: 1.28.0
+ tag: 1.28.1
pullPolicy: IfNotPresent
resources: {}
dashboards:
enabled: true
@@ -3226,9 +2095,8 @@
enabled: false
error_throttle_sleep: 0
# label that the configmaps with datasources are marked with
label: grafana_datasource
-
## Grafana's primary configuration
## NOTE: values in map will be converted to ini format
## ref: http://docs.grafana.org/installation/configuration/
##
@@ -3256,21 +2124,15 @@
serviceAccount:
create: true # Set this to false if you're bringing your own service account.
annotations: {}
- # name: kc-test
awsstore:
useAwsStore: false
- imageNameAndVersion: gcr.io/kubecost1/awsstore:latest # Name and version of the container image for AWSStore.
+ imageNameAndVersion: gcr.io/kubecost1/awsstore:latest
createServiceAccount: false
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Use a custom nodeSelector for AWSStore.
nodeSelector: {}
- # kubernetes.io/arch: amd64
- ## Annotations for the AWSStore ServiceAccount.
annotations: {}
## Federated ETL Architecture
## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl
@@ -3331,9 +2193,9 @@
# address: http://cluster-a.kubecost.com:9090
# # Optional authentication credentials - only basic auth is currently supported.
# auth:
# type: basic
-# # Secret name should be a secret formatted based on: https://github.com/kubecost/docs/blob/main/ingress-examples.md
+# # Secret name should be a secret formatted based on: https://github.com/kubecost/poc-common-configurations/tree/main/ingress-examples
# secretName: cluster-a-auth
# # Or pass auth directly as base64 encoded user:pass
# data: YWRtaW46YWRtaW4=
# # Or user and pass directly
@@ -3369,10 +2231,10 @@
# gpuLabel: gpu
# gpuLabelValue: true
# alibabaServiceKeyName: ""
# alibabaServiceKeyPassword: ""
-# awsServiceKeyName: ACCESSKEYID
-# awsServiceKeyPassword: fakepassword # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName
+# awsServiceKeyName: ""
+# awsServiceKeyPassword: ""
# awsSpotDataRegion: us-east-1
# awsSpotDataBucket: spot-data-feed-s3-bucket
# awsSpotDataPrefix: dev
# athenaProjectID: "530337586277" # The AWS AccountID where the Athena CUR is. Generally your masterpayer account
@@ -3551,4 +2413,8 @@
# host: kubecost.kubecost.svc.cluster.local
# port:
# number: 80
+# -- Optional override for the image used for the basic health test container
+# basicHealth:
+# fullImageName: alpine/k8s:1.26.9
+ |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-31 06:35:45.243596375 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-31 06:35:17.030113424 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-31 06:35:45.243596375 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-31 06:35:17.030113424 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-31 06:35:45.243596375 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-31 06:35:17.030113424 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-31 06:35:45.243596375 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-31 06:35:17.030113424 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-31 06:35:45.241596341 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-31 06:35:17.028113389 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-31 06:35:45.244596392 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-31 06:35:17.031113441 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 45f899ca0f060cb78b76717b768816a257756505a52b46a72a552cbed367f9ce
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJlbmFibGVkIjp0cnVlLCJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInBhdGhUeXBlIjoiSW1wbGVtZW50YXRpb25TcGVjaWZpYyIsInBhdGhzIjpbIi8iXSwidGxzIjpbeyJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjEifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsRGFpbHlTdG9yZUR1cmF0aW9uRGF5cyI6OTEsImV0bEhvdXJseVN0b3JlRHVyYXRpb25Ib3VycyI6NDksImV0bFJlYWRPbmx5TW9kZSI6ZmFsc2UsImV4dHJhQXJncyI6W10sImV4dHJhUG9ydHMiOltdLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvY29zdC1tb2RlbCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJsb2dMZXZlbCI6ImluZm8iLCJtYXhRdWVyeUNvbmN1cnJlbmN5Ijo1LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIyMDBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXRjT2Zmc2V0IjoiKzAwOjAwIn0sImt1YmVjb3N0UHJvZHVjdENvbmZpZ3MiOnsiY2x1c3Rlck5hbWUiOiJzeC1jbnAtb3NzIERlbW8iLCJjbHVzdGVyUHJvZmlsZSI6ImRldmVsb3BtZW50IiwiY3VycmVuY3lDb2RlIjoiRVVSIiwiY3VzdG9tUHJpY2VzRW5hYmxlZCI6dHJ1ZSwiZGVmYXVsdE1vZGVsUHJpY2luZyI6eyJDUFUiOiIyOC4wIiwiR1BVIjoiNjkzLjUwIiwiUkFNIjoiMy4wOSIsImVuYWJsZWQiOnRydWUsImludGVybmV0TmV0d29ya0VncmVzcyI6IjAuMTIiLCJyZWdpb25OZXR3b3JrRWdyZXNzIjoiMC4wMSIsInNwb3RDUFUiOiI0Ljg2Iiwic3BvdEdQVSI6IjIyNS4wIiwic3BvdFJBTSI6IjAuNjUiLCJzdG9yYWdlIjoiMC4wNCIsInpvbmVOZXR3b3JrRWdyZXNzIjoiMC4wMSJ9fSwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhbm5vdGF0aW9ucyI6e30sImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLiBUaGUgbGFiZWwgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBLOHMgc2VydmljZSBlbmRwb2ludHMgYW5kIG5vdCBqdXN0IHBvZHMuXG4jIyBSZWZzOlxuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9ncHUtb3BlcmF0b3IvYmxvYi9kNDMxNmE0MTViYmQ2ODRjZTg0MTZhODgwNDIzMDVmYzFhMDkzYWE0L2Fzc2V0cy9zdGF0ZS1kY2dtLWV4cG9ydGVyLzA2MDBfc2VydmljZS55YW1sI0w3XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2RjZ20tZXhwb3J0ZXIvYmxvYi81NGZkMWNhMTM3YzY2NTExYTg3YTcyMDM5MDYxMzY4MGI5YmRhYmRkL2RlcGxveW1lbnQvdGVtcGxhdGVzL3NlcnZpY2UueWFtbCNMMjNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWRjZ20tZXhwb3J0ZXJcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogZW5kcG9pbnRzXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwLCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fY29tcG9uZW50LCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICg/aSkoLipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLiopXG4iLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhZmZpbml0eSI6e30sImFsZXJ0bWFuYWdlcnMiOltdLCJhbm5vdGF0aW9ucyI6e30sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiXSwic2NyYXBlX2NvbmZpZ3MiOlt7ImpvYl9uYW1lIjoicHJvbWV0aGV1cyIsInN0YXRpY19jb25maWdzIjpbeyJ0YXJnZXRzIjpbImxvY2FsaG9zdDo5MDkwIl19XX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2Rlcy1jYWR2aXNvciIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfc3BlY19jcHVfc2hhcmVzfGNvbnRhaW5lcl9zcGVjX21lbW9yeV9saW1pdF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNhZHZpc29yX3ZlcnNpb25faW5mb3xrdWJlY29zdF9wdl9pbmZvKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJjb250YWluZXIiXSwidGFyZ2V0X2xhYmVsIjoiY29udGFpbmVyX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbInBvZCJdLCJ0YXJnZXRfbGFiZWwiOiJwb2RfbmFtZSJ9XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzL2NhZHZpc29yIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGt1YmVsZXRfdm9sdW1lX3N0YXRzX3VzZWRfYnl0ZXMpIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcyIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtc2VydmljZS1lbmRwb2ludHMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJlbmRwb2ludHMifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X2FsbG9jYXRpb258Y29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9ncHVfYWxsb2NhdGlvbnxjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXN8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8RENHTV9GSV9ERVZfR1BVX1VUSUx8ZGVwbG95bWVudF9tYXRjaF9sYWJlbHN8a3ViZV9kYWVtb25zZXRfc3RhdHVzX2Rlc2lyZWRfbnVtYmVyX3NjaGVkdWxlZHxrdWJlX2RhZW1vbnNldF9zdGF0dXNfbnVtYmVyX3JlYWR5fGt1YmVfZGVwbG95bWVudF9zcGVjX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc19hdmFpbGFibGV8a3ViZV9qb2Jfc3RhdHVzX2ZhaWxlZHxrdWJlX25hbWVzcGFjZV9hbm5vdGF0aW9uc3xrdWJlX25hbWVzcGFjZV9sYWJlbHN8a3ViZV9ub2RlX2luZm98a3ViZV9ub2RlX2xhYmVsc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHl8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jb25kaXRpb258a3ViZV9wZXJzaXN0ZW50dm9sdW1lX2NhcGFjaXR5X2J5dGVzfGt1YmVfcGVyc2lzdGVudHZvbHVtZV9zdGF0dXNfcGhhc2V8a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1faW5mb3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9yZXNvdXJjZV9yZXF1ZXN0c19zdG9yYWdlX2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9pbmZvfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Jlc3RhcnRzX3RvdGFsfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcnVubmluZ3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Rlcm1pbmF0ZWRfcmVhc29ufGt1YmVfcG9kX2xhYmVsc3xrdWJlX3BvZF9vd25lcnxrdWJlX3BvZF9zdGF0dXNfcGhhc2V8a3ViZV9yZXBsaWNhc2V0X293bmVyfGt1YmVfc3RhdGVmdWxzZXRfcmVwbGljYXN8a3ViZV9zdGF0ZWZ1bHNldF9zdGF0dXNfcmVwbGljYXN8a3ViZWNvc3RfY2x1c3Rlcl9pbmZvfGt1YmVjb3N0X2NsdXN0ZXJfbWFuYWdlbWVudF9jb3N0fGt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGt1YmVjb3N0X2xvYWRfYmFsYW5jZXJfY29zdHxrdWJlY29zdF9uZXR3b3JrX2ludGVybmV0X2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfcmVnaW9uX2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfem9uZV9lZ3Jlc3NfY29zdHxrdWJlY29zdF9ub2RlX2lzX3Nwb3R8a3ViZWNvc3RfcG9kX25ldHdvcmtfZWdyZXNzX2J5dGVzX3RvdGFsfG5vZGVfY3B1X2hvdXJseV9jb3N0fG5vZGVfY3B1X3NlY29uZHNfdG90YWx8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkX3RvdGFsfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkX3RvdGFsfG5vZGVfZmlsZXN5c3RlbV9kZXZpY2VfZXJyb3J8bm9kZV9ncHVfY291bnR8bm9kZV9ncHVfaG91cmx5X2Nvc3R8bm9kZV9tZW1vcnlfQnVmZmVyc19ieXRlc3xub2RlX21lbW9yeV9DYWNoZWRfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtQXZhaWxhYmxlX2J5dGVzfG5vZGVfbWVtb3J5X01lbUZyZWVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtVG90YWxfYnl0ZXN8bm9kZV9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfG5vZGVfcmFtX2hvdXJseV9jb3N0fG5vZGVfdG90YWxfaG91cmx5X2Nvc3R8cG9kX3B2Y19hbGxvY2F0aW9ufHB2X2hvdXJseV9jb3N0fHNlcnZpY2Vfc2VsZWN0b3JfbGFiZWxzfHN0YXRlZnVsU2V0X21hdGNoX2xhYmVsc3xrdWJlY29zdF9wdl9pbmZvfHVwKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6dHJ1ZSwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY3JhcGUiXX0seyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoLipub2RlLWV4cG9ydGVyfGt1YmVjb3N0LW5ldHdvcmstY29zdHMpIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19lbmRwb2ludHNfbmFtZSJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihodHRwcz8pIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY2hlbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19zY2hlbWVfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcGF0aCJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoW146XSspKD86OlxcZCspPzsoXFxkKykiLCJyZXBsYWNlbWVudCI6IiQxOiQyIiwic291cmNlX2xhYmVscyI6WyJfX2FkZHJlc3NfXyIsIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BvcnQiXSwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2xhYmVsXyguKykifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25hbWVzcGFjZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWVzcGFjZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfcG9kX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25vZGUifV19XX0sInJlY29yZGluZ19ydWxlcy55bWwiOnt9LCJydWxlcyI6eyJncm91cHMiOlt7Im5hbWUiOiJDUFUiLCJydWxlcyI6W3siZXhwciI6InN1bShyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkpIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2U6cmF0ZTVtIn0seyJleHByIjoicmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2Vfbm9zdW06cmF0ZTVtIn0seyJleHByIjoiYXZnKGlyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiUE9EXCIsIGNvbnRhaW5lciE9XCJcIn1bNW1dKSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9jcHVfdXNhZ2VfaXJhdGUifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9XX0seyJuYW1lIjoiU2F2aW5ncyIsInJ1bGVzIjpbeyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifV19XX19LCJzZXJ2aWNlQWNjb3VudHMiOnsiYWxlcnRtYW5hZ2VyIjp7ImNyZWF0ZSI6dHJ1ZX0sIm5vZGVFeHBvcnRlciI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9fX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-31 06:35:45.241596341 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-31 06:35:17.028113389 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-31 06:35:45.244596392 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-31 06:35:17.031113441 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-31 06:35:45.241596341 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-31 06:35:17.028113389 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-31 06:35:45.243596375 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-31 06:35:17.030113424 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-31 06:35:45.241596341 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-31 06:35:17.028113389 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-31 06:35:45.243596375 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-31 06:35:17.030113424 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-31 06:35:45.241596341 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-31 06:35:17.028113389 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-31 06:35:45.241596341 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-31 06:35:17.028113389 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-31 06:35:45.244596392 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-31 06:35:17.031113441 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-31 06:35:45.244596392 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-31 06:35:17.030113424 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-31 06:35:45.244596392 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-31 06:35:17.031113441 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-31 06:35:17.298118121 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-31 06:35:45.518601084 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-31 06:35:17.296118086 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 45f899ca0f060cb78b76717b768816a257756505a52b46a72a552cbed367f9ce
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LW1hbmFnZXIuaW8vY2x1c3Rlci1pc3N1ZXIiOiJsZXRzZW5jcnlwdC1zdGFnaW5nIn0sImNsYXNzTmFtZSI6Im5naW54IiwiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1ldHJpY3MiOnt9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsRmlsZVN0b3JlRW5hYmxlZCI6dHJ1ZSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAiLCJ3YXJtQ2FjaGUiOmZhbHNlfSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJQVkVuYWJsZWQiOmZhbHNlLCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJkZXBsb3ltZW50QW5ub3RhdGlvbnMiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJhbGVydHMiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9ydWxlcyIsIi9ldGMvY29uZmlnL2FsZXJ0cyJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInB1c2hnYXRld2F5Ijp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicmVwb3J0aW5nIjp7ImVycm9yUmVwb3J0aW5nIjp0cnVlLCJsb2dDb2xsZWN0aW9uIjp0cnVlLCJwcm9kdWN0QW5hbHl0aWNzIjp0cnVlLCJ2YWx1ZXNSZXBvcnRpbmciOnRydWV9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwibm9kZVBvcnQiOnt9LCJwb3J0Ijo5MDkwLCJ0YXJnZXRQb3J0Ijo5MDkwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjEifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiYW5ub3RhdGlvbnMiOnsiY2VydC1tYW5hZ2VyLmlvL2NsdXN0ZXItaXNzdWVyIjoibGV0c2VuY3J5cHQtc3RhZ2luZyJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwicGF0aFR5cGUiOiJJbXBsZW1lbnRhdGlvblNwZWNpZmljIiwicGF0aHMiOlsiLyJdLCJ0bHMiOlt7Imhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwic2VjcmV0TmFtZSI6Imt1YmVjb3N0LXNlcnZlci10bHMifV19LCJpbml0Q2hvd25EYXRhIjp7InJlc291cmNlcyI6e319LCJpbml0Q2hvd25EYXRhSW1hZ2UiOiJidXN5Ym94Iiwia3ViZWNvc3REZXBsb3ltZW50Ijp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwicmVwbGljYXMiOjF9LCJrdWJlY29zdEZyb250ZW5kIjp7ImRlcGxveU1ldGhvZCI6InNpbmdsZXBvZCIsImRlcGxveW1lbnRTdHJhdGVneSI6e30sImVuYWJsZWQiOnRydWUsImhhUmVwbGljYXMiOjIsImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9mcm9udGVuZCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImlwdjYiOnsiZW5hYmxlZCI6dHJ1ZX0sImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMTBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXNlRGVmYXVsdEZxZG4iOmZhbHNlfSwia3ViZWNvc3RNb2RlbCI6eyJjb250YWluZXJTdGF0c0VuYWJsZWQiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibG9nTGV2ZWwiOiJpbmZvIiwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCJ9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC4gVGhlIGxhYmVsIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgSzhzIHNlcnZpY2UgZW5kcG9pbnRzIGFuZCBub3QganVzdCBwb2RzLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYW5ub3RhdGlvbnMiOnt9LCJiYXNlVVJMIjoiIiwiY29uZmlnTWFwT3ZlcnJpZGVOYW1lIjoiIiwiY29uZmlnUGF0aCI6Ii9ldGMvY29uZmlnL3Byb21ldGhldXMueW1sIiwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7fSwiZW1wdHlEaXIiOnsic2l6ZUxpbWl0IjoiIn0sImVuYWJsZWQiOnRydWUsImVudiI6W10sImV4dHJhQXJncyI6eyJxdWVyeS5tYXgtY29uY3VycmVuY3kiOjEsInF1ZXJ5Lm1heC1zYW1wbGVzIjoxMDAwMDAwMDB9LCJleHRyYUNvbmZpZ21hcE1vdW50cyI6W10sImV4dHJhRmxhZ3MiOlsid2ViLmVuYWJsZS1saWZlY3ljbGUiXSwiZXh0cmFIb3N0UGF0aE1vdW50cyI6W10sImV4dHJhSW5pdENvbnRhaW5lcnMiOltdLCJleHRyYVNlY3JldE1vdW50cyI6W10sImV4dHJhVm9sdW1lTW91bnRzIjpbXSwiZXh0cmFWb2x1bWVzIjpbXSwiZ2xvYmFsIjp7ImV2YWx1YXRpb25faW50ZXJ2YWwiOiIxbSIsImV4dGVybmFsX2xhYmVscyI6eyJjbHVzdGVyX2lkIjoic3gtY25wLW9zcyJ9LCJzY3JhcGVfaW50ZXJ2YWwiOiIxbSIsInNjcmFwZV90aW1lb3V0IjoiNjBzIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoicXVheS5pby9wcm9tZXRoZXVzL3Byb21ldGhldXMiLCJ0YWciOiJ2Mi41NS4xIn0sImxpdmVuZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJsaXZlbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJsaXZlbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwibGl2ZW5lc3NQcm9iZVRpbWVvdXQiOjMsIm5hbWUiOiJzZXJ2ZXIiLCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFjY2Vzc01vZGVzIjpbIlJlYWRXcml0ZU9uY2UiXSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJleGlzdGluZ0NsYWltIjoiIiwibW91bnRQYXRoIjoiL2RhdGEiLCJzaXplIjoiMzJHaSIsInN1YlBhdGgiOiIifSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwb2RMYWJlbHMiOnt9LCJwcmVmaXhVUkwiOiIiLCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInJlYWRpbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywicmVhZGluZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsInJlYWRpbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwicmVhZGluZXNzUHJvYmVUaW1lb3V0IjozLCJyZW1vdGVSZWFkIjp7fSwicmVtb3RlV3JpdGUiOnt9LCJyZXBsaWNhQ291bnQiOjEsInJlc291cmNlcyI6e30sInJldGVudGlvbiI6Ijk3aCIsInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJjbHVzdGVySVAiOiIiLCJleHRlcm5hbElQcyI6W10sImxhYmVscyI6e30sImxvYWRCYWxhbmNlcklQIjoiIiwibG9hZEJhbGFuY2VyU291cmNlUmFuZ2VzIjpbXSwic2VydmljZVBvcnQiOjgwLCJzZXNzaW9uQWZmaW5pdHkiOiJOb25lIiwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzdHJhdGVneSI6eyJ0eXBlIjoiUmVjcmVhdGUifSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjMwMCwidG9sZXJhdGlvbnMiOltdfSwic2VydmVyRmlsZXMiOnsiYWxlcnRpbmdfcnVsZXMueW1sIjp7fSwicHJvbWV0aGV1cy55bWwiOnsicnVsZV9maWxlcyI6WyIvZXRjL2NvbmZpZy9yZWNvcmRpbmdfcnVsZXMueW1sIiwiL2V0Yy9jb25maWcvYWxlcnRpbmdfcnVsZXMueW1sIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-31 06:35:45.518601084 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-31 06:35:17.296118086 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-31 06:35:45.521601136 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-31 06:35:45.518601084 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-31 06:35:17.297118103 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-31 06:35:17.298118121 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-31 06:35:45.518601084 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-31 06:35:17.296118086 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-31 06:35:45.518601084 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-31 06:35:17.297118103 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-31 06:35:45.518601084 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-31 06:35:17.297118103 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-31 06:35:45.521601136 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-31 06:35:45.520601119 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-31 06:35:45.521601136 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-31 06:35:17.299118138 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2024-12-31 06:35:17.160115702 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 3200005267ed0d35ec8656b0c4da50d94bf7156275304458eccd802ce21d54ee
+ checksum/configs: 464ddc3eced704ef4072987b48e0134bc01babb9294f4d818dec7f9eed8943a9
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifSwiZ3JhZmFuYVVSTCI6Imh0dHBzOi8vZ3JhZmFuYS5sYWIuc3V4ZXNzaXQuazhzLmNsb3VkLnVpYmsuYWMuYXQifSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJhZGRpdGlvbmFsU2VjdXJpdHlDb250ZXh0Ijp7fSwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImNvbmZpZyI6eyJkZXN0aW5hdGlvbnMiOnsiY3Jvc3MtcmVnaW9uIjpbXSwiZGlyZWN0LWNsYXNzaWZpY2F0aW9uIjpbXSwiaW4tcmVnaW9uIjpbXSwiaW4tem9uZSI6WyIxMjcuMC4wLjAvOCIsIjE2OS4yNTQuMC4wLzE2IiwiMTAuMC4wLjAvOCIsIjE3Mi4xNi4wLjAvMTIiLCIxOTIuMTY4LjAuMC8xNiJdLCJpbnRlcm5ldCI6W119LCJzZXJ2aWNlcyI6eyJhbWF6b24td2ViLXNlcnZpY2VzIjp0cnVlLCJhenVyZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZSwiZ29vZ2xlLWNsb3VkLXNlcnZpY2VzIjp0cnVlfX0sImVuYWJsZWQiOnRydWUsImV4dHJhQXJncyI6W10sImhlYWx0aENoZWNrUHJvYmVzIjp7fSwiaW1hZ2UiOnsicmVwb3NpdG9yeSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbmV0d29yay1jb3N0cyIsInRhZyI6InYwLjE3LjYifSwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibG9nTGV2ZWwiOiJpbmZvIiwibm9kZVNlbGVjdG9yIjp7fSwicG9ydCI6MzAwMSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJwcm9tZXRoZXVzU2NyYXBlIjpmYWxzZSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MDBtIn0sInJlcXVlc3RzIjp7ImNwdSI6IjUwbSIsIm1lbW9yeSI6IjIwTWkifX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9fSwidG9sZXJhdGlvbnMiOltdLCJ0cmFmZmljTG9nZ2luZyI6dHJ1ZSwidXBkYXRlU3RyYXRlZ3kiOnsidHlwZSI6IlJvbGxpbmdVcGRhdGUifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJwcm9tZXRoZXVzUnVsZSI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNlcnZpY2VNb25pdG9yIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJuZXR3b3JrQ29zdHMiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWUsImludGVydmFsIjoiMW0iLCJtZXRyaWNSZWxhYmVsaW5ncyI6W10sInJlbGFiZWxpbmdzIjpbXSwic2NyYXBlVGltZW91dCI6IjEwcyJ9LCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJzZWN1cml0eUNvbnRleHQiOnsiZnNHcm91cCI6MTAwMSwiZnNHcm91cENoYW5nZVBvbGljeSI6Ik9uUm9vdE1pc21hdGNoIiwicnVuQXNHcm91cCI6MTAwMSwicnVuQXNOb25Sb290Ijp0cnVlLCJydW5Bc1VzZXIiOjEwMDEsInNlY2NvbXBQcm9maWxlIjp7InR5cGUiOiJSdW50aW1lRGVmYXVsdCJ9fX0sImdyYWZhbmEiOnsiYWRtaW5QYXNzd29yZCI6InN0cm9uZ3Bhc3N3b3JkIiwiYWRtaW5Vc2VyIjoiYWRtaW4iLCJhZmZpbml0eSI6e30sImFubm90YXRpb25zIjp7fSwiZGFzaGJvYXJkUHJvdmlkZXJzIjp7fSwiZGFzaGJvYXJkcyI6e30sImRhc2hib2FyZHNDb25maWdNYXBzIjp7fSwiZGVwbG95bWVudFN0cmF0ZWd5IjoiUm9sbGluZ1VwZGF0ZSIsImRvd25sb2FkRGFzaGJvYXJkc0ltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiY3VybGltYWdlcy9jdXJsIiwidGFnIjoibGF0ZXN0In0sImVudiI6e30sImVudkZyb21TZWNyZXQiOiIiLCJleHRyYVNlY3JldE1vdW50cyI6W10sImdyYWZhbmEuaW5pIjp7ImFuYWx5dGljcyI6eyJjaGVja19mb3JfdXBkYXRlcyI6dHJ1ZX0sImF1dGguYW5vbnltb3VzIjp7ImVuYWJsZWQiOnRydWUsIm9yZ19uYW1lIjoiTWFpbiBPcmcuIiwib3JnX3JvbGUiOiJFZGl0b3IifSwiZ3JhZmFuYV9uZXQiOnsidXJsIjoiaHR0cHM6Ly9ncmFmYW5hLm5ldCJ9LCJsb2ciOnsibW9kZSI6ImNvbnNvbGUifSwicGF0aHMiOnsiZGF0YSI6Ii92YXIvbGliL2dyYWZhbmEvZGF0YSIsImxvZ3MiOiIvdmFyL2xvZy9ncmFmYW5hIiwicGx1Z2lucyI6Ii92YXIvbGliL2dyYWZhbmEvcGx1Z2lucyIsInByb3Zpc2lvbmluZyI6Ii9ldGMvZ3JhZmFuYS9wcm92aXNpb25pbmcifSwic2VydmVyIjp7InJvb3RfdXJsIjoiJShwcm90b2NvbClzOi8vJShkb21haW4pczolKGh0dHBfcG9ydClzL2dyYWZhbmEiLCJzZXJ2ZV9mcm9tX3N1Yl9wYXRoIjpmYWxzZX19LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdyYWZhbmEvZ3JhZmFuYSIsInRhZyI6IjExLjMuMSJ9LCJsaXZlbmVzc1Byb2JlIjp7ImZhaWx1cmVUaHJlc2hvbGQiOjEwLCJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjo2MCwidGltZW91dFNlY29uZHMiOjMwfSwibm9kZVNlbGVjdG9yIjp7fSwicGx1Z2lucyI6W10sInBvZEFubm90YXRpb25zIjp7fSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9hcGkvaGVhbHRoIiwicG9ydCI6MzAwMH19LCJyZXBsaWNhcyI6MSwicmVzb3VyY2VzIjp7fSwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInBvcnQiOjgwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImNyZWF0ZSI6dHJ1ZSwibmFtZSI6IiJ9LCJzaWRlY2FyIjp7ImRhc2hib2FyZHMiOnsiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlcnJvcl90aHJvdHRsZV9zbGVlcCI6MCwiZm9sZGVyIjoiL3RtcC9kYXNoYm9hcmRzIiwibGFiZWwiOiJncmFmYW5hX2Rhc2hib2FyZCIsImxhYmVsVmFsdWUiOiIxIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ2hjci5pby9raXdpZ3JpZC9rOHMtc2lkZWNhciIsInRhZyI6IjEuMjguMSJ9LCJyZXNvdXJjZXMiOnt9fSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sImxvZ0xldmVsIjoiaW5mbyIsIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAifSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn0sImdyYWZhbmFVUkwiOiJodHRwczovL2dyYWZhbmEubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0In0sIm5ldHdvcmtDb3N0cyI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiYWRkaXRpb25hbFNlY3VyaXR5Q29udGV4dCI6e30sImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJjb25maWciOnsiZGVzdGluYXRpb25zIjp7ImNyb3NzLXJlZ2lvbiI6W10sImRpcmVjdC1jbGFzc2lmaWNhdGlvbiI6W10sImluLXJlZ2lvbiI6W10sImluLXpvbmUiOlsiMTI3LjAuMC4wLzgiLCIxNjkuMjU0LjAuMC8xNiIsIjEwLjAuMC4wLzgiLCIxNzIuMTYuMC4wLzEyIiwiMTkyLjE2OC4wLjAvMTYiXSwiaW50ZXJuZXQiOltdfSwic2VydmljZXMiOnsiYW1hem9uLXdlYi1zZXJ2aWNlcyI6dHJ1ZSwiYXp1cmUtY2xvdWQtc2VydmljZXMiOnRydWUsImdvb2dsZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZX19LCJlbmFibGVkIjp0cnVlLCJleHRyYUFyZ3MiOltdLCJoZWFsdGhDaGVja1Byb2JlcyI6e30sImltYWdlIjp7InJlcG9zaXRvcnkiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW5ldHdvcmstY29zdHMiLCJ0YWciOiJ2MC4xNy42In0sImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxvZ0xldmVsIjoiaW5mbyIsIm5vZGVTZWxlY3RvciI6e30sInBvcnQiOjMwMDEsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicHJvbWV0aGV1c1NjcmFwZSI6ZmFsc2UsInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiNTAwbSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiI1MG0iLCJtZW1vcnkiOiIyME1pIn19LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fX0sInRvbGVyYXRpb25zIjpbXSwidHJhZmZpY0xvZ2dpbmciOnRydWUsInVwZGF0ZVN0cmF0ZWd5Ijp7InR5cGUiOiJSb2xsaW5nVXBkYXRlIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJTaXplIjoiNUdpIiwiZW5hYmxlZCI6dHJ1ZSwibGFiZWxzIjp7fSwic2l6ZSI6IjVHaSJ9LCJwcm9tZXRoZXVzIjp7ImFsZXJ0bWFuYWdlckZpbGVzIjp7ImFsZXJ0bWFuYWdlci55bWwiOnsiZ2xvYmFsIjp7fSwicmVjZWl2ZXJzIjpbeyJuYW1lIjoiZGVmYXVsdC1yZWNlaXZlciJ9XSwicm91dGUiOnsiZ3JvdXBfaW50ZXJ2YWwiOiI1bSIsImdyb3VwX3dhaXQiOiIxMHMiLCJyZWNlaXZlciI6ImRlZmF1bHQtcmVjZWl2ZXIiLCJyZXBlYXRfaW50ZXJ2YWwiOiIzaCJ9fX0sImNvbmZpZ21hcFJlbG9hZCI6e30sImV4dHJhU2NyYXBlQ29uZmlncyI6Ii0gam9iX25hbWU6IGt1YmVjb3N0XG4gIGhvbm9yX2xhYmVsczogdHJ1ZVxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImNvc3QtYW5hbHl6ZXIuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAgcG9ydDogOTAwM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtbmV0d29ya2luZ1xuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBwb2RcbiAgcmVsYWJlbF9jb25maWdzOlxuICAjIFNjcmFwZSBvbmx5IHRoZSB0aGUgdGFyZ2V0cyBtYXRjaGluZyB0aGUgZm9sbG93aW5nIG1ldGFkYXRhXG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2luc3RhbmNlXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIGt1YmVjb3N0XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAgbmV0d29yay1jb3N0c1xuLSBqb2JfbmFtZToga3ViZWNvc3QtYWdncmVnYXRvclxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImFnZ3JlZ2F0b3Iuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAge3stIGlmIG9yIC5WYWx1ZXMuc2FtbC5lbmFibGVkIC5WYWx1ZXMub2lkYy5lbmFibGVkIH19XG4gICAgcG9ydDogOTAwOFxuICAgIHt7LSBlbHNlIH19XG4gICAgcG9ydDogOTAwNFxuICAgIHt7LSBlbmQgfX1cbiMjIEVuYWJsZXMgc2NyYXBpbmcgb2YgTlZJRElBIEdQVSBtZXRyaWNzIHZpYSBkY2dtLWV4cG9ydGVyLiBTY3JhcGVzIGFsbFxuIyMgZW5kcG9pbnRzIHdoaWNoIGNvbnRhaW4gXCJkY2dtLWV4cG9ydGVyXCIgaW4gbGFiZWxzIFwiYXBwXCIsXG4jIyBcImFwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudFwiLCBvciBcImFwcC5rdWJlcm5ldGVzLmlvL25hbWVcIiB3aXRoIGEgY2FzZVxuIyMgaW5zZW5zaXRpdmUgbWF0Y2guIFRoZSBsYWJlbCBtdXN0IGJlIHByZXNlbnQgb24gdGhlIEs4cyBzZXJ2aWNlIGVuZHBvaW50cyBhbmQgbm90IGp1c3QgcG9kcy5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImFubm90YXRpb25zIjp7fSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicHJvbWV0aGV1c1J1bGUiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWV9LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzZXJ2aWNlTW9uaXRvciI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJ2YWwiOiIxbSIsIm1ldHJpY1JlbGFiZWxpbmdzIjpbXSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwicmVsYWJlbGluZ3MiOltdLCJzY3JhcGVUaW1lb3V0IjoiMTBzIn0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -190,9 +173,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -240,9 +223,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -294,9 +277,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2024-12-31 06:35:17.160115702 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2024-12-31 06:35:17.160115702 +0000
@@ -5,11 +5,10 @@
metadata:
name: network-costs-config
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -7,9 +7,9 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
clusterIP: None
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -7,23 +7,25 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
+ annotations:
spec:
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: release-name-network-costs
template:
metadata:
+ annotations:
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
hostNetwork: true
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2024-12-31 06:35:17.160115702 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-31 06:35:45.382598755 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2024-12-31 06:35:17.160115702 +0000
@@ -4,11 +4,11 @@
kind: ConfigMap
metadata:
name: app-configs
namespace: default
- labels:
+ labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2024-12-31 06:35:17.159115685 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
@@ -24,8 +23,7 @@
matchNames:
- default
selector:
matchLabels:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2024-12-31 06:35:17.160115702 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-31 06:35:45.381598738 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2024-12-31 06:35:17.160115702 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2024-12-31 06:35:45.383598772 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2024-12-31 06:35:17.162115737 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-network-costs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-31 06:35:45.384598789 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2024-12-31 06:35:17.163115755 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi |
renovate
bot
changed the title
chore(deps): update helm release cost-analyzer to v2.5.1
feat(deps): update helm release cost-analyzer to v2.5.1
Jan 1, 2025
renovate
bot
force-pushed
the
renovate/cost-analyzer-2.x
branch
from
January 1, 2025 13:52
0a89700
to
ce71fd2
Compare
Edited/Blocked NotificationRenovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR. You can manually request rebase by checking the rebase/retry box above. |
Changes Default Valuesdiff -U 4 -r out-default-values/target/kubecost_cost-analyzer_default-values.out out-default-values/pr/kubecost_cost-analyzer_default-values.out
--- out-default-values/target/kubecost_cost-analyzer_default-values.out 2025-01-01 13:53:31.343715010 +0000
+++ out-default-values/pr/kubecost_cost-analyzer_default-values.out 2025-01-01 13:53:03.813372981 +0000
@@ -2,11 +2,12 @@
# zone: cluster.local (use only if your DNS server doesn't live in the same zone as kubecost)
prometheus:
enabled: true # Kubecost depends on Prometheus data, it is not optional. When enabled: false, Prometheus will not be installed and you must configure your own Prometheus to scrape kubecost as well as provide the fqdn below. -- Warning: Before changing this setting, please read to understand the risks https://docs.kubecost.com/install-and-configure/install/custom-prom
fqdn: http://cost-analyzer-prometheus-server.default.svc # example address of a prometheus to connect to. Include protocol (http:// or https://) Ignored if enabled: true
- # insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
+ insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus
# queryServiceBasicAuthSecretName: dbsecret # kubectl create secret generic dbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD
# queryServiceBearerTokenSecretName: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN
+ kubeRBACProxy: false # If true, kubecost will use kube-rbac-proxy to authenticate with in cluster Prometheus for openshift
grafana:
enabled: true # If false, Grafana will not be installed
domainName: cost-analyzer-grafana.default.svc # example grafana domain Ignored if enabled: true
@@ -53,8 +54,10 @@
# or `global.prometheus.fqdn=http://{{ template "cost-analyzer.fullname" . }}-mimir-proxy.{{ .Release.Namespace }}.svc:8085/prometheus'
# Learn more at https://grafana.com/docs/mimir/latest/operators-guide/secure/authentication-and-authorization/#without-an-authenticating-reverse-proxy
mimirProxy:
enabled: false
+ ## Annotations to be added to the Mimir Proxy deployment template
+ annotations: {}
name: mimir-proxy
image: nginxinc/nginx-unprivileged
port: 8085
mimirEndpoint: $mimir_endpoint # Your Mimir query endpoint. If your Mimir query endpoint is http://example.com/prometheus, replace $mimir_endpoint with http://example.com/
@@ -62,11 +65,10 @@
# basicAuth:
# username: user
# password: pwd
- # Azure Monitor Managed Service for Prometheus
- # See https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/azure-monitor/essentials/prometheus-metrics-overview.md for information
- # and https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines for more information on setting this up
+ ## Azure Monitor Managed Service for Prometheus
+ ## Ref: https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines
ammsp:
enabled: false
prometheusServerEndpoint: http://localhost:8081/
remoteWriteService: $<AMMSP_METRICS_INGESTION_ENDPOINT>
@@ -83,76 +85,68 @@
identityType: userAssigned
aadClientId: $<AZURE_MANAGED_IDENTITY_CLIENT_ID>
aadTenantId: $<AZURE_MANAGED_IDENTITY_TENANT_ID>
+ ## Kubecost Alerting
+ ## Ref: http://docs.kubecost.com/alerts
notifications:
- # Kubecost alerting configuration
- # Ref: http://docs.kubecost.com/alerts
# alertConfigs:
- # frontendUrl: http://localhost:9090 # optional, used for linkbacks
- # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts
- # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Microsoft Teams alerts
- # globalAlertEmails:
- # - [email protected]
- # - [email protected]
- # globalEmailSubject: Custom Subject
- # Alerts generated by kubecost, about cluster data
- # alerts:
- # Daily namespace budget alert on namespace `kubecost`
- # - type: budget # supported: budget, recurringUpdate
- # threshold: 50 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: namespace
- # filter: kubecost
- # ownerContact: # optional, overrides globalAlertEmails default
- # - [email protected]
- # - [email protected]
- # # optional, used for alert-specific Slack and Microsoft Teams alerts
- # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
- # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX
-
- # Daily cluster budget alert on cluster `cluster-one`
- # - type: budget
- # threshold: 200.8 # optional, required for budget alerts
- # window: daily # or 1d
- # aggregation: cluster
- # filter: cluster-one # does not accept csv
-
- # Recurring weekly update (weeklyUpdate alert)
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: '*'
-
- # Recurring weekly namespace update on kubecost namespace
- # - type: recurringUpdate
- # window: weekly # or 7d
- # aggregation: namespace
- # filter: kubecost
-
- # Spend Change Alert
- # - type: spendChange # change relative to moving avg
- # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
- # window: 1d # accepts ‘d’, ‘h’
- # baselineWindow: 30d # previous window, offset by window
- # aggregation: namespace
- # filter: kubecost, default # accepts csv
-
- # Health Score Alert
- # - type: health # Alerts when health score changes by a threshold
- # window: 10m
- # threshold: 5 # Send Alert if health scores changes by 5 or more
-
- # Kubecost Health Diagnostic
- # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
- # window: 10m
+ # frontendUrl: http://localhost:9090 # Optional
+ # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # globalAlertEmails:
+ # - [email protected]
+ # - [email protected]
+ # globalEmailSubject: Custom Subject
+ # alerts:
+ # # Daily namespace budget alert on namespace `kubecost`
+ # - type: budget # supported: budget, recurringUpdate
+ # threshold: 50 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: namespace
+ # filter: kubecost
+ # ownerContact: # optional, overrides globalAlertEmails default
+ # - [email protected]
+ # - [email protected]
+ # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # Optional
+ # # Daily cluster budget alert on cluster `cluster-one`
+ # - type: budget
+ # threshold: 200.8 # optional, required for budget alerts
+ # window: daily # or 1d
+ # aggregation: cluster
+ # filter: cluster-one # does not accept csv
+ # # Recurring weekly update (weeklyUpdate alert)
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: '*'
+ # # Recurring weekly namespace update on kubecost namespace
+ # - type: recurringUpdate
+ # window: weekly # or 7d
+ # aggregation: namespace
+ # filter: kubecost
+ # # Spend Change Alert
+ # - type: spendChange # change relative to moving avg
+ # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative)
+ # window: 1d # accepts ‘d’, ‘h’
+ # baselineWindow: 30d # previous window, offset by window
+ # aggregation: namespace
+ # filter: kubecost, default # accepts csv
+ # # Health Score Alert
+ # - type: health # Alerts when health score changes by a threshold
+ # window: 10m
+ # threshold: 5 # Send Alert if health scores changes by 5 or more
+ # # Kubecost Health Diagnostic
+ # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable
+ # window: 10m
alertmanager: # Supply an alertmanager FQDN to receive notifications from the app.
enabled: false # If true, allow kubecost to write to your alertmanager
fqdn: http://cost-analyzer-prometheus-server.default.svc # example fqdn. Ignored if prometheus.enabled: true
- # Set saved Cost Allocation report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ ## Kubecost Saved Reports
+ ## Ref: http://docs.kubecost.com/saved-reports
savedReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Saved Report 0"
@@ -160,35 +154,32 @@
aggregateBy: "namespace"
chartDisplay: "category"
idle: "separate"
rate: "cumulative"
- accumulate: false # daily resolution
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ accumulate: false # daily resolution
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "cluster" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "dev"
- title: "Example Saved Report 1"
window: "month"
aggregateBy: "controllerKind"
chartDisplay: "category"
idle: "share"
rate: "monthly"
accumulate: false
- filters: # Ref: https://docs.kubecost.com/apis/filters-api
+ filters: # Ref: https://docs.kubecost.com/apis/filters-api
- key: "namespace" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api
- operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
+ operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators
value: "kubecost"
- title: "Example Saved Report 2"
window: "2020-11-11T00:00:00Z,2020-12-09T23:59:59Z"
aggregateBy: "service"
chartDisplay: "category"
idle: "hide"
rate: "daily"
accumulate: true # entire window resolution
- filters: [] # if no filters, specify empty array
-
- # Set saved Asset report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
+ filters: [] # if no filters, specify empty array
assetReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Example Asset Report 0"
@@ -197,11 +188,8 @@
accumulate: false # daily resolution
filters:
- property: "cluster"
value: "cluster-one"
-
- # Set saved Cloud Cost report(s) accessible from /reports
- # Ref: http://docs.kubecost.com/saved-reports
cloudCostReports:
enabled: false # If true, overwrites report parameters set through UI
reports:
- title: "Cloud Cost Report 0"
@@ -214,8 +202,12 @@
podAnnotations: {}
# iam.amazonaws.com/role: role-arn
+ # Annotations to be added for all controllers (StatefulSets, Deployments, DaemonSets)
+ annotations: {}
+ # iam.amazonaws.com/role: role-arn
+
# Applies these labels to all Deployments, StatefulSets, DaemonSets, and their pod templates.
additionalLabels: {}
securityContext:
@@ -233,8 +225,25 @@
capabilities:
drop:
- ALL
+ # Installs custom CA certificates onto Kubecost pods
+ updateCaTrust:
+ enabled: false # Set to true to enable the init container for updating CA trust
+ # Security context settings for the init container.
+ securityContext:
+ runAsUser: 0
+ runAsGroup: 0
+ runAsNonRoot: false
+ allowPrivilegeEscalation: false
+ readOnlyRootFilesystem: true
+ seccompProfile:
+ type: RuntimeDefault
+ caCertsSecret: ca-certs-secret # The name of the Secret containing custom CA certificates to mount to the cost-model container.
+ # caCertsConfig: ca-certs-config # The name of the ConfigMap containing the CA trust configuration.
+ resources: {} # Resource requests and limits for the init container.
+ caCertsMountPath: /etc/pki/ca-trust/source/anchors # The path where the custom CA certificates will be mounted in the init container
+
# Platforms is a higher-level abstraction for platform-specific values and settings.
platforms:
# Deploying to OpenShift (OCP) requires enabling this option.
openshift:
@@ -242,8 +251,15 @@
route:
enabled: false # Create an OpenShift Route.
annotations: {} # Add annotations to the Route.
# host: kubecost.apps.okd4.example.com # Add a custom host for your Route.
+
+ # OPTIONAL. The following configs only to be enabled when using a Prometheus instance already installed in the cluster.
+ createMonitoringClusterRoleBinding: false # Create a ClusterRoleBinding to grant the Kubecost serviceaccount access to query Prometheus.
+ createMonitoringResourceReaderRoleBinding: false # Create a Role and Role Binding to allow Prometheus to list and watch Kubecost resources.
+ monitoringServiceAccountName: prometheus-k8s # Name of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+ monitoringServiceAccountNamespace: openshift-monitoring # Namespace of the Prometheus serviceaccount to bind to the Resource Reader Role Binding.
+
# Create Security Context Constraint resources for the DaemonSets requiring additional privileges.
scc:
nodeExporter: false # Creates an SCC for Prometheus Node Exporter. This requires Node Exporter be enabled.
networkCosts: false # Creates an SCC for Kubecost network-costs. This requires network-costs be enabled.
@@ -258,18 +274,24 @@
skipSanityChecks: false # If true, skip all sanity/existence checks for resources like Secrets.
## Kubecost Integrations
## Ref: https://docs.kubecost.com/integrations
- ##
integrations:
+ turbonomic:
+ enabled: false # Set to true to enable the Turbonomic integration
+ clientId: "" # Client ID generated from the OAuth Client created
+ clientSecret: "" # Client Secret generated from the OAuth Client created
+ role: "" # Role that the OAuth Client was created with (e.g. ADMINISTRATOR, SITE_ADMIN, etc.)
+ host: "" # URL to your turbonomic API. EG: https://turbonomic.example.com/
+ insecureClient: false # Do not verify certificate
postgres:
enabled: false
- runInterval: "12h" # How frequently to run the integration.
- databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
- databasePort: "" # REQUIRED. ex: 5432
- databaseName: "" # REQUIRED. ex: postgres
- databaseUser: "" # REQUIRED. ex: myusername
- databasePassword: "" # REQUIRED. ex: mypassword
+ runInterval: "12h" # How frequently to run the integration.
+ databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com
+ databasePort: "" # REQUIRED. ex: 5432
+ databaseName: "" # REQUIRED. ex: postgres
+ databaseUser: "" # REQUIRED. ex: myusername
+ databasePassword: "" # REQUIRED. ex: mypassword
databaseSecretName: "" # OPTIONAL. Specify your own k8s secret containing the above credentials. Must have key "creds.json".
## Configure what Postgres table to write to, and what parameters to pass
## when querying Kubecost's APIs. Ensure all parameters are enclosed in
@@ -303,8 +325,12 @@
# nameOverride: ""
## Provide a full name override option for the chart.
# fullnameOverride: ""
+## Provide additional labels for the chart.
+# chartLabels:
+# app.kubernetes.io/name: kubecost-cost-analyzer
+
## This flag is only required for users upgrading to a new version of Kubecost.
## The flag is used to ensure users are aware of important
## (potentially breaking) changes included in the new version.
##
@@ -322,79 +348,77 @@
region: "us-east-1"
URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI
csvAccessCredentials: pricing-schema-access-secret
-# SAML integration for user management and RBAC, enterprise key required
-# Ref: https://github.com/kubecost/docs/blob/main/user-management.md
+## Kubecost SAML (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-saml
saml:
enabled: false
- # secretName: "kubecost-authzero"
- # metadataSecretName: "kubecost-authzero-metadata" # One of metadataSecretName or idpMetadataURL must be set. defaults to metadataURL if set
- # idpMetadataURL: "https://dev-elu2z98r.auth0.com/samlp/metadata/c6nY4M37rBP0qSO1IYIqBPPyIPxLS8v2"
- # appRootURL: "http://localhost:9090" # sample URL
- # authTimeout: 1440 # number of minutes the JWT will be valid
- # redirectURL: "https://dev-elu2z98r.auth0.com/v2/logout" # callback URL redirected to after logout
- # audienceURI: "http://localhost:9090" # by convention, the same as the appRootURL, but any string uniquely identifying kubecost to your samp IDP. Optional if you follow the convention
- # nameIDFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" If your SAML provider requires a specific nameid format
- # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
- # encryptionCertSecret: "kubecost-saml-cert" # k8s secret where the x509 certificate used to encrypt an Okta saml response is stored
- # decryptionKeySecret: "kubecost-sank-decryption-key" # k8s secret where the private key associated with the encryptionCertSecret is stored
- # authSecret: "random-string" # value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
- # authSecretName: "kubecost-saml-secret" # name of k8s secret where the authSecret will be stored, defaults to "kubecost-saml-secret" if not provided
+ # secretName: ""
+ # metadataSecretName: "" # One of metadataSecretName or idpMetadataURL must be set. Defaults to idpMetadataURL if set.
+ # idpMetadataURL: ""
+ # appRootURL: ""
+ # authTimeout: 1440 # Number of minutes the JWT will be valid
+ # redirectURL: "" # Callback URL redirected to after logout
+ # audienceURI: "" # Usually the same as the appRootURL. Optionally any string uniquely identifying kubecost to your SAML IDP.
+ # nameIDFormat: "" # If your SAML provider requires a specific nameid format
+ # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers
+ # encryptionCertSecret: "" # K8s secret storing the x509 certificate used to encrypt an Okta SAML response
+ # decryptionKeySecret: "" # K8s secret storing the private key associated with the encryptionCertSecret
+ # authSecret: "" # Value of SAML secret used to issue tokens, will be autogenerated as random string if not provided
+ # authSecretName: "" # Name of K8s secret where the authSecret will be stored. Defaults to "kubecost-saml-secret" if not provided.
rbac:
enabled: false
# groups:
# - name: admin
- # enabled: false # if admin is disabled, all SAML users will be able to make configuration changes to the kubecost frontend
- # assertionName: "http://schemas.auth0.com/userType" # a SAML Assertion, one of whose elements has a value that matches on of the values in assertionValues
+ # enabled: false # If admin is disabled, all SAML users will be able to make configuration changes to the Kubecost frontend
+ # assertionName: ""
# assertionValues:
# - "admin"
# - "superusers"
# - name: readonly
- # enabled: false # if readonly is disabled, all users authorized on SAML will default to readonly
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: false # If readonly is disabled, all users authorized on SAML will default to readonly
+ # assertionName: ""
# assertionValues:
# - "readonly"
# - name: editor
- # enabled: true # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
- # assertionName: "http://schemas.auth0.com/userType"
+ # enabled: true # If editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # assertionName: ""
# assertionValues:
# - "editor"
+## Kubecost OIDC (enterprise key required)
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/user-management-oidc
oidc:
enabled: false
- clientID: "" # application/client client_id parameter obtained from provider, used to make requests to server
- clientSecret: "" # application/client client_secret parameter obtained from provider, used to make requests to server
- # secretName: "kubecost-oidc-secret" # k8s secret where clientsecret will be stored
- # For use to provide a custom OIDC Secret. Overrides the usage of oidc.clientSecret and oidc.secretName.
- # Should contain the field directly.
- # Can be created using raw k8s secrets, external secrets, sealed secrets, or any other method.
+ clientID: "" # Application client_id parameter obtained from provider. Used to make requests to server.
+ clientSecret: "" # Application/client client_secret parameter obtained from provider. Used to make requests to server.
+ secretName: "kubecost-oidc-secret" # K8s secret where clientsecret will be stored
existingCustomSecret:
enabled: false
- name: "" # name of the secret containing the client secret
-
- # authURL: "https://my.auth.server/authorize" # endpoint for login to auth server
- # loginRedirectURL: "http://my.kubecost.url/model/oidc/authorize" # Kubecost url configured in provider for redirect after authentication
- # discoveryURL: "https://my.auth.server/.well-known/openid-configuration" # url for OIDC endpoint discovery
- skipOnlineTokenValidation: false # if true, will skip accessing OIDC introspection endpoint for online token verification, and instead try to locally validate JWT claims
- useClientSecretPost: false # if true, client secret will specifically only use client_secret_post method, otherwise it will attempt to send the secret in both the header and the body.
- # hostedDomain: "example.com" # optional, blocks access to the auth domain specified in the hd claim of the provider ID token
+ name: "" # Name of an existing clientSecret. Overrides the usage of oidc.clientSecret and oidc.secretName.
+ authURL: "" # Authorization endpoint for your identity provider
+ loginRedirectURL: "" # Kubecost URL endpoint which handles auth flow
+ discoveryURL: "" # Your identity provider's endpoint sharing OIDC configuration
+ skipOnlineTokenValidation: false # If true, validate JWT claims locally
+ useClientSecretPost: false # If true, only use client_secret_post method. Otherwise attempt to send the secret in both the header and the body.
+ hostedDomain: "" # Optional, blocks access to the auth domain specified in the hd claim of the provider ID token
rbac:
enabled: false
# groups:
- # - name: admin
- # enabled: false # if admin is disabled, all authenticated users will be able to make configuration changes to the kubecost frontend
- # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
- # claimValues: # Kubecost matches these strings with the roles created in your identity provider
+ # - name: admin # Admins have permissions to edit Kubecost settings and save reports
+ # enabled: false
+ # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers)
+ # claimValues: # Kubecost matches these strings with the roles created in your identity provider
# - "admin"
# - "superusers"
- # - name: readonly
- # enabled: false # if readonly is disabled, all authenticated users will default to readonly
- # claimName: "roles"
+ # - name: readonly # Readonly users do not have permissions to edit Kubecost settings or save reports.
+ # enabled: false
+ # claimName: "roles"
# claimValues:
# - "readonly"
- # - name: editor
- # enabled: false # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor.
+ # - name: editor # Editors have permissions to edit reports/alerts and act as readers otherwise
+ # enabled: false
# claimName: "roles"
# claimValues:
# - "editor"
@@ -435,25 +459,14 @@
resources:
requests:
cpu: "10m"
memory: "55Mi"
- # limits:
- # cpu: "100m"
- # memory: "256Mi"
deploymentStrategy: {}
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
-
- # Define a readiness probe for the Kubecost frontend container.
readinessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
failureThreshold: 6
-
- # Define a liveness probe for the Kubecost frontend container.
livenessProbe:
enabled: true
initialDelaySeconds: 1
periodSeconds: 5
@@ -495,49 +508,8 @@
# emitNamespaceAnnotations: false
# emitKsmV1Metrics: true # emit all KSM metrics in KSM v1.
# emitKsmV1MetricsOnly: false # emit only the KSM metrics missing from KSM v2. Advanced users only.
- # Optional
- # The metrics exporter is a separate deployment and service (for prometheus scrape auto-discovery)
- # which emits metrics cost-model relies on. Enabling this deployment also removes the KSM dependency
- # from the cost-model. If the deployment is not enabled, the metrics will continue to be emitted from
- # the cost-model.
- exporter:
- enabled: false
- port: 9005
- # Adds the default Prometheus scrape annotations to the metrics exporter service.
- # Set to false and use service.annotations (below) to set custom scrape annotations.
- prometheusScrape: true
- resources: {}
- # requests:
- # cpu: "200m"
- # memory: "55Mi"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- tolerations: []
-
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
- affinity: {}
-
- service:
- annotations: {}
-
- # Service Monitor for Kubecost Metrics
- serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors.
- enabled: false
- additionalLabels: {}
- metricRelabelings: []
- relabelings: []
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
- priorityClassName: ""
- additionalLabels: {}
- nodeSelector: {}
- extraArgs: []
-
sigV4Proxy:
image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest
imagePullPolicy: IfNotPresent
name: aps
@@ -549,9 +521,8 @@
# - name: AWS_ACCESS_KEY_ID
# value: <access_key>
# - name: AWS_SECRET_ACCESS_KEY
# value: <secret_key>
- # Optional resource requests and limits for the sigV4proxy container.
resources: {}
kubecostModel:
image: "gcr.io/kubecost1/cost-model"
@@ -559,17 +530,14 @@
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for cost-model.
# fullImageName:
+ # Log level for the cost model container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
+ logLevel: info
+
# securityContext:
# readOnlyRootFilesystem: true
- # Build local cost allocation cache
- warmCache: false
- # Run allocation ETL pipelines
- etl: true
- # Enable the ETL filestore backing storage
- etlFileStoreEnabled: true
# The total number of days the ETL pipelines will build
# Set to 0 to disable daily ETL (not recommended)
etlDailyStoreDurationDays: 91
# The total number of hours the ETL pipelines will build
@@ -695,16 +663,13 @@
# limits:
# cpu: "800m"
# memory: "256Mi"
- # Define a readiness probe for the Kubecost cost-model container.
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the Kubecost cost-model container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -712,43 +677,18 @@
extraArgs: []
# Optional. A list of extra environment variables to be added to the cost-model container.
# extraEnv:
- # - name: LOG_LEVEL
- # value: trace
# - name: LOG_FORMAT
# value: json
# # When false, Kubecost will not show Asset costs for local disks physically
# # attached to nodes (e.g. ephemeral storage). This needs to be applied to
# # each cluster monitored.
# - name: ASSET_INCLUDE_LOCAL_DISK_COST
# value: "true"
- # creates an ingress directly to the model container, for API access
- ingress:
- enabled: false
- # className: nginx
- labels:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- annotations:
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- paths: ["/"]
- pathType: ImplementationSpecific
- hosts:
- - cost-analyzer-model.local
- tls: []
- # - secretName: cost-analyzer-model-tls
- # hosts:
- # - cost-analyzer-model.local
utcOffset: "+00:00"
- # Optional - add extra ports to the cost-model container. For kubecost development purposes only - not recommended for users.
extraPorts: []
- # - name: debug
- # port: 40000
- # targetPort: 40000
- # containerPort: 40000
## etlUtils is a utility typically used by Enterprise customers transitioning
## from v1 to v2 of Kubecost. It translates the data from the "/etl" dir of the
## bucket, to the "/federated" dir of the bucket.
@@ -760,8 +700,10 @@
resources: {}
env: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added to etlutils deployment
+ annotations: {}
affinity: {}
# Basic Kubecost ingress, more examples available at https://docs.kubecost.com/install-and-configure/install/ingress-examples
ingress:
@@ -782,77 +724,25 @@
# hosts:
# - cost-analyzer.local
nodeSelector: {}
-
tolerations: []
-# - key: "key"
-# operator: "Equal|Exists"
-# value: "value"
-# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
topologySpreadConstraints: []
-
-# If true, creates a PriorityClass to be used by the cost-analyzer pod
priority:
enabled: false
- name: "" # Provide name of existing priority class only. If left blank, upstream chart will create one from default template.
-
-# If true, enable creation of NetworkPolicy resources.
-networkPolicy:
- enabled: false
- denyEgress: true # create a network policy that denies egress from kubecost
- sameNamespace: true # Set to true if cost analyzer and prometheus are on the same namespace
-# namespace: kubecost # Namespace where prometheus is installed
-
- # Cost-analyzer specific vars using the new template
- costAnalyzer:
- enabled: false # If true, create a network policy for cost-analyzer
- annotations: {} # annotations to be added to the network policy
- additionalLabels: {} # additional labels to be added to the network policy
- # Examples rules:
- # ingressRules:
- # - selectors: # allow ingress from self on all ports
- # - podSelector:
- # matchLabels:
- # app.kubernetes.io/name: cost-analyzer
- # - selectors: # allow egress access to prometheus
- # - namespaceSelector:
- # matchLabels:
- # name: prometheus
- # podSelector:
- # matchLabels:
- # app: prometheus
- # ports:
- # - protocol: TCP
- # port: 9090
- # egressRules:
- # - selectors: # restrict egress to inside cluster
- # - namespaceSelector: {}
-
-## @param extraVolumes A list of volumes to be added to the pod
-##
+ name: ""
extraVolumes: []
-## @param extraVolumeMounts A list of volume mounts to be added to the pod
-##
extraVolumeMounts: []
# Define persistence volume for cost-analyzer, more information at https://docs.kubecost.com/install-and-configure/install/storage
persistentVolume:
size: 32Gi
- dbSize: 32.0Gi
enabled: true # Note that setting this to false means configurations will be wiped out on pod restart.
# storageClass: "-" #
# existingClaim: kubecost-cost-analyzer # a claim in the same namespace as kubecost
labels: {}
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- # Enables a separate PV specifically for ETL data. This should be avoided, but
- # is kept for legacy compatibility.
- dbPVEnabled: false
service:
type: ClusterIP
port: 9090
@@ -873,20 +763,15 @@
rbac:
create: true # Create the RBAC resources for Prometheus.
- ## Define serviceAccount names for components. Defaults to component's fully qualified name.
- ##
serviceAccounts:
alertmanager:
create: true
name:
nodeExporter:
create: true
name:
- pushgateway:
- create: true
- name:
server:
create: true
name:
## Prometheus server ServiceAccount annotations.
@@ -897,9 +782,8 @@
##
# selfsignedCertConfigMapName: ""
imagePullSecrets:
- # - name: "image-pull-secret"
extraScrapeConfigs: |
- job_name: kubecost
honor_labels: true
@@ -939,9 +823,9 @@
{{- end }}
## Enables scraping of NVIDIA GPU metrics via dcgm-exporter. Scrapes all
## endpoints which contain "dcgm-exporter" in labels "app",
## "app.kubernetes.io/component", or "app.kubernetes.io/name" with a case
- ## insensitive match.
+ ## insensitive match. The label must be present on the K8s service endpoints and not just pods.
## Refs:
## https://github.com/NVIDIA/gpu-operator/blob/d4316a415bbd684ce8416a88042305fc1a093aa4/assets/state-dcgm-exporter/0600_service.yaml#L7
## https://github.com/NVIDIA/dcgm-exporter/blob/54fd1ca137c66511a87a720390613680b9bdabdd/deployment/templates/service.yaml#L23
- job_name: kubecost-dcgm-exporter
@@ -961,381 +845,122 @@
## Provide a full name override for the Prometheus server.
# fullnameOverride: ""
- ## Prometheus server container name
- ##
enabled: true
name: server
sidecarContainers:
strategy:
type: Recreate
rollingUpdate: null
-
- ## Prometheus server container image
- ##
image:
repository: quay.io/prometheus/prometheus
tag: v2.55.1
pullPolicy: IfNotPresent
-
- ## prometheus server priorityClassName
- ##
priorityClassName: ""
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
- ## Maybe same with Ingress host name
baseURL: ""
-
- ## Additional server container environment variables
- ##
- ## You specify this manually like you would a raw deployment manifest.
- ## This means you can bind in environment variables from secrets.
- ##
- ## e.g. static environment variable:
- ## - name: DEMO_GREETING
- ## value: "Hello from the environment"
- ##
- ## e.g. secret environment variable:
- ## - name: USERNAME
- ## valueFrom:
- ## secretKeyRef:
- ## name: mysecret
- ## key: username
env: []
-
extraFlags:
- web.enable-lifecycle
- ## web.enable-admin-api flag controls access to the administrative HTTP API which includes functionality such as
- ## deleting time series. This is disabled by default.
- # - web.enable-admin-api
- ##
- ## storage.tsdb.no-lockfile flag controls BD locking
- # - storage.tsdb.no-lockfile
- ##
- ## storage.tsdb.wal-compression flag enables compression of the write-ahead log (WAL)
- # - storage.tsdb.wal-compression
-
- ## Path to a configuration file on prometheus server container FS
configPath: /etc/config/prometheus.yml
-
global:
- ## How frequently to scrape targets by default
- ##
scrape_interval: 1m
- ## How long until a scrape request times out
- ##
scrape_timeout: 60s
- ## How frequently to evaluate rules
- ##
evaluation_interval: 1m
external_labels:
cluster_id: cluster-one # Each cluster should have a unique ID
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write
- ##
remoteWrite: {}
- ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read
- ##
remoteRead: {}
-
- ## Additional Prometheus server container arguments
- ##
extraArgs:
query.max-concurrency: 1
query.max-samples: 100000000
-
- ## Additional InitContainers to initialize the pod
- ##
extraInitContainers: []
-
- ## Additional Prometheus server Volume mounts
- ##
extraVolumeMounts: []
-
- ## Additional Prometheus server Volumes
- ##
extraVolumes: []
-
- ## Additional Prometheus server hostPath mounts
- ##
extraHostPathMounts: []
- # - name: certs-dir
- # mountPath: /etc/kubernetes/certs
- # subPath: ""
- # hostPath: /etc/kubernetes/certs
- # readOnly: true
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # subPath: ""
- # configMap: certs-configmap
- # readOnly: true
-
- ## Additional Prometheus server Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: prom-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.server.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/server-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
ingress:
- ## If true, Prometheus server Ingress will be created
- ##
enabled: false
# className: nginx
-
- ## Prometheus server Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## Prometheus server Ingress additional labels
- ##
extraLabels: {}
-
- ## Prometheus server Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - prometheus.domain.com
- # - domain.com/prometheus
-
- ## PathType determines the interpretation of the Path matching
pathType: "Prefix"
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## Prometheus server Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-server-tls
- # hosts:
- # - prometheus.domain.com
-
- ## Server Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for Prometheus server pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, Prometheus server will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## Prometheus server data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## Prometheus server data Persistent Volume annotations
- ##
annotations: {}
- # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource
-
- ## Prometheus server data Persistent Volume existing claim name
- ## Requires server.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## Prometheus server data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## Prometheus server data Persistent Volume size
- ##
size: 32Gi
-
- ## Prometheus server data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## Prometheus server data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of Prometheus server data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
emptyDir:
sizeLimit: ""
-
- ## Annotations to be added to Prometheus server pods
- ##
podAnnotations: {}
- # iam.amazonaws.com/role: prometheus
-
- ## Annotations to be added to the Prometheus Server deployment
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to Prometheus server pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Prometheus AlertManager configuration
- ##
alertmanagers: []
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
annotations: {}
labels: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
servicePort: 80
-
- ## Prometheus server readiness and liveness probe initial delay and timeout
- ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
- ##
readinessProbeInitialDelay: 5
readinessProbeTimeout: 3
readinessProbeFailureThreshold: 3
readinessProbeSuccessThreshold: 1
livenessProbeInitialDelay: 5
livenessProbeTimeout: 3
livenessProbeFailureThreshold: 3
livenessProbeSuccessThreshold: 1
-
- ## Prometheus server resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 500m
- # memory: 512Mi
- # requests:
- # cpu: 500m
- # memory: 512Mi
-
- ## Vertical Pod Autoscaler config
- ## Ref: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
verticalAutoscaler:
- ## If true a VPA object will be created for the controller (either StatefulSet or Deployment, based on above configs)
enabled: false
## Optional. Defaults to "Auto" if not specified.
# updateMode: "Auto"
## Mandatory. Without, VPA will not be created.
# containerPolicies:
# - containerName: 'prometheus-server'
-
- ## Security context to be added to server pods
- ##
securityContext: {}
- # runAsUser: 1001
- # runAsNonRoot: true
- # runAsGroup: 1001
- # fsGroup: 1001
-
containerSecurityContext: {}
-
service:
annotations: {}
labels: {}
clusterIP: ""
- # nodePort: ""
-
- ## List of IP addresses at which the Prometheus server service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
sessionAffinity: None
type: ClusterIP
-
- ## Enable gRPC port on service to allow auto discovery with thanos-querier
gRPC:
enabled: false
servicePort: 10901
- # nodePort: 10901
-
- ## If using a statefulSet (statefulSet.enabled=true), configure the
- ## service to connect to a specific replica to have a consistent view
- ## of the data.
statefulsetReplica:
enabled: false
replica: 0
-
- ## Prometheus server pod termination grace period
- ##
terminationGracePeriodSeconds: 300
## Prometheus data retention period (default if not specified is 97 hours)
##
@@ -1366,292 +991,92 @@
# retentionSize: should be significantly greater than the storage used in the number of hours set in etlHourlyStoreDurationHours
# Install Prometheus Alert Manager
alertmanager:
- ## If false, alertmanager will not be installed
- ##
enabled: false
-
## Provide a full name override for Prometheus alertmanager.
# fullnameOverride: ""
-
strategy:
type: Recreate
rollingUpdate: null
-
- ## alertmanager container name
- ##
name: alertmanager
-
- ## alertmanager container image
- ##
image:
repository: quay.io/prometheus/alertmanager
tag: v0.27.0
pullPolicy: IfNotPresent
-
- ## alertmanager priorityClassName
- ##
priorityClassName: ""
-
- ## Additional alertmanager container arguments
- ##
extraArgs: {}
-
- ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug
- ## so that the various internal URLs are still able to access as they are in the default case.
- ## (Optional)
prefixURL: ""
-
- ## External URL which can access alertmanager
baseURL: "http://localhost:9093"
-
- ## Additional alertmanager container environment variable
- ## For instance to add a http_proxy
- ##
extraEnv: {}
-
- ## Additional alertmanager Secret mounts
- # Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # subPath: ""
- # secretName: alertmanager-secret-files
- # readOnly: true
-
- ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}}
- ## Defining configMapOverrideName will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configMapOverrideName: ""
-
- ## The name of a secret in the same kubernetes namespace which contains the Alertmanager config
- ## Defining configFromSecret will cause templates/alertmanager-configmap.yaml
- ## to NOT generate a ConfigMap resource
- ##
configFromSecret: ""
-
- ## The configuration file name to be loaded to alertmanager
- ## Must match the key within configuration loaded from ConfigMap/Secret
- ##
configFileName: alertmanager.yml
-
ingress:
- ## If true, alertmanager Ingress will be created
- ##
enabled: false
-
- ## alertmanager Ingress annotations
- ##
annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## alertmanager Ingress additional labels
- ##
extraLabels: {}
-
- ## alertmanager Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
hosts: []
- # - alertmanager.domain.com
- # - domain.com/alertmanager
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## alertmanager Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - alertmanager.domain.com
-
- ## Alertmanager Deployment Strategy type
# strategy:
# type: Recreate
-
- ## Node tolerations for alertmanager scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for alertmanager pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Pod affinity
- ##
affinity: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
# schedulerName:
-
persistentVolume:
- ## If true, alertmanager will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
enabled: true
-
- ## alertmanager data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
accessModes:
- ReadWriteOnce
-
- ## alertmanager data Persistent Volume Claim annotations
- ##
annotations: {}
-
- ## alertmanager data Persistent Volume existing claim name
- ## Requires alertmanager.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
-
- ## alertmanager data Persistent Volume mount root path
- ##
mountPath: /data
-
- ## alertmanager data Persistent Volume size
- ##
size: 2Gi
-
- ## alertmanager data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
# storageClass: "-"
-
- ## alertmanager data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
# volumeBindingMode: ""
-
- ## Subdirectory of alertmanager data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
subPath: ""
-
- ## Annotations to be added to alertmanager pods
- ##
podAnnotations: {}
- ## Tell prometheus to use a specific set of alertmanager pods
- ## instead of all alertmanager pods found in the same namespace
- ## Useful if you deploy multiple releases within the same namespace
- ##
- ## prometheus.io/probe: alertmanager-teamA
-
- ## Labels to be added to Prometheus AlertManager pods
- ##
+ annotations: {}
podLabels: {}
-
- ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below)
- ##
replicaCount: 1
-
statefulSet:
- ## If true, use a statefulset instead of a deployment for pod management.
- ## This allows to scale replicas to more than 1 pod
- ##
enabled: false
-
+ annotations: {}
podManagementPolicy: OrderedReady
-
- ## Alertmanager headless service to use for the statefulset
- ##
headless:
annotations: {}
labels: {}
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
servicePort: 80
-
- ## alertmanager resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to alertmanager pods
- ##
securityContext:
runAsUser: 1001
runAsNonRoot: true
runAsGroup: 1001
fsGroup: 1001
-
service:
annotations: {}
labels: {}
clusterIP: ""
-
- ## Enabling peer mesh service end points for enabling the HA alert manager
- ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md
# enableMeshPeer : true
-
- ## List of IP addresses at which the alertmanager service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 80
# nodePort: 30000
sessionAffinity: None
type: ClusterIP
- # Define a custom scheduler for Alertmanager pods
- # schedulerName: default-scheduler
-
- ## alertmanager ConfigMap entries
- ##
alertmanagerFiles:
alertmanager.yml:
global: {}
- # slack_api_url: ''
-
receivers:
- name: default-receiver
- # slack_configs:
- # - channel: '@you'
- # send_resolved: true
-
route:
group_wait: 10s
group_interval: 5m
receiver: default-receiver
@@ -1659,87 +1084,32 @@
## Monitors ConfigMap changes and POSTs to a URL
configmapReload:
prometheus:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
-
- ## configmap-reload container securityContext
containerSecurityContext: {}
alertmanager:
- ## If false, the configmap-reload container will not be deployed
- ##
enabled: false
-
- ## configmap-reload container name
- ##
name: configmap-reload
-
- ## configmap-reload container image
- ##
image:
repository: quay.io/prometheus-operator/prometheus-config-reloader
tag: v0.78.2
pullPolicy: IfNotPresent
-
- ## Additional configmap-reload container arguments
- ##
extraArgs: {}
- ## Additional configmap-reload volume directories
- ##
extraVolumeDirs: []
-
-
- ## Additional configmap-reload mounts
- ##
extraConfigmapMounts: []
- # - name: prometheus-alerts
- # mountPath: /etc/alerts.d
- # subPath: ""
- # configMap: prometheus-alerts
- # readOnly: true
-
-
- ## configmap-reload resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # node-export must be disabled if there is an existing daemonset: https://guide.kubecost.com/hc/en-us/articles/4407601830679-Troubleshoot-Install#a-name-node-exporter-a-issue-failedscheduling-kubecost-prometheus-node-exporter
nodeExporter:
## If false, node-exporter will not be installed.
## This is disabled by default in Kubecost 2.0, though it can be enabled as needed.
##
@@ -1747,346 +1117,59 @@
## Provide a full name override for node exporter.
# fullnameOverride: ""
- ## If true, node-exporter pods share the host network namespace
- ##
hostNetwork: true
-
- ## If true, node-exporter pods share the host PID namespace
- ##
hostPID: true
-
- ## node-exporter dns policy
- ##
dnsPolicy: ClusterFirstWithHostNet
-
- ## node-exporter container name
- ##
name: node-exporter
-
- ## node-exporter container image
- ##
image:
repository: prom/node-exporter
tag: v1.8.2
pullPolicy: IfNotPresent
-
- ## node-exporter priorityClassName
- ##
priorityClassName: ""
-
- ## Custom Update Strategy
- ##
updateStrategy:
type: RollingUpdate
-
- ## Additional node-exporter container arguments
- ##
extraArgs: {}
-
- ## Additional node-exporter hostPath mounts
- ##
extraHostPathMounts: []
- # - name: textfile-dir
- # mountPath: /srv/txt_collector
- # hostPath: /var/lib/node-exporter
- # readOnly: true
- # mountPropagation: HostToContainer
-
extraConfigmapMounts: []
- # - name: certs-configmap
- # mountPath: /prometheus
- # configMap: certs-configmap
- # readOnly: true
-
- ## Set a custom affinity for node-exporter
- ##
# affinity:
-
- ## Node tolerations for node-exporter scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for node-exporter pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
nodeSelector: {}
-
- ## Annotations to be added to node-exporter pods
- ##
podAnnotations: {}
-
- ## Annotations to be added to the node-exporter DaemonSet
- ##
- deploymentAnnotations: {}
-
- ## Labels to be added to node-exporter pods
- ##
+ annotations: {}
pod:
labels: {}
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
podDisruptionBudget:
enabled: false
maxUnavailable: 1
-
- ## node-exporter resource limits & requests
- ## Ref: https://kubernetes.io/docs/user-guide/compute-resources/
- ##
resources: {}
- # limits:
- # cpu: 200m
- # memory: 50Mi
- # requests:
- # cpu: 100m
- # memory: 30Mi
-
- ## Security context to be added to node-exporter pods
- ##
securityContext: {}
- # runAsUser: 0
-
service:
annotations:
prometheus.io/scrape: "true"
labels: {}
-
- # Exposed as a headless service:
- # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services
clusterIP: None
-
- ## List of IP addresses at which the node-exporter service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
externalIPs: []
-
hostPort: 9100
loadBalancerIP: ""
loadBalancerSourceRanges: []
servicePort: 9100
type: ClusterIP
- # Install Prometheus Push Gateway.
- pushgateway:
- ## If false, pushgateway will not be installed
- ##
- enabled: false
-
- ## Provide a full name override for Prometheus push gateway.
- # fullnameOverride: ""
-
- ## Use an alternate scheduler, e.g. "stork".
- ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
- ##
- # schedulerName:
-
- ## pushgateway container name
- ##
- name: pushgateway
-
- ## pushgateway container image
- ##
- image:
- repository: prom/pushgateway
- tag: v1.9.0
- pullPolicy: IfNotPresent
-
- ## pushgateway priorityClassName
- ##
- priorityClassName: ""
-
- ## Additional pushgateway container arguments
- ##
- ## for example: persistence.file: /data/pushgateway.data
- extraArgs: {}
-
- ingress:
- ## If true, pushgateway Ingress will be created
- ##
- enabled: false
-
- ## pushgateway Ingress annotations
- ##
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: 'true'
-
- ## pushgateway Ingress hostnames with optional path
- ## Must be provided if Ingress is enabled
- ##
- hosts: []
- # - pushgateway.domain.com
- # - domain.com/pushgateway
-
- ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
- extraPaths: []
- # - path: /*
- # backend:
- # serviceName: ssl-redirect
- # servicePort: use-annotation
-
- ## pushgateway Ingress TLS configuration
- ## Secrets must be manually created in the namespace
- ##
- tls: []
- # - secretName: prometheus-alerts-tls
- # hosts:
- # - pushgateway.domain.com
-
- ## Node tolerations for pushgateway scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
- tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
- ## Node labels for pushgateway pod assignment
- ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
- ##
- nodeSelector: {}
-
- ## Annotations to be added to pushgateway pods
- ##
- podAnnotations: {}
-
- replicaCount: 1
-
- ## PodDisruptionBudget settings
- ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
- ##
- podDisruptionBudget:
- enabled: false
- maxUnavailable: 1
-
- ## pushgateway resource requests and limits
- ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
- ##
- resources: {}
- # limits:
- # cpu: 10m
- # memory: 32Mi
- # requests:
- # cpu: 10m
- # memory: 32Mi
-
- ## Security context to be added to push-gateway pods
- ##
- securityContext:
- runAsUser: 1001
- runAsNonRoot: true
-
- service:
- annotations:
- prometheus.io/probe: pushgateway
- labels: {}
- clusterIP: ""
-
- ## List of IP addresses at which the pushgateway service is available
- ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
- ##
- externalIPs: []
-
- loadBalancerIP: ""
- loadBalancerSourceRanges: []
- servicePort: 9091
- type: ClusterIP
-
- strategy:
- type: Recreate
- rollingUpdate: null
-
-
- persistentVolume:
- ## If true, pushgateway will create/use a Persistent Volume Claim
- ## If false, use emptyDir
- ##
- enabled: true
-
- ## pushgateway data Persistent Volume access modes
- ## Must match those of existing PV or dynamic provisioner
- ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
- ##
- accessModes:
- - ReadWriteOnce
-
- ## pushgateway data Persistent Volume Claim annotations
- ##
- annotations: {}
-
- ## pushgateway data Persistent Volume existing claim name
- ## Requires pushgateway.persistentVolume.enabled: true
- ## If defined, PVC must be created manually before volume will be bound
- existingClaim: ""
-
- ## pushgateway data Persistent Volume mount root path
- ##
- mountPath: /data
-
- ## pushgateway data Persistent Volume size
- ##
- size: 2Gi
-
- ## pushgateway data Persistent Volume Storage Class
- ## If defined, storageClassName: <storageClass>
- ## If set to "-", storageClassName: "", which disables dynamic provisioning
- ## If undefined (the default) or set to null, no storageClassName spec is
- ## set, choosing the default provisioner. (gp2 on AWS, standard on
- ## GKE, AWS & OpenStack)
- ##
- # storageClass: "-"
-
- ## pushgateway data Persistent Volume Binding Mode
- ## If defined, volumeBindingMode: <volumeBindingMode>
- ## If undefined (the default) or set to null, no volumeBindingMode spec is
- ## set, choosing the default mode.
- ##
- # volumeBindingMode: ""
-
- ## Subdirectory of pushgateway data Persistent Volume to mount
- ## Useful if the volume's root directory is not empty
- ##
- subPath: ""
-
serverFiles:
## Alerts configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
alerting_rules.yml: {}
- # groups:
- # - name: Instances
- # rules:
- # - alert: InstanceDown
- # expr: up == 0
- # for: 5m
- # labels:
- # severity: page
- # annotations:
- # description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.'
- # summary: 'Instance {{ $labels.instance }} down'
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use alerting_rules.yml
- alerts: {}
## Records configuration
## Ref: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/
recording_rules.yml: {}
- ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use recording_rules.yml
prometheus.yml:
rule_files:
- /etc/config/recording_rules.yml
- /etc/config/alerting_rules.yml
- ## Below two files are DEPRECATED will be removed from this default values file
- - /etc/config/rules
- - /etc/config/alerts
scrape_configs:
- job_name: prometheus
static_configs:
@@ -2098,9 +1181,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes-cadvisor'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2159,9 +1241,8 @@
# and services to allow each to use different authentication configs.
#
# Kubernetes labels will be added as Prometheus labels on metrics via the
# `labelmap` relabeling action.
-
- job_name: 'kubernetes-nodes'
# Default to scraping over https. If required, just disable this or change to
# `http`.
@@ -2252,21 +1333,8 @@
metric_relabel_configs:
- source_labels: [__name__]
regex: (container_cpu_allocation|container_cpu_usage_seconds_total|container_fs_limit_bytes|container_fs_writes_bytes_total|container_gpu_allocation|container_memory_allocation_bytes|container_memory_usage_bytes|container_memory_working_set_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|DCGM_FI_DEV_GPU_UTIL|deployment_match_labels|kube_daemonset_status_desired_number_scheduled|kube_daemonset_status_number_ready|kube_deployment_spec_replicas|kube_deployment_status_replicas|kube_deployment_status_replicas_available|kube_job_status_failed|kube_namespace_annotations|kube_namespace_labels|kube_node_info|kube_node_labels|kube_node_status_allocatable|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_memory_bytes|kube_node_status_capacity|kube_node_status_capacity_cpu_cores|kube_node_status_capacity_memory_bytes|kube_node_status_condition|kube_persistentvolume_capacity_bytes|kube_persistentvolume_status_phase|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_pod_container_info|kube_pod_container_resource_limits|kube_pod_container_resource_limits_cpu_cores|kube_pod_container_resource_limits_memory_bytes|kube_pod_container_resource_requests|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests_memory_bytes|kube_pod_container_status_restarts_total|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_labels|kube_pod_owner|kube_pod_status_phase|kube_replicaset_owner|kube_statefulset_replicas|kube_statefulset_status_replicas|kubecost_cluster_info|kubecost_cluster_management_cost|kubecost_cluster_memory_working_set_bytes|kubecost_load_balancer_cost|kubecost_network_internet_egress_cost|kubecost_network_region_egress_cost|kubecost_network_zone_egress_cost|kubecost_node_is_spot|kubecost_pod_network_egress_bytes_total|node_cpu_hourly_cost|node_cpu_seconds_total|node_disk_reads_completed|node_disk_reads_completed_total|node_disk_writes_completed|node_disk_writes_completed_total|node_filesystem_device_error|node_gpu_count|node_gpu_hourly_cost|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_network_transmit_bytes_total|node_ram_hourly_cost|node_total_hourly_cost|pod_pvc_allocation|pv_hourly_cost|service_selector_labels|statefulSet_match_labels|kubecost_pv_info|up)
action: keep
-
-
- # prometheus.yml: # Sample block -- enable if using an in cluster durable store.
- # remote_write:
- # - url: "http://pgprometheus-adapter:9201/write"
- # write_relabel_configs:
- # - source_labels: [__name__]
- # regex: 'container_.*_allocation|container_.*_allocation_bytes|.*_hourly_cost|kube_pod_container_resource_requests{resource="memory", unit="byte"}|container_memory_working_set_bytes|kube_pod_container_resource_requests{resource="cpu", unit="core"}|kube_pod_container_resource_requests|pod_pvc_allocation|kube_namespace_labels|kube_pod_labels'
- # action: keep
- # queue_config:
- # max_samples_per_send: 1000
- # remote_read:
- # - url: "http://pgprometheus-adapter:9201/read"
rules:
groups:
- name: CPU
rules:
@@ -2307,13 +1375,10 @@
# regex: (.+)\d+
# target_label: dc
networkPolicy:
- ## Enable creation of NetworkPolicy resources.
- ##
enabled: false
-
## Optional daemonset to more accurately attribute network costs to the correct workload
## https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration
networkCosts:
enabled: false
@@ -2332,14 +1397,15 @@
# Traffic Logging will enable logging the top 5 destinations for each source
# every 30 minutes.
trafficLogging: true
+ # Log level for the network cost containers. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# Port will set both the containerPort and hostPort to this value.
# These must be identical due to network-costs being run on hostNetwork
port: 3001
- # this daemonset can use significant resources on large clusters: https://guide.kubecost.com/hc/en-us/articles/4407595973527-Network-Traffic-Cost-Allocation
+ # this daemonset can use significant resources on large clusters: https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/cost-allocation/network-allocation
resources:
limits: # remove the limits by setting cpu: null
cpu: 500m # can be less, will depend on cluster size
# memory: it is not recommended to set a memory limit
@@ -2410,75 +1476,41 @@
# ips:
# - "15.128.15.2"
# - "20.0.0.0/8"
- ## Node tolerations for server scheduling to nodes with taints
- ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
- ##
tolerations: []
- # - key: "key"
- # operator: "Equal|Exists"
- # value: "value"
- # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-
affinity: {}
-
service:
annotations: {}
labels: {}
-
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- ## PodMonitor
- ## Allows scraping of network metrics from a dedicated prometheus operator setup
podMonitor:
enabled: false
additionalLabels: {}
- # match the default extraScrapeConfig
additionalLabels: {}
nodeSelector: {}
+ # Annotations to be added to network cost daemonset template and pod template annotations
annotations: {}
healthCheckProbes: {}
- # readinessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
- # livenessProbe:
- # tcpSocket:
- # port: 3001
- # initialDelaySeconds: 5
- # periodSeconds: 10
- # failureThreshold: 5
additionalSecurityContext: {}
- # readOnlyRootFilesystem: true
## Kubecost Deployment Configuration
## Used for HA mode in Business & Enterprise tier
##
kubecostDeployment:
replicas: 1
- # deploymentStrategy:
- # rollingUpdate:
- # maxSurge: 1
- # maxUnavailable: 1
- # type: RollingUpdate
labels: {}
annotations: {}
-
## Kubecost Forecasting forecasts future cost patterns based on historical
## patterns observed by Kubecost.
forecasting:
enabled: true
# fullImageName overrides the default image construction logic. The exact
# image provided (registry, image, tag) will be used for the forecasting
# container.
- # Example: fullImageName: gcr.io/kubecost1/forecasting:v0.0.1
- fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.18
imagePullPolicy: IfNotPresent
# Resource specification block for the forecasting container.
resources:
@@ -2494,30 +1526,20 @@
# -t is the worker timeout which primarily affects model training time;
# if it is not high enough, training workers may die mid training
"GUNICORN_CMD_ARGS": "--log-level info -t 1200"
- # Define a priority class for the forecasting Deployment.
priority:
enabled: false
name: ""
-
- # Define a nodeSelector for the forecasting Deployment.
nodeSelector: {}
-
- # Define tolerations for the forecasting Deployment.
tolerations: []
-
- # Define Pod affinity for the forecasting Deployment.
+ annotations: {}
affinity: {}
-
- # Define a readiness probe for the forecasting container
readinessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 200
-
- # Define a liveness probe for the forecasting container.
livenessProbe:
enabled: true
initialDelaySeconds: 10
periodSeconds: 10
@@ -2545,8 +1567,9 @@
# Replicas sets the number of Aggregator replicas. It only has an effect if
# `deployMethod: "statefulset"`
replicas: 1
+ # Log level for the aggregator container. Options are "trace", "debug", "info", "warn", "error", "fatal", "panic"
logLevel: info
# stagingEmptyDirSizeLimit changes how large the "staging"
# /var/configs/waterfowl emptyDir is. It only takes effect in StatefulSet
@@ -2673,8 +1696,11 @@
## Define tolerations for the aggregator pod
# tolerations: []
+ ## Annotations to be added for aggregator deployment or statefulset
+ # annotations: {}
+
## Define Pod affinity for the aggregator pod
# affinity: {}
## Define extra volumes for the aggregator pod
@@ -2737,9 +1763,8 @@
jaeger:
enabled: false
image: jaegertracing/all-in-one
imageVersion: latest
- # containerSecurityContext:
service:
labels: {}
@@ -2785,8 +1810,10 @@
securityContext: {}
containerSecurityContext: {}
nodeSelector: {}
tolerations: []
+ ## Annotations to be added for diagnostics Deployment.
+ annotations: {}
affinity: {}
## Provide a full name override for the diagnostics Deployment.
# diagnosticsFullnameOverride: ""
@@ -2797,14 +1824,16 @@
image:
repository: gcr.io/kubecost1/cluster-controller
tag: v0.16.9
imagePullPolicy: IfNotPresent
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Set custom tolerations for the cluster controller.
tolerations: []
+
+ ## Annotations to be added for cluster controller template
+ annotations: {}
resources: {}
+ affinity: {}
+ nodeSelector: {}
actionConfigs:
# this configures the Kubecost Cluster Turndown action
# for more details, see documentation at https://github.com/kubecost/cluster-turndown/tree/develop?tab=readme-ov-file#setting-a-turndown-schedule
clusterTurndown: []
@@ -2950,12 +1979,12 @@
# initChownDataImage ensures all Kubecost filepath permissions on PV or local storage are set up correctly.
initChownDataImage: "busybox" # Supports a fully qualified Docker image, e.g. registry.hub.docker.com/library/busybox:latest
initChownData:
resources: {}
- # requests:
- # cpu: "50m"
- # memory: "20Mi"
+## Kubecost's Bundled Grafana
+## You can access it by visiting http://kubecost.me.com/grafana/
+## Ref: https://docs.kubecost.com/install-and-configure/advanced-configuration/custom-grafana
grafana:
# namespace_datasources: kubecost # override the default namespace here
# namespace_dashboards: kubecost # override the default namespace here
rbac:
@@ -2987,106 +2016,45 @@
# prometheusType: Prometheus
# prometheusVersion: 2.35.0
# timeInterval: 1m
- ## Number of replicas for the Grafana deployment
replicas: 1
-
- ## Deployment strategy for the Grafana deployment
deploymentStrategy: RollingUpdate
-
- ## Readiness probe for the Grafana deployment
readinessProbe:
httpGet:
path: /api/health
port: 3000
-
- ## Liveness probe for the Grafana deployment
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 60
timeoutSeconds: 30
failureThreshold: 10
-
- ## Container image settings for the Grafana deployment
image:
repository: grafana/grafana
tag: 11.3.1
pullPolicy: IfNotPresent
-
- ## Optionally specify an array of imagePullSecrets.
- ## Secrets must be manually created in the namespace.
# pullSecrets:
- # - myRegistrKeySecretName
-
- ## Pod-level security context for the Grafana deployment. Recommended let global defaults take effect.
securityContext: {}
- # runAsUser: 472
- # fsGroup: 472
-
- ## PriorityClassName for the Grafana deployment
priorityClassName: ""
## Container image settings for Grafana initContainer used to download dashboards. Will only be used when dashboards are present.
downloadDashboardsImage:
repository: curlimages/curl
tag: latest
pullPolicy: IfNotPresent
-
- ## Pod Annotations for the Grafana deployment
podAnnotations: {}
-
- ## Deployment annotations for the Grafana deployment
annotations: {}
-
- ## Expose the Grafana service to be accessed from outside the cluster (LoadBalancer service).
- ## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
service:
type: ClusterIP
port: 80
annotations: {}
labels: {}
-
- ## This template is not needed and is not supported.
- ## It is here for backwards compatibility.
- ## Kubecost exposes grafana by default with the
- ## top level ingress template under /grafana/
- ingress:
- enabled: false
- annotations: {}
- # kubernetes.io/ingress.class: nginx
- # kubernetes.io/tls-acme: "true"
- labels: {}
- path: /
- pathType: Prefix
- hosts:
- - chart-example.local
- tls: []
- # - secretName: chart-example-tls
- # hosts:
- # - chart-example.local
-
- ## Resource requests and limits for the Grafana deployment
resources: {}
- # limits:
- # cpu: 100m
- # memory: 128Mi
- # requests:
- # cpu: 100m
- # memory: 128Mi
-
- ## Node labels for pod assignment of the Grafana deployment
nodeSelector: {}
-
- ## Tolerations for pod assignment of the Grafana deployment
tolerations: []
-
- ## Affinity for pod assignment of the Grafana deployment
affinity: {}
-
- ## Enable persistence using Persistent Volume Claims of the Grafana deployment
persistence:
enabled: false
# storageClassName: default
# accessModes:
@@ -3094,123 +2062,24 @@
# size: 10Gi
# annotations: {}
# subPath: ""
# existingClaim:
-
- ## Admin user for Grafana
adminUser: admin
-
- ## Admin password for Grafana
adminPassword: strongpassword
-
- ## Use an alternate scheduler for the Grafana deployment
# schedulerName:
-
- ## Extra environment variables that will be passed onto Grafana deployment pods
env: {}
-
- ## The name of a secret for Grafana in the same Kubernetes namespace which contain values to be added to the environment
- ## This can be useful for auth tokens, etc
envFromSecret: ""
-
- ## Additional Grafana server secret mounts
- ## Defines additional mounts with secrets. Secrets must be manually created in the namespace.
extraSecretMounts: []
- # - name: secret-files
- # mountPath: /etc/secrets
- # secretName: grafana-secret-files
- # readOnly: true
-
- ## List of Grafana plugins
plugins: []
- # - digrich-bubblechart-panel
- # - grafana-clock-panel
-
- ## Grafana dashboard providers
- ## ref: http://docs.grafana.org/administration/provisioning/#dashboards
- ##
- ## `path` must be /var/lib/grafana/dashboards/<provider_name>
- ##
dashboardProviders: {}
- # dashboardproviders.yaml:
- # apiVersion: 1
- # providers:
- # - name: 'default'
- # orgId: 1
- # folder: ''
- # type: file
- # disableDeletion: false
- # editable: true
- # options:
- # path: /var/lib/grafana/dashboards/default
-
- ## Configure Grafana dashboard to import
- ## NOTE: To use dashboards you must also enable/configure dashboardProviders
- ## ref: https://grafana.com/dashboards
- ##
- ## dashboards per provider, use provider name as key.
- ##
dashboards: {}
- # default:
- # prometheus-stats:
- # gnetId: 3662
- # revision: 2
- # datasource: Prometheus
-
- ## Reference to external Grafana ConfigMap per provider. Use provider name as key and ConfiMap name as value.
- ## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both.
- ## ConfigMap data example:
- ##
- ## data:
- ## example-dashboard.json: |
- ## RAW_JSON
- ##
dashboardsConfigMaps: {}
- # default: ""
-
- ## LDAP Authentication for Grafana can be enabled with the following values on grafana.ini
- ## NOTE: Grafana will fail to start if the value for ldap.toml is invalid
- # auth.ldap:
- # enabled: true
- # allow_sign_up: true
- # config_file: /etc/grafana/ldap.toml
-
- ## Grafana's LDAP configuration
- ## Templated by the template in _helpers.tpl
- ## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#auth-ldap
- ## ref: http://docs.grafana.org/installation/ldap/#configuration
- ldap:
- # `existingSecret` is a reference to an existing secret containing the ldap configuration
- # for Grafana in a key `ldap-toml`.
- existingSecret: ""
- # `config` is the content of `ldap.toml` that will be stored in the created secret
- config: ""
- # config: |-
- # verbose_logging = true
-
- # [[servers]]
- # host = "my-ldap-server"
- # port = 636
- # use_ssl = true
- # start_tls = false
- # ssl_skip_verify = false
- # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com"
-
- ## Grafana's SMTP configuration
- ## NOTE: To enable, grafana.ini must be configured with smtp.enabled
- ## ref: http://docs.grafana.org/installation/configuration/#smtp
- smtp:
- # `existingSecret` is a reference to an existing secret containing the smtp configuration
- # for Grafana in keys `user` and `password`.
- existingSecret: ""
-
## Grafana sidecars that collect the configmaps with specified label and stores the included files them into the respective folders
## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards
sidecar:
image:
repository: ghcr.io/kiwigrid/k8s-sidecar
- tag: 1.28.0
+ tag: 1.28.1
pullPolicy: IfNotPresent
resources: {}
dashboards:
enabled: true
@@ -3226,9 +2095,8 @@
enabled: false
error_throttle_sleep: 0
# label that the configmaps with datasources are marked with
label: grafana_datasource
-
## Grafana's primary configuration
## NOTE: values in map will be converted to ini format
## ref: http://docs.grafana.org/installation/configuration/
##
@@ -3256,21 +2124,15 @@
serviceAccount:
create: true # Set this to false if you're bringing your own service account.
annotations: {}
- # name: kc-test
awsstore:
useAwsStore: false
- imageNameAndVersion: gcr.io/kubecost1/awsstore:latest # Name and version of the container image for AWSStore.
+ imageNameAndVersion: gcr.io/kubecost1/awsstore:latest
createServiceAccount: false
- ## PriorityClassName
- ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
priorityClassName: ""
- # Use a custom nodeSelector for AWSStore.
nodeSelector: {}
- # kubernetes.io/arch: amd64
- ## Annotations for the AWSStore ServiceAccount.
annotations: {}
## Federated ETL Architecture
## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl
@@ -3331,9 +2193,9 @@
# address: http://cluster-a.kubecost.com:9090
# # Optional authentication credentials - only basic auth is currently supported.
# auth:
# type: basic
-# # Secret name should be a secret formatted based on: https://github.com/kubecost/docs/blob/main/ingress-examples.md
+# # Secret name should be a secret formatted based on: https://github.com/kubecost/poc-common-configurations/tree/main/ingress-examples
# secretName: cluster-a-auth
# # Or pass auth directly as base64 encoded user:pass
# data: YWRtaW46YWRtaW4=
# # Or user and pass directly
@@ -3369,10 +2231,10 @@
# gpuLabel: gpu
# gpuLabelValue: true
# alibabaServiceKeyName: ""
# alibabaServiceKeyPassword: ""
-# awsServiceKeyName: ACCESSKEYID
-# awsServiceKeyPassword: fakepassword # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName
+# awsServiceKeyName: ""
+# awsServiceKeyPassword: ""
# awsSpotDataRegion: us-east-1
# awsSpotDataBucket: spot-data-feed-s3-bucket
# awsSpotDataPrefix: dev
# athenaProjectID: "530337586277" # The AWS AccountID where the Athena CUR is. Generally your masterpayer account
@@ -3551,4 +2413,8 @@
# host: kubecost.kubecost.svc.cluster.local
# port:
# number: 80
+# -- Optional override for the image used for the basic health test container
+# basicHealth:
+# fullImageName: alpine/k8s:1.26.9
+ |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2025-01-01 13:53:30.963710311 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2025-01-01 13:53:03.426368054 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 45f899ca0f060cb78b76717b768816a257756505a52b46a72a552cbed367f9ce
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJlbmFibGVkIjp0cnVlLCJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInBhdGhUeXBlIjoiSW1wbGVtZW50YXRpb25TcGVjaWZpYyIsInBhdGhzIjpbIi8iXSwidGxzIjpbeyJob3N0cyI6WyJrdWJlY29zdC0xMjctMC0wLTEubmlwLmlvIl0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjEifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtMTI3LTAtMC0xLm5pcC5pbyJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsRGFpbHlTdG9yZUR1cmF0aW9uRGF5cyI6OTEsImV0bEhvdXJseVN0b3JlRHVyYXRpb25Ib3VycyI6NDksImV0bFJlYWRPbmx5TW9kZSI6ZmFsc2UsImV4dHJhQXJncyI6W10sImV4dHJhUG9ydHMiOltdLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvY29zdC1tb2RlbCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJsb2dMZXZlbCI6ImluZm8iLCJtYXhRdWVyeUNvbmN1cnJlbmN5Ijo1LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIyMDBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXRjT2Zmc2V0IjoiKzAwOjAwIn0sImt1YmVjb3N0UHJvZHVjdENvbmZpZ3MiOnsiY2x1c3Rlck5hbWUiOiJzeC1jbnAtb3NzIERlbW8iLCJjbHVzdGVyUHJvZmlsZSI6ImRldmVsb3BtZW50IiwiY3VycmVuY3lDb2RlIjoiRVVSIiwiY3VzdG9tUHJpY2VzRW5hYmxlZCI6dHJ1ZSwiZGVmYXVsdE1vZGVsUHJpY2luZyI6eyJDUFUiOiIyOC4wIiwiR1BVIjoiNjkzLjUwIiwiUkFNIjoiMy4wOSIsImVuYWJsZWQiOnRydWUsImludGVybmV0TmV0d29ya0VncmVzcyI6IjAuMTIiLCJyZWdpb25OZXR3b3JrRWdyZXNzIjoiMC4wMSIsInNwb3RDUFUiOiI0Ljg2Iiwic3BvdEdQVSI6IjIyNS4wIiwic3BvdFJBTSI6IjAuNjUiLCJzdG9yYWdlIjoiMC4wNCIsInpvbmVOZXR3b3JrRWdyZXNzIjoiMC4wMSJ9fSwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhbm5vdGF0aW9ucyI6e30sImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLiBUaGUgbGFiZWwgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBLOHMgc2VydmljZSBlbmRwb2ludHMgYW5kIG5vdCBqdXN0IHBvZHMuXG4jIyBSZWZzOlxuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9ncHUtb3BlcmF0b3IvYmxvYi9kNDMxNmE0MTViYmQ2ODRjZTg0MTZhODgwNDIzMDVmYzFhMDkzYWE0L2Fzc2V0cy9zdGF0ZS1kY2dtLWV4cG9ydGVyLzA2MDBfc2VydmljZS55YW1sI0w3XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2RjZ20tZXhwb3J0ZXIvYmxvYi81NGZkMWNhMTM3YzY2NTExYTg3YTcyMDM5MDYxMzY4MGI5YmRhYmRkL2RlcGxveW1lbnQvdGVtcGxhdGVzL3NlcnZpY2UueWFtbCNMMjNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWRjZ20tZXhwb3J0ZXJcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogZW5kcG9pbnRzXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwLCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fY29tcG9uZW50LCBfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICg/aSkoLipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLip8LipkY2dtLWV4cG9ydGVyLiopXG4iLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhZmZpbml0eSI6e30sImFsZXJ0bWFuYWdlcnMiOltdLCJhbm5vdGF0aW9ucyI6e30sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiXSwic2NyYXBlX2NvbmZpZ3MiOlt7ImpvYl9uYW1lIjoicHJvbWV0aGV1cyIsInN0YXRpY19jb25maWdzIjpbeyJ0YXJnZXRzIjpbImxvY2FsaG9zdDo5MDkwIl19XX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2Rlcy1jYWR2aXNvciIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX2lub2Rlc19mcmVlfGNvbnRhaW5lcl9mc19pbm9kZXNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfc3BlY19jcHVfc2hhcmVzfGNvbnRhaW5lcl9zcGVjX21lbW9yeV9saW1pdF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNhZHZpc29yX3ZlcnNpb25faW5mb3xrdWJlY29zdF9wdl9pbmZvKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJjb250YWluZXIiXSwidGFyZ2V0X2xhYmVsIjoiY29udGFpbmVyX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbInBvZCJdLCJ0YXJnZXRfbGFiZWwiOiJwb2RfbmFtZSJ9XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzL2NhZHZpc29yIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGt1YmVsZXRfdm9sdW1lX3N0YXRzX3VzZWRfYnl0ZXMpIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcyIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtc2VydmljZS1lbmRwb2ludHMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJlbmRwb2ludHMifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6Iihjb250YWluZXJfY3B1X2FsbG9jYXRpb258Y29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9ncHVfYWxsb2NhdGlvbnxjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXN8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8RENHTV9GSV9ERVZfR1BVX1VUSUx8ZGVwbG95bWVudF9tYXRjaF9sYWJlbHN8a3ViZV9kYWVtb25zZXRfc3RhdHVzX2Rlc2lyZWRfbnVtYmVyX3NjaGVkdWxlZHxrdWJlX2RhZW1vbnNldF9zdGF0dXNfbnVtYmVyX3JlYWR5fGt1YmVfZGVwbG95bWVudF9zcGVjX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc19hdmFpbGFibGV8a3ViZV9qb2Jfc3RhdHVzX2ZhaWxlZHxrdWJlX25hbWVzcGFjZV9hbm5vdGF0aW9uc3xrdWJlX25hbWVzcGFjZV9sYWJlbHN8a3ViZV9ub2RlX2luZm98a3ViZV9ub2RlX2xhYmVsc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGVfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHl8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jb25kaXRpb258a3ViZV9wZXJzaXN0ZW50dm9sdW1lX2NhcGFjaXR5X2J5dGVzfGt1YmVfcGVyc2lzdGVudHZvbHVtZV9zdGF0dXNfcGhhc2V8a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1faW5mb3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9yZXNvdXJjZV9yZXF1ZXN0c19zdG9yYWdlX2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9pbmZvfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19jcHVfY29yZXN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Jlc3RhcnRzX3RvdGFsfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcnVubmluZ3xrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3Rlcm1pbmF0ZWRfcmVhc29ufGt1YmVfcG9kX2xhYmVsc3xrdWJlX3BvZF9vd25lcnxrdWJlX3BvZF9zdGF0dXNfcGhhc2V8a3ViZV9yZXBsaWNhc2V0X293bmVyfGt1YmVfc3RhdGVmdWxzZXRfcmVwbGljYXN8a3ViZV9zdGF0ZWZ1bHNldF9zdGF0dXNfcmVwbGljYXN8a3ViZWNvc3RfY2x1c3Rlcl9pbmZvfGt1YmVjb3N0X2NsdXN0ZXJfbWFuYWdlbWVudF9jb3N0fGt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGt1YmVjb3N0X2xvYWRfYmFsYW5jZXJfY29zdHxrdWJlY29zdF9uZXR3b3JrX2ludGVybmV0X2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfcmVnaW9uX2VncmVzc19jb3N0fGt1YmVjb3N0X25ldHdvcmtfem9uZV9lZ3Jlc3NfY29zdHxrdWJlY29zdF9ub2RlX2lzX3Nwb3R8a3ViZWNvc3RfcG9kX25ldHdvcmtfZWdyZXNzX2J5dGVzX3RvdGFsfG5vZGVfY3B1X2hvdXJseV9jb3N0fG5vZGVfY3B1X3NlY29uZHNfdG90YWx8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkX3RvdGFsfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkfG5vZGVfZGlza193cml0ZXNfY29tcGxldGVkX3RvdGFsfG5vZGVfZmlsZXN5c3RlbV9kZXZpY2VfZXJyb3J8bm9kZV9ncHVfY291bnR8bm9kZV9ncHVfaG91cmx5X2Nvc3R8bm9kZV9tZW1vcnlfQnVmZmVyc19ieXRlc3xub2RlX21lbW9yeV9DYWNoZWRfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtQXZhaWxhYmxlX2J5dGVzfG5vZGVfbWVtb3J5X01lbUZyZWVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtVG90YWxfYnl0ZXN8bm9kZV9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfG5vZGVfcmFtX2hvdXJseV9jb3N0fG5vZGVfdG90YWxfaG91cmx5X2Nvc3R8cG9kX3B2Y19hbGxvY2F0aW9ufHB2X2hvdXJseV9jb3N0fHNlcnZpY2Vfc2VsZWN0b3JfbGFiZWxzfHN0YXRlZnVsU2V0X21hdGNoX2xhYmVsc3xrdWJlY29zdF9wdl9pbmZvfHVwKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6dHJ1ZSwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY3JhcGUiXX0seyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoLipub2RlLWV4cG9ydGVyfGt1YmVjb3N0LW5ldHdvcmstY29zdHMpIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19lbmRwb2ludHNfbmFtZSJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihodHRwcz8pIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19zY2hlbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19zY2hlbWVfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcGF0aCJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoW146XSspKD86OlxcZCspPzsoXFxkKykiLCJyZXBsYWNlbWVudCI6IiQxOiQyIiwic291cmNlX2xhYmVscyI6WyJfX2FkZHJlc3NfXyIsIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BvcnQiXSwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2xhYmVsXyguKykifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25hbWVzcGFjZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWVzcGFjZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfcG9kX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25vZGUifV19XX0sInJlY29yZGluZ19ydWxlcy55bWwiOnt9LCJydWxlcyI6eyJncm91cHMiOlt7Im5hbWUiOiJDUFUiLCJydWxlcyI6W3siZXhwciI6InN1bShyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkpIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2U6cmF0ZTVtIn0seyJleHByIjoicmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pIiwicmVjb3JkIjoiY2x1c3RlcjpjcHVfdXNhZ2Vfbm9zdW06cmF0ZTVtIn0seyJleHByIjoiYXZnKGlyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiUE9EXCIsIGNvbnRhaW5lciE9XCJcIn1bNW1dKSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9jcHVfdXNhZ2VfaXJhdGUifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkgYnkgKGNvbnRhaW5lcixwb2QsbmFtZXNwYWNlKSIsInJlY29yZCI6Imt1YmVjb3N0X2NvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifSx7ImV4cHIiOiJzdW0oY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3tjb250YWluZXIhPVwiUE9EXCIsY29udGFpbmVyIT1cIlwifSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9XX0seyJuYW1lIjoiU2F2aW5ncyIsInJ1bGVzIjpbeyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX2NwdV9hbGxvY2F0aW9uKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19jcHVfYWxsb2NhdGlvbiJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcykgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMifV19XX19LCJzZXJ2aWNlQWNjb3VudHMiOnsiYWxlcnRtYW5hZ2VyIjp7ImNyZWF0ZSI6dHJ1ZX0sIm5vZGVFeHBvcnRlciI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9fX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2025-01-01 13:53:30.963710311 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2025-01-01 13:53:03.426368054 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2025-01-01 13:53:30.966710349 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2025-01-01 13:53:30.963710311 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2025-01-01 13:53:03.426368054 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2025-01-01 13:53:30.963710311 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2025-01-01 13:53:03.426368054 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2025-01-01 13:53:30.963710311 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2025-01-01 13:53:03.426368054 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2025-01-01 13:53:30.963710311 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2025-01-01 13:53:03.426368054 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2025-01-01 13:53:30.965710336 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2025-01-01 13:53:03.428368079 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2025-01-01 13:53:30.966710349 +0000
+++ out/pr/kubecost/values-k3d.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2025-01-01 13:53:03.429368092 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2025-01-01 13:53:03.699371530 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2025-01-01 13:53:03.699371530 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2025-01-01 13:53:03.699371530 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2025-01-01 13:53:03.699371530 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2025-01-01 13:53:31.239713724 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2025-01-01 13:53:03.697371504 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2025-01-01 13:53:03.700371542 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 85ffb7d70df73fa23802794bd8b0aadf0599d15396986db4b51fbd4f7b14015c
+ checksum/configs: 45f899ca0f060cb78b76717b768816a257756505a52b46a72a552cbed367f9ce
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInByb21ldGhldXMiOnsiZW5hYmxlZCI6dHJ1ZSwiZnFkbiI6Imh0dHA6Ly9zeC1rdWJlLXByb21ldGhldXMtc3RhY2stcHJvbWV0aGV1cy5tb25pdG9yaW5nOjkwOTAvIn0sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LW1hbmFnZXIuaW8vY2x1c3Rlci1pc3N1ZXIiOiJsZXRzZW5jcnlwdC1zdGFnaW5nIn0sImNsYXNzTmFtZSI6Im5naW54IiwiZW5hYmxlZCI6dHJ1ZSwiaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QtbWV0YWxzdGFjay5wbGF0Zm9ybS1lbmdpbmVlci5jbG91ZCJdLCJzZWNyZXROYW1lIjoia3ViZWNvc3Qtc2VydmVyLXRscyJ9XX0sImluaXRDaG93bkRhdGEiOnsicmVzb3VyY2VzIjp7fX0sImluaXRDaG93bkRhdGFJbWFnZSI6ImJ1c3lib3giLCJrdWJlY29zdERlcGxveW1lbnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJyZXBsaWNhcyI6MX0sImt1YmVjb3N0RnJvbnRlbmQiOnsiZGVwbG95TWV0aG9kIjoic2luZ2xlcG9kIiwiZGVwbG95bWVudFN0cmF0ZWd5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiaGFSZXBsaWNhcyI6MiwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Zyb250ZW5kIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwiaXB2NiI6eyJlbmFibGVkIjp0cnVlfSwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlc291cmNlcyI6eyJyZXF1ZXN0cyI6eyJjcHUiOiIxMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1c2VEZWZhdWx0RnFkbiI6ZmFsc2V9LCJrdWJlY29zdE1ldHJpY3MiOnt9LCJrdWJlY29zdE1vZGVsIjp7ImNvbnRhaW5lclN0YXRzRW5hYmxlZCI6dHJ1ZSwiZXRsIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsRmlsZVN0b3JlRW5hYmxlZCI6dHJ1ZSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAiLCJ3YXJtQ2FjaGUiOmZhbHNlfSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJQVkVuYWJsZWQiOmZhbHNlLCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImJhc2VVUkwiOiIiLCJjb25maWdNYXBPdmVycmlkZU5hbWUiOiIiLCJjb25maWdQYXRoIjoiL2V0Yy9jb25maWcvcHJvbWV0aGV1cy55bWwiLCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnt9LCJkZXBsb3ltZW50QW5ub3RhdGlvbnMiOnt9LCJlbXB0eURpciI6eyJzaXplTGltaXQiOiIifSwiZW5hYmxlZCI6dHJ1ZSwiZW52IjpbXSwiZXh0cmFBcmdzIjp7InF1ZXJ5Lm1heC1jb25jdXJyZW5jeSI6MSwicXVlcnkubWF4LXNhbXBsZXMiOjEwMDAwMDAwMH0sImV4dHJhQ29uZmlnbWFwTW91bnRzIjpbXSwiZXh0cmFGbGFncyI6WyJ3ZWIuZW5hYmxlLWxpZmVjeWNsZSJdLCJleHRyYUhvc3RQYXRoTW91bnRzIjpbXSwiZXh0cmFJbml0Q29udGFpbmVycyI6W10sImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZXh0cmFWb2x1bWVNb3VudHMiOltdLCJleHRyYVZvbHVtZXMiOltdLCJnbG9iYWwiOnsiZXZhbHVhdGlvbl9pbnRlcnZhbCI6IjFtIiwiZXh0ZXJuYWxfbGFiZWxzIjp7ImNsdXN0ZXJfaWQiOiJzeC1jbnAtb3NzIn0sInNjcmFwZV9pbnRlcnZhbCI6IjFtIiwic2NyYXBlX3RpbWVvdXQiOiI2MHMifSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJxdWF5LmlvL3Byb21ldGhldXMvcHJvbWV0aGV1cyIsInRhZyI6InYyLjU1LjEifSwibGl2ZW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsImxpdmVuZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsImxpdmVuZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJsaXZlbmVzc1Byb2JlVGltZW91dCI6MywibmFtZSI6InNlcnZlciIsIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYWNjZXNzTW9kZXMiOlsiUmVhZFdyaXRlT25jZSJdLCJhbm5vdGF0aW9ucyI6e30sImVuYWJsZWQiOnRydWUsImV4aXN0aW5nQ2xhaW0iOiIiLCJtb3VudFBhdGgiOiIvZGF0YSIsInNpemUiOiIzMkdpIiwic3ViUGF0aCI6IiJ9LCJwb2RBbm5vdGF0aW9ucyI6e30sInBvZExhYmVscyI6e30sInByZWZpeFVSTCI6IiIsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmVhZGluZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJyZWFkaW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwicmVhZGluZXNzUHJvYmVTdWNjZXNzVGhyZXNob2xkIjoxLCJyZWFkaW5lc3NQcm9iZVRpbWVvdXQiOjMsInJlbW90ZVJlYWQiOnt9LCJyZW1vdGVXcml0ZSI6e30sInJlcGxpY2FDb3VudCI6MSwicmVzb3VyY2VzIjp7fSwicmV0ZW50aW9uIjoiOTdoIiwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImNsdXN0ZXJJUCI6IiIsImV4dGVybmFsSVBzIjpbXSwibGFiZWxzIjp7fSwibG9hZEJhbGFuY2VySVAiOiIiLCJsb2FkQmFsYW5jZXJTb3VyY2VSYW5nZXMiOltdLCJzZXJ2aWNlUG9ydCI6ODAsInNlc3Npb25BZmZpbml0eSI6Ik5vbmUiLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInN0cmF0ZWd5Ijp7InR5cGUiOiJSZWNyZWF0ZSJ9LCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kcyI6MzAwLCJ0b2xlcmF0aW9ucyI6W119LCJzZXJ2ZXJGaWxlcyI6eyJhbGVydGluZ19ydWxlcy55bWwiOnt9LCJhbGVydHMiOnt9LCJwcm9tZXRoZXVzLnltbCI6eyJydWxlX2ZpbGVzIjpbIi9ldGMvY29uZmlnL3JlY29yZGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9hbGVydGluZ19ydWxlcy55bWwiLCIvZXRjL2NvbmZpZy9ydWxlcyIsIi9ldGMvY29uZmlnL2FsZXJ0cyJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInB1c2hnYXRld2F5Ijp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicmVwb3J0aW5nIjp7ImVycm9yUmVwb3J0aW5nIjp0cnVlLCJsb2dDb2xsZWN0aW9uIjp0cnVlLCJwcm9kdWN0QW5hbHl0aWNzIjp0cnVlLCJ2YWx1ZXNSZXBvcnRpbmciOnRydWV9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwibm9kZVBvcnQiOnt9LCJwb3J0Ijo5MDkwLCJ0YXJnZXRQb3J0Ijo5MDkwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwcm9tZXRoZXVzIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLXByb21ldGhldXMubW9uaXRvcmluZzo5MDkwLyIsImluc2VjdXJlU2tpcFZlcmlmeSI6ZmFsc2UsImt1YmVSQkFDUHJveHkiOmZhbHNlfSwic2VjdXJpdHlDb250ZXh0Ijp7ImZzR3JvdXAiOjEwMDEsImZzR3JvdXBDaGFuZ2VQb2xpY3kiOiJPblJvb3RNaXNtYXRjaCIsInJ1bkFzR3JvdXAiOjEwMDEsInJ1bkFzTm9uUm9vdCI6dHJ1ZSwicnVuQXNVc2VyIjoxMDAxLCJzZWNjb21wUHJvZmlsZSI6eyJ0eXBlIjoiUnVudGltZURlZmF1bHQifX19LCJncmFmYW5hIjp7ImFkbWluUGFzc3dvcmQiOiJzdHJvbmdwYXNzd29yZCIsImFkbWluVXNlciI6ImFkbWluIiwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImRhc2hib2FyZFByb3ZpZGVycyI6e30sImRhc2hib2FyZHMiOnt9LCJkYXNoYm9hcmRzQ29uZmlnTWFwcyI6e30sImRlcGxveW1lbnRTdHJhdGVneSI6IlJvbGxpbmdVcGRhdGUiLCJkb3dubG9hZERhc2hib2FyZHNJbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImN1cmxpbWFnZXMvY3VybCIsInRhZyI6ImxhdGVzdCJ9LCJlbnYiOnt9LCJlbnZGcm9tU2VjcmV0IjoiIiwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJncmFmYW5hLmluaSI6eyJhbmFseXRpY3MiOnsiY2hlY2tfZm9yX3VwZGF0ZXMiOnRydWV9LCJhdXRoLmFub255bW91cyI6eyJlbmFibGVkIjp0cnVlLCJvcmdfbmFtZSI6Ik1haW4gT3JnLiIsIm9yZ19yb2xlIjoiRWRpdG9yIn0sImdyYWZhbmFfbmV0Ijp7InVybCI6Imh0dHBzOi8vZ3JhZmFuYS5uZXQifSwibG9nIjp7Im1vZGUiOiJjb25zb2xlIn0sInBhdGhzIjp7ImRhdGEiOiIvdmFyL2xpYi9ncmFmYW5hL2RhdGEiLCJsb2dzIjoiL3Zhci9sb2cvZ3JhZmFuYSIsInBsdWdpbnMiOiIvdmFyL2xpYi9ncmFmYW5hL3BsdWdpbnMiLCJwcm92aXNpb25pbmciOiIvZXRjL2dyYWZhbmEvcHJvdmlzaW9uaW5nIn0sInNlcnZlciI6eyJyb290X3VybCI6IiUocHJvdG9jb2wpczovLyUoZG9tYWluKXM6JShodHRwX3BvcnQpcy9ncmFmYW5hIiwic2VydmVfZnJvbV9zdWJfcGF0aCI6ZmFsc2V9fSwiaW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJncmFmYW5hL2dyYWZhbmEiLCJ0YWciOiIxMS4zLjEifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5hbWVzcGFjZV9kYXNoYm9hcmRzIjoia3ViZWNvc3QiLCJuYW1lc3BhY2VfZGF0YXNvdXJjZXMiOiJrdWJlY29zdCIsIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjEifSwicmVzb3VyY2VzIjp7fX0sInRvbGVyYXRpb25zIjpbXX0sImluZ3Jlc3MiOnsiYW5ub3RhdGlvbnMiOnsiY2VydC1tYW5hZ2VyLmlvL2NsdXN0ZXItaXNzdWVyIjoibGV0c2VuY3J5cHQtc3RhZ2luZyJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwicGF0aFR5cGUiOiJJbXBsZW1lbnRhdGlvblNwZWNpZmljIiwicGF0aHMiOlsiLyJdLCJ0bHMiOlt7Imhvc3RzIjpbImt1YmVjb3N0LW1ldGFsc3RhY2sucGxhdGZvcm0tZW5naW5lZXIuY2xvdWQiXSwic2VjcmV0TmFtZSI6Imt1YmVjb3N0LXNlcnZlci10bHMifV19LCJpbml0Q2hvd25EYXRhIjp7InJlc291cmNlcyI6e319LCJpbml0Q2hvd25EYXRhSW1hZ2UiOiJidXN5Ym94Iiwia3ViZWNvc3REZXBsb3ltZW50Ijp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fSwicmVwbGljYXMiOjF9LCJrdWJlY29zdEZyb250ZW5kIjp7ImRlcGxveU1ldGhvZCI6InNpbmdsZXBvZCIsImRlcGxveW1lbnRTdHJhdGVneSI6e30sImVuYWJsZWQiOnRydWUsImhhUmVwbGljYXMiOjIsImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9mcm9udGVuZCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImlwdjYiOnsiZW5hYmxlZCI6dHJ1ZX0sImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6NiwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MSwicGVyaW9kU2Vjb25kcyI6NX0sInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMTBtIiwibWVtb3J5IjoiNTVNaSJ9fSwidXNlRGVmYXVsdEZxZG4iOmZhbHNlfSwia3ViZWNvc3RNb2RlbCI6eyJjb250YWluZXJTdGF0c0VuYWJsZWQiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibG9nTGV2ZWwiOiJpbmZvIiwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCJ9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlNpemUiOiI1R2kiLCJlbmFibGVkIjp0cnVlLCJsYWJlbHMiOnt9LCJzaXplIjoiNUdpIn0sInByb21ldGhldXMiOnsiYWxlcnRtYW5hZ2VyRmlsZXMiOnsiYWxlcnRtYW5hZ2VyLnltbCI6eyJnbG9iYWwiOnt9LCJyZWNlaXZlcnMiOlt7Im5hbWUiOiJkZWZhdWx0LXJlY2VpdmVyIn1dLCJyb3V0ZSI6eyJncm91cF9pbnRlcnZhbCI6IjVtIiwiZ3JvdXBfd2FpdCI6IjEwcyIsInJlY2VpdmVyIjoiZGVmYXVsdC1yZWNlaXZlciIsInJlcGVhdF9pbnRlcnZhbCI6IjNoIn19fSwiY29uZmlnbWFwUmVsb2FkIjp7fSwiZXh0cmFTY3JhcGVDb25maWdzIjoiLSBqb2JfbmFtZToga3ViZWNvc3RcbiAgaG9ub3JfbGFiZWxzOiB0cnVlXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiY29zdC1hbmFseXplci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICBwb3J0OiA5MDAzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1uZXR3b3JraW5nXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IHBvZFxuICByZWxhYmVsX2NvbmZpZ3M6XG4gICMgU2NyYXBlIG9ubHkgdGhlIHRoZSB0YXJnZXRzIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgbWV0YWRhdGFcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9faW5zdGFuY2VdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAga3ViZWNvc3RcbiAgICAtIHNvdXJjZV9sYWJlbHM6IFtfX21ldGFfa3ViZXJuZXRlc19wb2RfbGFiZWxfYXBwX2t1YmVybmV0ZXNfaW9fbmFtZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBuZXR3b3JrLWNvc3RzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1hZ2dyZWdhdG9yXG4gIHNjcmFwZV9pbnRlcnZhbDogMW1cbiAgc2NyYXBlX3RpbWVvdXQ6IDYwc1xuICBtZXRyaWNzX3BhdGg6IC9tZXRyaWNzXG4gIHNjaGVtZTogaHR0cFxuICBkbnNfc2RfY29uZmlnczpcbiAgLSBuYW1lczpcbiAgICAtIHt7IHRlbXBsYXRlIFwiYWdncmVnYXRvci5zZXJ2aWNlTmFtZVwiIC4gfX1cbiAgICB0eXBlOiAnQSdcbiAgICB7ey0gaWYgb3IgLlZhbHVlcy5zYW1sLmVuYWJsZWQgLlZhbHVlcy5vaWRjLmVuYWJsZWQgfX1cbiAgICBwb3J0OiA5MDA4XG4gICAge3stIGVsc2UgfX1cbiAgICBwb3J0OiA5MDA0XG4gICAge3stIGVuZCB9fVxuIyMgRW5hYmxlcyBzY3JhcGluZyBvZiBOVklESUEgR1BVIG1ldHJpY3MgdmlhIGRjZ20tZXhwb3J0ZXIuIFNjcmFwZXMgYWxsXG4jIyBlbmRwb2ludHMgd2hpY2ggY29udGFpbiBcImRjZ20tZXhwb3J0ZXJcIiBpbiBsYWJlbHMgXCJhcHBcIixcbiMjIFwiYXBwLmt1YmVybmV0ZXMuaW8vY29tcG9uZW50XCIsIG9yIFwiYXBwLmt1YmVybmV0ZXMuaW8vbmFtZVwiIHdpdGggYSBjYXNlXG4jIyBpbnNlbnNpdGl2ZSBtYXRjaC4gVGhlIGxhYmVsIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgSzhzIHNlcnZpY2UgZW5kcG9pbnRzIGFuZCBub3QganVzdCBwb2RzLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYW5ub3RhdGlvbnMiOnt9LCJiYXNlVVJMIjoiIiwiY29uZmlnTWFwT3ZlcnJpZGVOYW1lIjoiIiwiY29uZmlnUGF0aCI6Ii9ldGMvY29uZmlnL3Byb21ldGhldXMueW1sIiwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7fSwiZW1wdHlEaXIiOnsic2l6ZUxpbWl0IjoiIn0sImVuYWJsZWQiOnRydWUsImVudiI6W10sImV4dHJhQXJncyI6eyJxdWVyeS5tYXgtY29uY3VycmVuY3kiOjEsInF1ZXJ5Lm1heC1zYW1wbGVzIjoxMDAwMDAwMDB9LCJleHRyYUNvbmZpZ21hcE1vdW50cyI6W10sImV4dHJhRmxhZ3MiOlsid2ViLmVuYWJsZS1saWZlY3ljbGUiXSwiZXh0cmFIb3N0UGF0aE1vdW50cyI6W10sImV4dHJhSW5pdENvbnRhaW5lcnMiOltdLCJleHRyYVNlY3JldE1vdW50cyI6W10sImV4dHJhVm9sdW1lTW91bnRzIjpbXSwiZXh0cmFWb2x1bWVzIjpbXSwiZ2xvYmFsIjp7ImV2YWx1YXRpb25faW50ZXJ2YWwiOiIxbSIsImV4dGVybmFsX2xhYmVscyI6eyJjbHVzdGVyX2lkIjoic3gtY25wLW9zcyJ9LCJzY3JhcGVfaW50ZXJ2YWwiOiIxbSIsInNjcmFwZV90aW1lb3V0IjoiNjBzIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoicXVheS5pby9wcm9tZXRoZXVzL3Byb21ldGhldXMiLCJ0YWciOiJ2Mi41NS4xIn0sImxpdmVuZXNzUHJvYmVGYWlsdXJlVGhyZXNob2xkIjozLCJsaXZlbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJsaXZlbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwibGl2ZW5lc3NQcm9iZVRpbWVvdXQiOjMsIm5hbWUiOiJzZXJ2ZXIiLCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFjY2Vzc01vZGVzIjpbIlJlYWRXcml0ZU9uY2UiXSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJleGlzdGluZ0NsYWltIjoiIiwibW91bnRQYXRoIjoiL2RhdGEiLCJzaXplIjoiMzJHaSIsInN1YlBhdGgiOiIifSwicG9kQW5ub3RhdGlvbnMiOnt9LCJwb2RMYWJlbHMiOnt9LCJwcmVmaXhVUkwiOiIiLCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInJlYWRpbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywicmVhZGluZXNzUHJvYmVJbml0aWFsRGVsYXkiOjUsInJlYWRpbmVzc1Byb2JlU3VjY2Vzc1RocmVzaG9sZCI6MSwicmVhZGluZXNzUHJvYmVUaW1lb3V0IjozLCJyZW1vdGVSZWFkIjp7fSwicmVtb3RlV3JpdGUiOnt9LCJyZXBsaWNhQ291bnQiOjEsInJlc291cmNlcyI6e30sInJldGVudGlvbiI6Ijk3aCIsInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJjbHVzdGVySVAiOiIiLCJleHRlcm5hbElQcyI6W10sImxhYmVscyI6e30sImxvYWRCYWxhbmNlcklQIjoiIiwibG9hZEJhbGFuY2VyU291cmNlUmFuZ2VzIjpbXSwic2VydmljZVBvcnQiOjgwLCJzZXNzaW9uQWZmaW5pdHkiOiJOb25lIiwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzdHJhdGVneSI6eyJ0eXBlIjoiUmVjcmVhdGUifSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjMwMCwidG9sZXJhdGlvbnMiOltdfSwic2VydmVyRmlsZXMiOnsiYWxlcnRpbmdfcnVsZXMueW1sIjp7fSwicHJvbWV0aGV1cy55bWwiOnsicnVsZV9maWxlcyI6WyIvZXRjL2NvbmZpZy9yZWNvcmRpbmdfcnVsZXMueW1sIiwiL2V0Yy9jb25maWcvYWxlcnRpbmdfcnVsZXMueW1sIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzaWdWNFByb3h5Ijp7Imhvc3QiOiJhcHMtd29ya3NwYWNlcy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsImltYWdlIjoicHVibGljLmVjci5hd3MvYXdzLW9ic2VydmFiaWxpdHkvYXdzLXNpZ3Y0LXByb3h5OmxhdGVzdCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsIm5hbWUiOiJhcHMiLCJwb3J0Ijo4MDA1LCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJyZXNvdXJjZXMiOnt9fSwic3VwcG9ydE5GUyI6ZmFsc2UsInRvbGVyYXRpb25zIjpbXSwidG9wb2xvZ3lTcHJlYWRDb25zdHJhaW50cyI6W10sInVwZ3JhZGUiOnsidG9WMiI6ZmFsc2V9fQ==
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -183,9 +166,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -233,9 +216,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -287,9 +270,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2025-01-01 13:53:31.240713736 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2025-01-01 13:53:03.697371504 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2025-01-01 13:53:03.700371542 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2025-01-01 13:53:31.240713736 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2025-01-01 13:53:03.697371504 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2025-01-01 13:53:31.241713749 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2025-01-01 13:53:03.699371530 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2025-01-01 13:53:31.239713724 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2025-01-01 13:53:03.697371504 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2025-01-01 13:53:03.700371542 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2025-01-01 13:53:31.240713736 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2025-01-01 13:53:03.697371504 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2025-01-01 13:53:31.240713736 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2025-01-01 13:53:03.697371504 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2025-01-01 13:53:03.700371542 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2025-01-01 13:53:03.700371542 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
Only in out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrole.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-clusterrolebinding.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-configmap.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-deployment.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-pvc.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-service.yaml
Only in out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates: prometheus-server-serviceaccount.yaml
diff -U 4 -r out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2025-01-01 13:53:31.242713761 +0000
+++ out/pr/kubecost/values-metalstack.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2025-01-01 13:53:03.700371542 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-cloud-cost-service.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,17 +5,15 @@
metadata:
name: release-name-cloud-cost
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/aggregator-service.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,15 +5,13 @@
metadata:
name: release-name-aggregator
namespace: default
labels:
-
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: aggregator
spec:
selector:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
type: "ClusterIP"
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-binding-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -4,11 +4,10 @@
kind: ClusterRoleBinding
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
@@ -26,11 +25,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
roleRef:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-cluster-role-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -4,11 +4,10 @@
kind: ClusterRole
metadata:
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
@@ -90,11 +89,10 @@
metadata:
namespace: default
name: release-name-cost-analyzer
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
rules:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-config-map-template.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data: |
Changes Rendered Chartdiff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-deployment-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -6,12 +6,13 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -29,9 +30,9 @@
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
annotations:
- checksum/configs: 3200005267ed0d35ec8656b0c4da50d94bf7156275304458eccd802ce21d54ee
+ checksum/configs: 464ddc3eced704ef4072987b48e0134bc01babb9294f4d818dec7f9eed8943a9
spec:
securityContext:
fsGroup: 1001
fsGroupChangePolicy: OnRootMismatch
@@ -55,9 +56,9 @@
persistentVolumeClaim:
claimName: release-name-cost-analyzer
initContainers:
containers:
- - image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ - image: "gcr.io/kubecost1/cost-model:prod-2.5.1"
name: cost-model
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -94,12 +95,16 @@
volumeMounts:
- name: persistent-configs
mountPath: /var/configs
env:
+ - name: CONTAINER_IMAGE_TAG
+ value: prod-2.5.1
- name: GRAFANA_ENABLED
value: "false"
+ - name: LOG_LEVEL
+ value: info
- name: HELM_VALUES
- value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiZW5hYmxlZCI6dHJ1ZSwiZW52Ijp7IkdVTklDT1JOX0NNRF9BUkdTIjoiLS1sb2ctbGV2ZWwgaW5mbyAtdCAxMjAwIn0sImZ1bGxJbWFnZU5hbWUiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW1vZGVsaW5nOnYwLjEuMTYiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibm9kZVNlbGVjdG9yIjp7fSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsibGltaXRzIjp7ImNwdSI6IjE1MDBtIiwibWVtb3J5IjoiMUdpIn0sInJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiIzMDBNaSJ9fSwidG9sZXJhdGlvbnMiOltdfSwiZ2xvYmFsIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJjb250YWluZXJTZWN1cml0eUNvbnRleHQiOnsiYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uIjpmYWxzZSwiY2FwYWJpbGl0aWVzIjp7ImRyb3AiOlsiQUxMIl19LCJwcml2aWxlZ2VkIjpmYWxzZSwicmVhZE9ubHlSb290RmlsZXN5c3RlbSI6dHJ1ZX0sImludGVncmF0aW9ucyI6e30sIm5vdGlmaWNhdGlvbnMiOnsiYWxlcnRtYW5hZ2VyIjp7ImVuYWJsZWQiOnRydWUsImZxZG4iOiJodHRwOi8vc3gta3ViZS1wcm9tZXRoZXVzLXN0YWNrLWFsZXJ0bWFuYWdlci5tb25pdG9yaW5nOjkwOTMvIn19LCJwbGF0Zm9ybXMiOnsiY2ljZCI6eyJlbmFibGVkIjp0cnVlLCJza2lwU2FuaXR5Q2hlY2tzIjpmYWxzZX19LCJwb2RBbm5vdGF0aW9ucyI6e30sInNlY3VyaXR5Q29udGV4dCI6eyJmc0dyb3VwIjoxMDAxLCJmc0dyb3VwQ2hhbmdlUG9saWN5IjoiT25Sb290TWlzbWF0Y2giLCJydW5Bc0dyb3VwIjoxMDAxLCJydW5Bc05vblJvb3QiOnRydWUsInJ1bkFzVXNlciI6MTAwMSwic2VjY29tcFByb2ZpbGUiOnsidHlwZSI6IlJ1bnRpbWVEZWZhdWx0In19fSwiZ3JhZmFuYSI6eyJhZG1pblBhc3N3b3JkIjoic3Ryb25ncGFzc3dvcmQiLCJhZG1pblVzZXIiOiJhZG1pbiIsImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJkYXNoYm9hcmRQcm92aWRlcnMiOnt9LCJkYXNoYm9hcmRzIjp7fSwiZGFzaGJvYXJkc0NvbmZpZ01hcHMiOnt9LCJkZXBsb3ltZW50U3RyYXRlZ3kiOiJSb2xsaW5nVXBkYXRlIiwiZG93bmxvYWREYXNoYm9hcmRzSW1hZ2UiOnsicHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsInJlcG9zaXRvcnkiOiJjdXJsaW1hZ2VzL2N1cmwiLCJ0YWciOiJsYXRlc3QifSwiZW52Ijp7fSwiZW52RnJvbVNlY3JldCI6IiIsImV4dHJhU2VjcmV0TW91bnRzIjpbXSwiZ3JhZmFuYS5pbmkiOnsiYW5hbHl0aWNzIjp7ImNoZWNrX2Zvcl91cGRhdGVzIjp0cnVlfSwiYXV0aC5hbm9ueW1vdXMiOnsiZW5hYmxlZCI6dHJ1ZSwib3JnX25hbWUiOiJNYWluIE9yZy4iLCJvcmdfcm9sZSI6IkVkaXRvciJ9LCJncmFmYW5hX25ldCI6eyJ1cmwiOiJodHRwczovL2dyYWZhbmEubmV0In0sImxvZyI6eyJtb2RlIjoiY29uc29sZSJ9LCJwYXRocyI6eyJkYXRhIjoiL3Zhci9saWIvZ3JhZmFuYS9kYXRhIiwibG9ncyI6Ii92YXIvbG9nL2dyYWZhbmEiLCJwbHVnaW5zIjoiL3Zhci9saWIvZ3JhZmFuYS9wbHVnaW5zIiwicHJvdmlzaW9uaW5nIjoiL2V0Yy9ncmFmYW5hL3Byb3Zpc2lvbmluZyJ9LCJzZXJ2ZXIiOnsicm9vdF91cmwiOiIlKHByb3RvY29sKXM6Ly8lKGRvbWFpbilzOiUoaHR0cF9wb3J0KXMvZ3JhZmFuYSIsInNlcnZlX2Zyb21fc3ViX3BhdGgiOmZhbHNlfX0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ3JhZmFuYS9ncmFmYW5hIiwidGFnIjoiMTEuMy4xIn0sImxkYXAiOnsiY29uZmlnIjoiIiwiZXhpc3RpbmdTZWNyZXQiOiIifSwibGl2ZW5lc3NQcm9iZSI6eyJmYWlsdXJlVGhyZXNob2xkIjoxMCwiaHR0cEdldCI6eyJwYXRoIjoiL2FwaS9oZWFsdGgiLCJwb3J0IjozMDAwfSwiaW5pdGlhbERlbGF5U2Vjb25kcyI6NjAsInRpbWVvdXRTZWNvbmRzIjozMH0sIm5vZGVTZWxlY3RvciI6e30sInBsdWdpbnMiOltdLCJwb2RBbm5vdGF0aW9ucyI6e30sInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJyZWFkaW5lc3NQcm9iZSI6eyJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9fSwicmVwbGljYXMiOjEsInJlc291cmNlcyI6e30sInNlY3VyaXR5Q29udGV4dCI6e30sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJwb3J0Ijo4MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJjcmVhdGUiOnRydWUsIm5hbWUiOiIifSwic2lkZWNhciI6eyJkYXNoYm9hcmRzIjp7ImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXJyb3JfdGhyb3R0bGVfc2xlZXAiOjAsImZvbGRlciI6Ii90bXAvZGFzaGJvYXJkcyIsImxhYmVsIjoiZ3JhZmFuYV9kYXNoYm9hcmQiLCJsYWJlbFZhbHVlIjoiMSJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdoY3IuaW8va2l3aWdyaWQvazhzLXNpZGVjYXIiLCJ0YWciOiIxLjI4LjAifSwicmVzb3VyY2VzIjp7fX0sInNtdHAiOnsiZXhpc3RpbmdTZWNyZXQiOiIifSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TWV0cmljcyI6e30sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGwiOnRydWUsImV0bERhaWx5U3RvcmVEdXJhdGlvbkRheXMiOjkxLCJldGxGaWxlU3RvcmVFbmFibGVkIjp0cnVlLCJldGxIb3VybHlTdG9yZUR1cmF0aW9uSG91cnMiOjQ5LCJldGxSZWFkT25seU1vZGUiOmZhbHNlLCJleHRyYUFyZ3MiOltdLCJleHRyYVBvcnRzIjpbXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWNvc3QxL2Nvc3QtbW9kZWwiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwibWF4UXVlcnlDb25jdXJyZW5jeSI6NSwicmVhZGluZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJyZXNvdXJjZXMiOnsicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjU1TWkifX0sInV0Y09mZnNldCI6IiswMDowMCIsIndhcm1DYWNoZSI6ZmFsc2V9LCJrdWJlY29zdFByb2R1Y3RDb25maWdzIjp7ImNsdXN0ZXJOYW1lIjoic3gtY25wLW9zcyBEZW1vIiwiY2x1c3RlclByb2ZpbGUiOiJkZXZlbG9wbWVudCIsImN1cnJlbmN5Q29kZSI6IkVVUiIsImN1c3RvbVByaWNlc0VuYWJsZWQiOnRydWUsImRlZmF1bHRNb2RlbFByaWNpbmciOnsiQ1BVIjoiMjguMCIsIkdQVSI6IjY5My41MCIsIlJBTSI6IjMuMDkiLCJlbmFibGVkIjp0cnVlLCJpbnRlcm5ldE5ldHdvcmtFZ3Jlc3MiOiIwLjEyIiwicmVnaW9uTmV0d29ya0VncmVzcyI6IjAuMDEiLCJzcG90Q1BVIjoiNC44NiIsInNwb3RHUFUiOiIyMjUuMCIsInNwb3RSQU0iOiIwLjY1Iiwic3RvcmFnZSI6IjAuMDQiLCJ6b25lTmV0d29ya0VncmVzcyI6IjAuMDEifSwiZ3JhZmFuYVVSTCI6Imh0dHBzOi8vZ3JhZmFuYS5sYWIuc3V4ZXNzaXQuazhzLmNsb3VkLnVpYmsuYWMuYXQifSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJhZGRpdGlvbmFsU2VjdXJpdHlDb250ZXh0Ijp7fSwiYWZmaW5pdHkiOnt9LCJhbm5vdGF0aW9ucyI6e30sImNvbmZpZyI6eyJkZXN0aW5hdGlvbnMiOnsiY3Jvc3MtcmVnaW9uIjpbXSwiZGlyZWN0LWNsYXNzaWZpY2F0aW9uIjpbXSwiaW4tcmVnaW9uIjpbXSwiaW4tem9uZSI6WyIxMjcuMC4wLjAvOCIsIjE2OS4yNTQuMC4wLzE2IiwiMTAuMC4wLjAvOCIsIjE3Mi4xNi4wLjAvMTIiLCIxOTIuMTY4LjAuMC8xNiJdLCJpbnRlcm5ldCI6W119LCJzZXJ2aWNlcyI6eyJhbWF6b24td2ViLXNlcnZpY2VzIjp0cnVlLCJhenVyZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZSwiZ29vZ2xlLWNsb3VkLXNlcnZpY2VzIjp0cnVlfX0sImVuYWJsZWQiOnRydWUsImV4dHJhQXJncyI6W10sImhlYWx0aENoZWNrUHJvYmVzIjp7fSwiaW1hZ2UiOnsicmVwb3NpdG9yeSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbmV0d29yay1jb3N0cyIsInRhZyI6InYwLjE3LjYifSwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibG9nTGV2ZWwiOiJpbmZvIiwibm9kZVNlbGVjdG9yIjp7fSwicG9ydCI6MzAwMSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJwcm9tZXRoZXVzU2NyYXBlIjpmYWxzZSwicmVzb3VyY2VzIjp7ImxpbWl0cyI6eyJjcHUiOiI1MDBtIn0sInJlcXVlc3RzIjp7ImNwdSI6IjUwbSIsIm1lbW9yeSI6IjIwTWkifX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9fSwidG9sZXJhdGlvbnMiOltdLCJ0cmFmZmljTG9nZ2luZyI6dHJ1ZSwidXBkYXRlU3RyYXRlZ3kiOnsidHlwZSI6IlJvbGxpbmdVcGRhdGUifX0sIm5vZGVTZWxlY3RvciI6e30sInBlcnNpc3RlbnRWb2x1bWUiOnsiYW5ub3RhdGlvbnMiOnt9LCJkYlBWRW5hYmxlZCI6ZmFsc2UsImRiU2l6ZSI6IjVHaSIsImVuYWJsZWQiOnRydWUsImxhYmVscyI6e30sInNpemUiOiI1R2kifSwicHJvbWV0aGV1cyI6eyJhbGVydG1hbmFnZXJGaWxlcyI6eyJhbGVydG1hbmFnZXIueW1sIjp7Imdsb2JhbCI6e30sInJlY2VpdmVycyI6W3sibmFtZSI6ImRlZmF1bHQtcmVjZWl2ZXIifV0sInJvdXRlIjp7Imdyb3VwX2ludGVydmFsIjoiNW0iLCJncm91cF93YWl0IjoiMTBzIiwicmVjZWl2ZXIiOiJkZWZhdWx0LXJlY2VpdmVyIiwicmVwZWF0X2ludGVydmFsIjoiM2gifX19LCJjb25maWdtYXBSZWxvYWQiOnt9LCJleHRyYVNjcmFwZUNvbmZpZ3MiOiItIGpvYl9uYW1lOiBrdWJlY29zdFxuICBob25vcl9sYWJlbHM6IHRydWVcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJjb3N0LWFuYWx5emVyLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHBvcnQ6IDkwMDNcbi0gam9iX25hbWU6IGt1YmVjb3N0LW5ldHdvcmtpbmdcbiAga3ViZXJuZXRlc19zZF9jb25maWdzOlxuICAgIC0gcm9sZTogcG9kXG4gIHJlbGFiZWxfY29uZmlnczpcbiAgIyBTY3JhcGUgb25seSB0aGUgdGhlIHRhcmdldHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyBtZXRhZGF0YVxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19pbnN0YW5jZV1cbiAgICAgIGFjdGlvbjoga2VlcFxuICAgICAgcmVnZXg6ICBrdWJlY29zdFxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIG5ldHdvcmstY29zdHNcbi0gam9iX25hbWU6IGt1YmVjb3N0LWFnZ3JlZ2F0b3JcbiAgc2NyYXBlX2ludGVydmFsOiAxbVxuICBzY3JhcGVfdGltZW91dDogNjBzXG4gIG1ldHJpY3NfcGF0aDogL21ldHJpY3NcbiAgc2NoZW1lOiBodHRwXG4gIGRuc19zZF9jb25maWdzOlxuICAtIG5hbWVzOlxuICAgIC0ge3sgdGVtcGxhdGUgXCJhZ2dyZWdhdG9yLnNlcnZpY2VOYW1lXCIgLiB9fVxuICAgIHR5cGU6ICdBJ1xuICAgIHt7LSBpZiBvciAuVmFsdWVzLnNhbWwuZW5hYmxlZCAuVmFsdWVzLm9pZGMuZW5hYmxlZCB9fVxuICAgIHBvcnQ6IDkwMDhcbiAgICB7ey0gZWxzZSB9fVxuICAgIHBvcnQ6IDkwMDRcbiAgICB7ey0gZW5kIH19XG4jIyBFbmFibGVzIHNjcmFwaW5nIG9mIE5WSURJQSBHUFUgbWV0cmljcyB2aWEgZGNnbS1leHBvcnRlci4gU2NyYXBlcyBhbGxcbiMjIGVuZHBvaW50cyB3aGljaCBjb250YWluIFwiZGNnbS1leHBvcnRlclwiIGluIGxhYmVscyBcImFwcFwiLFxuIyMgXCJhcHAua3ViZXJuZXRlcy5pby9jb21wb25lbnRcIiwgb3IgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCIgd2l0aCBhIGNhc2VcbiMjIGluc2Vuc2l0aXZlIG1hdGNoLlxuIyMgUmVmczpcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZ3B1LW9wZXJhdG9yL2Jsb2IvZDQzMTZhNDE1YmJkNjg0Y2U4NDE2YTg4MDQyMzA1ZmMxYTA5M2FhNC9hc3NldHMvc3RhdGUtZGNnbS1leHBvcnRlci8wNjAwX3NlcnZpY2UueWFtbCNMN1xuIyMgaHR0cHM6Ly9naXRodWIuY29tL05WSURJQS9kY2dtLWV4cG9ydGVyL2Jsb2IvNTRmZDFjYTEzN2M2NjUxMWE4N2E3MjAzOTA2MTM2ODBiOWJkYWJkZC9kZXBsb3ltZW50L3RlbXBsYXRlcy9zZXJ2aWNlLnlhbWwjTDIzXG4tIGpvYl9uYW1lOiBrdWJlY29zdC1kY2dtLWV4cG9ydGVyXG4gIGt1YmVybmV0ZXNfc2RfY29uZmlnczpcbiAgICAtIHJvbGU6IGVuZHBvaW50c1xuICByZWxhYmVsX2NvbmZpZ3M6XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2NvbXBvbmVudCwgX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAoP2kpKC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qfC4qZGNnbS1leHBvcnRlci4qKVxuIiwicmJhYyI6eyJjcmVhdGUiOnRydWV9LCJzZXJ2ZXIiOnsiYWZmaW5pdHkiOnt9LCJhbGVydG1hbmFnZXJzIjpbXSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImRlcGxveW1lbnRBbm5vdGF0aW9ucyI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sImFsZXJ0cyI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL3J1bGVzIiwiL2V0Yy9jb25maWcvYWxlcnRzIl0sInNjcmFwZV9jb25maWdzIjpbeyJqb2JfbmFtZSI6InByb21ldGhldXMiLCJzdGF0aWNfY29uZmlncyI6W3sidGFyZ2V0cyI6WyJsb2NhbGhvc3Q6OTA5MCJdfV19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMtY2Fkdmlzb3IiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFsfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9lcnJvcnNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfcGFja2V0c19kcm9wcGVkX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2ZzX3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9mc19saW1pdF9ieXRlc3xjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfdGhyb3R0bGVkX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19pbm9kZXNfZnJlZXxjb250YWluZXJfZnNfaW5vZGVzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX3NwZWNfY3B1X3NoYXJlc3xjb250YWluZXJfc3BlY19tZW1vcnlfbGltaXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfZnNfd3JpdGVzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9mc19yZWFkc19ieXRlc190b3RhbHxjYWR2aXNvcl92ZXJzaW9uX2luZm98a3ViZWNvc3RfcHZfaW5mbykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsiY29udGFpbmVyIl0sInRhcmdldF9sYWJlbCI6ImNvbnRhaW5lcl9uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJwb2QiXSwidGFyZ2V0X2xhYmVsIjoicG9kX25hbWUifV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbGFiZWxfKC4rKSJ9LHsicmVwbGFjZW1lbnQiOiJrdWJlcm5ldGVzLmRlZmF1bHQuc3ZjOjQ0MyIsInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJyZWdleCI6IiguKykiLCJyZXBsYWNlbWVudCI6Ii9hcGkvdjEvbm9kZXMvJDEvcHJveHkvbWV0cmljcy9jYWR2aXNvciIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifV0sInNjaGVtZSI6Imh0dHBzIiwidGxzX2NvbmZpZyI6eyJjYV9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L2NhLmNydCIsImluc2VjdXJlX3NraXBfdmVyaWZ5Ijp0cnVlfX0seyJiZWFyZXJfdG9rZW5fZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC90b2tlbiIsImpvYl9uYW1lIjoia3ViZXJuZXRlcy1ub2RlcyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6Im5vZGUifV0sIm1ldHJpY19yZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IihrdWJlbGV0X3ZvbHVtZV9zdGF0c191c2VkX2J5dGVzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19uYW1lX18iXX1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiam9iX25hbWUiOiJrdWJlcm5ldGVzLXNlcnZpY2UtZW5kcG9pbnRzIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoiZW5kcG9pbnRzIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoY29udGFpbmVyX2NwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZ3B1X2FsbG9jYXRpb258Y29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xjb250YWluZXJfbmV0d29ya19yZWNlaXZlX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2J5dGVzX3RvdGFsfERDR01fRklfREVWX0dQVV9VVElMfGRlcGxveW1lbnRfbWF0Y2hfbGFiZWxzfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19kZXNpcmVkX251bWJlcl9zY2hlZHVsZWR8a3ViZV9kYWVtb25zZXRfc3RhdHVzX251bWJlcl9yZWFkeXxrdWJlX2RlcGxveW1lbnRfc3BlY19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzfGt1YmVfZGVwbG95bWVudF9zdGF0dXNfcmVwbGljYXNfYXZhaWxhYmxlfGt1YmVfam9iX3N0YXR1c19mYWlsZWR8a3ViZV9uYW1lc3BhY2VfYW5ub3RhdGlvbnN8a3ViZV9uYW1lc3BhY2VfbGFiZWxzfGt1YmVfbm9kZV9pbmZvfGt1YmVfbm9kZV9sYWJlbHN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZXxrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2FsbG9jYXRhYmxlX21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5fGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfY3B1X2NvcmVzfGt1YmVfbm9kZV9zdGF0dXNfY2FwYWNpdHlfbWVtb3J5X2J5dGVzfGt1YmVfbm9kZV9zdGF0dXNfY29uZGl0aW9ufGt1YmVfcGVyc2lzdGVudHZvbHVtZV9jYXBhY2l0eV9ieXRlc3xrdWJlX3BlcnNpc3RlbnR2b2x1bWVfc3RhdHVzX3BoYXNlfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX2luZm98a3ViZV9wZXJzaXN0ZW50dm9sdW1lY2xhaW1fcmVzb3VyY2VfcmVxdWVzdHNfc3RvcmFnZV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfaW5mb3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9saW1pdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfY3B1X2NvcmVzfGt1YmVfcG9kX2NvbnRhaW5lcl9yZXNvdXJjZV9yZXF1ZXN0c19tZW1vcnlfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19yZXN0YXJ0c190b3RhbHxrdWJlX3BvZF9jb250YWluZXJfc3RhdHVzX3J1bm5pbmd8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c190ZXJtaW5hdGVkX3JlYXNvbnxrdWJlX3BvZF9sYWJlbHN8a3ViZV9wb2Rfb3duZXJ8a3ViZV9wb2Rfc3RhdHVzX3BoYXNlfGt1YmVfcmVwbGljYXNldF9vd25lcnxrdWJlX3N0YXRlZnVsc2V0X3JlcGxpY2FzfGt1YmVfc3RhdGVmdWxzZXRfc3RhdHVzX3JlcGxpY2FzfGt1YmVjb3N0X2NsdXN0ZXJfaW5mb3xrdWJlY29zdF9jbHVzdGVyX21hbmFnZW1lbnRfY29zdHxrdWJlY29zdF9jbHVzdGVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlc3xrdWJlY29zdF9sb2FkX2JhbGFuY2VyX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19pbnRlcm5ldF9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3JlZ2lvbl9lZ3Jlc3NfY29zdHxrdWJlY29zdF9uZXR3b3JrX3pvbmVfZWdyZXNzX2Nvc3R8a3ViZWNvc3Rfbm9kZV9pc19zcG90fGt1YmVjb3N0X3BvZF9uZXR3b3JrX2VncmVzc19ieXRlc190b3RhbHxub2RlX2NwdV9ob3VybHlfY29zdHxub2RlX2NwdV9zZWNvbmRzX3RvdGFsfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWR8bm9kZV9kaXNrX3JlYWRzX2NvbXBsZXRlZF90b3RhbHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZHxub2RlX2Rpc2tfd3JpdGVzX2NvbXBsZXRlZF90b3RhbHxub2RlX2ZpbGVzeXN0ZW1fZGV2aWNlX2Vycm9yfG5vZGVfZ3B1X2NvdW50fG5vZGVfZ3B1X2hvdXJseV9jb3N0fG5vZGVfbWVtb3J5X0J1ZmZlcnNfYnl0ZXN8bm9kZV9tZW1vcnlfQ2FjaGVkX2J5dGVzfG5vZGVfbWVtb3J5X01lbUF2YWlsYWJsZV9ieXRlc3xub2RlX21lbW9yeV9NZW1GcmVlX2J5dGVzfG5vZGVfbWVtb3J5X01lbVRvdGFsX2J5dGVzfG5vZGVfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxub2RlX3JhbV9ob3VybHlfY29zdHxub2RlX3RvdGFsX2hvdXJseV9jb3N0fHBvZF9wdmNfYWxsb2NhdGlvbnxwdl9ob3VybHlfY29zdHxzZXJ2aWNlX3NlbGVjdG9yX2xhYmVsc3xzdGF0ZWZ1bFNldF9tYXRjaF9sYWJlbHN8a3ViZWNvc3RfcHZfaW5mb3x1cCkiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOnRydWUsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NyYXBlIl19LHsiYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKC4qbm9kZS1leHBvcnRlcnxrdWJlY29zdC1uZXR3b3JrLWNvc3RzKSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfZW5kcG9pbnRzX25hbWUiXX0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoaHR0cHM/KSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fc2NoZW1lIl0sInRhcmdldF9sYWJlbCI6Il9fc2NoZW1lX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3BhdGgiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKFteOl0rKSg/OjpcXGQrKT87KFxcZCspIiwicmVwbGFjZW1lbnQiOiIkMTokMiIsInNvdXJjZV9sYWJlbHMiOlsiX19hZGRyZXNzX18iLCJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wb3J0Il0sInRhcmdldF9sYWJlbCI6Il9fYWRkcmVzc19fIn0seyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9sYWJlbF8oLispIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19uYW1lc3BhY2UiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lc3BhY2UifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJrdWJlcm5ldGVzX25hbWUifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3BvZF9ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19ub2RlIn1dfV19LCJyZWNvcmRpbmdfcnVsZXMueW1sIjp7fSwicnVsZXMiOnsiZ3JvdXBzIjpbeyJuYW1lIjoiQ1BVIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0ocmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlwifVs1bV0pKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlOnJhdGU1bSJ9LHsiZXhwciI6InJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSIsInJlY29yZCI6ImNsdXN0ZXI6Y3B1X3VzYWdlX25vc3VtOnJhdGU1bSJ9LHsiZXhwciI6ImF2ZyhpcmF0ZShjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx7Y29udGFpbmVyIT1cIlBPRFwiLCBjb250YWluZXIhPVwiXCJ9WzVtXSkpIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfY3B1X3VzYWdlX2lyYXRlIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIGJ5IChjb250YWluZXIscG9kLG5hbWVzcGFjZSkiLCJyZWNvcmQiOiJrdWJlY29zdF9jb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn0seyJleHByIjoic3VtKGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN7Y29udGFpbmVyIT1cIlBPRFwiLGNvbnRhaW5lciE9XCJcIn0pIiwicmVjb3JkIjoia3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXMifV19LHsibmFtZSI6IlNhdmluZ3MiLCJydWxlcyI6W3siZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZCE9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6ImZhbHNlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQ9XCJEYWVtb25TZXRcIn0pIGJ5IChwb2QpICogc3VtKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbikgYnkgKHBvZCkpIC8gc3VtKGt1YmVfbm9kZV9pbmZvKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJ0cnVlIn0sInJlY29yZCI6Imt1YmVjb3N0X3NhdmluZ3NfY3B1X2FsbG9jYXRpb24ifSx7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfbWVtb3J5X2FsbG9jYXRpb25fYnl0ZXMpIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzIn1dfV19fSwic2VydmljZUFjY291bnRzIjp7ImFsZXJ0bWFuYWdlciI6eyJjcmVhdGUiOnRydWV9LCJub2RlRXhwb3J0ZXIiOnsiY3JlYXRlIjp0cnVlfSwicHVzaGdhdGV3YXkiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlIjp0cnVlfX19LCJwcm9tZXRoZXVzUnVsZSI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZX0sInJlcG9ydGluZyI6eyJlcnJvclJlcG9ydGluZyI6dHJ1ZSwibG9nQ29sbGVjdGlvbiI6dHJ1ZSwicHJvZHVjdEFuYWx5dGljcyI6dHJ1ZSwidmFsdWVzUmVwb3J0aW5nIjp0cnVlfSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sIm5vZGVQb3J0Ijp7fSwicG9ydCI6OTA5MCwidGFyZ2V0UG9ydCI6OTA5MCwidHlwZSI6IkNsdXN0ZXJJUCJ9LCJzZXJ2aWNlQWNjb3VudCI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX0sInNlcnZpY2VNb25pdG9yIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJuZXR3b3JrQ29zdHMiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWUsImludGVydmFsIjoiMW0iLCJtZXRyaWNSZWxhYmVsaW5ncyI6W10sInJlbGFiZWxpbmdzIjpbXSwic2NyYXBlVGltZW91dCI6IjEwcyJ9LCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwic2lnVjRQcm94eSI6eyJob3N0IjoiYXBzLXdvcmtzcGFjZXMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20iLCJpbWFnZSI6InB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1zaWd2NC1wcm94eTpsYXRlc3QiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJuYW1lIjoiYXBzIiwicG9ydCI6ODAwNSwicmVnaW9uIjoidXMtd2VzdC0yIiwicmVzb3VyY2VzIjp7fX0sInN1cHBvcnRORlMiOmZhbHNlLCJ0b2xlcmF0aW9ucyI6W10sInRvcG9sb2d5U3ByZWFkQ29uc3RyYWludHMiOltdLCJ1cGdyYWRlIjp7InRvVjIiOmZhbHNlfX0=
+ value: eyJhZmZpbml0eSI6e30sImF3c3N0b3JlIjp7ImFubm90YXRpb25zIjp7fSwiY3JlYXRlU2VydmljZUFjY291bnQiOmZhbHNlLCJpbWFnZU5hbWVBbmRWZXJzaW9uIjoiZ2NyLmlvL2t1YmVjb3N0MS9hd3NzdG9yZTpsYXRlc3QiLCJub2RlU2VsZWN0b3IiOnt9LCJwcmlvcml0eUNsYXNzTmFtZSI6IiIsInVzZUF3c1N0b3JlIjpmYWxzZX0sImRpYWdub3N0aWNzIjp7ImNvbGxlY3RIZWxtVmFsdWVzIjpmYWxzZSwiZW5hYmxlZCI6dHJ1ZSwia2VlcERpYWdub3N0aWNIaXN0b3J5IjpmYWxzZSwicG9sbGluZ0ludGVydmFsIjoiMzAwcyJ9LCJleHRyYU9iamVjdHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImZlZGVyYXRlZEVUTCI6eyJhZ2VudE9ubHkiOmZhbHNlLCJmZWRlcmF0ZWRDbHVzdGVyIjpmYWxzZSwicmVhZE9ubHlQcmltYXJ5IjpmYWxzZSwicmVkaXJlY3RTM0JhY2t1cCI6ZmFsc2UsInVzZU11bHRpQ2x1c3RlckRCIjpmYWxzZX0sImZvcmVjYXN0aW5nIjp7ImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlbnYiOnsiR1VOSUNPUk5fQ01EX0FSR1MiOiItLWxvZy1sZXZlbCBpbmZvIC10IDEyMDAifSwiZnVsbEltYWdlTmFtZSI6Imdjci5pby9rdWJlY29zdDEva3ViZWNvc3QtbW9kZWxpbmc6djAuMS4xOCIsImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxpdmVuZXNzUHJvYmUiOnsiZW5hYmxlZCI6dHJ1ZSwiZmFpbHVyZVRocmVzaG9sZCI6MjAwLCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxMCwicGVyaW9kU2Vjb25kcyI6MTB9LCJub2RlU2VsZWN0b3IiOnt9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTUwMG0iLCJtZW1vcnkiOiIxR2kifSwicmVxdWVzdHMiOnsiY3B1IjoiMjAwbSIsIm1lbW9yeSI6IjMwME1pIn19LCJ0b2xlcmF0aW9ucyI6W119LCJnbG9iYWwiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImFubm90YXRpb25zIjp7fSwiY29udGFpbmVyU2VjdXJpdHlDb250ZXh0Ijp7ImFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbiI6ZmFsc2UsImNhcGFiaWxpdGllcyI6eyJkcm9wIjpbIkFMTCJdfSwicHJpdmlsZWdlZCI6ZmFsc2UsInJlYWRPbmx5Um9vdEZpbGVzeXN0ZW0iOnRydWV9LCJpbnRlZ3JhdGlvbnMiOnt9LCJub3RpZmljYXRpb25zIjp7ImFsZXJ0bWFuYWdlciI6eyJlbmFibGVkIjp0cnVlLCJmcWRuIjoiaHR0cDovL3N4LWt1YmUtcHJvbWV0aGV1cy1zdGFjay1hbGVydG1hbmFnZXIubW9uaXRvcmluZzo5MDkzLyJ9fSwicGxhdGZvcm1zIjp7ImNpY2QiOnsiZW5hYmxlZCI6dHJ1ZSwic2tpcFNhbml0eUNoZWNrcyI6ZmFsc2V9fSwicG9kQW5ub3RhdGlvbnMiOnt9LCJzZWN1cml0eUNvbnRleHQiOnsiZnNHcm91cCI6MTAwMSwiZnNHcm91cENoYW5nZVBvbGljeSI6Ik9uUm9vdE1pc21hdGNoIiwicnVuQXNHcm91cCI6MTAwMSwicnVuQXNOb25Sb290Ijp0cnVlLCJydW5Bc1VzZXIiOjEwMDEsInNlY2NvbXBQcm9maWxlIjp7InR5cGUiOiJSdW50aW1lRGVmYXVsdCJ9fX0sImdyYWZhbmEiOnsiYWRtaW5QYXNzd29yZCI6InN0cm9uZ3Bhc3N3b3JkIiwiYWRtaW5Vc2VyIjoiYWRtaW4iLCJhZmZpbml0eSI6e30sImFubm90YXRpb25zIjp7fSwiZGFzaGJvYXJkUHJvdmlkZXJzIjp7fSwiZGFzaGJvYXJkcyI6e30sImRhc2hib2FyZHNDb25maWdNYXBzIjp7fSwiZGVwbG95bWVudFN0cmF0ZWd5IjoiUm9sbGluZ1VwZGF0ZSIsImRvd25sb2FkRGFzaGJvYXJkc0ltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiY3VybGltYWdlcy9jdXJsIiwidGFnIjoibGF0ZXN0In0sImVudiI6e30sImVudkZyb21TZWNyZXQiOiIiLCJleHRyYVNlY3JldE1vdW50cyI6W10sImdyYWZhbmEuaW5pIjp7ImFuYWx5dGljcyI6eyJjaGVja19mb3JfdXBkYXRlcyI6dHJ1ZX0sImF1dGguYW5vbnltb3VzIjp7ImVuYWJsZWQiOnRydWUsIm9yZ19uYW1lIjoiTWFpbiBPcmcuIiwib3JnX3JvbGUiOiJFZGl0b3IifSwiZ3JhZmFuYV9uZXQiOnsidXJsIjoiaHR0cHM6Ly9ncmFmYW5hLm5ldCJ9LCJsb2ciOnsibW9kZSI6ImNvbnNvbGUifSwicGF0aHMiOnsiZGF0YSI6Ii92YXIvbGliL2dyYWZhbmEvZGF0YSIsImxvZ3MiOiIvdmFyL2xvZy9ncmFmYW5hIiwicGx1Z2lucyI6Ii92YXIvbGliL2dyYWZhbmEvcGx1Z2lucyIsInByb3Zpc2lvbmluZyI6Ii9ldGMvZ3JhZmFuYS9wcm92aXNpb25pbmcifSwic2VydmVyIjp7InJvb3RfdXJsIjoiJShwcm90b2NvbClzOi8vJShkb21haW4pczolKGh0dHBfcG9ydClzL2dyYWZhbmEiLCJzZXJ2ZV9mcm9tX3N1Yl9wYXRoIjpmYWxzZX19LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6ImdyYWZhbmEvZ3JhZmFuYSIsInRhZyI6IjExLjMuMSJ9LCJsaXZlbmVzc1Byb2JlIjp7ImZhaWx1cmVUaHJlc2hvbGQiOjEwLCJodHRwR2V0Ijp7InBhdGgiOiIvYXBpL2hlYWx0aCIsInBvcnQiOjMwMDB9LCJpbml0aWFsRGVsYXlTZWNvbmRzIjo2MCwidGltZW91dFNlY29uZHMiOjMwfSwibm9kZVNlbGVjdG9yIjp7fSwicGx1Z2lucyI6W10sInBvZEFubm90YXRpb25zIjp7fSwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyYmFjIjp7ImNyZWF0ZSI6dHJ1ZX0sInJlYWRpbmVzc1Byb2JlIjp7Imh0dHBHZXQiOnsicGF0aCI6Ii9hcGkvaGVhbHRoIiwicG9ydCI6MzAwMH19LCJyZXBsaWNhcyI6MSwicmVzb3VyY2VzIjp7fSwic2VjdXJpdHlDb250ZXh0Ijp7fSwic2VydmljZSI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInBvcnQiOjgwLCJ0eXBlIjoiQ2x1c3RlcklQIn0sInNlcnZpY2VBY2NvdW50Ijp7ImNyZWF0ZSI6dHJ1ZSwibmFtZSI6IiJ9LCJzaWRlY2FyIjp7ImRhc2hib2FyZHMiOnsiYW5ub3RhdGlvbnMiOnt9LCJlbmFibGVkIjp0cnVlLCJlcnJvcl90aHJvdHRsZV9zbGVlcCI6MCwiZm9sZGVyIjoiL3RtcC9kYXNoYm9hcmRzIiwibGFiZWwiOiJncmFmYW5hX2Rhc2hib2FyZCIsImxhYmVsVmFsdWUiOiIxIn0sImltYWdlIjp7InB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJyZXBvc2l0b3J5IjoiZ2hjci5pby9raXdpZ3JpZC9rOHMtc2lkZWNhciIsInRhZyI6IjEuMjguMSJ9LCJyZXNvdXJjZXMiOnt9fSwidG9sZXJhdGlvbnMiOltdfSwiaW5ncmVzcyI6eyJhbm5vdGF0aW9ucyI6eyJjZXJ0LmdhcmRlbmVyLmNsb3VkL3B1cnBvc2UiOiJtYW5hZ2VkIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2NsYXNzIjoiZ2FyZGVuIiwiZG5zLmdhcmRlbmVyLmNsb3VkL2Ruc25hbWVzIjoia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0IiwiZG5zLmdhcmRlbmVyLmNsb3VkL3R0bCI6IjE4MCJ9LCJjbGFzc05hbWUiOiJuZ2lueCIsImVuYWJsZWQiOnRydWUsImhvc3RzIjpbImt1YmVjb3N0LmxhYi5zdXhlc3NpdC5rOHMuY2xvdWQudWliay5hYy5hdCJdLCJwYXRoVHlwZSI6IkltcGxlbWVudGF0aW9uU3BlY2lmaWMiLCJwYXRocyI6WyIvIl0sInRscyI6W3siaG9zdHMiOlsia3ViZWNvc3QubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0Il0sInNlY3JldE5hbWUiOiJrdWJlY29zdC1zZXJ2ZXItdGxzIn1dfSwiaW5pdENob3duRGF0YSI6eyJyZXNvdXJjZXMiOnt9fSwiaW5pdENob3duRGF0YUltYWdlIjoiYnVzeWJveCIsImt1YmVjb3N0RGVwbG95bWVudCI6eyJhbm5vdGF0aW9ucyI6e30sImxhYmVscyI6e30sInJlcGxpY2FzIjoxfSwia3ViZWNvc3RGcm9udGVuZCI6eyJkZXBsb3lNZXRob2QiOiJzaW5nbGVwb2QiLCJkZXBsb3ltZW50U3RyYXRlZ3kiOnt9LCJlbmFibGVkIjp0cnVlLCJoYVJlcGxpY2FzIjoyLCJpbWFnZSI6Imdjci5pby9rdWJlY29zdDEvZnJvbnRlbmQiLCJpbWFnZVB1bGxQb2xpY3kiOiJJZk5vdFByZXNlbnQiLCJpcHY2Ijp7ImVuYWJsZWQiOnRydWV9LCJsaXZlbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjYsImluaXRpYWxEZWxheVNlY29uZHMiOjEsInBlcmlvZFNlY29uZHMiOjV9LCJyZWFkaW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjo2LCJpbml0aWFsRGVsYXlTZWNvbmRzIjoxLCJwZXJpb2RTZWNvbmRzIjo1fSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjEwbSIsIm1lbW9yeSI6IjU1TWkifX0sInVzZURlZmF1bHRGcWRuIjpmYWxzZX0sImt1YmVjb3N0TW9kZWwiOnsiY29udGFpbmVyU3RhdHNFbmFibGVkIjp0cnVlLCJldGxEYWlseVN0b3JlRHVyYXRpb25EYXlzIjo5MSwiZXRsSG91cmx5U3RvcmVEdXJhdGlvbkhvdXJzIjo0OSwiZXRsUmVhZE9ubHlNb2RlIjpmYWxzZSwiZXh0cmFBcmdzIjpbXSwiZXh0cmFQb3J0cyI6W10sImltYWdlIjoiZ2NyLmlvL2t1YmVjb3N0MS9jb3N0LW1vZGVsIiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibGl2ZW5lc3NQcm9iZSI6eyJlbmFibGVkIjp0cnVlLCJmYWlsdXJlVGhyZXNob2xkIjoyMDAsImluaXRpYWxEZWxheVNlY29uZHMiOjEwLCJwZXJpb2RTZWNvbmRzIjoxMH0sImxvZ0xldmVsIjoiaW5mbyIsIm1heFF1ZXJ5Q29uY3VycmVuY3kiOjUsInJlYWRpbmVzc1Byb2JlIjp7ImVuYWJsZWQiOnRydWUsImZhaWx1cmVUaHJlc2hvbGQiOjIwMCwiaW5pdGlhbERlbGF5U2Vjb25kcyI6MTAsInBlcmlvZFNlY29uZHMiOjEwfSwicmVzb3VyY2VzIjp7InJlcXVlc3RzIjp7ImNwdSI6IjIwMG0iLCJtZW1vcnkiOiI1NU1pIn19LCJ1dGNPZmZzZXQiOiIrMDA6MDAifSwia3ViZWNvc3RQcm9kdWN0Q29uZmlncyI6eyJjbHVzdGVyTmFtZSI6InN4LWNucC1vc3MgRGVtbyIsImNsdXN0ZXJQcm9maWxlIjoiZGV2ZWxvcG1lbnQiLCJjdXJyZW5jeUNvZGUiOiJFVVIiLCJjdXN0b21QcmljZXNFbmFibGVkIjp0cnVlLCJkZWZhdWx0TW9kZWxQcmljaW5nIjp7IkNQVSI6IjI4LjAiLCJHUFUiOiI2OTMuNTAiLCJSQU0iOiIzLjA5IiwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJuZXROZXR3b3JrRWdyZXNzIjoiMC4xMiIsInJlZ2lvbk5ldHdvcmtFZ3Jlc3MiOiIwLjAxIiwic3BvdENQVSI6IjQuODYiLCJzcG90R1BVIjoiMjI1LjAiLCJzcG90UkFNIjoiMC42NSIsInN0b3JhZ2UiOiIwLjA0Iiwiem9uZU5ldHdvcmtFZ3Jlc3MiOiIwLjAxIn0sImdyYWZhbmFVUkwiOiJodHRwczovL2dyYWZhbmEubGFiLnN1eGVzc2l0Lms4cy5jbG91ZC51aWJrLmFjLmF0In0sIm5ldHdvcmtDb3N0cyI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiYWRkaXRpb25hbFNlY3VyaXR5Q29udGV4dCI6e30sImFmZmluaXR5Ijp7fSwiYW5ub3RhdGlvbnMiOnt9LCJjb25maWciOnsiZGVzdGluYXRpb25zIjp7ImNyb3NzLXJlZ2lvbiI6W10sImRpcmVjdC1jbGFzc2lmaWNhdGlvbiI6W10sImluLXJlZ2lvbiI6W10sImluLXpvbmUiOlsiMTI3LjAuMC4wLzgiLCIxNjkuMjU0LjAuMC8xNiIsIjEwLjAuMC4wLzgiLCIxNzIuMTYuMC4wLzEyIiwiMTkyLjE2OC4wLjAvMTYiXSwiaW50ZXJuZXQiOltdfSwic2VydmljZXMiOnsiYW1hem9uLXdlYi1zZXJ2aWNlcyI6dHJ1ZSwiYXp1cmUtY2xvdWQtc2VydmljZXMiOnRydWUsImdvb2dsZS1jbG91ZC1zZXJ2aWNlcyI6dHJ1ZX19LCJlbmFibGVkIjp0cnVlLCJleHRyYUFyZ3MiOltdLCJoZWFsdGhDaGVja1Byb2JlcyI6e30sImltYWdlIjp7InJlcG9zaXRvcnkiOiJnY3IuaW8va3ViZWNvc3QxL2t1YmVjb3N0LW5ldHdvcmstY29zdHMiLCJ0YWciOiJ2MC4xNy42In0sImltYWdlUHVsbFBvbGljeSI6IklmTm90UHJlc2VudCIsImxvZ0xldmVsIjoiaW5mbyIsIm5vZGVTZWxlY3RvciI6e30sInBvcnQiOjMwMDEsInByaW9yaXR5Q2xhc3NOYW1lIjoiIiwicHJvbWV0aGV1c1NjcmFwZSI6ZmFsc2UsInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiNTAwbSJ9LCJyZXF1ZXN0cyI6eyJjcHUiOiI1MG0iLCJtZW1vcnkiOiIyME1pIn19LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwibGFiZWxzIjp7fX0sInRvbGVyYXRpb25zIjpbXSwidHJhZmZpY0xvZ2dpbmciOnRydWUsInVwZGF0ZVN0cmF0ZWd5Ijp7InR5cGUiOiJSb2xsaW5nVXBkYXRlIn19LCJub2RlU2VsZWN0b3IiOnt9LCJwZXJzaXN0ZW50Vm9sdW1lIjp7ImFubm90YXRpb25zIjp7fSwiZGJTaXplIjoiNUdpIiwiZW5hYmxlZCI6dHJ1ZSwibGFiZWxzIjp7fSwic2l6ZSI6IjVHaSJ9LCJwcm9tZXRoZXVzIjp7ImFsZXJ0bWFuYWdlckZpbGVzIjp7ImFsZXJ0bWFuYWdlci55bWwiOnsiZ2xvYmFsIjp7fSwicmVjZWl2ZXJzIjpbeyJuYW1lIjoiZGVmYXVsdC1yZWNlaXZlciJ9XSwicm91dGUiOnsiZ3JvdXBfaW50ZXJ2YWwiOiI1bSIsImdyb3VwX3dhaXQiOiIxMHMiLCJyZWNlaXZlciI6ImRlZmF1bHQtcmVjZWl2ZXIiLCJyZXBlYXRfaW50ZXJ2YWwiOiIzaCJ9fX0sImNvbmZpZ21hcFJlbG9hZCI6e30sImV4dHJhU2NyYXBlQ29uZmlncyI6Ii0gam9iX25hbWU6IGt1YmVjb3N0XG4gIGhvbm9yX2xhYmVsczogdHJ1ZVxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImNvc3QtYW5hbHl6ZXIuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAgcG9ydDogOTAwM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtbmV0d29ya2luZ1xuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBwb2RcbiAgcmVsYWJlbF9jb25maWdzOlxuICAjIFNjcmFwZSBvbmx5IHRoZSB0aGUgdGFyZ2V0cyBtYXRjaGluZyB0aGUgZm9sbG93aW5nIG1ldGFkYXRhXG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX2luc3RhbmNlXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogIGt1YmVjb3N0XG4gICAgLSBzb3VyY2VfbGFiZWxzOiBbX19tZXRhX2t1YmVybmV0ZXNfcG9kX2xhYmVsX2FwcF9rdWJlcm5ldGVzX2lvX25hbWVdXG4gICAgICBhY3Rpb246IGtlZXBcbiAgICAgIHJlZ2V4OiAgbmV0d29yay1jb3N0c1xuLSBqb2JfbmFtZToga3ViZWNvc3QtYWdncmVnYXRvclxuICBzY3JhcGVfaW50ZXJ2YWw6IDFtXG4gIHNjcmFwZV90aW1lb3V0OiA2MHNcbiAgbWV0cmljc19wYXRoOiAvbWV0cmljc1xuICBzY2hlbWU6IGh0dHBcbiAgZG5zX3NkX2NvbmZpZ3M6XG4gIC0gbmFtZXM6XG4gICAgLSB7eyB0ZW1wbGF0ZSBcImFnZ3JlZ2F0b3Iuc2VydmljZU5hbWVcIiAuIH19XG4gICAgdHlwZTogJ0EnXG4gICAge3stIGlmIG9yIC5WYWx1ZXMuc2FtbC5lbmFibGVkIC5WYWx1ZXMub2lkYy5lbmFibGVkIH19XG4gICAgcG9ydDogOTAwOFxuICAgIHt7LSBlbHNlIH19XG4gICAgcG9ydDogOTAwNFxuICAgIHt7LSBlbmQgfX1cbiMjIEVuYWJsZXMgc2NyYXBpbmcgb2YgTlZJRElBIEdQVSBtZXRyaWNzIHZpYSBkY2dtLWV4cG9ydGVyLiBTY3JhcGVzIGFsbFxuIyMgZW5kcG9pbnRzIHdoaWNoIGNvbnRhaW4gXCJkY2dtLWV4cG9ydGVyXCIgaW4gbGFiZWxzIFwiYXBwXCIsXG4jIyBcImFwcC5rdWJlcm5ldGVzLmlvL2NvbXBvbmVudFwiLCBvciBcImFwcC5rdWJlcm5ldGVzLmlvL25hbWVcIiB3aXRoIGEgY2FzZVxuIyMgaW5zZW5zaXRpdmUgbWF0Y2guIFRoZSBsYWJlbCBtdXN0IGJlIHByZXNlbnQgb24gdGhlIEs4cyBzZXJ2aWNlIGVuZHBvaW50cyBhbmQgbm90IGp1c3QgcG9kcy5cbiMjIFJlZnM6XG4jIyBodHRwczovL2dpdGh1Yi5jb20vTlZJRElBL2dwdS1vcGVyYXRvci9ibG9iL2Q0MzE2YTQxNWJiZDY4NGNlODQxNmE4ODA0MjMwNWZjMWEwOTNhYTQvYXNzZXRzL3N0YXRlLWRjZ20tZXhwb3J0ZXIvMDYwMF9zZXJ2aWNlLnlhbWwjTDdcbiMjIGh0dHBzOi8vZ2l0aHViLmNvbS9OVklESUEvZGNnbS1leHBvcnRlci9ibG9iLzU0ZmQxY2ExMzdjNjY1MTFhODdhNzIwMzkwNjEzNjgwYjliZGFiZGQvZGVwbG95bWVudC90ZW1wbGF0ZXMvc2VydmljZS55YW1sI0wyM1xuLSBqb2JfbmFtZToga3ViZWNvc3QtZGNnbS1leHBvcnRlclxuICBrdWJlcm5ldGVzX3NkX2NvbmZpZ3M6XG4gICAgLSByb2xlOiBlbmRwb2ludHNcbiAgcmVsYWJlbF9jb25maWdzOlxuICAgIC0gc291cmNlX2xhYmVsczogW19fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHAsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19jb21wb25lbnQsIF9fbWV0YV9rdWJlcm5ldGVzX3BvZF9sYWJlbF9hcHBfa3ViZXJuZXRlc19pb19uYW1lXVxuICAgICAgYWN0aW9uOiBrZWVwXG4gICAgICByZWdleDogKD9pKSguKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKnwuKmRjZ20tZXhwb3J0ZXIuKilcbiIsInJiYWMiOnsiY3JlYXRlIjp0cnVlfSwic2VydmVyIjp7ImFmZmluaXR5Ijp7fSwiYWxlcnRtYW5hZ2VycyI6W10sImFubm90YXRpb25zIjp7fSwiYmFzZVVSTCI6IiIsImNvbmZpZ01hcE92ZXJyaWRlTmFtZSI6IiIsImNvbmZpZ1BhdGgiOiIvZXRjL2NvbmZpZy9wcm9tZXRoZXVzLnltbCIsImNvbnRhaW5lclNlY3VyaXR5Q29udGV4dCI6e30sImVtcHR5RGlyIjp7InNpemVMaW1pdCI6IiJ9LCJlbmFibGVkIjp0cnVlLCJlbnYiOltdLCJleHRyYUFyZ3MiOnsicXVlcnkubWF4LWNvbmN1cnJlbmN5IjoxLCJxdWVyeS5tYXgtc2FtcGxlcyI6MTAwMDAwMDAwfSwiZXh0cmFDb25maWdtYXBNb3VudHMiOltdLCJleHRyYUZsYWdzIjpbIndlYi5lbmFibGUtbGlmZWN5Y2xlIl0sImV4dHJhSG9zdFBhdGhNb3VudHMiOltdLCJleHRyYUluaXRDb250YWluZXJzIjpbXSwiZXh0cmFTZWNyZXRNb3VudHMiOltdLCJleHRyYVZvbHVtZU1vdW50cyI6W10sImV4dHJhVm9sdW1lcyI6W10sImdsb2JhbCI6eyJldmFsdWF0aW9uX2ludGVydmFsIjoiMW0iLCJleHRlcm5hbF9sYWJlbHMiOnsiY2x1c3Rlcl9pZCI6InN4LWNucC1vc3MifSwic2NyYXBlX2ludGVydmFsIjoiMW0iLCJzY3JhcGVfdGltZW91dCI6IjYwcyJ9LCJpbWFnZSI6eyJwdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwicmVwb3NpdG9yeSI6InF1YXkuaW8vcHJvbWV0aGV1cy9wcm9tZXRoZXVzIiwidGFnIjoidjIuNTUuMSJ9LCJsaXZlbmVzc1Byb2JlRmFpbHVyZVRocmVzaG9sZCI6MywibGl2ZW5lc3NQcm9iZUluaXRpYWxEZWxheSI6NSwibGl2ZW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsImxpdmVuZXNzUHJvYmVUaW1lb3V0IjozLCJuYW1lIjoic2VydmVyIiwibm9kZVNlbGVjdG9yIjp7fSwicGVyc2lzdGVudFZvbHVtZSI6eyJhY2Nlc3NNb2RlcyI6WyJSZWFkV3JpdGVPbmNlIl0sImFubm90YXRpb25zIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiZXhpc3RpbmdDbGFpbSI6IiIsIm1vdW50UGF0aCI6Ii9kYXRhIiwic2l6ZSI6IjMyR2kiLCJzdWJQYXRoIjoiIn0sInBvZEFubm90YXRpb25zIjp7fSwicG9kTGFiZWxzIjp7fSwicHJlZml4VVJMIjoiIiwicHJpb3JpdHlDbGFzc05hbWUiOiIiLCJyZWFkaW5lc3NQcm9iZUZhaWx1cmVUaHJlc2hvbGQiOjMsInJlYWRpbmVzc1Byb2JlSW5pdGlhbERlbGF5Ijo1LCJyZWFkaW5lc3NQcm9iZVN1Y2Nlc3NUaHJlc2hvbGQiOjEsInJlYWRpbmVzc1Byb2JlVGltZW91dCI6MywicmVtb3RlUmVhZCI6e30sInJlbW90ZVdyaXRlIjp7fSwicmVwbGljYUNvdW50IjoxLCJyZXNvdXJjZXMiOnt9LCJyZXRlbnRpb24iOiI5N2giLCJzZWN1cml0eUNvbnRleHQiOnt9LCJzZXJ2aWNlIjp7ImFubm90YXRpb25zIjp7fSwiY2x1c3RlcklQIjoiIiwiZXh0ZXJuYWxJUHMiOltdLCJsYWJlbHMiOnt9LCJsb2FkQmFsYW5jZXJJUCI6IiIsImxvYWRCYWxhbmNlclNvdXJjZVJhbmdlcyI6W10sInNlcnZpY2VQb3J0Ijo4MCwic2Vzc2lvbkFmZmluaXR5IjoiTm9uZSIsInR5cGUiOiJDbHVzdGVySVAifSwic3RyYXRlZ3kiOnsidHlwZSI6IlJlY3JlYXRlIn0sInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzIjozMDAsInRvbGVyYXRpb25zIjpbXX0sInNlcnZlckZpbGVzIjp7ImFsZXJ0aW5nX3J1bGVzLnltbCI6e30sInByb21ldGhldXMueW1sIjp7InJ1bGVfZmlsZXMiOlsiL2V0Yy9jb25maWcvcmVjb3JkaW5nX3J1bGVzLnltbCIsIi9ldGMvY29uZmlnL2FsZXJ0aW5nX3J1bGVzLnltbCJdLCJzY3JhcGVfY29uZmlncyI6W3siam9iX25hbWUiOiJwcm9tZXRoZXVzIiwic3RhdGljX2NvbmZpZ3MiOlt7InRhcmdldHMiOlsibG9jYWxob3N0OjkwOTAiXX1dfSx7ImJlYXJlcl90b2tlbl9maWxlIjoiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3Rva2VuIiwiam9iX25hbWUiOiJrdWJlcm5ldGVzLW5vZGVzLWNhZHZpc29yIiwia3ViZXJuZXRlc19zZF9jb25maWdzIjpbeyJyb2xlIjoibm9kZSJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHxjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfZXJyb3JzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3RyYW5zbWl0X2Vycm9yc190b3RhbHxjb250YWluZXJfbmV0d29ya19yZWNlaXZlX3BhY2tldHNfZHJvcHBlZF90b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9wYWNrZXRzX2Ryb3BwZWRfdG90YWx8Y29udGFpbmVyX21lbW9yeV91c2FnZV9ieXRlc3xjb250YWluZXJfY3B1X2Nmc190aHJvdHRsZWRfcGVyaW9kc190b3RhbHxjb250YWluZXJfY3B1X2Nmc19wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9mc191c2FnZV9ieXRlc3xjb250YWluZXJfZnNfbGltaXRfYnl0ZXN8Y29udGFpbmVyX2NwdV9jZnNfcGVyaW9kc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9jcHVfY2ZzX3Rocm90dGxlZF9wZXJpb2RzX3RvdGFsfGNvbnRhaW5lcl9jcHVfY2ZzX3BlcmlvZHNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxjb250YWluZXJfZnNfaW5vZGVzX2ZyZWV8Y29udGFpbmVyX2ZzX2lub2Rlc190b3RhbHxjb250YWluZXJfZnNfdXNhZ2VfYnl0ZXN8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9zcGVjX2NwdV9zaGFyZXN8Y29udGFpbmVyX3NwZWNfbWVtb3J5X2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3JlYWRzX2J5dGVzX3RvdGFsfGNvbnRhaW5lcl9uZXR3b3JrX3JlY2VpdmVfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2ZzX3dyaXRlc19ieXRlc190b3RhbHxjb250YWluZXJfZnNfcmVhZHNfYnl0ZXNfdG90YWx8Y2Fkdmlzb3JfdmVyc2lvbl9pbmZvfGt1YmVjb3N0X3B2X2luZm8pIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IiguKykiLCJzb3VyY2VfbGFiZWxzIjpbImNvbnRhaW5lciJdLCJ0YXJnZXRfbGFiZWwiOiJjb250YWluZXJfbmFtZSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKC4rKSIsInNvdXJjZV9sYWJlbHMiOlsicG9kIl0sInRhcmdldF9sYWJlbCI6InBvZF9uYW1lIn1dLCJyZWxhYmVsX2NvbmZpZ3MiOlt7ImFjdGlvbiI6ImxhYmVsbWFwIiwicmVnZXgiOiJfX21ldGFfa3ViZXJuZXRlc19ub2RlX2xhYmVsXyguKykifSx7InJlcGxhY2VtZW50Ijoia3ViZXJuZXRlcy5kZWZhdWx0LnN2Yzo0NDMiLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsicmVnZXgiOiIoLispIiwicmVwbGFjZW1lbnQiOiIvYXBpL3YxL25vZGVzLyQxL3Byb3h5L21ldHJpY3MvY2Fkdmlzb3IiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX25vZGVfbmFtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX21ldHJpY3NfcGF0aF9fIn1dLCJzY2hlbWUiOiJodHRwcyIsInRsc19jb25maWciOnsiY2FfZmlsZSI6Ii92YXIvcnVuL3NlY3JldHMva3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9jYS5jcnQiLCJpbnNlY3VyZV9za2lwX3ZlcmlmeSI6dHJ1ZX19LHsiYmVhcmVyX3Rva2VuX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvdG9rZW4iLCJqb2JfbmFtZSI6Imt1YmVybmV0ZXMtbm9kZXMiLCJrdWJlcm5ldGVzX3NkX2NvbmZpZ3MiOlt7InJvbGUiOiJub2RlIn1dLCJtZXRyaWNfcmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJrZWVwIiwicmVnZXgiOiIoa3ViZWxldF92b2x1bWVfc3RhdHNfdXNlZF9ieXRlcykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbmFtZV9fIl19XSwicmVsYWJlbF9jb25maWdzIjpbeyJhY3Rpb24iOiJsYWJlbG1hcCIsInJlZ2V4IjoiX19tZXRhX2t1YmVybmV0ZXNfbm9kZV9sYWJlbF8oLispIn0seyJyZXBsYWNlbWVudCI6Imt1YmVybmV0ZXMuZGVmYXVsdC5zdmM6NDQzIiwidGFyZ2V0X2xhYmVsIjoiX19hZGRyZXNzX18ifSx7InJlZ2V4IjoiKC4rKSIsInJlcGxhY2VtZW50IjoiL2FwaS92MS9ub2Rlcy8kMS9wcm94eS9tZXRyaWNzIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19ub2RlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoiX19tZXRyaWNzX3BhdGhfXyJ9XSwic2NoZW1lIjoiaHR0cHMiLCJ0bHNfY29uZmlnIjp7ImNhX2ZpbGUiOiIvdmFyL3J1bi9zZWNyZXRzL2t1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvY2EuY3J0IiwiaW5zZWN1cmVfc2tpcF92ZXJpZnkiOnRydWV9fSx7ImpvYl9uYW1lIjoia3ViZXJuZXRlcy1zZXJ2aWNlLWVuZHBvaW50cyIsImt1YmVybmV0ZXNfc2RfY29uZmlncyI6W3sicm9sZSI6ImVuZHBvaW50cyJ9XSwibWV0cmljX3JlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4IjoiKGNvbnRhaW5lcl9jcHVfYWxsb2NhdGlvbnxjb250YWluZXJfY3B1X3VzYWdlX3NlY29uZHNfdG90YWx8Y29udGFpbmVyX2ZzX2xpbWl0X2J5dGVzfGNvbnRhaW5lcl9mc193cml0ZXNfYnl0ZXNfdG90YWx8Y29udGFpbmVyX2dwdV9hbGxvY2F0aW9ufGNvbnRhaW5lcl9tZW1vcnlfYWxsb2NhdGlvbl9ieXRlc3xjb250YWluZXJfbWVtb3J5X3VzYWdlX2J5dGVzfGNvbnRhaW5lcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8Y29udGFpbmVyX25ldHdvcmtfcmVjZWl2ZV9ieXRlc190b3RhbHxjb250YWluZXJfbmV0d29ya190cmFuc21pdF9ieXRlc190b3RhbHxEQ0dNX0ZJX0RFVl9HUFVfVVRJTHxkZXBsb3ltZW50X21hdGNoX2xhYmVsc3xrdWJlX2RhZW1vbnNldF9zdGF0dXNfZGVzaXJlZF9udW1iZXJfc2NoZWR1bGVkfGt1YmVfZGFlbW9uc2V0X3N0YXR1c19udW1iZXJfcmVhZHl8a3ViZV9kZXBsb3ltZW50X3NwZWNfcmVwbGljYXN8a3ViZV9kZXBsb3ltZW50X3N0YXR1c19yZXBsaWNhc3xrdWJlX2RlcGxveW1lbnRfc3RhdHVzX3JlcGxpY2FzX2F2YWlsYWJsZXxrdWJlX2pvYl9zdGF0dXNfZmFpbGVkfGt1YmVfbmFtZXNwYWNlX2Fubm90YXRpb25zfGt1YmVfbmFtZXNwYWNlX2xhYmVsc3xrdWJlX25vZGVfaW5mb3xrdWJlX25vZGVfbGFiZWxzfGt1YmVfbm9kZV9zdGF0dXNfYWxsb2NhdGFibGV8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9jcHVfY29yZXN8a3ViZV9ub2RlX3N0YXR1c19hbGxvY2F0YWJsZV9tZW1vcnlfYnl0ZXN8a3ViZV9ub2RlX3N0YXR1c19jYXBhY2l0eXxrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X2NwdV9jb3Jlc3xrdWJlX25vZGVfc3RhdHVzX2NhcGFjaXR5X21lbW9yeV9ieXRlc3xrdWJlX25vZGVfc3RhdHVzX2NvbmRpdGlvbnxrdWJlX3BlcnNpc3RlbnR2b2x1bWVfY2FwYWNpdHlfYnl0ZXN8a3ViZV9wZXJzaXN0ZW50dm9sdW1lX3N0YXR1c19waGFzZXxrdWJlX3BlcnNpc3RlbnR2b2x1bWVjbGFpbV9pbmZvfGt1YmVfcGVyc2lzdGVudHZvbHVtZWNsYWltX3Jlc291cmNlX3JlcXVlc3RzX3N0b3JhZ2VfYnl0ZXN8a3ViZV9wb2RfY29udGFpbmVyX2luZm98a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX2xpbWl0c3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfbGltaXRzX21lbW9yeV9ieXRlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHN8a3ViZV9wb2RfY29udGFpbmVyX3Jlc291cmNlX3JlcXVlc3RzX2NwdV9jb3Jlc3xrdWJlX3BvZF9jb250YWluZXJfcmVzb3VyY2VfcmVxdWVzdHNfbWVtb3J5X2J5dGVzfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfcmVzdGFydHNfdG90YWx8a3ViZV9wb2RfY29udGFpbmVyX3N0YXR1c19ydW5uaW5nfGt1YmVfcG9kX2NvbnRhaW5lcl9zdGF0dXNfdGVybWluYXRlZF9yZWFzb258a3ViZV9wb2RfbGFiZWxzfGt1YmVfcG9kX293bmVyfGt1YmVfcG9kX3N0YXR1c19waGFzZXxrdWJlX3JlcGxpY2FzZXRfb3duZXJ8a3ViZV9zdGF0ZWZ1bHNldF9yZXBsaWNhc3xrdWJlX3N0YXRlZnVsc2V0X3N0YXR1c19yZXBsaWNhc3xrdWJlY29zdF9jbHVzdGVyX2luZm98a3ViZWNvc3RfY2x1c3Rlcl9tYW5hZ2VtZW50X2Nvc3R8a3ViZWNvc3RfY2x1c3Rlcl9tZW1vcnlfd29ya2luZ19zZXRfYnl0ZXN8a3ViZWNvc3RfbG9hZF9iYWxhbmNlcl9jb3N0fGt1YmVjb3N0X25ldHdvcmtfaW50ZXJuZXRfZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya19yZWdpb25fZWdyZXNzX2Nvc3R8a3ViZWNvc3RfbmV0d29ya196b25lX2VncmVzc19jb3N0fGt1YmVjb3N0X25vZGVfaXNfc3BvdHxrdWJlY29zdF9wb2RfbmV0d29ya19lZ3Jlc3NfYnl0ZXNfdG90YWx8bm9kZV9jcHVfaG91cmx5X2Nvc3R8bm9kZV9jcHVfc2Vjb25kc190b3RhbHxub2RlX2Rpc2tfcmVhZHNfY29tcGxldGVkfG5vZGVfZGlza19yZWFkc19jb21wbGV0ZWRfdG90YWx8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWR8bm9kZV9kaXNrX3dyaXRlc19jb21wbGV0ZWRfdG90YWx8bm9kZV9maWxlc3lzdGVtX2RldmljZV9lcnJvcnxub2RlX2dwdV9jb3VudHxub2RlX2dwdV9ob3VybHlfY29zdHxub2RlX21lbW9yeV9CdWZmZXJzX2J5dGVzfG5vZGVfbWVtb3J5X0NhY2hlZF9ieXRlc3xub2RlX21lbW9yeV9NZW1BdmFpbGFibGVfYnl0ZXN8bm9kZV9tZW1vcnlfTWVtRnJlZV9ieXRlc3xub2RlX21lbW9yeV9NZW1Ub3RhbF9ieXRlc3xub2RlX25ldHdvcmtfdHJhbnNtaXRfYnl0ZXNfdG90YWx8bm9kZV9yYW1faG91cmx5X2Nvc3R8bm9kZV90b3RhbF9ob3VybHlfY29zdHxwb2RfcHZjX2FsbG9jYXRpb258cHZfaG91cmx5X2Nvc3R8c2VydmljZV9zZWxlY3Rvcl9sYWJlbHN8c3RhdGVmdWxTZXRfbWF0Y2hfbGFiZWxzfGt1YmVjb3N0X3B2X2luZm98dXApIiwic291cmNlX2xhYmVscyI6WyJfX25hbWVfXyJdfV0sInJlbGFiZWxfY29uZmlncyI6W3siYWN0aW9uIjoia2VlcCIsInJlZ2V4Ijp0cnVlLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjcmFwZSJdfSx7ImFjdGlvbiI6ImtlZXAiLCJyZWdleCI6IiguKm5vZGUtZXhwb3J0ZXJ8a3ViZWNvc3QtbmV0d29yay1jb3N0cykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX2VuZHBvaW50c19uYW1lIl19LHsiYWN0aW9uIjoicmVwbGFjZSIsInJlZ2V4IjoiKGh0dHBzPykiLCJzb3VyY2VfbGFiZWxzIjpbIl9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfYW5ub3RhdGlvbl9wcm9tZXRoZXVzX2lvX3NjaGVtZSJdLCJ0YXJnZXRfbGFiZWwiOiJfX3NjaGVtZV9fIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwicmVnZXgiOiIoLispIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX2Fubm90YXRpb25fcHJvbWV0aGV1c19pb19wYXRoIl0sInRhcmdldF9sYWJlbCI6Il9fbWV0cmljc19wYXRoX18ifSx7ImFjdGlvbiI6InJlcGxhY2UiLCJyZWdleCI6IihbXjpdKykoPzo6XFxkKyk/OyhcXGQrKSIsInJlcGxhY2VtZW50IjoiJDE6JDIiLCJzb3VyY2VfbGFiZWxzIjpbIl9fYWRkcmVzc19fIiwiX19tZXRhX2t1YmVybmV0ZXNfc2VydmljZV9hbm5vdGF0aW9uX3Byb21ldGhldXNfaW9fcG9ydCJdLCJ0YXJnZXRfbGFiZWwiOiJfX2FkZHJlc3NfXyJ9LHsiYWN0aW9uIjoibGFiZWxtYXAiLCJyZWdleCI6Il9fbWV0YV9rdWJlcm5ldGVzX3NlcnZpY2VfbGFiZWxfKC4rKSJ9LHsiYWN0aW9uIjoicmVwbGFjZSIsInNvdXJjZV9sYWJlbHMiOlsiX19tZXRhX2t1YmVybmV0ZXNfbmFtZXNwYWNlIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbmFtZXNwYWNlIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19zZXJ2aWNlX25hbWUiXSwidGFyZ2V0X2xhYmVsIjoia3ViZXJuZXRlc19uYW1lIn0seyJhY3Rpb24iOiJyZXBsYWNlIiwic291cmNlX2xhYmVscyI6WyJfX21ldGFfa3ViZXJuZXRlc19wb2Rfbm9kZV9uYW1lIl0sInRhcmdldF9sYWJlbCI6Imt1YmVybmV0ZXNfbm9kZSJ9XX1dfSwicmVjb3JkaW5nX3J1bGVzLnltbCI6e30sInJ1bGVzIjp7Imdyb3VwcyI6W3sibmFtZSI6IkNQVSIsInJ1bGVzIjpbeyJleHByIjoic3VtKHJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJcIn1bNW1dKSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZTpyYXRlNW0ifSx7ImV4cHIiOiJyYXRlKGNvbnRhaW5lcl9jcHVfdXNhZ2Vfc2Vjb25kc190b3RhbHtjb250YWluZXIhPVwiXCJ9WzVtXSkiLCJyZWNvcmQiOiJjbHVzdGVyOmNwdV91c2FnZV9ub3N1bTpyYXRlNW0ifSx7ImV4cHIiOiJhdmcoaXJhdGUoY29udGFpbmVyX2NwdV91c2FnZV9zZWNvbmRzX3RvdGFse2NvbnRhaW5lciE9XCJQT0RcIiwgY29udGFpbmVyIT1cIlwifVs1bV0pKSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX2NwdV91c2FnZV9pcmF0ZSJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSBieSAoY29udGFpbmVyLHBvZCxuYW1lc3BhY2UpIiwicmVjb3JkIjoia3ViZWNvc3RfY29udGFpbmVyX21lbW9yeV93b3JraW5nX3NldF9ieXRlcyJ9LHsiZXhwciI6InN1bShjb250YWluZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVze2NvbnRhaW5lciE9XCJQT0RcIixjb250YWluZXIhPVwiXCJ9KSIsInJlY29yZCI6Imt1YmVjb3N0X2NsdXN0ZXJfbWVtb3J5X3dvcmtpbmdfc2V0X2J5dGVzIn1dfSx7Im5hbWUiOiJTYXZpbmdzIiwicnVsZXMiOlt7ImV4cHIiOiJzdW0oYXZnKGt1YmVfcG9kX293bmVye293bmVyX2tpbmQhPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSIsImxhYmVscyI6eyJkYWVtb25zZXQiOiJmYWxzZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kPVwiRGFlbW9uU2V0XCJ9KSBieSAocG9kKSAqIHN1bShjb250YWluZXJfY3B1X2FsbG9jYXRpb24pIGJ5IChwb2QpKSAvIHN1bShrdWJlX25vZGVfaW5mbykiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoidHJ1ZSJ9LCJyZWNvcmQiOiJrdWJlY29zdF9zYXZpbmdzX2NwdV9hbGxvY2F0aW9uIn0seyJleHByIjoic3VtKGF2ZyhrdWJlX3BvZF9vd25lcntvd25lcl9raW5kIT1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkiLCJsYWJlbHMiOnsiZGFlbW9uc2V0IjoiZmFsc2UifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9LHsiZXhwciI6InN1bShhdmcoa3ViZV9wb2Rfb3duZXJ7b3duZXJfa2luZD1cIkRhZW1vblNldFwifSkgYnkgKHBvZCkgKiBzdW0oY29udGFpbmVyX21lbW9yeV9hbGxvY2F0aW9uX2J5dGVzKSBieSAocG9kKSkgLyBzdW0oa3ViZV9ub2RlX2luZm8pIiwibGFiZWxzIjp7ImRhZW1vbnNldCI6InRydWUifSwicmVjb3JkIjoia3ViZWNvc3Rfc2F2aW5nc19tZW1vcnlfYWxsb2NhdGlvbl9ieXRlcyJ9XX1dfX0sInNlcnZpY2VBY2NvdW50cyI6eyJhbGVydG1hbmFnZXIiOnsiY3JlYXRlIjp0cnVlfSwibm9kZUV4cG9ydGVyIjp7ImNyZWF0ZSI6dHJ1ZX0sInNlcnZlciI6eyJhbm5vdGF0aW9ucyI6e30sImNyZWF0ZSI6dHJ1ZX19fSwicHJvbWV0aGV1c1J1bGUiOnsiYWRkaXRpb25hbExhYmVscyI6e30sImVuYWJsZWQiOnRydWV9LCJyZXBvcnRpbmciOnsiZXJyb3JSZXBvcnRpbmciOnRydWUsImxvZ0NvbGxlY3Rpb24iOnRydWUsInByb2R1Y3RBbmFseXRpY3MiOnRydWUsInZhbHVlc1JlcG9ydGluZyI6dHJ1ZX0sInNlcnZpY2UiOnsiYW5ub3RhdGlvbnMiOnt9LCJsYWJlbHMiOnt9LCJub2RlUG9ydCI6e30sInBvcnQiOjkwOTAsInRhcmdldFBvcnQiOjkwOTAsInR5cGUiOiJDbHVzdGVySVAifSwic2VydmljZUFjY291bnQiOnsiYW5ub3RhdGlvbnMiOnt9LCJjcmVhdGUiOnRydWV9LCJzZXJ2aWNlTW9uaXRvciI6eyJhZGRpdGlvbmFsTGFiZWxzIjp7fSwiZW5hYmxlZCI6dHJ1ZSwiaW50ZXJ2YWwiOiIxbSIsIm1ldHJpY1JlbGFiZWxpbmdzIjpbXSwibmV0d29ya0Nvc3RzIjp7ImFkZGl0aW9uYWxMYWJlbHMiOnt9LCJlbmFibGVkIjp0cnVlLCJpbnRlcnZhbCI6IjFtIiwibWV0cmljUmVsYWJlbGluZ3MiOltdLCJyZWxhYmVsaW5ncyI6W10sInNjcmFwZVRpbWVvdXQiOiIxMHMifSwicmVsYWJlbGluZ3MiOltdLCJzY3JhcGVUaW1lb3V0IjoiMTBzIn0sInNpZ1Y0UHJveHkiOnsiaG9zdCI6ImFwcy13b3Jrc3BhY2VzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwiaW1hZ2UiOiJwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtc2lndjQtcHJveHk6bGF0ZXN0IiwiaW1hZ2VQdWxsUG9saWN5IjoiSWZOb3RQcmVzZW50IiwibmFtZSI6ImFwcyIsInBvcnQiOjgwMDUsInJlZ2lvbiI6InVzLXdlc3QtMiIsInJlc291cmNlcyI6e319LCJzdXBwb3J0TkZTIjpmYWxzZSwidG9sZXJhdGlvbnMiOltdLCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzIjpbXSwidXBncmFkZSI6eyJ0b1YyIjpmYWxzZX19
- name: READ_ONLY
value: "false"
- name: PROMETHEUS_SERVER_ENDPOINT
valueFrom:
@@ -113,16 +118,8 @@
- name: DB_PATH
value: /var/db/
- name: CLUSTER_PROFILE
value: development
- - name: EMIT_POD_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC
- value: "false"
- - name: EMIT_KSM_V1_METRICS
- value: "true"
- - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default
- value: "false"
- name: LOG_COLLECTION_ENABLED
value: "true"
- name: PRODUCT_ANALYTICS_ENABLED
value: "true"
@@ -131,32 +128,18 @@
- name: VALUES_REPORTING_ENABLED
value: "true"
- name: SENTRY_DSN
value: "https://[email protected]/5245431"
- - name: LEGACY_EXTERNAL_API_DISABLED
- value: "false"
- - name: CACHE_WARMING_ENABLED
- value: "false"
- - name: SAVINGS_ENABLED
- value: "true"
- name: ETL_RESOLUTION_SECONDS
value: "300"
- name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES
value: "1440"
- name: ETL_DAILY_STORE_DURATION_DAYS
value: "91"
- name: ETL_HOURLY_STORE_DURATION_HOURS
value: "49"
- - name: ETL_FILE_STORE_ENABLED
- value: "true"
- - name: ETL_ASSET_RECONCILIATION_ENABLED
- value: "true"
- name: CONTAINER_STATS_ENABLED
value: "true"
- - name: RECONCILE_NETWORK
- value: "true"
- - name: KUBECOST_METRICS_POD_ENABLED
- value: "false"
- name: PV_ENABLED
value: "true"
- name: MAX_QUERY_CONCURRENCY
value: "5"
@@ -190,9 +173,9 @@
- name: WATERFOWL_ENABLED
value: "true"
- name: DIAGNOSTICS_RUN_IN_COST_MODEL
value: "false"
- - image: gcr.io/kubecost1/frontend:prod-2.4.3
+ - image: gcr.io/kubecost1/frontend:prod-2.5.1
env:
- name: GET_HOSTS_FROM
value: dns
name: cost-analyzer-frontend
@@ -240,9 +223,9 @@
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
port: 9004
@@ -294,9 +277,9 @@
- name: GRAFANA_ENABLED
value: "false"
- name: cloud-cost
- image: gcr.io/kubecost1/cost-model:prod-2.4.3
+ image: gcr.io/kubecost1/cost-model:prod-2.5.1
readinessProbe:
httpGet:
path: /healthz
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-frontend-config-map-template.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -5,11 +5,10 @@
metadata:
name: nginx-conf
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
@@ -82,9 +81,9 @@
add_header Cache-Control "max-age=300";
location / {
try_files $uri $uri/ /index.html;
}
- add_header ETag "2.4.3";
+ add_header ETag "2.5.1";
listen 9090;
listen [::]:9090;
location /api/ {
proxy_pass http://api/;
@@ -262,8 +261,32 @@
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
+ location ~* /model/savings/gpuContainersDetails(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuContainersDetails$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuWorkloadUtilization(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuWorkloadUtilization$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
+ location ~* /model/savings/gpuRecommendation(.*) {
+ proxy_read_timeout 300;
+ proxy_pass http://aggregator/savings/gpuRecommendation$1$is_args$args;
+ proxy_redirect off;
+ proxy_set_header Connection "";
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ }
location = /model/cloudCost {
proxy_read_timeout 300;
proxy_pass http://aggregator/cloudCost;
proxy_redirect off;
@@ -1106,9 +1129,9 @@
"pluginsEnabled": "false",
"carbonEstimatesEnabled": "false",
"clusterControllerEnabled": "false",
"forecastingEnabled": "true",
- "chartVersion": "2.4.3",
+ "chartVersion": "2.5.1",
"hourlyDataRetention": "49",
"dailyDataRetention": "91",
"hideDiagnostics": "false",
"hideOrphanedResources": "false",
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2025-01-01 13:53:31.100712005 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-ingress-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
annotations:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-config-map-template.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -5,11 +5,10 @@
metadata:
name: network-costs-config
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-service-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -7,9 +7,9 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
clusterIP: None
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-network-costs-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -7,23 +7,25 @@
namespace: default
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
+ annotations:
spec:
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: release-name-network-costs
template:
metadata:
+ annotations:
labels:
app.kubernetes.io/instance: kubecost
app.kubernetes.io/name: network-costs
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app: release-name-network-costs
spec:
hostNetwork: true
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pricing-configmap.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -5,11 +5,10 @@
metadata:
name: pricing-configs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2025-01-01 13:53:31.100712005 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-prometheusrule-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-pvc-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-server-configmap.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -4,11 +4,11 @@
kind: ConfigMap
metadata:
name: app-configs
namespace: default
- labels:
+ labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-account-template.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -5,10 +5,9 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-service-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -6,9 +6,9 @@
name: release-name-cost-analyzer
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2025-01-01 13:53:31.100712005 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-servicemonitor-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-cost-analyzer
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
@@ -24,8 +23,7 @@
matchNames:
- default
selector:
matchLabels:
-
app.kubernetes.io/name: cost-analyzer
app.kubernetes.io/instance: release-name
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/cost-analyzer-smtp-configmap.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -6,8 +6,8 @@
name: smtp-configs
namespace: default
labels:
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2025-01-01 13:53:31.097711968 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/external-grafana-config-map-template.yaml 2025-01-01 13:53:03.564369811 +0000
@@ -5,11 +5,10 @@
metadata:
name: external-grafana-config-map
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
data:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2025-01-01 13:53:31.100712005 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-deployment.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,13 +5,14 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
+ annotations:
spec:
replicas: 1
selector:
matchLabels:
@@ -38,9 +39,9 @@
type: RuntimeDefault
restartPolicy: Always
containers:
- name: forecasting
- image: gcr.io/kubecost1/kubecost-modeling:v0.1.16
+ image: gcr.io/kubecost1/kubecost-modeling:v0.1.18
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2025-01-01 13:53:31.099711993 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/forecasting-service.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,9 +5,9 @@
metadata:
name: release-name-forecasting
namespace: default
labels:
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: forecasting
app.kubernetes.io/instance: release-name
app: forecasting
Only in out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-attached-disks.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-cluster-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-deployment-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-kubernetes-resource-efficiency-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-label-cost-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-namespace-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-cloud-sevices.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-network-costs.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-node-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-multi-cluster.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-pod-utilization-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-prometheus-metrics-template.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-aggregator.yaml
Only in out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates: grafana-dashboard-workload-metrics.yaml
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2025-01-01 13:53:31.100712005 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/network-costs-servicemonitor-template.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -5,11 +5,10 @@
metadata:
name: release-name-network-costs
namespace: default
labels:
-
app.kubernetes.io/name: cost-analyzer
- helm.sh/chart: cost-analyzer-2.4.3
+ helm.sh/chart: cost-analyzer-2.5.1
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app: cost-analyzer
spec:
diff -U 4 -r out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml
--- out/target/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2025-01-01 13:53:31.100712005 +0000
+++ out/pr/kubecost/values-uibklab.yaml/sx-kubecost/charts/cost-analyzer/templates/tests/basic-health.yaml 2025-01-01 13:53:03.566369836 +0000
@@ -26,9 +26,9 @@
image: alpine/k8s:1.26.9
securityContext:
privileged: false
capabilities:
- drop:
+ drop:
- ALL
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
command:
@@ -42,8 +42,8 @@
code=$(echo ${response} | jq .code);
if [ "$code" -eq 200 ]; then
echo "Got Kubecost working configuration. Successful."
exit 0
- else
+ else
echo "Failed to fetch Kubecost configuration. Response was $response"
exit 1
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
2.4.3
->2.5.1
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.