Dokploy

Appwrite

Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster. Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.

Appwrite logo

Configuration

version: "3.8"

x-logging: &x-logging
  logging:
    driver: "json-file"
    options:
      max-file: "5"
      max-size: "10m"
services:
  appwrite:
    image: appwrite/appwrite:1.9.5
    <<: *x-logging
    restart: unless-stopped
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=appwrite
      - 'traefik.http.routers.appwrite-sites-wildcard.rule=HostRegexp(`^.+\.${_APP_DOMAIN_SITES}$$`)'
      - traefik.http.routers.appwrite-sites-wildcard.entrypoints=web
      - traefik.http.routers.appwrite-sites-wildcard.service=appwrite-wildcard
      - 'traefik.http.routers.appwrite-sites-wildcard-secure.rule=HostRegexp(`^.+\.${_APP_DOMAIN_SITES}$$`)'
      - traefik.http.routers.appwrite-sites-wildcard-secure.entrypoints=websecure
      - traefik.http.routers.appwrite-sites-wildcard-secure.tls=true
      - traefik.http.routers.appwrite-sites-wildcard-secure.service=appwrite-wildcard
      - 'traefik.http.routers.appwrite-functions-wildcard.rule=HostRegexp(`^.+\.${_APP_DOMAIN_FUNCTIONS}$$`)'
      - traefik.http.routers.appwrite-functions-wildcard.entrypoints=web
      - traefik.http.routers.appwrite-functions-wildcard.service=appwrite-wildcard
      - 'traefik.http.routers.appwrite-functions-wildcard-secure.rule=HostRegexp(`^.+\.${_APP_DOMAIN_FUNCTIONS}$$`)'
      - traefik.http.routers.appwrite-functions-wildcard-secure.entrypoints=websecure
      - traefik.http.routers.appwrite-functions-wildcard-secure.tls=true
      - traefik.http.routers.appwrite-functions-wildcard-secure.service=appwrite-wildcard
      - traefik.http.services.appwrite-wildcard.loadbalancer.server.port=80
    healthcheck:
      test:
        - CMD
        - doctor
      interval: 5s
      timeout: 5s
      retries: 12
    volumes:
      - appwrite-uploads:/storage/uploads:rw
      - appwrite-imports:/storage/imports:rw
      - appwrite-cache:/storage/cache:rw
      - appwrite-config:/storage/config:rw
      - appwrite-certificates:/storage/certificates:rw
      - appwrite-functions:/storage/functions:rw
      - appwrite-sites:/storage/sites:rw
      - appwrite-builds:/storage/builds:rw
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_EDITION
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_LOCALE
      - _APP_COMPRESSION_ENABLED
      - _APP_COMPRESSION_MIN_SIZE_BYTES
      - _APP_CONSOLE_WHITELIST_ROOT
      - _APP_CONSOLE_WHITELIST_EMAILS
      - _APP_CONSOLE_SESSION_ALERTS
      - _APP_CONSOLE_WHITELIST_IPS
      - _APP_CONSOLE_HOSTNAMES
      - _APP_CONSOLE_SCHEMA
      - _APP_SYSTEM_EMAIL_NAME
      - _APP_SYSTEM_EMAIL_ADDRESS
      - _APP_SYSTEM_TEAM_EMAIL
      - _APP_EMAIL_SECURITY
      - _APP_SYSTEM_RESPONSE_FORMAT
      - _APP_OPTIONS_ABUSE
      - _APP_OPTIONS_ROUTER_PROTECTION
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_OPTIONS_ROUTER_FORCE_HTTPS
      - _APP_OPENSSL_KEY_V1
      - _APP_DOMAIN
      - _APP_CONSOLE_DOMAIN
      - _APP_CONSOLE_TRUSTED_PROJECTS
      - _APP_DOMAIN_TARGET_CNAME
      - _APP_DOMAIN_TARGET_AAAA
      - _APP_DOMAIN_TARGET_A
      - _APP_DOMAIN_TARGET_CAA
      - _APP_DNS
      - _APP_DOMAIN_FUNCTIONS
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DB_ADAPTER_VECTORSDB
      - _APP_DB_HOST_VECTORSDB
      - _APP_DB_PORT_VECTORSDB
      - _APP_DB_SCHEMA_VECTORSDB
      - _APP_DB_USER_VECTORSDB
      - _APP_DB_PASS_VECTORSDB
      - _APP_SMTP_HOST
      - _APP_SMTP_PORT
      - _APP_SMTP_SECURE
      - _APP_SMTP_USERNAME
      - _APP_SMTP_PASSWORD
      - _APP_USAGE_STATS
      - _APP_STORAGE_LIMIT
      - _APP_STORAGE_PREVIEW_LIMIT
      - _APP_STORAGE_ANTIVIRUS
      - _APP_STORAGE_ANTIVIRUS_HOST
      - _APP_STORAGE_ANTIVIRUS_PORT
      - _APP_STORAGE_DEVICE
      - _APP_STORAGE_S3_ACCESS_KEY
      - _APP_STORAGE_S3_SECRET
      - _APP_STORAGE_S3_REGION
      - _APP_STORAGE_S3_BUCKET
      - _APP_STORAGE_S3_ENDPOINT
      - _APP_STORAGE_DO_SPACES_ACCESS_KEY
      - _APP_STORAGE_DO_SPACES_SECRET
      - _APP_STORAGE_DO_SPACES_REGION
      - _APP_STORAGE_DO_SPACES_BUCKET
      - _APP_STORAGE_BACKBLAZE_ACCESS_KEY
      - _APP_STORAGE_BACKBLAZE_SECRET
      - _APP_STORAGE_BACKBLAZE_REGION
      - _APP_STORAGE_BACKBLAZE_BUCKET
      - _APP_STORAGE_LINODE_ACCESS_KEY
      - _APP_STORAGE_LINODE_SECRET
      - _APP_STORAGE_LINODE_REGION
      - _APP_STORAGE_LINODE_BUCKET
      - _APP_STORAGE_WASABI_ACCESS_KEY
      - _APP_STORAGE_WASABI_SECRET
      - _APP_STORAGE_WASABI_REGION
      - _APP_STORAGE_WASABI_BUCKET
      - _APP_COMPUTE_SIZE_LIMIT
      - _APP_FUNCTIONS_TIMEOUT
      - _APP_SITES_TIMEOUT
      - _APP_COMPUTE_BUILD_TIMEOUT
      - _APP_COMPUTE_CPUS
      - _APP_COMPUTE_MEMORY
      - _APP_FUNCTIONS_RUNTIMES
      - _APP_SITES_RUNTIMES
      - _APP_DOMAIN_SITES
      - _APP_EXECUTOR_SECRET
      - _APP_EXECUTOR_HOST
      - _APP_LOGGING_CONFIG
      - _APP_MAINTENANCE_INTERVAL
      - _APP_MAINTENANCE_RETENTION_EXECUTION
      - _APP_MAINTENANCE_RETENTION_CACHE
      - _APP_MAINTENANCE_RETENTION_ABUSE
      - _APP_MAINTENANCE_RETENTION_AUDIT
      - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
      - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY
      - _APP_MAINTENANCE_RETENTION_SCHEDULES
      - _APP_SMS_PROVIDER
      - _APP_SMS_FROM
      - _APP_GRAPHQL_INTROSPECTION
      - _APP_GRAPHQL_MAX_BATCH_SIZE
      - _APP_GRAPHQL_MAX_COMPLEXITY
      - _APP_GRAPHQL_MAX_DEPTH
      - _APP_VCS_GITHUB_APP_NAME
      - _APP_VCS_GITHUB_PRIVATE_KEY
      - _APP_VCS_GITHUB_APP_ID
      - _APP_VCS_GITHUB_WEBHOOK_SECRET
      - _APP_VCS_GITHUB_CLIENT_SECRET
      - _APP_VCS_GITHUB_CLIENT_ID
      - _APP_MIGRATIONS_FIREBASE_CLIENT_ID
      - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
      - _APP_ASSISTANT_OPENAI_API_KEY
      - _APP_CONSOLE_COUNTRIES_DENYLIST
      - _APP_EXPERIMENT_LOGGING_PROVIDER
      - _APP_EXPERIMENT_LOGGING_CONFIG
      - _APP_DATABASE_SHARED_TABLES
      - _APP_DATABASE_SHARED_NAMESPACE
      - _APP_FUNCTIONS_CREATION_ABUSE_LIMIT
      - _APP_CUSTOM_DOMAIN_DENY_LIST
      - _APP_TRUSTED_HEADERS
      - _APP_MIGRATION_HOST

  appwrite-console:
    <<: *x-logging
    image: appwrite/console:8.7.5
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.constraint-label-stack=appwrite"

  appwrite-realtime:
    image: appwrite/appwrite:1.9.5
    entrypoint: realtime
    <<: *x-logging
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.constraint-label-stack=appwrite"
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_OPTIONS_ABUSE
      - _APP_OPTIONS_ROUTER_PROTECTION
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DB_ADAPTER_VECTORSDB
      - _APP_DB_HOST_VECTORSDB
      - _APP_DB_PORT_VECTORSDB
      - _APP_DB_SCHEMA_VECTORSDB
      - _APP_DB_USER_VECTORSDB
      - _APP_DB_PASS_VECTORSDB
      - _APP_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_LOGGING_CONFIG_REALTIME
      - _APP_DATABASE_SHARED_TABLES
      - _APP_POOL_ADAPTER=swoole

  appwrite-worker-audits:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-audits
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_LOGGING_CONFIG
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-webhooks:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-webhooks
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_EMAIL_SECURITY
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_LOGGING_CONFIG
      - _APP_WEBHOOK_MAX_FAILED_ATTEMPTS
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-deletes:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-deletes
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    volumes:
      - appwrite-uploads:/storage/uploads:rw
      - appwrite-cache:/storage/cache:rw
      - appwrite-functions:/storage/functions:rw
      - appwrite-sites:/storage/sites:rw
      - appwrite-builds:/storage/builds:rw
      - appwrite-certificates:/storage/certificates:rw
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_STORAGE_DEVICE
      - _APP_STORAGE_S3_ACCESS_KEY
      - _APP_STORAGE_S3_SECRET
      - _APP_STORAGE_S3_REGION
      - _APP_STORAGE_S3_BUCKET
      - _APP_STORAGE_S3_ENDPOINT
      - _APP_STORAGE_DO_SPACES_ACCESS_KEY
      - _APP_STORAGE_DO_SPACES_SECRET
      - _APP_STORAGE_DO_SPACES_REGION
      - _APP_STORAGE_DO_SPACES_BUCKET
      - _APP_STORAGE_BACKBLAZE_ACCESS_KEY
      - _APP_STORAGE_BACKBLAZE_SECRET
      - _APP_STORAGE_BACKBLAZE_REGION
      - _APP_STORAGE_BACKBLAZE_BUCKET
      - _APP_STORAGE_LINODE_ACCESS_KEY
      - _APP_STORAGE_LINODE_SECRET
      - _APP_STORAGE_LINODE_REGION
      - _APP_STORAGE_LINODE_BUCKET
      - _APP_STORAGE_WASABI_ACCESS_KEY
      - _APP_STORAGE_WASABI_SECRET
      - _APP_STORAGE_WASABI_REGION
      - _APP_STORAGE_WASABI_BUCKET
      - _APP_LOGGING_CONFIG
      - _APP_EXECUTOR_SECRET
      - _APP_EXECUTOR_HOST
      - _APP_DATABASE_SHARED_TABLES
      - _APP_EMAIL_CERTIFICATES
      - _APP_MAINTENANCE_RETENTION_AUDIT
      - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE

  appwrite-worker-databases:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-databases
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DB_ADAPTER_VECTORSDB
      - _APP_DB_HOST_VECTORSDB
      - _APP_DB_PORT_VECTORSDB
      - _APP_DB_SCHEMA_VECTORSDB
      - _APP_DB_USER_VECTORSDB
      - _APP_DB_PASS_VECTORSDB
      - _APP_LOGGING_CONFIG
      - _APP_QUEUE_NAME
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-builds:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-builds
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    volumes:
      - appwrite-functions:/storage/functions:rw
      - appwrite-sites:/storage/sites:rw
      - appwrite-builds:/storage/builds:rw
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_EXECUTOR_SECRET
      - _APP_EXECUTOR_HOST
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_LOGGING_CONFIG
      - _APP_VCS_GITHUB_APP_NAME
      - _APP_VCS_GITHUB_PRIVATE_KEY
      - _APP_VCS_GITHUB_APP_ID
      - _APP_FUNCTIONS_TIMEOUT
      - _APP_SITES_TIMEOUT
      - _APP_COMPUTE_BUILD_TIMEOUT
      - _APP_COMPUTE_CPUS
      - _APP_COMPUTE_MEMORY
      - _APP_OPEN_RUNTIMES_NFT
      - _APP_COMPUTE_SIZE_LIMIT
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_OPTIONS_ROUTER_FORCE_HTTPS
      - _APP_DOMAIN
      - _APP_CONSOLE_DOMAIN
      - _APP_CONSOLE_TRUSTED_PROJECTS
      - _APP_STORAGE_DEVICE
      - _APP_STORAGE_S3_ACCESS_KEY
      - _APP_STORAGE_S3_SECRET
      - _APP_STORAGE_S3_REGION
      - _APP_STORAGE_S3_BUCKET
      - _APP_STORAGE_S3_ENDPOINT
      - _APP_STORAGE_DO_SPACES_ACCESS_KEY
      - _APP_STORAGE_DO_SPACES_SECRET
      - _APP_STORAGE_DO_SPACES_REGION
      - _APP_STORAGE_DO_SPACES_BUCKET
      - _APP_STORAGE_BACKBLAZE_ACCESS_KEY
      - _APP_STORAGE_BACKBLAZE_SECRET
      - _APP_STORAGE_BACKBLAZE_REGION
      - _APP_STORAGE_BACKBLAZE_BUCKET
      - _APP_STORAGE_LINODE_ACCESS_KEY
      - _APP_STORAGE_LINODE_SECRET
      - _APP_STORAGE_LINODE_REGION
      - _APP_STORAGE_LINODE_BUCKET
      - _APP_STORAGE_WASABI_ACCESS_KEY
      - _APP_STORAGE_WASABI_SECRET
      - _APP_STORAGE_WASABI_REGION
      - _APP_STORAGE_WASABI_BUCKET
      - _APP_DATABASE_SHARED_TABLES
      - _APP_DOMAIN_SITES
    extra_hosts:
      - host.docker.internal:host-gateway

  appwrite-worker-screenshots:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-screenshots
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    volumes:
      - appwrite-uploads:/storage/uploads:rw
    environment:
      - _APP_BROWSER_HOST
      - _APP_WORKER_SCREENSHOTS_ROUTER
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_LOGGING_CONFIG
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DATABASE_SHARED_TABLES
      - _APP_STORAGE_DEVICE
      - _APP_STORAGE_S3_ACCESS_KEY
      - _APP_STORAGE_S3_SECRET
      - _APP_STORAGE_S3_REGION
      - _APP_STORAGE_S3_BUCKET
      - _APP_STORAGE_S3_ENDPOINT
      - _APP_STORAGE_DO_SPACES_ACCESS_KEY
      - _APP_STORAGE_DO_SPACES_SECRET
      - _APP_STORAGE_DO_SPACES_REGION
      - _APP_STORAGE_DO_SPACES_BUCKET
      - _APP_STORAGE_BACKBLAZE_ACCESS_KEY
      - _APP_STORAGE_BACKBLAZE_SECRET
      - _APP_STORAGE_BACKBLAZE_REGION
      - _APP_STORAGE_BACKBLAZE_BUCKET
      - _APP_STORAGE_LINODE_ACCESS_KEY
      - _APP_STORAGE_LINODE_SECRET
      - _APP_STORAGE_LINODE_REGION
      - _APP_STORAGE_LINODE_BUCKET
      - _APP_STORAGE_WASABI_ACCESS_KEY
      - _APP_STORAGE_WASABI_SECRET
      - _APP_STORAGE_WASABI_REGION
      - _APP_STORAGE_WASABI_BUCKET
    extra_hosts:
      - host.docker.internal:host-gateway

  appwrite-worker-certificates:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-certificates
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    volumes:
      - appwrite-config:/storage/config:rw
      - appwrite-certificates:/storage/certificates:rw
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_DOMAIN
      - _APP_DOMAIN_TARGET_CNAME
      - _APP_DOMAIN_TARGET_AAAA
      - _APP_DOMAIN_TARGET_A
      - _APP_DOMAIN_TARGET_CAA
      - _APP_DNS
      - _APP_DOMAIN_FUNCTIONS
      - _APP_DOMAIN_SITES
      - _APP_EMAIL_CERTIFICATES
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_LOGGING_CONFIG
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-executions:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-executions
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_LOGGING_CONFIG
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-functions:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-functions
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
      - openruntimes-executor
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_DOMAIN
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_FUNCTIONS_TIMEOUT
      - _APP_SITES_TIMEOUT
      - _APP_COMPUTE_BUILD_TIMEOUT
      - _APP_COMPUTE_CPUS
      - _APP_COMPUTE_MEMORY
      - _APP_EXECUTOR_SECRET
      - _APP_EXECUTOR_HOST
      - _APP_USAGE_STATS
      - _APP_DOCKER_HUB_USERNAME
      - _APP_DOCKER_HUB_PASSWORD
      - _APP_LOGGING_CONFIG
      - _APP_LOGGING_PROVIDER
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-mails:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-mails
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_SYSTEM_EMAIL_NAME
      - _APP_SYSTEM_EMAIL_ADDRESS
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DB_ADAPTER
      - _APP_SMTP_HOST
      - _APP_SMTP_PORT
      - _APP_SMTP_SECURE
      - _APP_SMTP_USERNAME
      - _APP_SMTP_PASSWORD
      - _APP_LOGGING_CONFIG
      - _APP_DOMAIN
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-messaging:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-messaging
    <<: *x-logging
    restart: unless-stopped
    volumes:
      - appwrite-uploads:/storage/uploads:rw
    depends_on:
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_LOGGING_CONFIG
      - _APP_SMS_FROM
      - _APP_SMS_PROVIDER
      - _APP_SMS_PROJECTS_DENY_LIST
      - _APP_STORAGE_DEVICE
      - _APP_STORAGE_S3_ACCESS_KEY
      - _APP_STORAGE_S3_SECRET
      - _APP_STORAGE_S3_REGION
      - _APP_STORAGE_S3_BUCKET
      - _APP_STORAGE_S3_ENDPOINT
      - _APP_STORAGE_DO_SPACES_ACCESS_KEY
      - _APP_STORAGE_DO_SPACES_SECRET
      - _APP_STORAGE_DO_SPACES_REGION
      - _APP_STORAGE_DO_SPACES_BUCKET
      - _APP_STORAGE_BACKBLAZE_ACCESS_KEY
      - _APP_STORAGE_BACKBLAZE_SECRET
      - _APP_STORAGE_BACKBLAZE_REGION
      - _APP_STORAGE_BACKBLAZE_BUCKET
      - _APP_STORAGE_LINODE_ACCESS_KEY
      - _APP_STORAGE_LINODE_SECRET
      - _APP_STORAGE_LINODE_REGION
      - _APP_STORAGE_LINODE_BUCKET
      - _APP_STORAGE_WASABI_ACCESS_KEY
      - _APP_STORAGE_WASABI_SECRET
      - _APP_STORAGE_WASABI_REGION
      - _APP_STORAGE_WASABI_BUCKET
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-migrations:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-migrations
    <<: *x-logging
    restart: unless-stopped
    volumes:
      - appwrite-imports:/storage/imports:rw
      - appwrite-uploads:/storage/uploads:rw
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_DOMAIN
      - _APP_DOMAIN_TARGET_CNAME
      - _APP_DOMAIN_TARGET_AAAA
      - _APP_DOMAIN_TARGET_A
      - _APP_DOMAIN_TARGET_CAA
      - _APP_DNS
      - _APP_EMAIL_SECURITY
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_LOGGING_CONFIG
      - _APP_MIGRATIONS_FIREBASE_CLIENT_ID
      - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
      - _APP_DATABASE_SHARED_TABLES
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_MIGRATION_HOST

  appwrite-task-maintenance:
    image: appwrite/appwrite:1.9.5
    entrypoint: maintenance
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_DOMAIN
      - _APP_DOMAIN_TARGET_CNAME
      - _APP_DOMAIN_TARGET_AAAA
      - _APP_DOMAIN_TARGET_A
      - _APP_DOMAIN_TARGET_CAA
      - _APP_DNS
      - _APP_DOMAIN_FUNCTIONS
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_MAINTENANCE_INTERVAL
      - _APP_MAINTENANCE_RETENTION_EXECUTION
      - _APP_MAINTENANCE_RETENTION_CACHE
      - _APP_MAINTENANCE_RETENTION_ABUSE
      - _APP_MAINTENANCE_RETENTION_AUDIT
      - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
      - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY
      - _APP_MAINTENANCE_RETENTION_SCHEDULES
      - _APP_MAINTENANCE_START_TIME
      - _APP_DATABASE_SHARED_TABLES

  appwrite-task-interval:
    image: appwrite/appwrite:1.9.5
    entrypoint: interval
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_DOMAIN
      - _APP_DOMAIN_TARGET_CNAME
      - _APP_DOMAIN_TARGET_AAAA
      - _APP_DOMAIN_TARGET_A
      - _APP_DOMAIN_TARGET_CAA
      - _APP_DNS
      - _APP_DOMAIN_FUNCTIONS
      - _APP_DOMAIN_SITES
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DATABASE_SHARED_TABLES
      - _APP_INTERVAL_DOMAIN_VERIFICATION
      - _APP_INTERVAL_CLEANUP_STALE_EXECUTIONS

  appwrite-task-stats-resources:
    image: appwrite/appwrite:1.9.5
    entrypoint: stats-resources
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_DATABASE_SHARED_TABLES
      - _APP_STATS_RESOURCES_INTERVAL

  appwrite-worker-stats-resources:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-stats-resources
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_USAGE_AGGREGATION_INTERVAL
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-stats-usage:
    image: appwrite/appwrite:1.9.5
    entrypoint: worker-stats-usage
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_USAGE_AGGREGATION_INTERVAL
      - _APP_DATABASE_SHARED_TABLES

  appwrite-task-scheduler-functions:
    image: appwrite/appwrite:1.9.5
    entrypoint: schedule-functions
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_DOMAIN
      - _APP_CONSOLE_DOMAIN
      - _APP_DOMAIN_FUNCTIONS
      - _APP_DOMAIN_SITES
      - _APP_MIGRATION_HOST
      - _APP_CONSOLE_SCHEMA
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DATABASE_SHARED_TABLES

  appwrite-task-scheduler-executions:
    image: appwrite/appwrite:1.9.5
    entrypoint: schedule-executions
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_DOMAIN
      - _APP_CONSOLE_DOMAIN
      - _APP_DOMAIN_FUNCTIONS
      - _APP_DOMAIN_SITES
      - _APP_MIGRATION_HOST
      - _APP_CONSOLE_SCHEMA
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DATABASE_SHARED_TABLES

  appwrite-task-scheduler-messages:
    image: appwrite/appwrite:1.9.5
    entrypoint: schedule-messages
    <<: *x-logging
    restart: unless-stopped
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _APP_REDIS_HOST
      - _APP_REDIS_PORT
      - _APP_REDIS_USER
      - _APP_REDIS_PASS
      - _APP_DB_ADAPTER
      - _APP_DB_HOST
      - _APP_DB_PORT
      - _APP_DB_SCHEMA
      - _APP_DB_USER
      - _APP_DB_PASS
      - _APP_DATABASE_SHARED_TABLES

  appwrite-assistant:
    image: appwrite/assistant:0.8.4
    <<: *x-logging
    restart: unless-stopped
    environment:
      - _APP_ASSISTANT_OPENAI_API_KEY

  appwrite-browser:
    image: appwrite/browser:0.3.2
    <<: *x-logging
    restart: unless-stopped

  openruntimes-executor:
    hostname: openruntimes-executor
    <<: *x-logging
    restart: unless-stopped
    stop_signal: SIGINT
    image: openruntimes/executor:0.25.1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - appwrite-builds:/storage/builds:rw
      - appwrite-functions:/storage/functions:rw
      - appwrite-sites:/storage/sites:rw
      # Host mount necessary to share files between executor and runtimes.
      # It's not possible to share mount file between 2 containers without host mount (copying is too slow)
      - /tmp:/tmp:rw
    environment:
      - OPR_EXECUTOR_CONNECTION_STORAGE=local://localhost
      - OPR_EXECUTOR_CONNECTION_BUILD_CACHE_STORAGE=
      - OPR_EXECUTOR_IMAGES=$_APP_EXECUTOR_IMAGES
      - OPR_EXECUTOR_INACTIVE_THRESHOLD=$_APP_COMPUTE_INACTIVE_THRESHOLD
      - OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_COMPUTE_MAINTENANCE_INTERVAL
      - OPR_EXECUTOR_NETWORK=$_APP_COMPUTE_RUNTIMES_NETWORK
      - OPR_EXECUTOR_DOCKER_HUB_USERNAME=$_APP_DOCKER_HUB_USERNAME
      - OPR_EXECUTOR_DOCKER_HUB_PASSWORD=$_APP_DOCKER_HUB_PASSWORD
      - OPR_EXECUTOR_ENV=$_APP_ENV
      - OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES,$_APP_SITES_RUNTIMES
      - OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET
      - OPR_EXECUTOR_RUNTIME_VERSIONS=v5
      - OPEN_RUNTIMES_NFT=$_APP_OPEN_RUNTIMES_NFT
      - OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
      - OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE
      - OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_S3_SECRET=$_APP_STORAGE_S3_SECRET
      - OPR_EXECUTOR_STORAGE_S3_REGION=$_APP_STORAGE_S3_REGION
      - OPR_EXECUTOR_STORAGE_S3_BUCKET=$_APP_STORAGE_S3_BUCKET
      - OPR_EXECUTOR_STORAGE_S3_ENDPOINT=$_APP_STORAGE_S3_ENDPOINT
      - OPR_EXECUTOR_STORAGE_DO_SPACES_ACCESS_KEY=$_APP_STORAGE_DO_SPACES_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_DO_SPACES_SECRET=$_APP_STORAGE_DO_SPACES_SECRET
      - OPR_EXECUTOR_STORAGE_DO_SPACES_REGION=$_APP_STORAGE_DO_SPACES_REGION
      - OPR_EXECUTOR_STORAGE_DO_SPACES_BUCKET=$_APP_STORAGE_DO_SPACES_BUCKET
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_ACCESS_KEY=$_APP_STORAGE_BACKBLAZE_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_SECRET=$_APP_STORAGE_BACKBLAZE_SECRET
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_REGION=$_APP_STORAGE_BACKBLAZE_REGION
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_BUCKET=$_APP_STORAGE_BACKBLAZE_BUCKET
      - OPR_EXECUTOR_STORAGE_LINODE_ACCESS_KEY=$_APP_STORAGE_LINODE_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_LINODE_SECRET=$_APP_STORAGE_LINODE_SECRET
      - OPR_EXECUTOR_STORAGE_LINODE_REGION=$_APP_STORAGE_LINODE_REGION
      - OPR_EXECUTOR_STORAGE_LINODE_BUCKET=$_APP_STORAGE_LINODE_BUCKET
      - OPR_EXECUTOR_STORAGE_WASABI_ACCESS_KEY=$_APP_STORAGE_WASABI_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_WASABI_SECRET=$_APP_STORAGE_WASABI_SECRET
      - OPR_EXECUTOR_STORAGE_WASABI_REGION=$_APP_STORAGE_WASABI_REGION
      - OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET
    healthcheck:
      test:
        - CMD-SHELL
        - 'curl -fsS -H "Authorization: Bearer $$OPR_EXECUTOR_SECRET" http://localhost/v1/health >/dev/null'
      interval: 5s
      timeout: 3s
      retries: 20
      start_period: 5s

  mongodb:
    image: mongo:8.2.5
    <<: *x-logging
    restart: unless-stopped
    volumes:
      - appwrite-mongodb:/data/db
      - appwrite-mongodb-keyfile:/data/keyfile
      - ../files/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
      - ../files/mongo-entrypoint.sh:/mongo-entrypoint.sh:ro
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
      - MONGO_INITDB_DATABASE=${_APP_DB_SCHEMA}
      - MONGO_INITDB_USERNAME=${_APP_DB_USER}
      - MONGO_INITDB_PASSWORD=${_APP_DB_PASS}
    entrypoint:
      - /bin/bash
      - /mongo-entrypoint.sh
    healthcheck:
      test: |
        bash -c "
          mongosh -u root -p \"$$MONGO_INITDB_ROOT_PASSWORD\" --authenticationDatabase admin --quiet --eval \"
            try {
              const hello = db.adminCommand({hello: 1});
              if (hello.isWritablePrimary) {
                quit(0);
              }
            } catch (e) {}

            try {
              rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'mongodb:27017'}]});
            } catch (e) {}

            quit(1);
          \" 2>/dev/null
        "
      interval: 10s
      timeout: 10s
      retries: 10
      start_period: 30s

  mariadb:
    image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p
    <<: *x-logging
    restart: unless-stopped
    volumes:
      - appwrite-mariadb:/var/lib/mysql:rw
    environment:
      - MYSQL_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
      - MYSQL_DATABASE=${_APP_DB_SCHEMA}
      - MYSQL_USER=${_APP_DB_USER}
      - MYSQL_PASSWORD=${_APP_DB_PASS}
      - MARIADB_AUTO_UPGRADE=1
    command: "mysqld --innodb-flush-method=fsync"

  redis:
    image: redis:7.4.7-alpine
    <<: *x-logging
    restart: unless-stopped
    command: >
      redis-server
      --maxmemory            512mb
      --maxmemory-policy     allkeys-lru
      --maxmemory-samples    5
    volumes:
      - appwrite-redis:/data:rw

  # clamav:
  #   image: appwrite/clamav:1.2.0
  #   restart: unless-stopped
  #   volumes:
  #     - appwrite-uploads:/storage/uploads

volumes:
  appwrite-mariadb:
  appwrite-mongodb:
  appwrite-mongodb-keyfile:
  appwrite-redis:
  appwrite-cache:
  appwrite-uploads:
  appwrite-imports:
  appwrite-certificates:
  appwrite-functions:
  appwrite-sites:
  appwrite-builds:
  appwrite-config:
[variables]
main_domain = "${domain}"
functions_domain = "functions.${main_domain}"
sites_domain = "sites.${main_domain}"
openssl_key = "${password:32}"
db_root_pw = "${password:32}"
db_user_pw = "${password:32}"
executor_secret = "${password:32}"

[config]
env = [
  "_APP_ENV=production",
  "_APP_EDITION=self-hosted",
  "_APP_LOCALE=en",
  "_APP_POOL_ADAPTER=stack",
  "_APP_WORKER_PER_CORE=6",
  "_APP_OPTIONS_ABUSE=enabled",
  "_APP_OPTIONS_FORCE_HTTPS=disabled",
  "_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled",
  "_APP_OPTIONS_ROUTER_PROTECTION=disabled",
  "_APP_OPENSSL_KEY_V1=${openssl_key}",
  "_APP_DOMAIN=${main_domain}",
  "_APP_CONSOLE_DOMAIN=${main_domain}",
  "_APP_CONSOLE_TRUSTED_PROJECTS=",
  "_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com",
  "_APP_DOMAIN_FUNCTIONS=${functions_domain}",
  "_APP_DOMAIN_SITES=${sites_domain}",
  "_APP_DOMAIN_TARGET_CNAME=localhost",
  "_APP_DOMAIN_TARGET_AAAA=::1",
  "_APP_DOMAIN_TARGET_A=127.0.0.1",
  "_APP_DOMAIN_TARGET_CAA=",
  "_APP_DNS=8.8.8.8",
  "_APP_TRUSTED_HEADERS=x-forwarded-for",
  "_APP_CONSOLE_WHITELIST_ROOT=enabled",
  "_APP_CONSOLE_WHITELIST_EMAILS=",
  "_APP_CONSOLE_WHITELIST_IPS=",
  "_APP_CONSOLE_HOSTNAMES=",
  "_APP_CONSOLE_SCHEMA=appwriteio",
  "_APP_CONSOLE_SESSION_ALERTS=disabled",
  "_APP_CONSOLE_COUNTRIES_DENYLIST=",
  "_APP_SYSTEM_EMAIL_NAME=Appwrite",
  "[email protected]",
  "[email protected]",
  "_APP_SYSTEM_RESPONSE_FORMAT=",
  "_APP_EMAIL_SECURITY=",
  "_APP_EMAIL_CERTIFICATES=",
  "_APP_COMPRESSION_ENABLED=enabled",
  "_APP_COMPRESSION_MIN_SIZE_BYTES=1024",
  "_APP_USAGE_STATS=enabled",
  "_APP_USAGE_AGGREGATION_INTERVAL=30",
  "_APP_STATS_RESOURCES_INTERVAL=30",
  "_APP_LOGGING_PROVIDER=",
  "_APP_LOGGING_CONFIG=",
  "_APP_LOGGING_CONFIG_REALTIME=",
  "_APP_EXPERIMENT_LOGGING_PROVIDER=",
  "_APP_EXPERIMENT_LOGGING_CONFIG=",
  "_APP_REDIS_HOST=redis",
  "_APP_REDIS_PORT=6379",
  "_APP_REDIS_USER=",
  "_APP_REDIS_PASS=",
  "_APP_DB_ADAPTER=mongodb",
  "_APP_DB_HOST=mongodb",
  "_APP_DB_PORT=27017",
  "_APP_DB_SCHEMA=appwrite",
  "_APP_DB_USER=user",
  "_APP_DB_PASS=${db_user_pw}",
  "_APP_DB_ROOT_PASS=${db_root_pw}",
  "_APP_DATABASE_SHARED_TABLES=",
  "_APP_DATABASE_SHARED_NAMESPACE=",
  "_APP_DB_ADAPTER_VECTORSDB=",
  "_APP_DB_HOST_VECTORSDB=",
  "_APP_DB_PORT_VECTORSDB=",
  "_APP_DB_SCHEMA_VECTORSDB=",
  "_APP_DB_USER_VECTORSDB=",
  "_APP_DB_PASS_VECTORSDB=",
  "_APP_SMTP_HOST=",
  "_APP_SMTP_PORT=",
  "_APP_SMTP_SECURE=",
  "_APP_SMTP_USERNAME=",
  "_APP_SMTP_PASSWORD=",
  "_APP_SMS_PROVIDER=",
  "_APP_SMS_FROM=",
  "_APP_SMS_PROJECTS_DENY_LIST=",
  "_APP_STORAGE_LIMIT=30000000",
  "_APP_STORAGE_PREVIEW_LIMIT=20000000",
  "_APP_STORAGE_ANTIVIRUS=disabled",
  "_APP_STORAGE_ANTIVIRUS_HOST=clamav",
  "_APP_STORAGE_ANTIVIRUS_PORT=3310",
  "_APP_STORAGE_DEVICE=local",
  "_APP_STORAGE_S3_ACCESS_KEY=",
  "_APP_STORAGE_S3_SECRET=",
  "_APP_STORAGE_S3_REGION=us-east-1",
  "_APP_STORAGE_S3_BUCKET=",
  "_APP_STORAGE_S3_ENDPOINT=",
  "_APP_STORAGE_DO_SPACES_ACCESS_KEY=",
  "_APP_STORAGE_DO_SPACES_SECRET=",
  "_APP_STORAGE_DO_SPACES_REGION=us-east-1",
  "_APP_STORAGE_DO_SPACES_BUCKET=",
  "_APP_STORAGE_BACKBLAZE_ACCESS_KEY=",
  "_APP_STORAGE_BACKBLAZE_SECRET=",
  "_APP_STORAGE_BACKBLAZE_REGION=us-west-004",
  "_APP_STORAGE_BACKBLAZE_BUCKET=",
  "_APP_STORAGE_LINODE_ACCESS_KEY=",
  "_APP_STORAGE_LINODE_SECRET=",
  "_APP_STORAGE_LINODE_REGION=eu-central-1",
  "_APP_STORAGE_LINODE_BUCKET=",
  "_APP_STORAGE_WASABI_ACCESS_KEY=",
  "_APP_STORAGE_WASABI_SECRET=",
  "_APP_STORAGE_WASABI_REGION=eu-central-1",
  "_APP_STORAGE_WASABI_BUCKET=",
  "_APP_COMPUTE_SIZE_LIMIT=30000000",
  "_APP_COMPUTE_BUILD_TIMEOUT=900",
  "_APP_COMPUTE_CPUS=0",
  "_APP_COMPUTE_MEMORY=0",
  "_APP_COMPUTE_INACTIVE_THRESHOLD=60",
  "_APP_COMPUTE_MAINTENANCE_INTERVAL=3600",
  "_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network",
  "_APP_FUNCTIONS_TIMEOUT=900",
  "_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000",
  "_APP_FUNCTIONS_RUNTIMES=node-22,python-3.12,php-8.3,ruby-3.3,dart-3.5,go-1.23,rust-1.83,bun-1.1,deno-1.46,java-21.0,dotnet-8.0",
  "_APP_SITES_TIMEOUT=900",
  "_APP_SITES_RUNTIMES=static-1,node-22",
  "_APP_EXECUTOR_SECRET=${executor_secret}",
  "_APP_EXECUTOR_HOST=http://openruntimes-executor/v1",
  "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/python:v5-3.12,openruntimes/php:v5-8.3,openruntimes/static:v5-1",
  "_APP_OPEN_RUNTIMES_NFT=enabled",
  "_APP_BROWSER_HOST=http://appwrite-browser:3000/v1",
  "_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite",
  "_APP_DOCKER_HUB_USERNAME=",
  "_APP_DOCKER_HUB_PASSWORD=",
  "_APP_MAINTENANCE_INTERVAL=86400",
  "_APP_MAINTENANCE_START_TIME=00:00",
  "_APP_MAINTENANCE_RETENTION_CACHE=2592000",
  "_APP_MAINTENANCE_RETENTION_EXECUTION=1209600",
  "_APP_MAINTENANCE_RETENTION_AUDIT=1209600",
  "_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=15778800",
  "_APP_MAINTENANCE_RETENTION_ABUSE=86400",
  "_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000",
  "_APP_MAINTENANCE_RETENTION_SCHEDULES=86400",
  "_APP_INTERVAL_DOMAIN_VERIFICATION=120",
  "_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=300",
  "_APP_GRAPHQL_INTROSPECTION=enabled",
  "_APP_GRAPHQL_MAX_BATCH_SIZE=10",
  "_APP_GRAPHQL_MAX_COMPLEXITY=250",
  "_APP_GRAPHQL_MAX_DEPTH=4",
  "_APP_WEBHOOK_MAX_FAILED_ATTEMPTS=10",
  "_APP_VCS_GITHUB_APP_NAME=",
  "_APP_VCS_GITHUB_PRIVATE_KEY=",
  "_APP_VCS_GITHUB_APP_ID=",
  "_APP_VCS_GITHUB_CLIENT_ID=",
  "_APP_VCS_GITHUB_CLIENT_SECRET=",
  "_APP_VCS_GITHUB_WEBHOOK_SECRET=",
  "_APP_MIGRATION_HOST=appwrite",
  "_APP_MIGRATIONS_FIREBASE_CLIENT_ID=",
  "_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=",
  "_APP_ASSISTANT_OPENAI_API_KEY=",
]

[[config.mounts]]
filePath = "mongo-init.js"
content = """// mongo-init.js

// Switch to the admin database
const adminDb = db.getSiblingDB('admin');

// Get username and password from environment variables
const username = process.env.MONGO_INITDB_USERNAME;
const password = process.env.MONGO_INITDB_PASSWORD;
const database = process.env.MONGO_INITDB_DATABASE;

// Create the user
adminDb.createUser({
  user: username,
  pwd: password,
  roles: [
    { role: 'readWrite', db: database }
  ]
});
"""

[[config.mounts]]
filePath = "mongo-entrypoint.sh"
content = """#!/bin/bash
set -e

# Fix keyfile permissions if mounted from volume
KEYFILE_PATH="/data/keyfile/mongo-keyfile"

if [ ! -f "$KEYFILE_PATH" ]; then
  echo "Generating random MongoDB keyfile..."
  mkdir -p /data/keyfile
  openssl rand -base64 756 > "$KEYFILE_PATH"
fi

chmod 400 "$KEYFILE_PATH"
chown mongodb:mongodb "$KEYFILE_PATH" 2>/dev/null || chown 999:999 "$KEYFILE_PATH"

# Use MongoDB's standard entrypoint with our command
exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH"
"""

[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${main_domain}"
path = "/"

[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${sites_domain}"
path = "/"

[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${functions_domain}"
path = "/"

[[config.domains]]
serviceName = "appwrite-console"
port = 80
host = "${main_domain}"
path = "/console"

[[config.domains]]
serviceName = "appwrite-realtime"
port = 80
host = "${main_domain}"
path = "/v1/realtime"

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInZlcnNpb246IFwiMy44XCJcblxueC1sb2dnaW5nOiAmeC1sb2dnaW5nXG4gIGxvZ2dpbmc6XG4gICAgZHJpdmVyOiBcImpzb24tZmlsZVwiXG4gICAgb3B0aW9uczpcbiAgICAgIG1heC1maWxlOiBcIjVcIlxuICAgICAgbWF4LXNpemU6IFwiMTBtXCJcbnNlcnZpY2VzOlxuICBhcHB3cml0ZTpcbiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS45LjVcbiAgICA8PDogKngtbG9nZ2luZ1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgbGFiZWxzOlxuICAgICAgLSB0cmFlZmlrLmVuYWJsZT10cnVlXG4gICAgICAtIHRyYWVmaWsuY29uc3RyYWludC1sYWJlbC1zdGFjaz1hcHB3cml0ZVxuICAgICAgLSAndHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGUtc2l0ZXMtd2lsZGNhcmQucnVsZT1Ib3N0UmVnZXhwKGBeLitcXC4ke19BUFBfRE9NQUlOX1NJVEVTfSQkYCknXG4gICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlLXNpdGVzLXdpbGRjYXJkLmVudHJ5cG9pbnRzPXdlYlxuICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZS1zaXRlcy13aWxkY2FyZC5zZXJ2aWNlPWFwcHdyaXRlLXdpbGRjYXJkXG4gICAgICAtICd0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZS1zaXRlcy13aWxkY2FyZC1zZWN1cmUucnVsZT1Ib3N0UmVnZXhwKGBeLitcXC4ke19BUFBfRE9NQUlOX1NJVEVTfSQkYCknXG4gICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlLXNpdGVzLXdpbGRjYXJkLXNlY3VyZS5lbnRyeXBvaW50cz13ZWJzZWN1cmVcbiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGUtc2l0ZXMtd2lsZGNhcmQtc2VjdXJlLnRscz10cnVlXG4gICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlLXNpdGVzLXdpbGRjYXJkLXNlY3VyZS5zZXJ2aWNlPWFwcHdyaXRlLXdpbGRjYXJkXG4gICAgICAtICd0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZS1mdW5jdGlvbnMtd2lsZGNhcmQucnVsZT1Ib3N0UmVnZXhwKGBeLitcXC4ke19BUFBfRE9NQUlOX0ZVTkNUSU9OU30kJGApJ1xuICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZS1mdW5jdGlvbnMtd2lsZGNhcmQuZW50cnlwb2ludHM9d2ViXG4gICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlLWZ1bmN0aW9ucy13aWxkY2FyZC5zZXJ2aWNlPWFwcHdyaXRlLXdpbGRjYXJkXG4gICAgICAtICd0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZS1mdW5jdGlvbnMtd2lsZGNhcmQtc2VjdXJlLnJ1bGU9SG9zdFJlZ2V4cChgXi4rXFwuJHtfQVBQX0RPTUFJTl9GVU5DVElPTlN9JCRgKSdcbiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGUtZnVuY3Rpb25zLXdpbGRjYXJkLXNlY3VyZS5lbnRyeXBvaW50cz13ZWJzZWN1cmVcbiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGUtZnVuY3Rpb25zLXdpbGRjYXJkLXNlY3VyZS50bHM9dHJ1ZVxuICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZS1mdW5jdGlvbnMtd2lsZGNhcmQtc2VjdXJlLnNlcnZpY2U9YXBwd3JpdGUtd2lsZGNhcmRcbiAgICAgIC0gdHJhZWZpay5odHRwLnNlcnZpY2VzLmFwcHdyaXRlLXdpbGRjYXJkLmxvYWRiYWxhbmNlci5zZXJ2ZXIucG9ydD04MFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDpcbiAgICAgICAgLSBDTURcbiAgICAgICAgLSBkb2N0b3JcbiAgICAgIGludGVydmFsOiA1c1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDEyXG4gICAgdm9sdW1lczpcbiAgICAgIC0gYXBwd3JpdGUtdXBsb2Fkczovc3RvcmFnZS91cGxvYWRzOnJ3XG4gICAgICAtIGFwcHdyaXRlLWltcG9ydHM6L3N0b3JhZ2UvaW1wb3J0czpyd1xuICAgICAgLSBhcHB3cml0ZS1jYWNoZTovc3RvcmFnZS9jYWNoZTpyd1xuICAgICAgLSBhcHB3cml0ZS1jb25maWc6L3N0b3JhZ2UvY29uZmlnOnJ3XG4gICAgICAtIGFwcHdyaXRlLWNlcnRpZmljYXRlczovc3RvcmFnZS9jZXJ0aWZpY2F0ZXM6cndcbiAgICAgIC0gYXBwd3JpdGUtZnVuY3Rpb25zOi9zdG9yYWdlL2Z1bmN0aW9uczpyd1xuICAgICAgLSBhcHB3cml0ZS1zaXRlczovc3RvcmFnZS9zaXRlczpyd1xuICAgICAgLSBhcHB3cml0ZS1idWlsZHM6L3N0b3JhZ2UvYnVpbGRzOnJ3XG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gcmVkaXNcbiAgICAgIC0gJHtfQVBQX0RCX0hPU1Q6LW1vbmdvZGJ9XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfRURJVElPTlxuICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRVxuICAgICAgLSBfQVBQX1BPT0xfQURBUFRFUlxuICAgICAgLSBfQVBQX0xPQ0FMRVxuICAgICAgLSBfQVBQX0NPTVBSRVNTSU9OX0VOQUJMRURcbiAgICAgIC0gX0FQUF9DT01QUkVTU0lPTl9NSU5fU0laRV9CWVRFU1xuICAgICAgLSBfQVBQX0NPTlNPTEVfV0hJVEVMSVNUX1JPT1RcbiAgICAgIC0gX0FQUF9DT05TT0xFX1dISVRFTElTVF9FTUFJTFNcbiAgICAgIC0gX0FQUF9DT05TT0xFX1NFU1NJT05fQUxFUlRTXG4gICAgICAtIF9BUFBfQ09OU09MRV9XSElURUxJU1RfSVBTXG4gICAgICAtIF9BUFBfQ09OU09MRV9IT1NUTkFNRVNcbiAgICAgIC0gX0FQUF9DT05TT0xFX1NDSEVNQVxuICAgICAgLSBfQVBQX1NZU1RFTV9FTUFJTF9OQU1FXG4gICAgICAtIF9BUFBfU1lTVEVNX0VNQUlMX0FERFJFU1NcbiAgICAgIC0gX0FQUF9TWVNURU1fVEVBTV9FTUFJTFxuICAgICAgLSBfQVBQX0VNQUlMX1NFQ1VSSVRZXG4gICAgICAtIF9BUFBfU1lTVEVNX1JFU1BPTlNFX0ZPUk1BVFxuICAgICAgLSBfQVBQX09QVElPTlNfQUJVU0VcbiAgICAgIC0gX0FQUF9PUFRJT05TX1JPVVRFUl9QUk9URUNUSU9OXG4gICAgICAtIF9BUFBfT1BUSU9OU19GT1JDRV9IVFRQU1xuICAgICAgLSBfQVBQX09QVElPTlNfUk9VVEVSX0ZPUkNFX0hUVFBTXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9ET01BSU5cbiAgICAgIC0gX0FQUF9DT05TT0xFX0RPTUFJTlxuICAgICAgLSBfQVBQX0NPTlNPTEVfVFJVU1RFRF9QUk9KRUNUU1xuICAgICAgLSBfQVBQX0RPTUFJTl9UQVJHRVRfQ05BTUVcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0FBQUFcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0FcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0NBQVxuICAgICAgLSBfQVBQX0ROU1xuICAgICAgLSBfQVBQX0RPTUFJTl9GVU5DVElPTlNcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSX1ZFQ1RPUlNEQlxuICAgICAgLSBfQVBQX0RCX0hPU1RfVkVDVE9SU0RCXG4gICAgICAtIF9BUFBfREJfUE9SVF9WRUNUT1JTREJcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFfVkVDVE9SU0RCXG4gICAgICAtIF9BUFBfREJfVVNFUl9WRUNUT1JTREJcbiAgICAgIC0gX0FQUF9EQl9QQVNTX1ZFQ1RPUlNEQlxuICAgICAgLSBfQVBQX1NNVFBfSE9TVFxuICAgICAgLSBfQVBQX1NNVFBfUE9SVFxuICAgICAgLSBfQVBQX1NNVFBfU0VDVVJFXG4gICAgICAtIF9BUFBfU01UUF9VU0VSTkFNRVxuICAgICAgLSBfQVBQX1NNVFBfUEFTU1dPUkRcbiAgICAgIC0gX0FQUF9VU0FHRV9TVEFUU1xuICAgICAgLSBfQVBQX1NUT1JBR0VfTElNSVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1BSRVZJRVdfTElNSVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0FOVElWSVJVU1xuICAgICAgLSBfQVBQX1NUT1JBR0VfQU5USVZJUlVTX0hPU1RcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0FOVElWSVJVU19QT1JUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ERVZJQ0VcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9TM19CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0VORFBPSU5UXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0JVQ0tFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9TRUNSRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9SRUdJT05cbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX0JVQ0tFVFxuICAgICAgLSBfQVBQX0NPTVBVVEVfU0laRV9MSU1JVFxuICAgICAgLSBfQVBQX0ZVTkNUSU9OU19USU1FT1VUXG4gICAgICAtIF9BUFBfU0lURVNfVElNRU9VVFxuICAgICAgLSBfQVBQX0NPTVBVVEVfQlVJTERfVElNRU9VVFxuICAgICAgLSBfQVBQX0NPTVBVVEVfQ1BVU1xuICAgICAgLSBfQVBQX0NPTVBVVEVfTUVNT1JZXG4gICAgICAtIF9BUFBfRlVOQ1RJT05TX1JVTlRJTUVTXG4gICAgICAtIF9BUFBfU0lURVNfUlVOVElNRVNcbiAgICAgIC0gX0FQUF9ET01BSU5fU0lURVNcbiAgICAgIC0gX0FQUF9FWEVDVVRPUl9TRUNSRVRcbiAgICAgIC0gX0FQUF9FWEVDVVRPUl9IT1NUXG4gICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUdcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9JTlRFUlZBTFxuICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9FWEVDVVRJT05cbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQ0FDSEVcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQUJVU0VcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVRcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVRfQ09OU09MRVxuICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9VU0FHRV9IT1VSTFlcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fU0NIRURVTEVTXG4gICAgICAtIF9BUFBfU01TX1BST1ZJREVSXG4gICAgICAtIF9BUFBfU01TX0ZST01cbiAgICAgIC0gX0FQUF9HUkFQSFFMX0lOVFJPU1BFQ1RJT05cbiAgICAgIC0gX0FQUF9HUkFQSFFMX01BWF9CQVRDSF9TSVpFXG4gICAgICAtIF9BUFBfR1JBUEhRTF9NQVhfQ09NUExFWElUWVxuICAgICAgLSBfQVBQX0dSQVBIUUxfTUFYX0RFUFRIXG4gICAgICAtIF9BUFBfVkNTX0dJVEhVQl9BUFBfTkFNRVxuICAgICAgLSBfQVBQX1ZDU19HSVRIVUJfUFJJVkFURV9LRVlcbiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0FQUF9JRFxuICAgICAgLSBfQVBQX1ZDU19HSVRIVUJfV0VCSE9PS19TRUNSRVRcbiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0NMSUVOVF9TRUNSRVRcbiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0NMSUVOVF9JRFxuICAgICAgLSBfQVBQX01JR1JBVElPTlNfRklSRUJBU0VfQ0xJRU5UX0lEXG4gICAgICAtIF9BUFBfTUlHUkFUSU9OU19GSVJFQkFTRV9DTElFTlRfU0VDUkVUXG4gICAgICAtIF9BUFBfQVNTSVNUQU5UX09QRU5BSV9BUElfS0VZXG4gICAgICAtIF9BUFBfQ09OU09MRV9DT1VOVFJJRVNfREVOWUxJU1RcbiAgICAgIC0gX0FQUF9FWFBFUklNRU5UX0xPR0dJTkdfUFJPVklERVJcbiAgICAgIC0gX0FQUF9FWFBFUklNRU5UX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfREFUQUJBU0VfU0hBUkVEX1RBQkxFU1xuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9OQU1FU1BBQ0VcbiAgICAgIC0gX0FQUF9GVU5DVElPTlNfQ1JFQVRJT05fQUJVU0VfTElNSVRcbiAgICAgIC0gX0FQUF9DVVNUT01fRE9NQUlOX0RFTllfTElTVFxuICAgICAgLSBfQVBQX1RSVVNURURfSEVBREVSU1xuICAgICAgLSBfQVBQX01JR1JBVElPTl9IT1NUXG5cbiAgYXBwd3JpdGUtY29uc29sZTpcbiAgICA8PDogKngtbG9nZ2luZ1xuICAgIGltYWdlOiBhcHB3cml0ZS9jb25zb2xlOjguNy41XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBsYWJlbHM6XG4gICAgICAtIFwidHJhZWZpay5lbmFibGU9dHJ1ZVwiXG4gICAgICAtIFwidHJhZWZpay5jb25zdHJhaW50LWxhYmVsLXN0YWNrPWFwcHdyaXRlXCJcblxuICBhcHB3cml0ZS1yZWFsdGltZTpcbiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS45LjVcbiAgICBlbnRyeXBvaW50OiByZWFsdGltZVxuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBsYWJlbHM6XG4gICAgICAtIFwidHJhZWZpay5lbmFibGU9dHJ1ZVwiXG4gICAgICAtIFwidHJhZWZpay5jb25zdHJhaW50LWxhYmVsLXN0YWNrPWFwcHdyaXRlXCJcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICAgIC0gcmVkaXNcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9PUFRJT05TX0FCVVNFXG4gICAgICAtIF9BUFBfT1BUSU9OU19ST1VURVJfUFJPVEVDVElPTlxuICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxXG4gICAgICAtIF9BUFBfUkVESVNfSE9TVFxuICAgICAgLSBfQVBQX1JFRElTX1BPUlRcbiAgICAgIC0gX0FQUF9SRURJU19VU0VSXG4gICAgICAtIF9BUFBfUkVESVNfUEFTU1xuICAgICAgLSBfQVBQX0RCX0FEQVBURVJcbiAgICAgIC0gX0FQUF9EQl9IT1NUXG4gICAgICAtIF9BUFBfREJfUE9SVFxuICAgICAgLSBfQVBQX0RCX1NDSEVNQVxuICAgICAgLSBfQVBQX0RCX1VTRVJcbiAgICAgIC0gX0FQUF9EQl9QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUl9WRUNUT1JTREJcbiAgICAgIC0gX0FQUF9EQl9IT1NUX1ZFQ1RPUlNEQlxuICAgICAgLSBfQVBQX0RCX1BPUlRfVkVDVE9SU0RCXG4gICAgICAtIF9BUFBfREJfU0NIRU1BX1ZFQ1RPUlNEQlxuICAgICAgLSBfQVBQX0RCX1VTRVJfVkVDVE9SU0RCXG4gICAgICAtIF9BUFBfREJfUEFTU19WRUNUT1JTREJcbiAgICAgIC0gX0FQUF9VU0FHRV9TVEFUU1xuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUdfUkVBTFRJTUVcbiAgICAgIC0gX0FQUF9EQVRBQkFTRV9TSEFSRURfVEFCTEVTXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSPXN3b29sZVxuXG4gIGFwcHdyaXRlLXdvcmtlci1hdWRpdHM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogd29ya2VyLWF1ZGl0c1xuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSByZWRpc1xuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJTX05VTT0xXG4gICAgICAtIF9BUFBfV09SS0VSX01BWF9DT1JPVVRJTkVTPTFcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfREFUQUJBU0VfU0hBUkVEX1RBQkxFU1xuXG4gIGFwcHdyaXRlLXdvcmtlci13ZWJob29rczpcbiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS45LjVcbiAgICBlbnRyeXBvaW50OiB3b3JrZXItd2ViaG9va3NcbiAgICA8PDogKngtbG9nZ2luZ1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gcmVkaXNcbiAgICAgIC0gJHtfQVBQX0RCX0hPU1Q6LW1vbmdvZGJ9XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfV09SS0VSU19OVU09MVxuICAgICAgLSBfQVBQX1dPUktFUl9NQVhfQ09ST1VUSU5FUz04XG4gICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9FTUFJTF9TRUNVUklUWVxuICAgICAgLSBfQVBQX0RCX0FEQVBURVJcbiAgICAgIC0gX0FQUF9EQl9IT1NUXG4gICAgICAtIF9BUFBfREJfUE9SVFxuICAgICAgLSBfQVBQX0RCX1NDSEVNQVxuICAgICAgLSBfQVBQX0RCX1VTRVJcbiAgICAgIC0gX0FQUF9EQl9QQVNTXG4gICAgICAtIF9BUFBfUkVESVNfSE9TVFxuICAgICAgLSBfQVBQX1JFRElTX1BPUlRcbiAgICAgIC0gX0FQUF9SRURJU19VU0VSXG4gICAgICAtIF9BUFBfUkVESVNfUEFTU1xuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfV0VCSE9PS19NQVhfRkFJTEVEX0FUVEVNUFRTXG4gICAgICAtIF9BUFBfREFUQUJBU0VfU0hBUkVEX1RBQkxFU1xuXG4gIGFwcHdyaXRlLXdvcmtlci1kZWxldGVzOlxuICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjkuNVxuICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1kZWxldGVzXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtIHJlZGlzXG4gICAgICAtICR7X0FQUF9EQl9IT1NUOi1tb25nb2RifVxuICAgIHZvbHVtZXM6XG4gICAgICAtIGFwcHdyaXRlLXVwbG9hZHM6L3N0b3JhZ2UvdXBsb2Fkczpyd1xuICAgICAgLSBhcHB3cml0ZS1jYWNoZTovc3RvcmFnZS9jYWNoZTpyd1xuICAgICAgLSBhcHB3cml0ZS1mdW5jdGlvbnM6L3N0b3JhZ2UvZnVuY3Rpb25zOnJ3XG4gICAgICAtIGFwcHdyaXRlLXNpdGVzOi9zdG9yYWdlL3NpdGVzOnJ3XG4gICAgICAtIGFwcHdyaXRlLWJ1aWxkczovc3RvcmFnZS9idWlsZHM6cndcbiAgICAgIC0gYXBwd3JpdGUtY2VydGlmaWNhdGVzOi9zdG9yYWdlL2NlcnRpZmljYXRlczpyd1xuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBfQVBQX0VOVlxuICAgICAgLSBfQVBQX1dPUktFUlNfTlVNPTFcbiAgICAgIC0gX0FQUF9XT1JLRVJfTUFYX0NPUk9VVElORVM9OFxuICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRVxuICAgICAgLSBfQVBQX1BPT0xfQURBUFRFUlxuICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxXG4gICAgICAtIF9BUFBfUkVESVNfSE9TVFxuICAgICAgLSBfQVBQX1JFRElTX1BPUlRcbiAgICAgIC0gX0FQUF9SRURJU19VU0VSXG4gICAgICAtIF9BUFBfUkVESVNfUEFTU1xuICAgICAgLSBfQVBQX0RCX0FEQVBURVJcbiAgICAgIC0gX0FQUF9EQl9IT1NUXG4gICAgICAtIF9BUFBfREJfUE9SVFxuICAgICAgLSBfQVBQX0RCX1NDSEVNQVxuICAgICAgLSBfQVBQX0RCX1VTRVJcbiAgICAgIC0gX0FQUF9EQl9QQVNTXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ERVZJQ0VcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9TM19CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0VORFBPSU5UXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0JVQ0tFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9TRUNSRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9SRUdJT05cbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX0JVQ0tFVFxuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfRVhFQ1VUT1JfU0VDUkVUXG4gICAgICAtIF9BUFBfRVhFQ1VUT1JfSE9TVFxuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcbiAgICAgIC0gX0FQUF9FTUFJTF9DRVJUSUZJQ0FURVNcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVRcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVRfQ09OU09MRVxuXG4gIGFwcHdyaXRlLXdvcmtlci1kYXRhYmFzZXM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogd29ya2VyLWRhdGFiYXNlc1xuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSByZWRpc1xuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJTX05VTT0xXG4gICAgICAtIF9BUFBfV09SS0VSX01BWF9DT1JPVVRJTkVTPTFcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX0RCX0FEQVBURVJfVkVDVE9SU0RCXG4gICAgICAtIF9BUFBfREJfSE9TVF9WRUNUT1JTREJcbiAgICAgIC0gX0FQUF9EQl9QT1JUX1ZFQ1RPUlNEQlxuICAgICAgLSBfQVBQX0RCX1NDSEVNQV9WRUNUT1JTREJcbiAgICAgIC0gX0FQUF9EQl9VU0VSX1ZFQ1RPUlNEQlxuICAgICAgLSBfQVBQX0RCX1BBU1NfVkVDVE9SU0RCXG4gICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUdcbiAgICAgIC0gX0FQUF9RVUVVRV9OQU1FXG4gICAgICAtIF9BUFBfREFUQUJBU0VfU0hBUkVEX1RBQkxFU1xuXG4gIGFwcHdyaXRlLXdvcmtlci1idWlsZHM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogd29ya2VyLWJ1aWxkc1xuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSByZWRpc1xuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICB2b2x1bWVzOlxuICAgICAgLSBhcHB3cml0ZS1mdW5jdGlvbnM6L3N0b3JhZ2UvZnVuY3Rpb25zOnJ3XG4gICAgICAtIGFwcHdyaXRlLXNpdGVzOi9zdG9yYWdlL3NpdGVzOnJ3XG4gICAgICAtIGFwcHdyaXRlLWJ1aWxkczovc3RvcmFnZS9idWlsZHM6cndcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJTX05VTT0xXG4gICAgICAtIF9BUFBfV09SS0VSX01BWF9DT1JPVVRJTkVTPThcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX0VYRUNVVE9SX1NFQ1JFVFxuICAgICAgLSBfQVBQX0VYRUNVVE9SX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9MT0dHSU5HX0NPTkZJR1xuICAgICAgLSBfQVBQX1ZDU19HSVRIVUJfQVBQX05BTUVcbiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX1BSSVZBVEVfS0VZXG4gICAgICAtIF9BUFBfVkNTX0dJVEhVQl9BUFBfSURcbiAgICAgIC0gX0FQUF9GVU5DVElPTlNfVElNRU9VVFxuICAgICAgLSBfQVBQX1NJVEVTX1RJTUVPVVRcbiAgICAgIC0gX0FQUF9DT01QVVRFX0JVSUxEX1RJTUVPVVRcbiAgICAgIC0gX0FQUF9DT01QVVRFX0NQVVNcbiAgICAgIC0gX0FQUF9DT01QVVRFX01FTU9SWVxuICAgICAgLSBfQVBQX09QRU5fUlVOVElNRVNfTkZUXG4gICAgICAtIF9BUFBfQ09NUFVURV9TSVpFX0xJTUlUXG4gICAgICAtIF9BUFBfT1BUSU9OU19GT1JDRV9IVFRQU1xuICAgICAgLSBfQVBQX09QVElPTlNfUk9VVEVSX0ZPUkNFX0hUVFBTXG4gICAgICAtIF9BUFBfRE9NQUlOXG4gICAgICAtIF9BUFBfQ09OU09MRV9ET01BSU5cbiAgICAgIC0gX0FQUF9DT05TT0xFX1RSVVNURURfUFJPSkVDVFNcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0RFVklDRVxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9TM19SRUdJT05cbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0JVQ0tFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfRU5EUE9JTlRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19BQ0NFU1NfS0VZXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQlVDS0VUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0JVQ0tFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfTElOT0RFX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9TRUNSRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9SRUdJT05cbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1dBU0FCSV9BQ0NFU1NfS0VZXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfQlVDS0VUXG4gICAgICAtIF9BUFBfREFUQUJBU0VfU0hBUkVEX1RBQkxFU1xuICAgICAgLSBfQVBQX0RPTUFJTl9TSVRFU1xuICAgIGV4dHJhX2hvc3RzOlxuICAgICAgLSBob3N0LmRvY2tlci5pbnRlcm5hbDpob3N0LWdhdGV3YXlcblxuICBhcHB3cml0ZS13b3JrZXItc2NyZWVuc2hvdHM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogd29ya2VyLXNjcmVlbnNob3RzXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtIHJlZGlzXG4gICAgICAtICR7X0FQUF9EQl9IT1NUOi1tb25nb2RifVxuICAgIHZvbHVtZXM6XG4gICAgICAtIGFwcHdyaXRlLXVwbG9hZHM6L3N0b3JhZ2UvdXBsb2Fkczpyd1xuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBfQVBQX0JST1dTRVJfSE9TVFxuICAgICAgLSBfQVBQX1dPUktFUl9TQ1JFRU5TSE9UU19ST1VURVJcbiAgICAgIC0gX0FQUF9PUFRJT05TX0ZPUkNFX0hUVFBTXG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfV09SS0VSU19OVU09MVxuICAgICAgLSBfQVBQX1dPUktFUl9NQVhfQ09ST1VUSU5FUz04XG4gICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSXG4gICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUdcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0RFVklDRVxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9TM19SRUdJT05cbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0JVQ0tFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfRU5EUE9JTlRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19BQ0NFU1NfS0VZXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQlVDS0VUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0JVQ0tFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfTElOT0RFX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9TRUNSRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9SRUdJT05cbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1dBU0FCSV9BQ0NFU1NfS0VZXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfQlVDS0VUXG4gICAgZXh0cmFfaG9zdHM6XG4gICAgICAtIGhvc3QuZG9ja2VyLmludGVybmFsOmhvc3QtZ2F0ZXdheVxuXG4gIGFwcHdyaXRlLXdvcmtlci1jZXJ0aWZpY2F0ZXM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogd29ya2VyLWNlcnRpZmljYXRlc1xuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSByZWRpc1xuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICB2b2x1bWVzOlxuICAgICAgLSBhcHB3cml0ZS1jb25maWc6L3N0b3JhZ2UvY29uZmlnOnJ3XG4gICAgICAtIGFwcHdyaXRlLWNlcnRpZmljYXRlczovc3RvcmFnZS9jZXJ0aWZpY2F0ZXM6cndcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJTX05VTT0xXG4gICAgICAtIF9BUFBfV09SS0VSX01BWF9DT1JPVVRJTkVTPThcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX0RPTUFJTlxuICAgICAgLSBfQVBQX0RPTUFJTl9UQVJHRVRfQ05BTUVcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0FBQUFcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0FcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0NBQVxuICAgICAgLSBfQVBQX0ROU1xuICAgICAgLSBfQVBQX0RPTUFJTl9GVU5DVElPTlNcbiAgICAgIC0gX0FQUF9ET01BSU5fU0lURVNcbiAgICAgIC0gX0FQUF9FTUFJTF9DRVJUSUZJQ0FURVNcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9MT0dHSU5HX0NPTkZJR1xuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcblxuICBhcHB3cml0ZS13b3JrZXItZXhlY3V0aW9uczpcbiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS45LjVcbiAgICBlbnRyeXBvaW50OiB3b3JrZXItZXhlY3V0aW9uc1xuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSByZWRpc1xuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJTX05VTT0xXG4gICAgICAtIF9BUFBfV09SS0VSX01BWF9DT1JPVVRJTkVTPThcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfREFUQUJBU0VfU0hBUkVEX1RBQkxFU1xuXG4gIGFwcHdyaXRlLXdvcmtlci1mdW5jdGlvbnM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogd29ya2VyLWZ1bmN0aW9uc1xuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICAgIC0gcmVkaXNcbiAgICAgIC0gb3BlbnJ1bnRpbWVzLWV4ZWN1dG9yXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfV09SS0VSU19OVU09MVxuICAgICAgLSBfQVBQX1dPUktFUl9NQVhfQ09ST1VUSU5FUz04XG4gICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9ET01BSU5cbiAgICAgIC0gX0FQUF9PUFRJT05TX0ZPUkNFX0hUVFBTXG4gICAgICAtIF9BUFBfUkVESVNfSE9TVFxuICAgICAgLSBfQVBQX1JFRElTX1BPUlRcbiAgICAgIC0gX0FQUF9SRURJU19VU0VSXG4gICAgICAtIF9BUFBfUkVESVNfUEFTU1xuICAgICAgLSBfQVBQX0RCX0FEQVBURVJcbiAgICAgIC0gX0FQUF9EQl9IT1NUXG4gICAgICAtIF9BUFBfREJfUE9SVFxuICAgICAgLSBfQVBQX0RCX1NDSEVNQVxuICAgICAgLSBfQVBQX0RCX1VTRVJcbiAgICAgIC0gX0FQUF9EQl9QQVNTXG4gICAgICAtIF9BUFBfRlVOQ1RJT05TX1RJTUVPVVRcbiAgICAgIC0gX0FQUF9TSVRFU19USU1FT1VUXG4gICAgICAtIF9BUFBfQ09NUFVURV9CVUlMRF9USU1FT1VUXG4gICAgICAtIF9BUFBfQ09NUFVURV9DUFVTXG4gICAgICAtIF9BUFBfQ09NUFVURV9NRU1PUllcbiAgICAgIC0gX0FQUF9FWEVDVVRPUl9TRUNSRVRcbiAgICAgIC0gX0FQUF9FWEVDVVRPUl9IT1NUXG4gICAgICAtIF9BUFBfVVNBR0VfU1RBVFNcbiAgICAgIC0gX0FQUF9ET0NLRVJfSFVCX1VTRVJOQU1FXG4gICAgICAtIF9BUFBfRE9DS0VSX0hVQl9QQVNTV09SRFxuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfTE9HR0lOR19QUk9WSURFUlxuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcblxuICBhcHB3cml0ZS13b3JrZXItbWFpbHM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogd29ya2VyLW1haWxzXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtIHJlZGlzXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfV09SS0VSU19OVU09MVxuICAgICAgLSBfQVBQX1dPUktFUl9NQVhfQ09ST1VUSU5FUz0xXG4gICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9TWVNURU1fRU1BSUxfTkFNRVxuICAgICAgLSBfQVBQX1NZU1RFTV9FTUFJTF9BRERSRVNTXG4gICAgICAtIF9BUFBfUkVESVNfSE9TVFxuICAgICAgLSBfQVBQX1JFRElTX1BPUlRcbiAgICAgIC0gX0FQUF9SRURJU19VU0VSXG4gICAgICAtIF9BUFBfUkVESVNfUEFTU1xuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfU01UUF9IT1NUXG4gICAgICAtIF9BUFBfU01UUF9QT1JUXG4gICAgICAtIF9BUFBfU01UUF9TRUNVUkVcbiAgICAgIC0gX0FQUF9TTVRQX1VTRVJOQU1FXG4gICAgICAtIF9BUFBfU01UUF9QQVNTV09SRFxuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfRE9NQUlOXG4gICAgICAtIF9BUFBfT1BUSU9OU19GT1JDRV9IVFRQU1xuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcblxuICBhcHB3cml0ZS13b3JrZXItbWVzc2FnaW5nOlxuICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjkuNVxuICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1tZXNzYWdpbmdcbiAgICA8PDogKngtbG9nZ2luZ1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgdm9sdW1lczpcbiAgICAgIC0gYXBwd3JpdGUtdXBsb2Fkczovc3RvcmFnZS91cGxvYWRzOnJ3XG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gcmVkaXNcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJTX05VTT0xXG4gICAgICAtIF9BUFBfV09SS0VSX01BWF9DT1JPVVRJTkVTPTFcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfU01TX0ZST01cbiAgICAgIC0gX0FQUF9TTVNfUFJPVklERVJcbiAgICAgIC0gX0FQUF9TTVNfUFJPSkVDVFNfREVOWV9MSVNUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ERVZJQ0VcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9TM19CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0VORFBPSU5UXG4gICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0JVQ0tFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0FDQ0VTU19LRVlcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9TRUNSRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9SRUdJT05cbiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVRcbiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfU0VDUkVUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfUkVHSU9OXG4gICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUXG4gICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfQUNDRVNTX0tFWVxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1NFQ1JFVFxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTlxuICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX0JVQ0tFVFxuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcblxuICBhcHB3cml0ZS13b3JrZXItbWlncmF0aW9uczpcbiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS45LjVcbiAgICBlbnRyeXBvaW50OiB3b3JrZXItbWlncmF0aW9uc1xuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICB2b2x1bWVzOlxuICAgICAgLSBhcHB3cml0ZS1pbXBvcnRzOi9zdG9yYWdlL2ltcG9ydHM6cndcbiAgICAgIC0gYXBwd3JpdGUtdXBsb2Fkczovc3RvcmFnZS91cGxvYWRzOnJ3XG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gJHtfQVBQX0RCX0hPU1Q6LW1vbmdvZGJ9XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfV09SS0VSU19OVU09MVxuICAgICAgLSBfQVBQX1dPUktFUl9NQVhfQ09ST1VUSU5FUz0xXG4gICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9ET01BSU5cbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0NOQU1FXG4gICAgICAtIF9BUFBfRE9NQUlOX1RBUkdFVF9BQUFBXG4gICAgICAtIF9BUFBfRE9NQUlOX1RBUkdFVF9BXG4gICAgICAtIF9BUFBfRE9NQUlOX1RBUkdFVF9DQUFcbiAgICAgIC0gX0FQUF9ETlNcbiAgICAgIC0gX0FQUF9FTUFJTF9TRUNVUklUWVxuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfTUlHUkFUSU9OU19GSVJFQkFTRV9DTElFTlRfSURcbiAgICAgIC0gX0FQUF9NSUdSQVRJT05TX0ZJUkVCQVNFX0NMSUVOVF9TRUNSRVRcbiAgICAgIC0gX0FQUF9EQVRBQkFTRV9TSEFSRURfVEFCTEVTXG4gICAgICAtIF9BUFBfT1BUSU9OU19GT1JDRV9IVFRQU1xuICAgICAgLSBfQVBQX01JR1JBVElPTl9IT1NUXG5cbiAgYXBwd3JpdGUtdGFzay1tYWludGVuYW5jZTpcbiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS45LjVcbiAgICBlbnRyeXBvaW50OiBtYWludGVuYW5jZVxuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICAgIC0gcmVkaXNcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9ET01BSU5cbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0NOQU1FXG4gICAgICAtIF9BUFBfRE9NQUlOX1RBUkdFVF9BQUFBXG4gICAgICAtIF9BUFBfRE9NQUlOX1RBUkdFVF9BXG4gICAgICAtIF9BUFBfRE9NQUlOX1RBUkdFVF9DQUFcbiAgICAgIC0gX0FQUF9ETlNcbiAgICAgIC0gX0FQUF9ET01BSU5fRlVOQ1RJT05TXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9JTlRFUlZBTFxuICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9FWEVDVVRJT05cbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQ0FDSEVcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQUJVU0VcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVRcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVRfQ09OU09MRVxuICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9VU0FHRV9IT1VSTFlcbiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fU0NIRURVTEVTXG4gICAgICAtIF9BUFBfTUFJTlRFTkFOQ0VfU1RBUlRfVElNRVxuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcblxuICBhcHB3cml0ZS10YXNrLWludGVydmFsOlxuICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjkuNVxuICAgIGVudHJ5cG9pbnQ6IGludGVydmFsXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtICR7X0FQUF9EQl9IT1NUOi1tb25nb2RifVxuICAgICAgLSByZWRpc1xuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBfQVBQX0VOVlxuICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRVxuICAgICAgLSBfQVBQX1BPT0xfQURBUFRFUlxuICAgICAgLSBfQVBQX0RPTUFJTlxuICAgICAgLSBfQVBQX0RPTUFJTl9UQVJHRVRfQ05BTUVcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0FBQUFcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0FcbiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUX0NBQVxuICAgICAgLSBfQVBQX0ROU1xuICAgICAgLSBfQVBQX0RPTUFJTl9GVU5DVElPTlNcbiAgICAgIC0gX0FQUF9ET01BSU5fU0lURVNcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcbiAgICAgIC0gX0FQUF9JTlRFUlZBTF9ET01BSU5fVkVSSUZJQ0FUSU9OXG4gICAgICAtIF9BUFBfSU5URVJWQUxfQ0xFQU5VUF9TVEFMRV9FWEVDVVRJT05TXG5cbiAgYXBwd3JpdGUtdGFzay1zdGF0cy1yZXNvdXJjZXM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogc3RhdHMtcmVzb3VyY2VzXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtIHJlZGlzXG4gICAgICAtICR7X0FQUF9EQl9IT1NUOi1tb25nb2RifVxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBfQVBQX0VOVlxuICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRVxuICAgICAgLSBfQVBQX1BPT0xfQURBUFRFUlxuICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfVVNBR0VfU1RBVFNcbiAgICAgIC0gX0FQUF9MT0dHSU5HX0NPTkZJR1xuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcbiAgICAgIC0gX0FQUF9TVEFUU19SRVNPVVJDRVNfSU5URVJWQUxcblxuICBhcHB3cml0ZS13b3JrZXItc3RhdHMtcmVzb3VyY2VzOlxuICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjkuNVxuICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1zdGF0cy1yZXNvdXJjZXNcbiAgICA8PDogKngtbG9nZ2luZ1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gcmVkaXNcbiAgICAgIC0gJHtfQVBQX0RCX0hPU1Q6LW1vbmdvZGJ9XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfV09SS0VSU19OVU09MVxuICAgICAgLSBfQVBQX1dPUktFUl9NQVhfQ09ST1VUSU5FUz0xXG4gICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9EQl9BREFQVEVSXG4gICAgICAtIF9BUFBfREJfSE9TVFxuICAgICAgLSBfQVBQX0RCX1BPUlRcbiAgICAgIC0gX0FQUF9EQl9TQ0hFTUFcbiAgICAgIC0gX0FQUF9EQl9VU0VSXG4gICAgICAtIF9BUFBfREJfUEFTU1xuICAgICAgLSBfQVBQX1JFRElTX0hPU1RcbiAgICAgIC0gX0FQUF9SRURJU19QT1JUXG4gICAgICAtIF9BUFBfUkVESVNfVVNFUlxuICAgICAgLSBfQVBQX1JFRElTX1BBU1NcbiAgICAgIC0gX0FQUF9VU0FHRV9TVEFUU1xuICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHXG4gICAgICAtIF9BUFBfVVNBR0VfQUdHUkVHQVRJT05fSU5URVJWQUxcbiAgICAgIC0gX0FQUF9EQVRBQkFTRV9TSEFSRURfVEFCTEVTXG5cbiAgYXBwd3JpdGUtd29ya2VyLXN0YXRzLXVzYWdlOlxuICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjkuNVxuICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1zdGF0cy11c2FnZVxuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgLSByZWRpc1xuICAgICAgLSAke19BUFBfREJfSE9TVDotbW9uZ29kYn1cbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gX0FQUF9FTlZcbiAgICAgIC0gX0FQUF9XT1JLRVJTX05VTT0xXG4gICAgICAtIF9BUFBfV09SS0VSX01BWF9DT1JPVVRJTkVTPTFcbiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkVcbiAgICAgIC0gX0FQUF9QT09MX0FEQVBURVJcbiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMVxuICAgICAgLSBfQVBQX0RCX0FEQVBURVJcbiAgICAgIC0gX0FQUF9EQl9IT1NUXG4gICAgICAtIF9BUFBfREJfUE9SVFxuICAgICAgLSBfQVBQX0RCX1NDSEVNQVxuICAgICAgLSBfQVBQX0RCX1VTRVJcbiAgICAgIC0gX0FQUF9EQl9QQVNTXG4gICAgICAtIF9BUFBfUkVESVNfSE9TVFxuICAgICAgLSBfQVBQX1JFRElTX1BPUlRcbiAgICAgIC0gX0FQUF9SRURJU19VU0VSXG4gICAgICAtIF9BUFBfUkVESVNfUEFTU1xuICAgICAgLSBfQVBQX1VTQUdFX1NUQVRTXG4gICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUdcbiAgICAgIC0gX0FQUF9VU0FHRV9BR0dSRUdBVElPTl9JTlRFUlZBTFxuICAgICAgLSBfQVBQX0RBVEFCQVNFX1NIQVJFRF9UQUJMRVNcblxuICBhcHB3cml0ZS10YXNrLXNjaGVkdWxlci1mdW5jdGlvbnM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogc2NoZWR1bGUtZnVuY3Rpb25zXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtICR7X0FQUF9EQl9IT1NUOi1tb25nb2RifVxuICAgICAgLSByZWRpc1xuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBfQVBQX0VOVlxuICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRVxuICAgICAgLSBfQVBQX1BPT0xfQURBUFRFUlxuICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxXG4gICAgICAtIF9BUFBfT1BUSU9OU19GT1JDRV9IVFRQU1xuICAgICAgLSBfQVBQX0RPTUFJTlxuICAgICAgLSBfQVBQX0NPTlNPTEVfRE9NQUlOXG4gICAgICAtIF9BUFBfRE9NQUlOX0ZVTkNUSU9OU1xuICAgICAgLSBfQVBQX0RPTUFJTl9TSVRFU1xuICAgICAgLSBfQVBQX01JR1JBVElPTl9IT1NUXG4gICAgICAtIF9BUFBfQ09OU09MRV9TQ0hFTUFcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9EQVRBQkFTRV9TSEFSRURfVEFCTEVTXG5cbiAgYXBwd3JpdGUtdGFzay1zY2hlZHVsZXItZXhlY3V0aW9uczpcbiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS45LjVcbiAgICBlbnRyeXBvaW50OiBzY2hlZHVsZS1leGVjdXRpb25zXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIGRlcGVuZHNfb246XG4gICAgICAtICR7X0FQUF9EQl9IT1NUOi1tb25nb2RifVxuICAgICAgLSByZWRpc1xuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBfQVBQX0VOVlxuICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRVxuICAgICAgLSBfQVBQX1BPT0xfQURBUFRFUlxuICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxXG4gICAgICAtIF9BUFBfT1BUSU9OU19GT1JDRV9IVFRQU1xuICAgICAgLSBfQVBQX0RPTUFJTlxuICAgICAgLSBfQVBQX0NPTlNPTEVfRE9NQUlOXG4gICAgICAtIF9BUFBfRE9NQUlOX0ZVTkNUSU9OU1xuICAgICAgLSBfQVBQX0RPTUFJTl9TSVRFU1xuICAgICAgLSBfQVBQX01JR1JBVElPTl9IT1NUXG4gICAgICAtIF9BUFBfQ09OU09MRV9TQ0hFTUFcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9EQVRBQkFTRV9TSEFSRURfVEFCTEVTXG5cbiAgYXBwd3JpdGUtdGFzay1zY2hlZHVsZXItbWVzc2FnZXM6XG4gICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuOS41XG4gICAgZW50cnlwb2ludDogc2NoZWR1bGUtbWVzc2FnZXNcbiAgICA8PDogKngtbG9nZ2luZ1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIC0gJHtfQVBQX0RCX0hPU1Q6LW1vbmdvZGJ9XG4gICAgICAtIHJlZGlzXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfRU5WXG4gICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFXG4gICAgICAtIF9BUFBfUE9PTF9BREFQVEVSXG4gICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjFcbiAgICAgIC0gX0FQUF9SRURJU19IT1NUXG4gICAgICAtIF9BUFBfUkVESVNfUE9SVFxuICAgICAgLSBfQVBQX1JFRElTX1VTRVJcbiAgICAgIC0gX0FQUF9SRURJU19QQVNTXG4gICAgICAtIF9BUFBfREJfQURBUFRFUlxuICAgICAgLSBfQVBQX0RCX0hPU1RcbiAgICAgIC0gX0FQUF9EQl9QT1JUXG4gICAgICAtIF9BUFBfREJfU0NIRU1BXG4gICAgICAtIF9BUFBfREJfVVNFUlxuICAgICAgLSBfQVBQX0RCX1BBU1NcbiAgICAgIC0gX0FQUF9EQVRBQkFTRV9TSEFSRURfVEFCTEVTXG5cbiAgYXBwd3JpdGUtYXNzaXN0YW50OlxuICAgIGltYWdlOiBhcHB3cml0ZS9hc3Npc3RhbnQ6MC44LjRcbiAgICA8PDogKngtbG9nZ2luZ1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIF9BUFBfQVNTSVNUQU5UX09QRU5BSV9BUElfS0VZXG5cbiAgYXBwd3JpdGUtYnJvd3NlcjpcbiAgICBpbWFnZTogYXBwd3JpdGUvYnJvd3NlcjowLjMuMlxuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcblxuICBvcGVucnVudGltZXMtZXhlY3V0b3I6XG4gICAgaG9zdG5hbWU6IG9wZW5ydW50aW1lcy1leGVjdXRvclxuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBzdG9wX3NpZ25hbDogU0lHSU5UXG4gICAgaW1hZ2U6IG9wZW5ydW50aW1lcy9leGVjdXRvcjowLjI1LjFcbiAgICB2b2x1bWVzOlxuICAgICAgLSAvdmFyL3J1bi9kb2NrZXIuc29jazovdmFyL3J1bi9kb2NrZXIuc29ja1xuICAgICAgLSBhcHB3cml0ZS1idWlsZHM6L3N0b3JhZ2UvYnVpbGRzOnJ3XG4gICAgICAtIGFwcHdyaXRlLWZ1bmN0aW9uczovc3RvcmFnZS9mdW5jdGlvbnM6cndcbiAgICAgIC0gYXBwd3JpdGUtc2l0ZXM6L3N0b3JhZ2Uvc2l0ZXM6cndcbiAgICAgICMgSG9zdCBtb3VudCBuZWNlc3NhcnkgdG8gc2hhcmUgZmlsZXMgYmV0d2VlbiBleGVjdXRvciBhbmQgcnVudGltZXMuXG4gICAgICAjIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHNoYXJlIG1vdW50IGZpbGUgYmV0d2VlbiAyIGNvbnRhaW5lcnMgd2l0aG91dCBob3N0IG1vdW50IChjb3B5aW5nIGlzIHRvbyBzbG93KVxuICAgICAgLSAvdG1wOi90bXA6cndcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gT1BSX0VYRUNVVE9SX0NPTk5FQ1RJT05fU1RPUkFHRT1sb2NhbDovL2xvY2FsaG9zdFxuICAgICAgLSBPUFJfRVhFQ1VUT1JfQ09OTkVDVElPTl9CVUlMRF9DQUNIRV9TVE9SQUdFPVxuICAgICAgLSBPUFJfRVhFQ1VUT1JfSU1BR0VTPSRfQVBQX0VYRUNVVE9SX0lNQUdFU1xuICAgICAgLSBPUFJfRVhFQ1VUT1JfSU5BQ1RJVkVfVEhSRVNIT0xEPSRfQVBQX0NPTVBVVEVfSU5BQ1RJVkVfVEhSRVNIT0xEXG4gICAgICAtIE9QUl9FWEVDVVRPUl9NQUlOVEVOQU5DRV9JTlRFUlZBTD0kX0FQUF9DT01QVVRFX01BSU5URU5BTkNFX0lOVEVSVkFMXG4gICAgICAtIE9QUl9FWEVDVVRPUl9ORVRXT1JLPSRfQVBQX0NPTVBVVEVfUlVOVElNRVNfTkVUV09SS1xuICAgICAgLSBPUFJfRVhFQ1VUT1JfRE9DS0VSX0hVQl9VU0VSTkFNRT0kX0FQUF9ET0NLRVJfSFVCX1VTRVJOQU1FXG4gICAgICAtIE9QUl9FWEVDVVRPUl9ET0NLRVJfSFVCX1BBU1NXT1JEPSRfQVBQX0RPQ0tFUl9IVUJfUEFTU1dPUkRcbiAgICAgIC0gT1BSX0VYRUNVVE9SX0VOVj0kX0FQUF9FTlZcbiAgICAgIC0gT1BSX0VYRUNVVE9SX1JVTlRJTUVTPSRfQVBQX0ZVTkNUSU9OU19SVU5USU1FUywkX0FQUF9TSVRFU19SVU5USU1FU1xuICAgICAgLSBPUFJfRVhFQ1VUT1JfU0VDUkVUPSRfQVBQX0VYRUNVVE9SX1NFQ1JFVFxuICAgICAgLSBPUFJfRVhFQ1VUT1JfUlVOVElNRV9WRVJTSU9OUz12NVxuICAgICAgLSBPUEVOX1JVTlRJTUVTX05GVD0kX0FQUF9PUEVOX1JVTlRJTUVTX05GVFxuICAgICAgLSBPUFJfRVhFQ1VUT1JfTE9HR0lOR19DT05GSUc9JF9BUFBfTE9HR0lOR19DT05GSUdcbiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfREVWSUNFPSRfQVBQX1NUT1JBR0VfREVWSUNFXG4gICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1MzX0FDQ0VTU19LRVk9JF9BUFBfU1RPUkFHRV9TM19BQ0NFU1NfS0VZXG4gICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1MzX1NFQ1JFVD0kX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVFxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9TM19SRUdJT049JF9BUFBfU1RPUkFHRV9TM19SRUdJT05cbiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfUzNfQlVDS0VUPSRfQVBQX1NUT1JBR0VfUzNfQlVDS0VUXG4gICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1MzX0VORFBPSU5UPSRfQVBQX1NUT1JBR0VfUzNfRU5EUE9JTlRcbiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfRE9fU1BBQ0VTX0FDQ0VTU19LRVk9JF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQUNDRVNTX0tFWVxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9ET19TUEFDRVNfU0VDUkVUPSRfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1NFQ1JFVFxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9ET19TUEFDRVNfUkVHSU9OPSRfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1JFR0lPTlxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9ET19TUEFDRVNfQlVDS0VUPSRfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0JVQ0tFVFxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9CQUNLQkxBWkVfQUNDRVNTX0tFWT0kX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9BQ0NFU1NfS0VZXG4gICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0JBQ0tCTEFaRV9TRUNSRVQ9JF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfU0VDUkVUXG4gICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0JBQ0tCTEFaRV9SRUdJT049JF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfUkVHSU9OXG4gICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVQ9JF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfQlVDS0VUXG4gICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZPSRfQVBQX1NUT1JBR0VfTElOT0RFX0FDQ0VTU19LRVlcbiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfTElOT0RFX1NFQ1JFVD0kX0FQUF9TVE9SQUdFX0xJTk9ERV9TRUNSRVRcbiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfTElOT0RFX1JFR0lPTj0kX0FQUF9TVE9SQUdFX0xJTk9ERV9SRUdJT05cbiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfTElOT0RFX0JVQ0tFVD0kX0FQUF9TVE9SQUdFX0xJTk9ERV9CVUNLRVRcbiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfV0FTQUJJX0FDQ0VTU19LRVk9JF9BUFBfU1RPUkFHRV9XQVNBQklfQUNDRVNTX0tFWVxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9XQVNBQklfU0VDUkVUPSRfQVBQX1NUT1JBR0VfV0FTQUJJX1NFQ1JFVFxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9XQVNBQklfUkVHSU9OPSRfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTlxuICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9XQVNBQklfQlVDS0VUPSRfQVBQX1NUT1JBR0VfV0FTQUJJX0JVQ0tFVFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDpcbiAgICAgICAgLSBDTUQtU0hFTExcbiAgICAgICAgLSAnY3VybCAtZnNTIC1IIFwiQXV0aG9yaXphdGlvbjogQmVhcmVyICQkT1BSX0VYRUNVVE9SX1NFQ1JFVFwiIGh0dHA6Ly9sb2NhbGhvc3QvdjEvaGVhbHRoID4vZGV2L251bGwnXG4gICAgICBpbnRlcnZhbDogNXNcbiAgICAgIHRpbWVvdXQ6IDNzXG4gICAgICByZXRyaWVzOiAyMFxuICAgICAgc3RhcnRfcGVyaW9kOiA1c1xuXG4gIG1vbmdvZGI6XG4gICAgaW1hZ2U6IG1vbmdvOjguMi41XG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIGFwcHdyaXRlLW1vbmdvZGI6L2RhdGEvZGJcbiAgICAgIC0gYXBwd3JpdGUtbW9uZ29kYi1rZXlmaWxlOi9kYXRhL2tleWZpbGVcbiAgICAgIC0gLi4vZmlsZXMvbW9uZ28taW5pdC5qczovZG9ja2VyLWVudHJ5cG9pbnQtaW5pdGRiLmQvbW9uZ28taW5pdC5qczpyb1xuICAgICAgLSAuLi9maWxlcy9tb25nby1lbnRyeXBvaW50LnNoOi9tb25nby1lbnRyeXBvaW50LnNoOnJvXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIE1PTkdPX0lOSVREQl9ST09UX1VTRVJOQU1FPXJvb3RcbiAgICAgIC0gTU9OR09fSU5JVERCX1JPT1RfUEFTU1dPUkQ9JHtfQVBQX0RCX1JPT1RfUEFTU31cbiAgICAgIC0gTU9OR09fSU5JVERCX0RBVEFCQVNFPSR7X0FQUF9EQl9TQ0hFTUF9XG4gICAgICAtIE1PTkdPX0lOSVREQl9VU0VSTkFNRT0ke19BUFBfREJfVVNFUn1cbiAgICAgIC0gTU9OR09fSU5JVERCX1BBU1NXT1JEPSR7X0FQUF9EQl9QQVNTfVxuICAgIGVudHJ5cG9pbnQ6XG4gICAgICAtIC9iaW4vYmFzaFxuICAgICAgLSAvbW9uZ28tZW50cnlwb2ludC5zaFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogfFxuICAgICAgICBiYXNoIC1jIFwiXG4gICAgICAgICAgbW9uZ29zaCAtdSByb290IC1wIFxcXCIkJE1PTkdPX0lOSVREQl9ST09UX1BBU1NXT1JEXFxcIiAtLWF1dGhlbnRpY2F0aW9uRGF0YWJhc2UgYWRtaW4gLS1xdWlldCAtLWV2YWwgXFxcIlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgaGVsbG8gPSBkYi5hZG1pbkNvbW1hbmQoe2hlbGxvOiAxfSk7XG4gICAgICAgICAgICAgIGlmIChoZWxsby5pc1dyaXRhYmxlUHJpbWFyeSkge1xuICAgICAgICAgICAgICAgIHF1aXQoMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJzLmluaXRpYXRlKHtfaWQ6ICdyczAnLCBtZW1iZXJzOiBbe19pZDogMCwgaG9zdDogJ21vbmdvZGI6MjcwMTcnfV19KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgIHF1aXQoMSk7XG4gICAgICAgICAgXFxcIiAyPi9kZXYvbnVsbFxuICAgICAgICBcIlxuICAgICAgaW50ZXJ2YWw6IDEwc1xuICAgICAgdGltZW91dDogMTBzXG4gICAgICByZXRyaWVzOiAxMFxuICAgICAgc3RhcnRfcGVyaW9kOiAzMHNcblxuICBtYXJpYWRiOlxuICAgIGltYWdlOiBtYXJpYWRiOjEwLjExICMgZml4IGlzc3VlcyB3aGVuIHVwZ3JhZGluZyB1c2luZzogbXlzcWxfdXBncmFkZSAtdSByb290IC1wXG4gICAgPDw6ICp4LWxvZ2dpbmdcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIHZvbHVtZXM6XG4gICAgICAtIGFwcHdyaXRlLW1hcmlhZGI6L3Zhci9saWIvbXlzcWw6cndcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gTVlTUUxfUk9PVF9QQVNTV09SRD0ke19BUFBfREJfUk9PVF9QQVNTfVxuICAgICAgLSBNWVNRTF9EQVRBQkFTRT0ke19BUFBfREJfU0NIRU1BfVxuICAgICAgLSBNWVNRTF9VU0VSPSR7X0FQUF9EQl9VU0VSfVxuICAgICAgLSBNWVNRTF9QQVNTV09SRD0ke19BUFBfREJfUEFTU31cbiAgICAgIC0gTUFSSUFEQl9BVVRPX1VQR1JBREU9MVxuICAgIGNvbW1hbmQ6IFwibXlzcWxkIC0taW5ub2RiLWZsdXNoLW1ldGhvZD1mc3luY1wiXG5cbiAgcmVkaXM6XG4gICAgaW1hZ2U6IHJlZGlzOjcuNC43LWFscGluZVxuICAgIDw8OiAqeC1sb2dnaW5nXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOiA+XG4gICAgICByZWRpcy1zZXJ2ZXJcbiAgICAgIC0tbWF4bWVtb3J5ICAgICAgICAgICAgNTEybWJcbiAgICAgIC0tbWF4bWVtb3J5LXBvbGljeSAgICAgYWxsa2V5cy1scnVcbiAgICAgIC0tbWF4bWVtb3J5LXNhbXBsZXMgICAgNVxuICAgIHZvbHVtZXM6XG4gICAgICAtIGFwcHdyaXRlLXJlZGlzOi9kYXRhOnJ3XG5cbiAgIyBjbGFtYXY6XG4gICMgICBpbWFnZTogYXBwd3JpdGUvY2xhbWF2OjEuMi4wXG4gICMgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAjICAgdm9sdW1lczpcbiAgIyAgICAgLSBhcHB3cml0ZS11cGxvYWRzOi9zdG9yYWdlL3VwbG9hZHNcblxudm9sdW1lczpcbiAgYXBwd3JpdGUtbWFyaWFkYjpcbiAgYXBwd3JpdGUtbW9uZ29kYjpcbiAgYXBwd3JpdGUtbW9uZ29kYi1rZXlmaWxlOlxuICBhcHB3cml0ZS1yZWRpczpcbiAgYXBwd3JpdGUtY2FjaGU6XG4gIGFwcHdyaXRlLXVwbG9hZHM6XG4gIGFwcHdyaXRlLWltcG9ydHM6XG4gIGFwcHdyaXRlLWNlcnRpZmljYXRlczpcbiAgYXBwd3JpdGUtZnVuY3Rpb25zOlxuICBhcHB3cml0ZS1zaXRlczpcbiAgYXBwd3JpdGUtYnVpbGRzOlxuICBhcHB3cml0ZS1jb25maWc6XG4iLAogICJjb25maWciOiAiW3ZhcmlhYmxlc11cbm1haW5fZG9tYWluID0gXCIke2RvbWFpbn1cIlxuZnVuY3Rpb25zX2RvbWFpbiA9IFwiZnVuY3Rpb25zLiR7bWFpbl9kb21haW59XCJcbnNpdGVzX2RvbWFpbiA9IFwic2l0ZXMuJHttYWluX2RvbWFpbn1cIlxub3BlbnNzbF9rZXkgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbmRiX3Jvb3RfcHcgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbmRiX3VzZXJfcHcgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbmV4ZWN1dG9yX3NlY3JldCA9IFwiJHtwYXNzd29yZDozMn1cIlxuXG5bY29uZmlnXVxuZW52ID0gW1xuICBcIl9BUFBfRU5WPXByb2R1Y3Rpb25cIixcbiAgXCJfQVBQX0VESVRJT049c2VsZi1ob3N0ZWRcIixcbiAgXCJfQVBQX0xPQ0FMRT1lblwiLFxuICBcIl9BUFBfUE9PTF9BREFQVEVSPXN0YWNrXCIsXG4gIFwiX0FQUF9XT1JLRVJfUEVSX0NPUkU9NlwiLFxuICBcIl9BUFBfT1BUSU9OU19BQlVTRT1lbmFibGVkXCIsXG4gIFwiX0FQUF9PUFRJT05TX0ZPUkNFX0hUVFBTPWRpc2FibGVkXCIsXG4gIFwiX0FQUF9PUFRJT05TX1JPVVRFUl9GT1JDRV9IVFRQUz1kaXNhYmxlZFwiLFxuICBcIl9BUFBfT1BUSU9OU19ST1VURVJfUFJPVEVDVElPTj1kaXNhYmxlZFwiLFxuICBcIl9BUFBfT1BFTlNTTF9LRVlfVjE9JHtvcGVuc3NsX2tleX1cIixcbiAgXCJfQVBQX0RPTUFJTj0ke21haW5fZG9tYWlufVwiLFxuICBcIl9BUFBfQ09OU09MRV9ET01BSU49JHttYWluX2RvbWFpbn1cIixcbiAgXCJfQVBQX0NPTlNPTEVfVFJVU1RFRF9QUk9KRUNUUz1cIixcbiAgXCJfQVBQX0NVU1RPTV9ET01BSU5fREVOWV9MSVNUPWV4YW1wbGUuY29tLHRlc3QuY29tLGFwcC5leGFtcGxlLmNvbVwiLFxuICBcIl9BUFBfRE9NQUlOX0ZVTkNUSU9OUz0ke2Z1bmN0aW9uc19kb21haW59XCIsXG4gIFwiX0FQUF9ET01BSU5fU0lURVM9JHtzaXRlc19kb21haW59XCIsXG4gIFwiX0FQUF9ET01BSU5fVEFSR0VUX0NOQU1FPWxvY2FsaG9zdFwiLFxuICBcIl9BUFBfRE9NQUlOX1RBUkdFVF9BQUFBPTo6MVwiLFxuICBcIl9BUFBfRE9NQUlOX1RBUkdFVF9BPTEyNy4wLjAuMVwiLFxuICBcIl9BUFBfRE9NQUlOX1RBUkdFVF9DQUE9XCIsXG4gIFwiX0FQUF9ETlM9OC44LjguOFwiLFxuICBcIl9BUFBfVFJVU1RFRF9IRUFERVJTPXgtZm9yd2FyZGVkLWZvclwiLFxuICBcIl9BUFBfQ09OU09MRV9XSElURUxJU1RfUk9PVD1lbmFibGVkXCIsXG4gIFwiX0FQUF9DT05TT0xFX1dISVRFTElTVF9FTUFJTFM9XCIsXG4gIFwiX0FQUF9DT05TT0xFX1dISVRFTElTVF9JUFM9XCIsXG4gIFwiX0FQUF9DT05TT0xFX0hPU1ROQU1FUz1cIixcbiAgXCJfQVBQX0NPTlNPTEVfU0NIRU1BPWFwcHdyaXRlaW9cIixcbiAgXCJfQVBQX0NPTlNPTEVfU0VTU0lPTl9BTEVSVFM9ZGlzYWJsZWRcIixcbiAgXCJfQVBQX0NPTlNPTEVfQ09VTlRSSUVTX0RFTllMSVNUPVwiLFxuICBcIl9BUFBfU1lTVEVNX0VNQUlMX05BTUU9QXBwd3JpdGVcIixcbiAgXCJfQVBQX1NZU1RFTV9FTUFJTF9BRERSRVNTPW5vcmVwbHlAYXBwd3JpdGUuaW9cIixcbiAgXCJfQVBQX1NZU1RFTV9URUFNX0VNQUlMPXRlYW1AYXBwd3JpdGUuaW9cIixcbiAgXCJfQVBQX1NZU1RFTV9SRVNQT05TRV9GT1JNQVQ9XCIsXG4gIFwiX0FQUF9FTUFJTF9TRUNVUklUWT1cIixcbiAgXCJfQVBQX0VNQUlMX0NFUlRJRklDQVRFUz1cIixcbiAgXCJfQVBQX0NPTVBSRVNTSU9OX0VOQUJMRUQ9ZW5hYmxlZFwiLFxuICBcIl9BUFBfQ09NUFJFU1NJT05fTUlOX1NJWkVfQllURVM9MTAyNFwiLFxuICBcIl9BUFBfVVNBR0VfU1RBVFM9ZW5hYmxlZFwiLFxuICBcIl9BUFBfVVNBR0VfQUdHUkVHQVRJT05fSU5URVJWQUw9MzBcIixcbiAgXCJfQVBQX1NUQVRTX1JFU09VUkNFU19JTlRFUlZBTD0zMFwiLFxuICBcIl9BUFBfTE9HR0lOR19QUk9WSURFUj1cIixcbiAgXCJfQVBQX0xPR0dJTkdfQ09ORklHPVwiLFxuICBcIl9BUFBfTE9HR0lOR19DT05GSUdfUkVBTFRJTUU9XCIsXG4gIFwiX0FQUF9FWFBFUklNRU5UX0xPR0dJTkdfUFJPVklERVI9XCIsXG4gIFwiX0FQUF9FWFBFUklNRU5UX0xPR0dJTkdfQ09ORklHPVwiLFxuICBcIl9BUFBfUkVESVNfSE9TVD1yZWRpc1wiLFxuICBcIl9BUFBfUkVESVNfUE9SVD02Mzc5XCIsXG4gIFwiX0FQUF9SRURJU19VU0VSPVwiLFxuICBcIl9BUFBfUkVESVNfUEFTUz1cIixcbiAgXCJfQVBQX0RCX0FEQVBURVI9bW9uZ29kYlwiLFxuICBcIl9BUFBfREJfSE9TVD1tb25nb2RiXCIsXG4gIFwiX0FQUF9EQl9QT1JUPTI3MDE3XCIsXG4gIFwiX0FQUF9EQl9TQ0hFTUE9YXBwd3JpdGVcIixcbiAgXCJfQVBQX0RCX1VTRVI9dXNlclwiLFxuICBcIl9BUFBfREJfUEFTUz0ke2RiX3VzZXJfcHd9XCIsXG4gIFwiX0FQUF9EQl9ST09UX1BBU1M9JHtkYl9yb290X3B3fVwiLFxuICBcIl9BUFBfREFUQUJBU0VfU0hBUkVEX1RBQkxFUz1cIixcbiAgXCJfQVBQX0RBVEFCQVNFX1NIQVJFRF9OQU1FU1BBQ0U9XCIsXG4gIFwiX0FQUF9EQl9BREFQVEVSX1ZFQ1RPUlNEQj1cIixcbiAgXCJfQVBQX0RCX0hPU1RfVkVDVE9SU0RCPVwiLFxuICBcIl9BUFBfREJfUE9SVF9WRUNUT1JTREI9XCIsXG4gIFwiX0FQUF9EQl9TQ0hFTUFfVkVDVE9SU0RCPVwiLFxuICBcIl9BUFBfREJfVVNFUl9WRUNUT1JTREI9XCIsXG4gIFwiX0FQUF9EQl9QQVNTX1ZFQ1RPUlNEQj1cIixcbiAgXCJfQVBQX1NNVFBfSE9TVD1cIixcbiAgXCJfQVBQX1NNVFBfUE9SVD1cIixcbiAgXCJfQVBQX1NNVFBfU0VDVVJFPVwiLFxuICBcIl9BUFBfU01UUF9VU0VSTkFNRT1cIixcbiAgXCJfQVBQX1NNVFBfUEFTU1dPUkQ9XCIsXG4gIFwiX0FQUF9TTVNfUFJPVklERVI9XCIsXG4gIFwiX0FQUF9TTVNfRlJPTT1cIixcbiAgXCJfQVBQX1NNU19QUk9KRUNUU19ERU5ZX0xJU1Q9XCIsXG4gIFwiX0FQUF9TVE9SQUdFX0xJTUlUPTMwMDAwMDAwXCIsXG4gIFwiX0FQUF9TVE9SQUdFX1BSRVZJRVdfTElNSVQ9MjAwMDAwMDBcIixcbiAgXCJfQVBQX1NUT1JBR0VfQU5USVZJUlVTPWRpc2FibGVkXCIsXG4gIFwiX0FQUF9TVE9SQUdFX0FOVElWSVJVU19IT1NUPWNsYW1hdlwiLFxuICBcIl9BUFBfU1RPUkFHRV9BTlRJVklSVVNfUE9SVD0zMzEwXCIsXG4gIFwiX0FQUF9TVE9SQUdFX0RFVklDRT1sb2NhbFwiLFxuICBcIl9BUFBfU1RPUkFHRV9TM19BQ0NFU1NfS0VZPVwiLFxuICBcIl9BUFBfU1RPUkFHRV9TM19TRUNSRVQ9XCIsXG4gIFwiX0FQUF9TVE9SQUdFX1MzX1JFR0lPTj11cy1lYXN0LTFcIixcbiAgXCJfQVBQX1NUT1JBR0VfUzNfQlVDS0VUPVwiLFxuICBcIl9BUFBfU1RPUkFHRV9TM19FTkRQT0lOVD1cIixcbiAgXCJfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0FDQ0VTU19LRVk9XCIsXG4gIFwiX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19TRUNSRVQ9XCIsXG4gIFwiX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19SRUdJT049dXMtZWFzdC0xXCIsXG4gIFwiX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19CVUNLRVQ9XCIsXG4gIFwiX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9BQ0NFU1NfS0VZPVwiLFxuICBcIl9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfU0VDUkVUPVwiLFxuICBcIl9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfUkVHSU9OPXVzLXdlc3QtMDA0XCIsXG4gIFwiX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVQ9XCIsXG4gIFwiX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZPVwiLFxuICBcIl9BUFBfU1RPUkFHRV9MSU5PREVfU0VDUkVUPVwiLFxuICBcIl9BUFBfU1RPUkFHRV9MSU5PREVfUkVHSU9OPWV1LWNlbnRyYWwtMVwiLFxuICBcIl9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUPVwiLFxuICBcIl9BUFBfU1RPUkFHRV9XQVNBQklfQUNDRVNTX0tFWT1cIixcbiAgXCJfQVBQX1NUT1JBR0VfV0FTQUJJX1NFQ1JFVD1cIixcbiAgXCJfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTj1ldS1jZW50cmFsLTFcIixcbiAgXCJfQVBQX1NUT1JBR0VfV0FTQUJJX0JVQ0tFVD1cIixcbiAgXCJfQVBQX0NPTVBVVEVfU0laRV9MSU1JVD0zMDAwMDAwMFwiLFxuICBcIl9BUFBfQ09NUFVURV9CVUlMRF9USU1FT1VUPTkwMFwiLFxuICBcIl9BUFBfQ09NUFVURV9DUFVTPTBcIixcbiAgXCJfQVBQX0NPTVBVVEVfTUVNT1JZPTBcIixcbiAgXCJfQVBQX0NPTVBVVEVfSU5BQ1RJVkVfVEhSRVNIT0xEPTYwXCIsXG4gIFwiX0FQUF9DT01QVVRFX01BSU5URU5BTkNFX0lOVEVSVkFMPTM2MDBcIixcbiAgXCJfQVBQX0NPTVBVVEVfUlVOVElNRVNfTkVUV09SSz1kb2twbG95LW5ldHdvcmtcIixcbiAgXCJfQVBQX0ZVTkNUSU9OU19USU1FT1VUPTkwMFwiLFxuICBcIl9BUFBfRlVOQ1RJT05TX0NSRUFUSU9OX0FCVVNFX0xJTUlUPTUwMDBcIixcbiAgXCJfQVBQX0ZVTkNUSU9OU19SVU5USU1FUz1ub2RlLTIyLHB5dGhvbi0zLjEyLHBocC04LjMscnVieS0zLjMsZGFydC0zLjUsZ28tMS4yMyxydXN0LTEuODMsYnVuLTEuMSxkZW5vLTEuNDYsamF2YS0yMS4wLGRvdG5ldC04LjBcIixcbiAgXCJfQVBQX1NJVEVTX1RJTUVPVVQ9OTAwXCIsXG4gIFwiX0FQUF9TSVRFU19SVU5USU1FUz1zdGF0aWMtMSxub2RlLTIyXCIsXG4gIFwiX0FQUF9FWEVDVVRPUl9TRUNSRVQ9JHtleGVjdXRvcl9zZWNyZXR9XCIsXG4gIFwiX0FQUF9FWEVDVVRPUl9IT1NUPWh0dHA6Ly9vcGVucnVudGltZXMtZXhlY3V0b3IvdjFcIixcbiAgXCJfQVBQX0VYRUNVVE9SX0lNQUdFUz1vcGVucnVudGltZXMvbm9kZTp2NS0yMixvcGVucnVudGltZXMvcHl0aG9uOnY1LTMuMTIsb3BlbnJ1bnRpbWVzL3BocDp2NS04LjMsb3BlbnJ1bnRpbWVzL3N0YXRpYzp2NS0xXCIsXG4gIFwiX0FQUF9PUEVOX1JVTlRJTUVTX05GVD1lbmFibGVkXCIsXG4gIFwiX0FQUF9CUk9XU0VSX0hPU1Q9aHR0cDovL2FwcHdyaXRlLWJyb3dzZXI6MzAwMC92MVwiLFxuICBcIl9BUFBfV09SS0VSX1NDUkVFTlNIT1RTX1JPVVRFUj1odHRwOi8vYXBwd3JpdGVcIixcbiAgXCJfQVBQX0RPQ0tFUl9IVUJfVVNFUk5BTUU9XCIsXG4gIFwiX0FQUF9ET0NLRVJfSFVCX1BBU1NXT1JEPVwiLFxuICBcIl9BUFBfTUFJTlRFTkFOQ0VfSU5URVJWQUw9ODY0MDBcIixcbiAgXCJfQVBQX01BSU5URU5BTkNFX1NUQVJUX1RJTUU9MDA6MDBcIixcbiAgXCJfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9DQUNIRT0yNTkyMDAwXCIsXG4gIFwiX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fRVhFQ1VUSU9OPTEyMDk2MDBcIixcbiAgXCJfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9BVURJVD0xMjA5NjAwXCIsXG4gIFwiX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVRfQ09OU09MRT0xNTc3ODgwMFwiLFxuICBcIl9BUFBfTUFJTlRFTkFOQ0VfUkVURU5USU9OX0FCVVNFPTg2NDAwXCIsXG4gIFwiX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fVVNBR0VfSE9VUkxZPTg2NDAwMDBcIixcbiAgXCJfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9TQ0hFRFVMRVM9ODY0MDBcIixcbiAgXCJfQVBQX0lOVEVSVkFMX0RPTUFJTl9WRVJJRklDQVRJT049MTIwXCIsXG4gIFwiX0FQUF9JTlRFUlZBTF9DTEVBTlVQX1NUQUxFX0VYRUNVVElPTlM9MzAwXCIsXG4gIFwiX0FQUF9HUkFQSFFMX0lOVFJPU1BFQ1RJT049ZW5hYmxlZFwiLFxuICBcIl9BUFBfR1JBUEhRTF9NQVhfQkFUQ0hfU0laRT0xMFwiLFxuICBcIl9BUFBfR1JBUEhRTF9NQVhfQ09NUExFWElUWT0yNTBcIixcbiAgXCJfQVBQX0dSQVBIUUxfTUFYX0RFUFRIPTRcIixcbiAgXCJfQVBQX1dFQkhPT0tfTUFYX0ZBSUxFRF9BVFRFTVBUUz0xMFwiLFxuICBcIl9BUFBfVkNTX0dJVEhVQl9BUFBfTkFNRT1cIixcbiAgXCJfQVBQX1ZDU19HSVRIVUJfUFJJVkFURV9LRVk9XCIsXG4gIFwiX0FQUF9WQ1NfR0lUSFVCX0FQUF9JRD1cIixcbiAgXCJfQVBQX1ZDU19HSVRIVUJfQ0xJRU5UX0lEPVwiLFxuICBcIl9BUFBfVkNTX0dJVEhVQl9DTElFTlRfU0VDUkVUPVwiLFxuICBcIl9BUFBfVkNTX0dJVEhVQl9XRUJIT09LX1NFQ1JFVD1cIixcbiAgXCJfQVBQX01JR1JBVElPTl9IT1NUPWFwcHdyaXRlXCIsXG4gIFwiX0FQUF9NSUdSQVRJT05TX0ZJUkVCQVNFX0NMSUVOVF9JRD1cIixcbiAgXCJfQVBQX01JR1JBVElPTlNfRklSRUJBU0VfQ0xJRU5UX1NFQ1JFVD1cIixcbiAgXCJfQVBQX0FTU0lTVEFOVF9PUEVOQUlfQVBJX0tFWT1cIixcbl1cblxuW1tjb25maWcubW91bnRzXV1cbmZpbGVQYXRoID0gXCJtb25nby1pbml0LmpzXCJcbmNvbnRlbnQgPSBcIlwiXCIvLyBtb25nby1pbml0LmpzXG5cbi8vIFN3aXRjaCB0byB0aGUgYWRtaW4gZGF0YWJhc2VcbmNvbnN0IGFkbWluRGIgPSBkYi5nZXRTaWJsaW5nREIoJ2FkbWluJyk7XG5cbi8vIEdldCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbmNvbnN0IHVzZXJuYW1lID0gcHJvY2Vzcy5lbnYuTU9OR09fSU5JVERCX1VTRVJOQU1FO1xuY29uc3QgcGFzc3dvcmQgPSBwcm9jZXNzLmVudi5NT05HT19JTklUREJfUEFTU1dPUkQ7XG5jb25zdCBkYXRhYmFzZSA9IHByb2Nlc3MuZW52Lk1PTkdPX0lOSVREQl9EQVRBQkFTRTtcblxuLy8gQ3JlYXRlIHRoZSB1c2VyXG5hZG1pbkRiLmNyZWF0ZVVzZXIoe1xuICB1c2VyOiB1c2VybmFtZSxcbiAgcHdkOiBwYXNzd29yZCxcbiAgcm9sZXM6IFtcbiAgICB7IHJvbGU6ICdyZWFkV3JpdGUnLCBkYjogZGF0YWJhc2UgfVxuICBdXG59KTtcblwiXCJcIlxuXG5bW2NvbmZpZy5tb3VudHNdXVxuZmlsZVBhdGggPSBcIm1vbmdvLWVudHJ5cG9pbnQuc2hcIlxuY29udGVudCA9IFwiXCJcIiMhL2Jpbi9iYXNoXG5zZXQgLWVcblxuIyBGaXgga2V5ZmlsZSBwZXJtaXNzaW9ucyBpZiBtb3VudGVkIGZyb20gdm9sdW1lXG5LRVlGSUxFX1BBVEg9XCIvZGF0YS9rZXlmaWxlL21vbmdvLWtleWZpbGVcIlxuXG5pZiBbICEgLWYgXCIkS0VZRklMRV9QQVRIXCIgXTsgdGhlblxuICBlY2hvIFwiR2VuZXJhdGluZyByYW5kb20gTW9uZ29EQiBrZXlmaWxlLi4uXCJcbiAgbWtkaXIgLXAgL2RhdGEva2V5ZmlsZVxuICBvcGVuc3NsIHJhbmQgLWJhc2U2NCA3NTYgPiBcIiRLRVlGSUxFX1BBVEhcIlxuZmlcblxuY2htb2QgNDAwIFwiJEtFWUZJTEVfUEFUSFwiXG5jaG93biBtb25nb2RiOm1vbmdvZGIgXCIkS0VZRklMRV9QQVRIXCIgMj4vZGV2L251bGwgfHwgY2hvd24gOTk5Ojk5OSBcIiRLRVlGSUxFX1BBVEhcIlxuXG4jIFVzZSBNb25nb0RCJ3Mgc3RhbmRhcmQgZW50cnlwb2ludCB3aXRoIG91ciBjb21tYW5kXG5leGVjIGRvY2tlci1lbnRyeXBvaW50LnNoIG1vbmdvZCAtLXJlcGxTZXQgcnMwIC0tYmluZF9pcF9hbGwgLS1hdXRoIC0ta2V5RmlsZSBcIiRLRVlGSUxFX1BBVEhcIlxuXCJcIlwiXG5cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcImFwcHdyaXRlXCJcbnBvcnQgPSA4MFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxucGF0aCA9IFwiL1wiXG5cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcImFwcHdyaXRlXCJcbnBvcnQgPSA4MFxuaG9zdCA9IFwiJHtzaXRlc19kb21haW59XCJcbnBhdGggPSBcIi9cIlxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJhcHB3cml0ZVwiXG5wb3J0ID0gODBcbmhvc3QgPSBcIiR7ZnVuY3Rpb25zX2RvbWFpbn1cIlxucGF0aCA9IFwiL1wiXG5cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcImFwcHdyaXRlLWNvbnNvbGVcIlxucG9ydCA9IDgwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5wYXRoID0gXCIvY29uc29sZVwiXG5cbltbY29uZmlnLmRvbWFpbnNdXVxuc2VydmljZU5hbWUgPSBcImFwcHdyaXRlLXJlYWx0aW1lXCJcbnBvcnQgPSA4MFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxucGF0aCA9IFwiL3YxL3JlYWx0aW1lXCJcbiIKfQ==

Tags

database, firebase, mariadb, mongodb, hosting, self-hosted


Version: 1.9.5

On this page