Dokploy

Plane

Open source project management — alternative to Jira, Linear, Asana

Plane logo

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 → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxuIyBETlMgY29sbGlzaW9uIGF2b2lkYW5jZSBmb3IgbXVsdGktc3RhY2sgRG9rcGxveTpcbiMgSW50ZXJuYWwgc2VydmljZXMgcmVuYW1lZCB3aXRoIGBwbGFuZS0qYCBwcmVmaXggKHVuaXF1ZSBjbHVzdGVyLXdpZGUpIGFuZFxuIyBgbGlua3M6YCBvbiB0aGUgYHByb3h5YCBzZXJ2aWNlIGNyZWF0ZXMgL2V0Yy9ob3N0cyBlbnRyaWVzIChgPHBsYW5lLXdlYi1JUD5cbiMgd2ViYCwgZXRjLikg4oCUIC9ldGMvaG9zdHMgdGFrZXMgYWJzb2x1dGUgcHJpb3JpdHkgb3ZlciBETlMsIHNvIHRoZSBDYWRkeVxuIyBpbnNpZGUgcGxhbmUtcHJveHkgKHdoaWNoIGhhcyBgcmV2ZXJzZV9wcm94eSB3ZWI6MzAwMGAvYGFwaTo4MDAwYFxuIyBoYXJkY29kZWQpIHJlc29sdmVzIHN0cmFpZ2h0IHRvIG91ciBjb250YWluZXJzLCBpZ25vcmluZyBhbnkgYHdlYmAvYGFwaWBcbiMgY29udGFpbmVycyBmcm9tIG90aGVyIHN0YWNrcyBvbiB0aGUgc2hhcmVkIERva3Bsb3kgbmV0d29yay5cblxueC1kYi1lbnY6ICZkYi1lbnZcbiAgUEdIT1NUOiAke1BHSE9TVDotcGxhbmUtZGJ9XG4gIFBHREFUQUJBU0U6ICR7UEdEQVRBQkFTRTotcGxhbmV9XG4gIFBPU1RHUkVTX1VTRVI6ICR7UE9TVEdSRVNfVVNFUjotcGxhbmV9XG4gIFBPU1RHUkVTX1BBU1NXT1JEOiAke1BPU1RHUkVTX1BBU1NXT1JEOi1wbGFuZX1cbiAgUE9TVEdSRVNfREI6ICR7UE9TVEdSRVNfREI6LXBsYW5lfVxuICBQT1NUR1JFU19QT1JUOiAke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9XG4gIFBHREFUQTogJHtQR0RBVEE6LS92YXIvbGliL3Bvc3RncmVzcWwvZGF0YX1cblxueC1yZWRpcy1lbnY6ICZyZWRpcy1lbnZcbiAgUkVESVNfSE9TVDogJHtSRURJU19IT1NUOi1wbGFuZS1yZWRpc31cbiAgUkVESVNfUE9SVDogJHtSRURJU19QT1JUOi02Mzc5fVxuICBSRURJU19VUkw6ICR7UkVESVNfVVJMOi1yZWRpczovL3BsYW5lLXJlZGlzOjYzNzkvfVxuXG54LW1pbmlvLWVudjogJm1pbmlvLWVudlxuICBNSU5JT19ST09UX1VTRVI6ICR7QVdTX0FDQ0VTU19LRVlfSUQ6LWFjY2Vzcy1rZXl9XG4gIE1JTklPX1JPT1RfUEFTU1dPUkQ6ICR7QVdTX1NFQ1JFVF9BQ0NFU1NfS0VZOi1zZWNyZXQta2V5fVxuXG54LWF3cy1zMy1lbnY6ICZhd3MtczMtZW52XG4gIEFXU19SRUdJT046ICR7QVdTX1JFR0lPTjotfVxuICBBV1NfQUNDRVNTX0tFWV9JRDogJHtBV1NfQUNDRVNTX0tFWV9JRDotYWNjZXNzLWtleX1cbiAgQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZOiAke0FXU19TRUNSRVRfQUNDRVNTX0tFWTotc2VjcmV0LWtleX1cbiAgQVdTX1MzX0VORFBPSU5UX1VSTDogJHtBV1NfUzNfRU5EUE9JTlRfVVJMOi1odHRwOi8vcGxhbmUtbWluaW86OTAwMH1cbiAgQVdTX1MzX0JVQ0tFVF9OQU1FOiAke0FXU19TM19CVUNLRVRfTkFNRTotdXBsb2Fkc31cblxueC1wcm94eS1lbnY6ICZwcm94eS1lbnZcbiAgQVBQX0RPTUFJTjogJHtBUFBfRE9NQUlOOi1sb2NhbGhvc3R9XG4gIEZJTEVfU0laRV9MSU1JVDogJHtGSUxFX1NJWkVfTElNSVQ6LTUyNDI4ODB9XG4gIEJVQ0tFVF9OQU1FOiAke0FXU19TM19CVUNLRVRfTkFNRTotdXBsb2Fkc31cbiAgIyBDYWRkeSBwcm94eTogbGlzdGVuIGFkZHJlc3MgKG5vIHVwc3RyZWFtIGRlZmF1bHQgaW4gQ2FkZHlmaWxlIC0+IG11c3QgYmUgc2V0LFxuICAjIGVsc2UgdGhlIGB7JFNJVEVfQUREUkVTU30geyAuLi4gfWAgYmxvY2sgaXMga2V5bGVzcyBhbmQgQ2FkZHkgYWJvcnRzKS5cbiAgU0lURV9BRERSRVNTOiAke1NJVEVfQUREUkVTUzotOjgwfVxuICAjIHRydXN0ZWRfcHJveGllcyBkZWNpZGVzIHdoaWNoIHBlZXJzIG1heSBzZXQgWC1Gb3J3YXJkZWQtRm9yL1gtUmVhbC1JUC4gRG9rcGxveSdzXG4gICMgVHJhZWZpayB1cHN0cmVhbSBhbHdheXMgbGl2ZXMgb24gRG9rcGxveSdzIHByaXZhdGUgbmV0d29yaywgc28gdHJ1c3Qgb25seSBwcml2YXRlXG4gICMgcmFuZ2VzIChDYWRkeSBidWlsdC1pbikgaW5zdGVhZCBvZiAwLjAuMC4wLzAgdG8gcHJldmVudCBjbGllbnQtSVAgc3Bvb2ZpbmcgaWYgdGhlXG4gICMgcHJveHkgaXMgZXZlciBleHBvc2VkIGRpcmVjdGx5LiBPdmVycmlkZSB3aXRoIHlvdXIgcmVhbCB1cHN0cmVhbSBDSURSIGlmIG5lZWRlZC5cbiAgVFJVU1RFRF9QUk9YSUVTOiAke1RSVVNURURfUFJPWElFUzotcHJpdmF0ZV9yYW5nZXN9XG5cbngtbXEtZW52OiAmbXEtZW52XG4gIFJBQkJJVE1RX0hPU1Q6ICR7UkFCQklUTVFfSE9TVDotcGxhbmUtbXF9XG4gIFJBQkJJVE1RX1BPUlQ6ICR7UkFCQklUTVFfUE9SVDotNTY3Mn1cbiAgUkFCQklUTVFfREVGQVVMVF9VU0VSOiAke1JBQkJJVE1RX1VTRVI6LXBsYW5lfVxuICBSQUJCSVRNUV9ERUZBVUxUX1BBU1M6ICR7UkFCQklUTVFfUEFTU1dPUkQ6LXBsYW5lfVxuICBSQUJCSVRNUV9ERUZBVUxUX1ZIT1NUOiAke1JBQkJJVE1RX1ZIT1NUOi1wbGFuZX1cbiAgUkFCQklUTVFfVkhPU1Q6ICR7UkFCQklUTVFfVkhPU1Q6LXBsYW5lfVxuXG54LWxpdmUtZW52OiAmbGl2ZS1lbnZcbiAgQVBJX0JBU0VfVVJMOiAke0FQSV9CQVNFX1VSTDotaHR0cDovL3BsYW5lLWFwaTo4MDAwfVxuICBMSVZFX1NFUlZFUl9TRUNSRVRfS0VZOiAke0xJVkVfU0VSVkVSX1NFQ1JFVF9LRVk6LWRldi1vbmx5LWNoYW5nZS1tZX1cblxueC1hcHAtZW52OiAmYXBwLWVudlxuICBXRUJfVVJMOiAke1dFQl9VUkw6LWh0dHA6Ly9sb2NhbGhvc3R9XG4gIERFQlVHOiAke0RFQlVHOi0wfVxuICBDT1JTX0FMTE9XRURfT1JJR0lOUzogJHtDT1JTX0FMTE9XRURfT1JJR0lOUzotaHR0cDovL2xvY2FsaG9zdH1cbiAgR1VOSUNPUk5fV09SS0VSUzogJHtHVU5JQ09STl9XT1JLRVJTOi0xfVxuICBVU0VfTUlOSU86ICR7VVNFX01JTklPOi0xfVxuICBEQVRBQkFTRV9VUkw6ICR7REFUQUJBU0VfVVJMOi1wb3N0Z3Jlc3FsOi8vcGxhbmU6cGxhbmVAcGxhbmUtZGIvcGxhbmV9XG4gIFNFQ1JFVF9LRVk6ICR7U0VDUkVUX0tFWTotZGV2LW9ubHktY2hhbmdlLW1lfVxuICBBTVFQX1VSTDogJHtBTVFQX1VSTDotYW1xcDovL3BsYW5lOnBsYW5lQHBsYW5lLW1xOjU2NzIvcGxhbmV9XG4gIEFQSV9LRVlfUkFURV9MSU1JVDogJHtBUElfS0VZX1JBVEVfTElNSVQ6LTYwL21pbnV0ZX1cbiAgTUlOSU9fRU5EUE9JTlRfU1NMOiAke01JTklPX0VORFBPSU5UX1NTTDotMH1cbiAgTElWRV9TRVJWRVJfU0VDUkVUX0tFWTogJHtMSVZFX1NFUlZFUl9TRUNSRVRfS0VZOi1kZXYtb25seS1jaGFuZ2UtbWV9XG4gIFdFQkhPT0tfQUxMT1dFRF9JUFM6ICR7V0VCSE9PS19BTExPV0VEX0lQUzotfVxuICBXRUJIT09LX0FMTE9XRURfSE9TVFM6ICR7V0VCSE9PS19BTExPV0VEX0hPU1RTOi19XG5cbnNlcnZpY2VzOlxuICBwbGFuZS13ZWI6XG4gICAgaW1hZ2U6IG1ha2VwbGFuZS9wbGFuZS1mcm9udGVuZDoke0FQUF9SRUxFQVNFOi12MS4zLjF9XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgcGxhbmUtYXBpOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgcGxhbmUtd29ya2VyOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuXG4gIHBsYW5lLXNwYWNlOlxuICAgIGltYWdlOiBtYWtlcGxhbmUvcGxhbmUtc3BhY2U6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHBsYW5lLWFwaTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICAgIHBsYW5lLXdvcmtlcjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICAgIHBsYW5lLXdlYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcblxuICBwbGFuZS1hZG1pbjpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWFkbWluOiR7QVBQX1JFTEVBU0U6LXYxLjMuMX1cbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICBwbGFuZS1hcGk6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBwbGFuZS13ZWI6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG5cbiAgcGxhbmUtbGl2ZTpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWxpdmU6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICA8PDogWypsaXZlLWVudiwgKnJlZGlzLWVudl1cbiAgICBkZXBlbmRzX29uOlxuICAgICAgcGxhbmUtYXBpOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgcGxhbmUtd2ViOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuXG4gIHBsYW5lLWFwaTpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWJhY2tlbmQ6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDogLi9iaW4vZG9ja2VyLWVudHJ5cG9pbnQtYXBpLnNoXG4gICAgdm9sdW1lczpcbiAgICAgIC0gbG9nc19hcGk6L2NvZGUvcGxhbmUvbG9nc1xuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6IFsqYXBwLWVudiwgKmRiLWVudiwgKnJlZGlzLWVudiwgKm1pbmlvLWVudiwgKmF3cy1zMy1lbnYsICpwcm94eS1lbnZdXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHBsYW5lLWRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcGxhbmUtcmVkaXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICBwbGFuZS1tcTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLW1pZ3JhdG9yOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfY29tcGxldGVkX3N1Y2Nlc3NmdWxseVxuXG4gIHBsYW5lLXdvcmtlcjpcbiAgICBpbWFnZTogbWFrZXBsYW5lL3BsYW5lLWJhY2tlbmQ6JHtBUFBfUkVMRUFTRTotdjEuMy4xfVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDogLi9iaW4vZG9ja2VyLWVudHJ5cG9pbnQtd29ya2VyLnNoXG4gICAgdm9sdW1lczpcbiAgICAgIC0gbG9nc193b3JrZXI6L2NvZGUvcGxhbmUvbG9nc1xuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6IFsqYXBwLWVudiwgKmRiLWVudiwgKnJlZGlzLWVudiwgKm1pbmlvLWVudiwgKmF3cy1zMy1lbnYsICpwcm94eS1lbnZdXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHBsYW5lLWRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcGxhbmUtcmVkaXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICBwbGFuZS1tcTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLW1pZ3JhdG9yOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfY29tcGxldGVkX3N1Y2Nlc3NmdWxseVxuXG4gIHBsYW5lLWJlYXQtd29ya2VyOlxuICAgIGltYWdlOiBtYWtlcGxhbmUvcGxhbmUtYmFja2VuZDoke0FQUF9SRUxFQVNFOi12MS4zLjF9XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOiAuL2Jpbi9kb2NrZXItZW50cnlwb2ludC1iZWF0LnNoXG4gICAgdm9sdW1lczpcbiAgICAgIC0gbG9nc19iZWF0LXdvcmtlcjovY29kZS9wbGFuZS9sb2dzXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICA8PDogWyphcHAtZW52LCAqZGItZW52LCAqcmVkaXMtZW52LCAqbWluaW8tZW52LCAqYXdzLXMzLWVudiwgKnByb3h5LWVudl1cbiAgICBkZXBlbmRzX29uOlxuICAgICAgcGxhbmUtZGI6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICBwbGFuZS1yZWRpczpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLW1xOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgcGxhbmUtbWlncmF0b3I6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9jb21wbGV0ZWRfc3VjY2Vzc2Z1bGx5XG5cbiAgcGxhbmUtbWlncmF0b3I6XG4gICAgaW1hZ2U6IG1ha2VwbGFuZS9wbGFuZS1iYWNrZW5kOiR7QVBQX1JFTEVBU0U6LXYxLjMuMX1cbiAgICByZXN0YXJ0OiBvbi1mYWlsdXJlXG4gICAgY29tbWFuZDogLi9iaW4vZG9ja2VyLWVudHJ5cG9pbnQtbWlncmF0b3Iuc2hcbiAgICB2b2x1bWVzOlxuICAgICAgLSBsb2dzX21pZ3JhdG9yOi9jb2RlL3BsYW5lL2xvZ3NcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIDw8OiBbKmFwcC1lbnYsICpkYi1lbnYsICpyZWRpcy1lbnYsICptaW5pby1lbnYsICphd3MtczMtZW52LCAqcHJveHktZW52XVxuICAgIGRlcGVuZHNfb246XG4gICAgICBwbGFuZS1kYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHBsYW5lLXJlZGlzOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuXG4gIHBsYW5lLWRiOlxuICAgIGltYWdlOiBwb3N0Z3JlczoxNy1hbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGNvbW1hbmQ6IHBvc3RncmVzIC1jICdtYXhfY29ubmVjdGlvbnM9MTAwMCdcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIDw8OiAqZGItZW52XG4gICAgdm9sdW1lczpcbiAgICAgIC0gcGdkYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01ELVNIRUxMXCIsIFwicGdfaXNyZWFkeSAtVSAke1BPU1RHUkVTX1VTRVI6LXBsYW5lfSAtZCAke1BPU1RHUkVTX0RCOi1wbGFuZX1cIl1cbiAgICAgIGludGVydmFsOiA1c1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDEwXG4gICAgICBzdGFydF9wZXJpb2Q6IDEwc1xuXG4gIHBsYW5lLXJlZGlzOlxuICAgIGltYWdlOiB2YWxrZXkvdmFsa2V5OjcuMi4xMS1hbHBpbmVcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHJlZGlzZGF0YTovZGF0YVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01ELVNIRUxMXCIsIFwidmFsa2V5LWNsaSBwaW5nIHwgZ3JlcCAtcSBQT05HXCJdXG4gICAgICBpbnRlcnZhbDogNXNcbiAgICAgIHRpbWVvdXQ6IDNzXG4gICAgICByZXRyaWVzOiA1XG4gICAgICBzdGFydF9wZXJpb2Q6IDVzXG5cbiAgcGxhbmUtbXE6XG4gICAgaW1hZ2U6IHJhYmJpdG1xOjMuMTMuNi1tYW5hZ2VtZW50LWFscGluZVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICA8PDogKm1xLWVudlxuICAgIHZvbHVtZXM6XG4gICAgICAtIHJhYmJpdG1xX2RhdGE6L3Zhci9saWIvcmFiYml0bXFcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRFwiLCBcInJhYmJpdG1xLWRpYWdub3N0aWNzXCIsIFwiLXFcIiwgXCJwaW5nXCJdXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiAxMHNcbiAgICAgIHJldHJpZXM6IDEwXG4gICAgICBzdGFydF9wZXJpb2Q6IDMwc1xuXG4gIHBsYW5lLW1pbmlvOlxuICAgIGltYWdlOiBtaW5pby9taW5pbzpSRUxFQVNFLjIwMjUtMDQtMjJUMjItMTItMjZaXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOiBzZXJ2ZXIgL2V4cG9ydCAtLWNvbnNvbGUtYWRkcmVzcyBcIjo5MDkwXCJcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIDw8OiAqbWluaW8tZW52XG4gICAgdm9sdW1lczpcbiAgICAgIC0gdXBsb2FkczovZXhwb3J0XG5cbiAgcHJveHk6XG4gICAgaW1hZ2U6IG1ha2VwbGFuZS9wbGFuZS1wcm94eToke0FQUF9SRUxFQVNFOi12MS4zLjF9XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBleHBvc2U6XG4gICAgICAtIFwiODBcIlxuICAgIGVudmlyb25tZW50OlxuICAgICAgPDw6ICpwcm94eS1lbnZcbiAgICB2b2x1bWVzOlxuICAgICAgLSBwcm94eV9jb25maWc6L2NvbmZpZ1xuICAgICAgLSBwcm94eV9kYXRhOi9kYXRhXG4gICAgbGlua3M6XG4gICAgICAtIFwicGxhbmUtd2ViOndlYlwiXG4gICAgICAtIFwicGxhbmUtYXBpOmFwaVwiXG4gICAgICAtIFwicGxhbmUtc3BhY2U6c3BhY2VcIlxuICAgICAgLSBcInBsYW5lLWFkbWluOmFkbWluXCJcbiAgICAgIC0gXCJwbGFuZS1saXZlOmxpdmVcIlxuICAgIGRlcGVuZHNfb246XG4gICAgICBwbGFuZS13ZWI6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBwbGFuZS1hcGk6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkXG4gICAgICBwbGFuZS1zcGFjZTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcbiAgICAgIHBsYW5lLWFkbWluOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZFxuICAgICAgcGxhbmUtbGl2ZTpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWRcblxudm9sdW1lczpcbiAgcGdkYXRhOlxuICByZWRpc2RhdGE6XG4gIHVwbG9hZHM6XG4gIHJhYmJpdG1xX2RhdGE6XG4gIGxvZ3NfYXBpOlxuICBsb2dzX3dvcmtlcjpcbiAgbG9nc19iZWF0LXdvcmtlcjpcbiAgbG9nc19taWdyYXRvcjpcbiAgcHJveHlfY29uZmlnOlxuICBwcm94eV9kYXRhOlxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5hcHBfcmVsZWFzZSA9IFwidjEuMy4xXCJcbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxucG9zdGdyZXNfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbm1pbmlvX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5yYWJiaXRtcV9wYXNzd29yZCA9IFwiJHtwYXNzd29yZDozMn1cIlxuc2VjcmV0X2tleSA9IFwiJHtiYXNlNjQ6NDh9XCJcbmxpdmVfc2VjcmV0X2tleSA9IFwiJHtiYXNlNjQ6NDh9XCJcblxuW2NvbmZpZ11cbmVudiA9IFtcbiAgXCIjID09PT09IEFwcGxpY2F0aW9uID09PT09XCIsXG4gIFwiIyBQbGFuZSBpbWFnZSB0YWcgZGVwbG95ZWQgZm9yIGV2ZXJ5IHNlcnZpY2UuXCIsXG4gIFwiQVBQX1JFTEVBU0U9JHthcHBfcmVsZWFzZX1cIixcbiAgXCIjIFB1YmxpYyBkb21haW4gUGxhbmUgaXMgc2VydmVkIG9uLlwiLFxuICBcIkFQUF9ET01BSU49JHttYWluX2RvbWFpbn1cIixcbiAgXCIjIEZ1bGwgZXh0ZXJuYWwgVVJMIG9mIHRoZSBpbnN0YW5jZSAodXNlZCB0byBidWlsZCBsaW5rcykuXCIsXG4gIFwiV0VCX1VSTD1odHRwczovLyR7bWFpbl9kb21haW59XCIsXG4gIFwiIyBCcm93c2VyIG9yaWdpbnMgYWxsb3dlZCB0byBjYWxsIHRoZSBBUEkgKENPUlMpLlwiLFxuICBcIkNPUlNfQUxMT1dFRF9PUklHSU5TPWh0dHBzOi8vJHttYWluX2RvbWFpbn1cIixcbiAgXCIjIEludGVybmFsIFVSTCBvdGhlciBzZXJ2aWNlcyB1c2UgdG8gcmVhY2ggdGhlIEFQSS5cIixcbiAgXCJBUElfQkFTRV9VUkw9aHR0cDovL3BsYW5lLWFwaTo4MDAwXCIsXG4gIFwiIyBEamFuZ28gc2VjcmV0IGtleTogc2lnbnMgc2Vzc2lvbnMgYW5kIHRva2Vucy4gS2VlcCBpdCBzZWNyZXQuXCIsXG4gIFwiU0VDUkVUX0tFWT0ke3NlY3JldF9rZXl9XCIsXG4gIFwiIyBTaGFyZWQgc2VjcmV0IGJldHdlZW4gdGhlIEFQSSBhbmQgdGhlIHJlYWx0aW1lIChsaXZlKSBzZXJ2ZXIuXCIsXG4gIFwiTElWRV9TRVJWRVJfU0VDUkVUX0tFWT0ke2xpdmVfc2VjcmV0X2tleX1cIixcbiAgXCJcIixcbiAgXCIjID09PT09IFBvc3RncmVTUUwgPT09PT1cIixcbiAgXCIjIERhdGFiYXNlIHVzZXIuXCIsXG4gIFwiUE9TVEdSRVNfVVNFUj1wbGFuZVwiLFxuICBcIiMgRGF0YWJhc2UgcGFzc3dvcmQuXCIsXG4gIFwiUE9TVEdSRVNfUEFTU1dPUkQ9JHtwb3N0Z3Jlc19wYXNzd29yZH1cIixcbiAgXCIjIERhdGFiYXNlIG5hbWUuXCIsXG4gIFwiUE9TVEdSRVNfREI9cGxhbmVcIixcbiAgXCIjIFBvcnQgUG9zdGdyZVNRTCBsaXN0ZW5zIG9uLlwiLFxuICBcIlBPU1RHUkVTX1BPUlQ9NTQzMlwiLFxuICBcIiMgSG9zdCB0aGUgYXBwIGFuZCBsaWJwcSB0b29scyBjb25uZWN0IHRvLlwiLFxuICBcIlBHSE9TVD1wbGFuZS1kYlwiLFxuICBcIiMgRGVmYXVsdCBkYXRhYmFzZSBmb3IgbGlicHEgdG9vbHMuXCIsXG4gIFwiUEdEQVRBQkFTRT1wbGFuZVwiLFxuICBcIiMgT24tZGlzayBsb2NhdGlvbiBvZiB0aGUgZGF0YWJhc2UgZmlsZXMuXCIsXG4gIFwiUEdEQVRBPS92YXIvbGliL3Bvc3RncmVzcWwvZGF0YVwiLFxuICBcIiMgRnVsbCBjb25uZWN0aW9uIHN0cmluZyAoY29tcG9zZWQgZnJvbSB0aGUgdmFsdWVzIGFib3ZlKS5cIixcbiAgXCJEQVRBQkFTRV9VUkw9cG9zdGdyZXNxbDovL3BsYW5lOiR7cG9zdGdyZXNfcGFzc3dvcmR9QHBsYW5lLWRiOjU0MzIvcGxhbmVcIixcbiAgXCJcIixcbiAgXCIjID09PT09IFJlZGlzIC8gVmFsa2V5IChjYWNoZSkgPT09PT1cIixcbiAgXCIjIFJlZGlzIGhvc3QuXCIsXG4gIFwiUkVESVNfSE9TVD1wbGFuZS1yZWRpc1wiLFxuICBcIiMgUmVkaXMgcG9ydC5cIixcbiAgXCJSRURJU19QT1JUPTYzNzlcIixcbiAgXCIjIEZ1bGwgUmVkaXMgY29ubmVjdGlvbiBVUkwuXCIsXG4gIFwiUkVESVNfVVJMPXJlZGlzOi8vcGxhbmUtcmVkaXM6NjM3OS9cIixcbiAgXCJcIixcbiAgXCIjID09PT09IFJhYmJpdE1RICh0YXNrIHF1ZXVlKSA9PT09PVwiLFxuICBcIiMgQnJva2VyIGhvc3QuXCIsXG4gIFwiUkFCQklUTVFfSE9TVD1wbGFuZS1tcVwiLFxuICBcIiMgQnJva2VyIHBvcnQuXCIsXG4gIFwiUkFCQklUTVFfUE9SVD01NjcyXCIsXG4gIFwiIyBCcm9rZXIgdXNlci5cIixcbiAgXCJSQUJCSVRNUV9VU0VSPXBsYW5lXCIsXG4gIFwiIyBCcm9rZXIgcGFzc3dvcmQuXCIsXG4gIFwiUkFCQklUTVFfUEFTU1dPUkQ9JHtyYWJiaXRtcV9wYXNzd29yZH1cIixcbiAgXCIjIEJyb2tlciB2aXJ0dWFsIGhvc3QuXCIsXG4gIFwiUkFCQklUTVFfVkhPU1Q9cGxhbmVcIixcbiAgXCIjIEZ1bGwgQU1RUCBjb25uZWN0aW9uIHN0cmluZyAoY29tcG9zZWQgZnJvbSB0aGUgdmFsdWVzIGFib3ZlKS5cIixcbiAgXCJBTVFQX1VSTD1hbXFwOi8vcGxhbmU6JHtyYWJiaXRtcV9wYXNzd29yZH1AcGxhbmUtbXE6NTY3Mi9wbGFuZVwiLFxuICBcIlwiLFxuICBcIiMgPT09PT0gT2JqZWN0IHN0b3JhZ2UgKE1pbklPIC8gUzMpID09PT09XCIsXG4gIFwiIyBVc2UgdGhlIGJ1bmRsZWQgTWluSU8gKDEpIGluc3RlYWQgb2YgYW4gZXh0ZXJuYWwgUzMgcHJvdmlkZXIgKDApLlwiLFxuICBcIlVTRV9NSU5JTz0xXCIsXG4gIFwiIyBBV1MgcmVnaW9uOyBsZWF2ZSBlbXB0eSB3aGVuIHVzaW5nIE1pbklPLlwiLFxuICBcIkFXU19SRUdJT049XCIsXG4gIFwiIyBTMyAvIE1pbklPIGFjY2VzcyBrZXkuXCIsXG4gIFwiQVdTX0FDQ0VTU19LRVlfSUQ9YWNjZXNzLWtleVwiLFxuICBcIiMgUzMgLyBNaW5JTyBzZWNyZXQga2V5LlwiLFxuICBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWT0ke21pbmlvX3Bhc3N3b3JkfVwiLFxuICBcIiMgUzMgLyBNaW5JTyBlbmRwb2ludCBVUkwuXCIsXG4gIFwiQVdTX1MzX0VORFBPSU5UX1VSTD1odHRwOi8vcGxhbmUtbWluaW86OTAwMFwiLFxuICBcIiMgQnVja2V0IHVzZWQgdG8gc3RvcmUgdXBsb2Fkcy5cIixcbiAgXCJBV1NfUzNfQlVDS0VUX05BTUU9dXBsb2Fkc1wiLFxuICBcIiMgTWF4IHVwbG9hZCBzaXplIGluIGJ5dGVzIChkZWZhdWx0IDUgTWlCKS5cIixcbiAgXCJGSUxFX1NJWkVfTElNSVQ9NTI0Mjg4MFwiLFxuICBcIiMgU2V0IHRvIDEgaWYgdGhlIFMzIC8gTWluSU8gZW5kcG9pbnQgaXMgc2VydmVkIG92ZXIgSFRUUFMuXCIsXG4gIFwiTUlOSU9fRU5EUE9JTlRfU1NMPTBcIixcbiAgXCJcIixcbiAgXCIjID09PT09IENhZGR5IHByb3h5ID09PT09XCIsXG4gIFwiIyBBZGRyZXNzIHRoZSBpbi1jb250YWluZXIgQ2FkZHkgbGlzdGVucyBvbi4gUmVxdWlyZWQ6IHRoZSBwcm94eVwiLFxuICBcIiMgQ2FkZHlmaWxlIGhhcyBubyBkZWZhdWx0IGFuZCBhbiBlbXB0eSB2YWx1ZSBjcmFzaGVzIGl0IG9uIGJvb3QuXCIsXG4gIFwiU0lURV9BRERSRVNTPTo4MFwiLFxuICBcIiMgUGVlcnMgYWxsb3dlZCB0byBzZXQgWC1Gb3J3YXJkZWQtRm9yIC8gWC1SZWFsLUlQLiAncHJpdmF0ZV9yYW5nZXMnXCIsXG4gIFwiIyB0cnVzdHMgb25seSBEb2twbG95J3MgcHJpdmF0ZSB1cHN0cmVhbSAoVHJhZWZpaykgYW5kIGJsb2NrcyBwdWJsaWNcIixcbiAgXCIjIElQIHNwb29maW5nLiBVc2UgYSBuYXJyb3dlciBDSURSIGlmIGV4cG9zaW5nIHRoZSBwcm94eSBkaXJlY3RseS5cIixcbiAgXCJUUlVTVEVEX1BST1hJRVM9cHJpdmF0ZV9yYW5nZXNcIixcbiAgXCJcIixcbiAgXCIjID09PT09IEFwcCBydW50aW1lID09PT09XCIsXG4gIFwiIyBEamFuZ28gZGVidWcgbW9kZTsga2VlcCAwIGluIHByb2R1Y3Rpb24uXCIsXG4gIFwiREVCVUc9MFwiLFxuICBcIiMgTnVtYmVyIG9mIEd1bmljb3JuIHdvcmtlcnMgZm9yIHRoZSBBUEkuXCIsXG4gIFwiR1VOSUNPUk5fV09SS0VSUz0xXCIsXG4gIFwiIyBSYXRlIGxpbWl0IGFwcGxpZWQgdG8gQVBJLWtleSByZXF1ZXN0cy5cIixcbiAgXCJBUElfS0VZX1JBVEVfTElNSVQ9NjAvbWludXRlXCIsXG4gIFwiIyBDb21tYS1zZXBhcmF0ZWQgSVBzIGFsbG93ZWQgYXMgd2ViaG9vayB0YXJnZXRzOyBlbXB0eSBhbGxvd3MgYWxsLlwiLFxuICBcIldFQkhPT0tfQUxMT1dFRF9JUFM9XCIsXG4gIFwiIyBDb21tYS1zZXBhcmF0ZWQgaG9zdHMgYWxsb3dlZCBhcyB3ZWJob29rIHRhcmdldHM7IGVtcHR5IGFsbG93cyBhbGwuXCIsXG4gIFwiV0VCSE9PS19BTExPV0VEX0hPU1RTPVwiLFxuXVxuXG5tb3VudHMgPSBbXVxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJwcm94eVwiXG5wb3J0ID0gODBcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcbiIKfQ==

Tags

kanban, project-management


Version: v1.3.1

On this page