Plane
Open source project management — alternative to Jira, Linear, Asana
Configuration
version: "3.8"
# DNS collision avoidance for multi-stack Dokploy:
# Internal services renamed with `plane-*` prefix (unique cluster-wide) and
# `links:` on the `proxy` service creates /etc/hosts entries (`<plane-web-IP>
# web`, etc.) — /etc/hosts takes absolute priority over DNS, so the Caddy
# inside plane-proxy (which has `reverse_proxy web:3000`/`api:8000`
# hardcoded) resolves straight to our containers, ignoring any `web`/`api`
# containers from other stacks on the shared Dokploy network.
x-db-env: &db-env
PGHOST: ${PGHOST:-plane-db}
PGDATABASE: ${PGDATABASE:-plane}
POSTGRES_USER: ${POSTGRES_USER:-plane}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-plane}
POSTGRES_DB: ${POSTGRES_DB:-plane}
POSTGRES_PORT: ${POSTGRES_PORT:-5432}
PGDATA: ${PGDATA:-/var/lib/postgresql/data}
x-redis-env: &redis-env
REDIS_HOST: ${REDIS_HOST:-plane-redis}
REDIS_PORT: ${REDIS_PORT:-6379}
REDIS_URL: ${REDIS_URL:-redis://plane-redis:6379/}
x-minio-env: &minio-env
MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID:-access-key}
MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY:-secret-key}
x-aws-s3-env: &aws-s3-env
AWS_REGION: ${AWS_REGION:-}
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-access-key}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-secret-key}
AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000}
AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads}
x-proxy-env: &proxy-env
APP_DOMAIN: ${APP_DOMAIN:-localhost}
FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880}
BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads}
# Caddy proxy: listen address (no upstream default in Caddyfile -> must be set,
# else the `{$SITE_ADDRESS} { ... }` block is keyless and Caddy aborts).
SITE_ADDRESS: ${SITE_ADDRESS:-:80}
# trusted_proxies decides which peers may set X-Forwarded-For/X-Real-IP. Dokploy's
# Traefik upstream always lives on Dokploy's private network, so trust only private
# ranges (Caddy built-in) instead of 0.0.0.0/0 to prevent client-IP spoofing if the
# proxy is ever exposed directly. Override with your real upstream CIDR if needed.
TRUSTED_PROXIES: ${TRUSTED_PROXIES:-private_ranges}
x-mq-env: &mq-env
RABBITMQ_HOST: ${RABBITMQ_HOST:-plane-mq}
RABBITMQ_PORT: ${RABBITMQ_PORT:-5672}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-plane}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-plane}
RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST:-plane}
RABBITMQ_VHOST: ${RABBITMQ_VHOST:-plane}
x-live-env: &live-env
API_BASE_URL: ${API_BASE_URL:-http://plane-api:8000}
LIVE_SERVER_SECRET_KEY: ${LIVE_SERVER_SECRET_KEY:-dev-only-change-me}
x-app-env: &app-env
WEB_URL: ${WEB_URL:-http://localhost}
DEBUG: ${DEBUG:-0}
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost}
GUNICORN_WORKERS: ${GUNICORN_WORKERS:-1}
USE_MINIO: ${USE_MINIO:-1}
DATABASE_URL: ${DATABASE_URL:-postgresql://plane:plane@plane-db/plane}
SECRET_KEY: ${SECRET_KEY:-dev-only-change-me}
AMQP_URL: ${AMQP_URL:-amqp://plane:plane@plane-mq:5672/plane}
API_KEY_RATE_LIMIT: ${API_KEY_RATE_LIMIT:-60/minute}
MINIO_ENDPOINT_SSL: ${MINIO_ENDPOINT_SSL:-0}
LIVE_SERVER_SECRET_KEY: ${LIVE_SERVER_SECRET_KEY:-dev-only-change-me}
WEBHOOK_ALLOWED_IPS: ${WEBHOOK_ALLOWED_IPS:-}
WEBHOOK_ALLOWED_HOSTS: ${WEBHOOK_ALLOWED_HOSTS:-}
services:
plane-web:
image: makeplane/plane-frontend:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
depends_on:
plane-api:
condition: service_started
plane-worker:
condition: service_started
plane-space:
image: makeplane/plane-space:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
depends_on:
plane-api:
condition: service_started
plane-worker:
condition: service_started
plane-web:
condition: service_started
plane-admin:
image: makeplane/plane-admin:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
depends_on:
plane-api:
condition: service_started
plane-web:
condition: service_started
plane-live:
image: makeplane/plane-live:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
environment:
<<: [*live-env, *redis-env]
depends_on:
plane-api:
condition: service_started
plane-web:
condition: service_started
plane-api:
image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
command: ./bin/docker-entrypoint-api.sh
volumes:
- logs_api:/code/plane/logs
environment:
<<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env]
depends_on:
plane-db:
condition: service_healthy
plane-redis:
condition: service_healthy
plane-mq:
condition: service_healthy
plane-migrator:
condition: service_completed_successfully
plane-worker:
image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
command: ./bin/docker-entrypoint-worker.sh
volumes:
- logs_worker:/code/plane/logs
environment:
<<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env]
depends_on:
plane-db:
condition: service_healthy
plane-redis:
condition: service_healthy
plane-mq:
condition: service_healthy
plane-migrator:
condition: service_completed_successfully
plane-beat-worker:
image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
command: ./bin/docker-entrypoint-beat.sh
volumes:
- logs_beat-worker:/code/plane/logs
environment:
<<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env]
depends_on:
plane-db:
condition: service_healthy
plane-redis:
condition: service_healthy
plane-mq:
condition: service_healthy
plane-migrator:
condition: service_completed_successfully
plane-migrator:
image: makeplane/plane-backend:${APP_RELEASE:-v1.3.1}
restart: on-failure
command: ./bin/docker-entrypoint-migrator.sh
volumes:
- logs_migrator:/code/plane/logs
environment:
<<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env]
depends_on:
plane-db:
condition: service_healthy
plane-redis:
condition: service_healthy
plane-db:
image: postgres:17-alpine
restart: unless-stopped
command: postgres -c 'max_connections=1000'
environment:
<<: *db-env
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-plane} -d ${POSTGRES_DB:-plane}"]
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
plane-redis:
image: valkey/valkey:7.2.11-alpine
restart: unless-stopped
volumes:
- redisdata:/data
healthcheck:
test: ["CMD-SHELL", "valkey-cli ping | grep -q PONG"]
interval: 5s
timeout: 3s
retries: 5
start_period: 5s
plane-mq:
image: rabbitmq:3.13.6-management-alpine
restart: unless-stopped
environment:
<<: *mq-env
volumes:
- rabbitmq_data:/var/lib/rabbitmq
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
plane-minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
restart: unless-stopped
command: server /export --console-address ":9090"
environment:
<<: *minio-env
volumes:
- uploads:/export
proxy:
image: makeplane/plane-proxy:${APP_RELEASE:-v1.3.1}
restart: unless-stopped
expose:
- "80"
environment:
<<: *proxy-env
volumes:
- proxy_config:/config
- proxy_data:/data
links:
- "plane-web:web"
- "plane-api:api"
- "plane-space:space"
- "plane-admin:admin"
- "plane-live:live"
depends_on:
plane-web:
condition: service_started
plane-api:
condition: service_started
plane-space:
condition: service_started
plane-admin:
condition: service_started
plane-live:
condition: service_started
volumes:
pgdata:
redisdata:
uploads:
rabbitmq_data:
logs_api:
logs_worker:
logs_beat-worker:
logs_migrator:
proxy_config:
proxy_data:[variables]
app_release = "v1.3.1"
main_domain = "${domain}"
postgres_password = "${password:32}"
minio_password = "${password:32}"
rabbitmq_password = "${password:32}"
secret_key = "${base64:48}"
live_secret_key = "${base64:48}"
[config]
env = [
"# ===== Application =====",
"# Plane image tag deployed for every service.",
"APP_RELEASE=${app_release}",
"# Public domain Plane is served on.",
"APP_DOMAIN=${main_domain}",
"# Full external URL of the instance (used to build links).",
"WEB_URL=https://${main_domain}",
"# Browser origins allowed to call the API (CORS).",
"CORS_ALLOWED_ORIGINS=https://${main_domain}",
"# Internal URL other services use to reach the API.",
"API_BASE_URL=http://plane-api:8000",
"# Django secret key: signs sessions and tokens. Keep it secret.",
"SECRET_KEY=${secret_key}",
"# Shared secret between the API and the realtime (live) server.",
"LIVE_SERVER_SECRET_KEY=${live_secret_key}",
"",
"# ===== PostgreSQL =====",
"# Database user.",
"POSTGRES_USER=plane",
"# Database password.",
"POSTGRES_PASSWORD=${postgres_password}",
"# Database name.",
"POSTGRES_DB=plane",
"# Port PostgreSQL listens on.",
"POSTGRES_PORT=5432",
"# Host the app and libpq tools connect to.",
"PGHOST=plane-db",
"# Default database for libpq tools.",
"PGDATABASE=plane",
"# On-disk location of the database files.",
"PGDATA=/var/lib/postgresql/data",
"# Full connection string (composed from the values above).",
"DATABASE_URL=postgresql://plane:${postgres_password}@plane-db:5432/plane",
"",
"# ===== Redis / Valkey (cache) =====",
"# Redis host.",
"REDIS_HOST=plane-redis",
"# Redis port.",
"REDIS_PORT=6379",
"# Full Redis connection URL.",
"REDIS_URL=redis://plane-redis:6379/",
"",
"# ===== RabbitMQ (task queue) =====",
"# Broker host.",
"RABBITMQ_HOST=plane-mq",
"# Broker port.",
"RABBITMQ_PORT=5672",
"# Broker user.",
"RABBITMQ_USER=plane",
"# Broker password.",
"RABBITMQ_PASSWORD=${rabbitmq_password}",
"# Broker virtual host.",
"RABBITMQ_VHOST=plane",
"# Full AMQP connection string (composed from the values above).",
"AMQP_URL=amqp://plane:${rabbitmq_password}@plane-mq:5672/plane",
"",
"# ===== Object storage (MinIO / S3) =====",
"# Use the bundled MinIO (1) instead of an external S3 provider (0).",
"USE_MINIO=1",
"# AWS region; leave empty when using MinIO.",
"AWS_REGION=",
"# S3 / MinIO access key.",
"AWS_ACCESS_KEY_ID=access-key",
"# S3 / MinIO secret key.",
"AWS_SECRET_ACCESS_KEY=${minio_password}",
"# S3 / MinIO endpoint URL.",
"AWS_S3_ENDPOINT_URL=http://plane-minio:9000",
"# Bucket used to store uploads.",
"AWS_S3_BUCKET_NAME=uploads",
"# Max upload size in bytes (default 5 MiB).",
"FILE_SIZE_LIMIT=5242880",
"# Set to 1 if the S3 / MinIO endpoint is served over HTTPS.",
"MINIO_ENDPOINT_SSL=0",
"",
"# ===== Caddy proxy =====",
"# Address the in-container Caddy listens on. Required: the proxy",
"# Caddyfile has no default and an empty value crashes it on boot.",
"SITE_ADDRESS=:80",
"# Peers allowed to set X-Forwarded-For / X-Real-IP. 'private_ranges'",
"# trusts only Dokploy's private upstream (Traefik) and blocks public",
"# IP spoofing. Use a narrower CIDR if exposing the proxy directly.",
"TRUSTED_PROXIES=private_ranges",
"",
"# ===== App runtime =====",
"# Django debug mode; keep 0 in production.",
"DEBUG=0",
"# Number of Gunicorn workers for the API.",
"GUNICORN_WORKERS=1",
"# Rate limit applied to API-key requests.",
"API_KEY_RATE_LIMIT=60/minute",
"# Comma-separated IPs allowed as webhook targets; empty allows all.",
"WEBHOOK_ALLOWED_IPS=",
"# Comma-separated hosts allowed as webhook targets; empty allows all.",
"WEBHOOK_ALLOWED_HOSTS=",
]
mounts = []
[[config.domains]]
serviceName = "proxy"
port = 80
host = "${main_domain}"Base64
To import this template in Dokploy: create a Compose service → Advanced → Base64 import and paste the content below:
ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuIyBETlMgY29sbGlzaW9uIGF2b2lkYW5jZSBmb3IgbXVsdGktc3RhY2sgRG9rcGxveTpcbiMgSW50ZXJuYWwgc2VydmljZXMgcmVuYW1lZCB3aXRoIGBwbGFuZS0qYCBwcmVmaXggKHVuaXF1ZSBjbHVzdGVyLXdpZGUpIGFuZFxuIyBgbGlua3M6YCBvbiB0aGUgYHByb3h5YCBzZXJ2aWNlIGNyZWF0ZXMgL2V0Yy9ob3N0cyBlbnRyaWVzIChgPHBsYW5lLXdlYi1JUD5cbiMgd2ViYCwgZXRjLikg4oCUIC9ldGMvaG9zdHMgdGFrZXMgYWJzb2x1dGUgcHJpb3JpdHkgb3ZlciBETlMsIHNvIHRoZSBDYWRkeVxuIyBpbnNpZGUgcGxhbmUtcHJveHkgKHdoaWNoIGhhcyBgcmV2ZXJzZV9wcm94eSB3ZWI6MzAwMGAvYGFwaTo4MDAwYFxuIyBoYXJkY29kZWQpIHJlc29sdmVzIHN0cmFpZ2h0IHRvIG91ciBjb250YWluZXJzLCBpZ25vcmluZyBhbnkgYHdlYmAvYGFwaWBcbiMgY29udGFpbmVycyBmcm9tIG90aGVyIHN0YWNrcyBvbiB0aGUgc2hhcmVkIERva3Bsb3kgbmV0d29yay5cblxueC1kYi1lbnY6ICZkYi1lbnZcbiAgUEdIT1NUOiAke1BHSE9TVDotcGxhbmUtZGJ9XG4gIFBHREFUQUJBU0U6ICR7UEdEQVRBQkFTRTotcGxhbmV9XG4gIFBPU1RHUkVTX1VTRVI6ICR7UE9TVEdSRVNfVVNFUjotcGxhbmV9XG4gIFBPU1RHUkVTX1BBU1NXT1JEOiAke1BPU1RHUkVTX1BBU1NXT1JEOi1wbGFuZX1cbiAgUE9TVEdSRVNfREI6ICR7UE9TVEdSRVNfREI6LXBsYW5lfVxuICBQT1NUR1JFU19QT1JUOiAke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9XG4gIFBHREFUQTogJHtQR0RBVEE6LS92YXIvbGliL3Bvc3RncmVzcWwvZGF0YX1cblxueC1yZWRpcy1lbnY6ICZyZWRpcy1lbnZcbiAgUkVESVNfSE9TVDogJHtSRURJU19IT1NUOi1wbGFuZS1yZWRpc31cbiAgUkVESVNfUE9SVDogJHtSRURJU19QT1JUOi02Mzc5fVxuICBSRURJU19VUkw6ICR7UkVESVNfVVJMOi1yZWRpczovL3BsYW5lLXJlZGlzOjYzNzkvfVxuXG54LW1pbmlvLWVudjogJm1pbmlvLWVudlxuICBNSU5JT19ST09UX1VTRVI6ICR7QVdTX0FDQ0VTU19LRVlfSUQ6LWFjY2Vzcy1rZXl9XG4gIE1JTklPX1JPT1RfUEFTU1dPUkQ6ICR7QVdTX1NFQ1JFVF9BQ0NFU1NfS0VZOi1zZWNyZXQta2V5fVxuXG54LWF3cy1zMy1lbnY6ICZhd3MtczMtZW52XG4gIEFXU19SRUdJT046ICR7QVdTX1JFR0lPTjotfVxuICBBV1NfQUNDRVNTX0tFWV9JRDogJHtBV1NfQUNDRVNTX0tFWV9JRDotYWNjZXNzLWtleX1cbiAgQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZOiAke0FXU19TRUNSRVRfQUNDRVNTX0tFWTotc2VjcmV0LWtleX1cbiAgQVdTX1MzX0VORFBPSU5UX1VSTDogJHtBV1NfUzNfRU5EUE9JTlRfVVJMOi1odHRwOi8vcGxhbmUtbWluaW86OTAwMH1cbiAgQVdTX1MzX0JVQ0tFVF9OQU1FOiAke0FXU19TM19CVUNLRVRfTkFNRTotdXBsb2Fkc31cblxueC1wcm94eS1lbnY6ICZwcm94eS1lbnZcbiAgQVBQX0RPTUFJTjogJHtBUFBfRE9NQUlOOi1sb2NhbGhvc3R9XG4gIEZJTEVfU0laRV9MSU1JVDogJHtGSUxFX1NJWkVfTElNSVQ6LTUyNDI4ODB9XG4gIEJVQ0tFVF9OQU1FOiAke0FXU19TM19CVUNLRVRfTkFNRTotdXBsb2Fkc31cbiAgIyBDYWRkeSBwcm94eTogbGlzdGVuIGFkZHJlc3MgKG5vIHVwc3RyZWFtIGRlZmF1bHQgaW4gQ2FkZHlmaWxlIC0+IG11c3QgYmUgc2V0LFxuICAjIGVsc2UgdGhlIGB7JFNJVEVfQUREUkVTU30geyAuLi4gfWAgYmxvY2sgaXMga2V5bGVzcyBhbmQgQ2FkZHkgYWJvcnRzKS5cbiAgU0lURV9BRERSRVNTOiAke1NJVEVfQUREUkVTUzotOjgwfVxuICAjIHRydXN0ZWRfcHJveGllcyBkZWNpZGVzIHdoaWNoIHBlZXJzIG1heSBzZXQgWC1Gb3J3YXJkZWQtRm9yL1gtUmVhbC1JUC4gRG9rcGxveSdzXG4gICMgVHJhZWZpayB1cHN0cmVhbSBhbHdheXMgbGl2ZXMgb24gRG9rcGxveSdzIHByaXZhdGUgbmV0d29yaywgc28gdHJ1c3Qgb25seSBwcml2YXRlXG4gICMgcmFuZ2VzIChDYWRkeSBidWlsdC1pbikgaW5zdGVhZCBvZiAwLjAuMC4wLzAgdG8gcHJldmVudCBjbGllbnQtSVAgc3Bvb2ZpbmcgaWYgdGhlXG4gICMgcHJveHkgaXMgZXZlciBleHBvc2VkIGRpcmVjdGx5LiBPdmVycmlkZSB3aXRoIHlvdXIgcmVhbCB1cHN0cmVhbSBDSURSIGlmIG5lZWRlZC5cbiAgVFJVU1RFRF9QUk9YSUVTOiAke1RSVVNURURfUFJPWElFUzotcHJpdmF0ZV9yYW5nZXN9XG5cbngtbXEtZW52OiAmbXEtZW52XG4gIFJBQkJJVE1RX0hPU1Q6ICR7UkFCQklUTVFfSE9TVDotcGxhbmUtbXF9XG4gIFJBQkJJVE1RX1BPUlQ6ICR7UkFCQklUTVFfUE9SVDotNTY3Mn1cbiAgUkFCQklUTVFfREVGQVVMVF9VU0VSOiAke1JBQkJJVE1RX1VTRVI6LXBsYW5lfVxuICBSQUJCSVRNUV9ERUZBVUxUX1BBU1M6ICR7UkFCQklUTVFfUEFTU1dPUkQ6LXBsYW5lfVxuICBSQUJCSVRNUV9ERUZBVUxUX1ZIT1NUOiAke1JBQkJJVE1RX1ZIT1NUOi1wbGFuZX1cbiAgUkFCQklUTVFfVkhPU1Q6ICR7UkFCQklUTVFfVkhPU1Q6LXBsYW5lfVxuXG54LWxpdmUtZW52OiAmbGl2ZS1lbnZcbiAgQVBJX0JBU0VfVVJMOiAke0FQSV9CQVNFX1VSTDotaHR0cDovL3BsYW5lLWFwaTo4MDAwfVxuICBMSVZFX1NFUlZFUl9TRUNSRVRfS0VZOiAke0xJVkVfU0VSVkVSX1NFQ1JFVF9LRVk6LWRldi1vbmx5LWNoYW5nZS1tZX1cblxueC1hcHAtZW52OiAmYXBwLWVudlxuICBXRUJfVVJMOiAke1dFQl9VUkw6LWh0dHA6Ly9sb2NhbGhvc3R9XG4gIERFQlVHOiAke0RFQlVHOi0wfVxuICBDT1JTX0FMTE9XRURfT1JJR0lOUzogJHtDT1JTX0FMTE9XRURfT1JJR0lOUzotaHR0cDovL2xvY2FsaG9zdH1cbiAgR1VOSUNPUk5fV09SS0VSUzogJHtHVU5JQ09STl9XT1JLRVJTOi0xfVxuICBVU0VfTUlOSU86ICR7VVNFX01JTklPOi0xfVxuICBEQVRBQkFTRV9VUkw6ICR7REFUQUJBU0VfVVJMOi1wb3N0Z3Jlc3FsOi8vcGxhbmU6cGxhbmVAcGxhbmUtZGIvcGxhbmV9XG4gIFNFQ1JFVF9LRVk6ICR7U0VDUkVUX0tFWTotZGV2LW9ubHktY2hhbmdlLW1lfVxuICBBTVFQX1VSTDogJHtBTVFQX1VSTDotYW1xcDovL3BsYW5lOnBsYW5lQHBsYW5lLW1xOjU2NzIvcGxhbmV9XG4gIEFQSV9LRVlfUkFURV9MSU1JVDogJHtBUElfS0VZX1JBVEVfTElNSVQ6LTYwL21pbnV0ZX1cbiAgTUlOSU9fRU5EUE9JTlRfU1NMOiAke01JTklPX0VORFBPSU5UX1NTTDotMH1cbiAgTElWRV9TRVJWRVJfU0VDUkVUX0tFWTogJHtMSVZFX1NFUlZFUl9TRUNSRVRfS0VZOi1kZXYtb25seS1jaGFuZ2UtbWV9XG4gIFdFQkhPT0tfQUxMT1dFRF9JUFM6ICR7V0VCSE9PS19BTExPV0VEX0lQUzotfVxuICBXRUJIT09LX0FMTE9XRURfSE9TVFM6ICR7V0VCSE9PS19BTExPV0VEX0hPU1RTOi19XG5cbnNlcnZpY2VzOlxuICBwbGFuZS13ZWI6XG4gICAgaW1hZ2U6IG1ha2VwbGFuZS9wbGFuZS1mcm9udGVuZDoke0FQUF9SRUxFQVNFOi12MS4zLjF9XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgcGxhbmUtYXBpOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgcGxhbmUtd29ya2VyOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuXG4gIHBsYW5lLXNwYWNlOlxuICAgIGltYWdlOiBtYWtlcGxhbmUvcGxhbmUtc3BhY2U6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHBsYW5lLWFwaTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICAgIHBsYW5lLXdvcmtlcjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICAgIHBsYW5lLXdlYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcblxuICBwbGFuZS1hZG1pbjpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWFkbWluOiR7QVBQX1JFTEVBU0U6LXYxLjMuMX1cbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICBwbGFuZS1hcGk6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBwbGFuZS13ZWI6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG5cbiAgcGxhbmUtbGl2ZTpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWxpdmU6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICA8PDogWypsaXZlLWVudiwgKnJlZGlzLWVudl1cbiAgICBkZXBlbmRzX29uOlxuICAgICAgcGxhbmUtYXBpOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgcGxhbmUtd2ViOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuXG4gIHBsYW5lLWFwaTpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWJhY2tlbmQ6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDogLi9iaW4vZG9ja2VyLWVudHJ5cG9pbnQtYXBpLnNoXG4gICAgdm9sdW1lczpcbiAgICAgIC0gbG9nc19hcGk6L2NvZGUvcGxhbmUvbG9nc1xuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6IFsqYXBwLWVudiwgKmRiLWVudiwgKnJlZGlzLWVudiwgKm1pbmlvLWVudiwgKmF3cy1zMy1lbnYsICpwcm94eS1lbnZdXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHBsYW5lLWRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcGxhbmUtcmVkaXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICBwbGFuZS1tcTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLW1pZ3JhdG9yOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfY29tcGxldGVkX3N1Y2Nlc3NmdWxseVxuXG4gIHBsYW5lLXdvcmtlcjpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWJhY2tlbmQ6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDogLi9iaW4vZG9ja2VyLWVudHJ5cG9pbnQtd29ya2VyLnNoXG4gICAgdm9sdW1lczpcbiAgICAgIC0gbG9nc193b3JrZXI6L2NvZGUvcGxhbmUvbG9nc1xuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6IFsqYXBwLWVudiwgKmRiLWVudiwgKnJlZGlzLWVudiwgKm1pbmlvLWVudiwgKmF3cy1zMy1lbnYsICpwcm94eS1lbnZdXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHBsYW5lLWRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcGxhbmUtcmVkaXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICBwbGFuZS1tcTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLW1pZ3JhdG9yOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfY29tcGxldGVkX3N1Y2Nlc3NmdWxseVxuXG4gIHBsYW5lLWJlYXQtd29ya2VyOlxuICAgIGltYWdlOiBtYWtlcGxhbmUvcGxhbmUtYmFja2VuZDoke0FQUF9SRUxFQVNFOi12MS4zLjF9XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOiAuL2Jpbi9kb2NrZXItZW50cnlwb2ludC1iZWF0LnNoXG4gICAgdm9sdW1lczpcbiAgICAgIC0gbG9nc19iZWF0LXdvcmtlcjovY29kZS9wbGFuZS9sb2dzXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICA8PDogWyphcHAtZW52LCAqZGItZW52LCAqcmVkaXMtZW52LCAqbWluaW8tZW52LCAqYXdzLXMzLWVudiwgKnByb3h5LWVudl1cbiAgICBkZXBlbmRzX29uOlxuICAgICAgcGxhbmUtZGI6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICBwbGFuZS1yZWRpczpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLW1xOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcGxhbmUtbWlncmF0b3I6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9jb21wbGV0ZWRfc3VjY2Vzc2Z1bGx5XG5cbiAgcGxhbmUtbWlncmF0b3I6XG4gICAgaW1hZ2U6IG1ha2VwbGFuZS9wbGFuZS1iYWNrZW5kOiR7QVBQX1JFTEVBU0U6LXYxLjMuMX1cbiAgICByZXN0YXJ0OiBvbi1mYWlsdXJlXG4gICAgY29tbWFuZDogLi9iaW4vZG9ja2VyLWVudHJ5cG9pbnQtbWlncmF0b3Iuc2hcbiAgICB2b2x1bWVzOlxuICAgICAgLSBsb2dzX21pZ3JhdG9yOi9jb2RlL3BsYW5lL2xvZ3NcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIDw8OiBbKmFwcC1lbnYsICpkYi1lbnYsICpyZWRpcy1lbnYsICptaW5pby1lbnYsICphd3MtczMtZW52LCAqcHJveHktZW52XVxuICAgIGRlcGVuZHNfb246XG4gICAgICBwbGFuZS1kYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLXJlZGlzOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuXG4gIHBsYW5lLWRiOlxuICAgIGltYWdlOiBwb3N0Z3JlczoxNy1hbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGNvbW1hbmQ6IHBvc3RncmVzIC1jICdtYXhfY29ubmVjdGlvbnM9MTAwMCdcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIDw8OiAqZGItZW52XG4gICAgdm9sdW1lczpcbiAgICAgIC0gcGdkYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01ELVNIRUxMXCIsIFwicGdfaXNyZWFkeSAtVSAke1BPU1RHUkVTX1VTRVI6LXBsYW5lfSAtZCAke1BPU1RHUkVTX0RCOi1wbGFuZX1cIl1cbiAgICAgIGludGVydmFsOiA1c1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDEwXG4gICAgICBzdGFydF9wZXJpb2Q6IDEwc1xuXG4gIHBsYW5lLXJlZGlzOlxuICAgIGltYWdlOiB2YWxrZXkvdmFsa2V5OjcuMi4xMS1hbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHJlZGlzZGF0YTovZGF0YVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01ELVNIRUxMXCIsIFwidmFsa2V5LWNsaSBwaW5nIHwgZ3JlcCAtcSBQT05HXCJdXG4gICAgICBpbnRlcnZhbDogNXNcbiAgICAgIHRpbWVvdXQ6IDNzXG4gICAgICByZXRyaWVzOiA1XG4gICAgICBzdGFydF9wZXJpb2Q6IDVzXG5cbiAgcGxhbmUtbXE6XG4gICAgaW1hZ2U6IHJhYmJpdG1xOjMuMTMuNi1tYW5hZ2VtZW50LWFscGluZVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICA8PDogKm1xLWVudlxuICAgIHZvbHVtZXM6XG4gICAgICAtIHJhYmJpdG1xX2RhdGE6L3Zhci9saWIvcmFiYml0bXFcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRFwiLCBcInJhYmJpdG1xLWRpYWdub3N0aWNzXCIsIFwiLXFcIiwgXCJwaW5nXCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiAxMHNcbiAgICAgIHJldHJpZXM6IDEwXG4gICAgICBzdGFydF9wZXJpb2Q6IDMwc1xuXG4gIHBsYW5lLW1pbmlvOlxuICAgIGltYWdlOiBtaW5pby9taW5pbzpSRUxFQVNFLjIwMjUtMDQtMjJUMjItMTItMjZaXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOiBzZXJ2ZXIgL2V4cG9ydCAtLWNvbnNvbGUtYWRkcmVzcyBcIjo5MDkwXCJcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIDw8OiAqbWluaW8tZW52XG4gICAgdm9sdW1lczpcbiAgICAgIC0gdXBsb2FkczovZXhwb3J0XG5cbiAgcHJveHk6XG4gICAgaW1hZ2U6IG1ha2VwbGFuZS9wbGFuZS1wcm94eToke0FQUF9SRUxFQVNFOi12MS4zLjF9XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBleHBvc2U6XG4gICAgICAtIFwiODBcIlxuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6ICpwcm94eS1lbnZcbiAgICB2b2x1bWVzOlxuICAgICAgLSBwcm94eV9jb25maWc6L2NvbmZpZ1xuICAgICAgLSBwcm94eV9kYXRhOi9kYXRhXG4gICAgbGlua3M6XG4gICAgICAtIFwicGxhbmUtd2ViOndlYlwiXG4gICAgICAtIFwicGxhbmUtYXBpOmFwaVwiXG4gICAgICAtIFwicGxhbmUtc3BhY2U6c3BhY2VcIlxuICAgICAgLSBcInBsYW5lLWFkbWluOmFkbWluXCJcbiAgICAgIC0gXCJwbGFuZS1saXZlOmxpdmVcIlxuICAgIGRlcGVuZHNfb246XG4gICAgICBwbGFuZS13ZWI6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBwbGFuZS1hcGk6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBwbGFuZS1zcGFjZTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICAgIHBsYW5lLWFkbWluOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgcGxhbmUtbGl2ZTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcblxudm9sdW1lczpcbiAgcGdkYXRhOlxuICByZWRpc2RhdGE6XG4gIHVwbG9hZHM6XG4gIHJhYmJpdG1xX2RhdGE6XG4gIGxvZ3NfYXBpOlxuICBsb2dzX3dvcmtlcjpcbiAgbG9nc19iZWF0LXdvcmtlcjpcbiAgbG9nc19taWdyYXRvcjpcbiAgcHJveHlfY29uZmlnOlxuICBwcm94eV9kYXRhOlxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5hcHBfcmVsZWFzZSA9IFwidjEuMy4xXCJcbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxucG9zdGdyZXNfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbm1pbmlvX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5yYWJiaXRtcV9wYXNzd29yZCA9IFwiJHtwYXNzd29yZDozMn1cIlxuc2VjcmV0X2tleSA9IFwiJHtiYXNlNjQ6NDh9XCJcbmxpdmVfc2VjcmV0X2tleSA9IFwiJHtiYXNlNjQ6NDh9XCJcblxuW2NvbmZpZ11cbmVudiA9IFtcbiAgXCIjID09PT09IEFwcGxpY2F0aW9uID09PT09XCIsXG4gIFwiIyBQbGFuZSBpbWFnZSB0YWcgZGVwbG95ZWQgZm9yIGV2ZXJ5IHNlcnZpY2UuXCIsXG4gIFwiQVBQX1JFTEVBU0U9JHthcHBfcmVsZWFzZX1cIixcbiAgXCIjIFB1YmxpYyBkb21haW4gUGxhbmUgaXMgc2VydmVkIG9uLlwiLFxuICBcIkFQUF9ET01BSU49JHttYWluX2RvbWFpbn1cIixcbiAgXCIjIEZ1bGwgZXh0ZXJuYWwgVVJMIG9mIHRoZSBpbnN0YW5jZSAodXNlZCB0byBidWlsZCBsaW5rcykuXCIsXG4gIFwiV0VCX1VSTD1odHRwczovLyR7bWFpbl9kb21haW59XCIsXG4gIFwiIyBCcm93c2VyIG9yaWdpbnMgYWxsb3dlZCB0byBjYWxsIHRoZSBBUEkgKENPUlMpLlwiLFxuICBcIkNPUlNfQUxMT1dFRF9PUklHSU5TPWh0dHBzOi8vJHttYWluX2RvbWFpbn1cIixcbiAgXCIjIEludGVybmFsIFVSTCBvdGhlciBzZXJ2aWNlcyB1c2UgdG8gcmVhY2ggdGhlIEFQSS5cIixcbiAgXCJBUElfQkFTRV9VUkw9aHR0cDovL3BsYW5lLWFwaTo4MDAwXCIsXG4gIFwiIyBEamFuZ28gc2VjcmV0IGtleTogc2lnbnMgc2Vzc2lvbnMgYW5kIHRva2Vucy4gS2VlcCBpdCBzZWNyZXQuXCIsXG4gIFwiU0VDUkVUX0tFWT0ke3NlY3JldF9rZXl9XCIsXG4gIFwiIyBTaGFyZWQgc2VjcmV0IGJldHdlZW4gdGhlIEFQSSBhbmQgdGhlIHJlYWx0aW1lIChsaXZlKSBzZXJ2ZXIuXCIsXG4gIFwiTElWRV9TRVJWRVJfU0VDUkVUX0tFWT0ke2xpdmVfc2VjcmV0X2tleX1cIixcbiAgXCJcIixcbiAgXCIjID09PT09IFBvc3RncmVTUUwgPT09PT1cIixcbiAgXCIjIERhdGFiYXNlIHVzZXIuXCIsXG4gIFwiUE9TVEdSRVNfVVNFUj1wbGFuZVwiLFxuICBcIiMgRGF0YWJhc2UgcGFzc3dvcmQuXCIsXG4gIFwiUE9TVEdSRVNfUEFTU1dPUkQ9JHtwb3N0Z3Jlc19wYXNzd29yZH1cIixcbiAgXCIjIERhdGFiYXNlIG5hbWUuXCIsXG4gIFwiUE9TVEdSRVNfREI9cGxhbmVcIixcbiAgXCIjIFBvcnQgUG9zdGdyZVNRTCBsaXN0ZW5zIG9uLlwiLFxuICBcIlBPU1RHUkVTX1BPUlQ9NTQzMlwiLFxuICBcIiMgSG9zdCB0aGUgYXBwIGFuZCBsaWJwcSB0b29scyBjb25uZWN0IHRvLlwiLFxuICBcIlBHSE9TVD1wbGFuZS1kYlwiLFxuICBcIiMgRGVmYXVsdCBkYXRhYmFzZSBmb3IgbGlicHEgdG9vbHMuXCIsXG4gIFwiUEdEQVRBQkFTRT1wbGFuZVwiLFxuICBcIiMgT24tZGlzayBsb2NhdGlvbiBvZiB0aGUgZGF0YWJhc2UgZmlsZXMuXCIsXG4gIFwiUEdEQVRBPS92YXIvbGliL3Bvc3RncmVzcWwvZGF0YVwiLFxuICBcIiMgRnVsbCBjb25uZWN0aW9uIHN0cmluZyAoY29tcG9zZWQgZnJvbSB0aGUgdmFsdWVzIGFib3ZlKS5cIixcbiAgXCJEQVRBQkFTRV9VUkw9cG9zdGdyZXNxbDovL3BsYW5lOiR7cG9zdGdyZXNfcGFzc3dvcmR9QHBsYW5lLWRiOjU0MzIvcGxhbmVcIixcbiAgXCJcIixcbiAgXCIjID09PT09IFJlZGlzIC8gVmFsa2V5IChjYWNoZSkgPT09PT1cIixcbiAgXCIjIFJlZGlzIGhvc3QuXCIsXG4gIFwiUkVESVNfSE9TVD1wbGFuZS1yZWRpc1wiLFxuICBcIiMgUmVkaXMgcG9ydC5cIixcbiAgXCJSRURJU19QT1JUPTYzNzlcIixcbiAgXCIjIEZ1bGwgUmVkaXMgY29ubmVjdGlvbiBVUkwuXCIsXG4gIFwiUkVESVNfVVJMPXJlZGlzOi8vcGxhbmUtcmVkaXM6NjM3OS9cIixcbiAgXCJcIixcbiAgXCIjID09PT09IFJhYmJpdE1RICh0YXNrIHF1ZXVlKSA9PT09PVwiLFxuICBcIiMgQnJva2VyIGhvc3QuXCIsXG4gIFwiUkFCQklUTVFfSE9TVD1wbGFuZS1tcVwiLFxuICBcIiMgQnJva2VyIHBvcnQuXCIsXG4gIFwiUkFCQklUTVFfUE9SVD01NjcyXCIsXG4gIFwiIyBCcm9rZXIgdXNlci5cIixcbiAgXCJSQUJCSVRNUV9VU0VSPXBsYW5lXCIsXG4gIFwiIyBCcm9rZXIgcGFzc3dvcmQuXCIsXG4gIFwiUkFCQklUTVFfUEFTU1dPUkQ9JHtyYWJiaXRtcV9wYXNzd29yZH1cIixcbiAgXCIjIEJyb2tlciB2aXJ0dWFsIGhvc3QuXCIsXG4gIFwiUkFCQklUTVFfVkhPU1Q9cGxhbmVcIixcbiAgXCIjIEZ1bGwgQU1RUCBjb25uZWN0aW9uIHN0cmluZyAoY29tcG9zZWQgZnJvbSB0aGUgdmFsdWVzIGFib3ZlKS5cIixcbiAgXCJBTVFQX1VSTD1hbXFwOi8vcGxhbmU6JHtyYWJiaXRtcV9wYXNzd29yZH1AcGxhbmUtbXE6NTY3Mi9wbGFuZVwiLFxuICBcIlwiLFxuICBcIiMgPT09PT0gT2JqZWN0IHN0b3JhZ2UgKE1pbklPIC8gUzMpID09PT09XCIsXG4gIFwiIyBVc2UgdGhlIGJ1bmRsZWQgTWluSU8gKDEpIGluc3RlYWQgb2YgYW4gZXh0ZXJuYWwgUzMgcHJvdmlkZXIgKDApLlwiLFxuICBcIlVTRV9NSU5JTz0xXCIsXG4gIFwiIyBBV1MgcmVnaW9uOyBsZWF2ZSBlbXB0eSB3aGVuIHVzaW5nIE1pbklPLlwiLFxuICBcIkFXU19SRUdJT049XCIsXG4gIFwiIyBTMyAvIE1pbklPIGFjY2VzcyBrZXkuXCIsXG4gIFwiQVdTX0FDQ0VTU19LRVlfSUQ9YWNjZXNzLWtleVwiLFxuICBcIiMgUzMgLyBNaW5JTyBzZWNyZXQga2V5LlwiLFxuICBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWT0ke21pbmlvX3Bhc3N3b3JkfVwiLFxuICBcIiMgUzMgLyBNaW5JTyBlbmRwb2ludCBVUkwuXCIsXG4gIFwiQVdTX1MzX0VORFBPSU5UX1VSTD1odHRwOi8vcGxhbmUtbWluaW86OTAwMFwiLFxuICBcIiMgQnVja2V0IHVzZWQgdG8gc3RvcmUgdXBsb2Fkcy5cIixcbiAgXCJBV1NfUzNfQlVDS0VUX05BTUU9dXBsb2Fkc1wiLFxuICBcIiMgTWF4IHVwbG9hZCBzaXplIGluIGJ5dGVzIChkZWZhdWx0IDUgTWlCKS5cIixcbiAgXCJGSUxFX1NJWkVfTElNSVQ9NTI0Mjg4MFwiLFxuICBcIiMgU2V0IHRvIDEgaWYgdGhlIFMzIC8gTWluSU8gZW5kcG9pbnQgaXMgc2VydmVkIG92ZXIgSFRUUFMuXCIsXG4gIFwiTUlOSU9fRU5EUE9JTlRfU1NMPTBcIixcbiAgXCJcIixcbiAgXCIjID09PT09IENhZGR5IHByb3h5ID09PT09XCIsXG4gIFwiIyBBZGRyZXNzIHRoZSBpbi1jb250YWluZXIgQ2FkZHkgbGlzdGVucyBvbi4gUmVxdWlyZWQ6IHRoZSBwcm94eVwiLFxuICBcIiMgQ2FkZHlmaWxlIGhhcyBubyBkZWZhdWx0IGFuZCBhbiBlbXB0eSB2YWx1ZSBjcmFzaGVzIGl0IG9uIGJvb3QuXCIsXG4gIFwiU0lURV9BRERSRVNTPTo4MFwiLFxuICBcIiMgUGVlcnMgYWxsb3dlZCB0byBzZXQgWC1Gb3J3YXJkZWQtRm9yIC8gWC1SZWFsLUlQLiAncHJpdmF0ZV9yYW5nZXMnXCIsXG4gIFwiIyB0cnVzdHMgb25seSBEb2twbG95J3MgcHJpdmF0ZSB1cHN0cmVhbSAoVHJhZWZpaykgYW5kIGJsb2NrcyBwdWJsaWNcIixcbiAgXCIjIElQIHNwb29maW5nLiBVc2UgYSBuYXJyb3dlciBDSURSIGlmIGV4cG9zaW5nIHRoZSBwcm94eSBkaXJlY3RseS5cIixcbiAgXCJUUlVTVEVEX1BST1hJRVM9cHJpdmF0ZV9yYW5nZXNcIixcbiAgXCJcIixcbiAgXCIjID09PT09IEFwcCBydW50aW1lID09PT09XCIsXG4gIFwiIyBEamFuZ28gZGVidWcgbW9kZTsga2VlcCAwIGluIHByb2R1Y3Rpb24uXCIsXG4gIFwiREVCVUc9MFwiLFxuICBcIiMgTnVtYmVyIG9mIEd1bmljb3JuIHdvcmtlcnMgZm9yIHRoZSBBUEkuXCIsXG4gIFwiR1VOSUNPUk5fV09SS0VSUz0xXCIsXG4gIFwiIyBSYXRlIGxpbWl0IGFwcGxpZWQgdG8gQVBJLWtleSByZXF1ZXN0cy5cIixcbiAgXCJBUElfS0VZX1JBVEVfTElNSVQ9NjAvbWludXRlXCIsXG4gIFwiIyBDb21tYS1zZXBhcmF0ZWQgSVBzIGFsbG93ZWQgYXMgd2ViaG9vayB0YXJnZXRzOyBlbXB0eSBhbGxvd3MgYWxsLlwiLFxuICBcIldFQkhPT0tfQUxMT1dFRF9JUFM9XCIsXG4gIFwiIyBDb21tYS1zZXBhcmF0ZWQgaG9zdHMgYWxsb3dlZCBhcyB3ZWJob29rIHRhcmdldHM7IGVtcHR5IGFsbG93cyBhbGwuXCIsXG4gIFwiV0VCSE9PS19BTExPV0VEX0hPU1RTPVwiLFxuXVxuXG5tb3VudHMgPSBbXVxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJwcm94eVwiXG5wb3J0ID0gODBcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcbiIKfQ==Links
Tags
kanban, project-management
Version: v1.3.1