{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "definitions": {
    "webOptimizer": {
      "title": "web optimizer",
      "type": "object",
      "description": "Settings for WebOptimizer.Core",
      "properties": {
        "enableCaching": {
          "description": "Determines if the \"cache-control\" HTTP headers should be set and if conditional GET (304) requests should be supported. This could be helpful to disable while in development mode.",
          "type": "boolean"
        },
        "enableTagHelperBundling": {
          "description": "Determines if `<script>` and `<link>` elements should point to the bundled path or a reference per source file should be created. This is helpful to disable when in development mode.",
          "type": "boolean",
          "default": true
        }
      }
    },
    "cdn": {
      "title": "CDN",
      "type": "object",
      "description": "Definitions for WebEssentials.AspNetCore.CdnTagHelpers",
      "properties": {
        "url": {
          "description": "An absolute URL used as a prefix for static resources",
          "type": "string",
          "pattern": "^((//|https?://).+|)$"
        },
        "prefetch": {
          "description": "If true, injects a <link rel='dns-prefetch'> tag that speeds up DNS resolution to the CDN.",
          "type": "boolean",
          "default": true
        }
      }
    },
    "pwa": {
      "properties": {
        "cacheId": {
          "description": "The cache identifier of the service worker (can be any string). Change this property to force the service worker to reload in browsers.",
          "type": "string",
          "default": "v1.0"
        },
        "offlineRoute": {
          "description": "The route to the page to show when offline.",
          "type": "string",
          "default": "/offline.html"
        },
        "registerServiceWorker": {
          "description": "Determines if a script that registers the service worker should be injected into the bottom of the HTML page.",
          "type": "boolean",
          "default": true
        },
        "registerWebmanifest": {
          "description": "Determines if a meta tag that points to the web manifest should be inserted at the end of the head element.",
          "type": "boolean",
          "default": true
        },
        "routesToPreCache": {
          "description": "A comma separated list of routes to pre-cache when service worker installs in the browser.",
          "type": "string",
          "default": ""
        },
        "strategy": {
          "description": "Selects one of the predefined service worker types.",
          "enum": ["cacheFirst", "cacheFirstSafe", "minimal", "networkFirst"],
          "default": "cacheFirstSafe"
        }
      }
    },
    "ElmahIo": {
      "properties": {
        "ApiKey": {
          "description": "An elmah.io API key with the Messages | Write permission.",
          "type": "string",
          "pattern": "^[0-9a-f]{32}$"
        },
        "LogId": {
          "description": "The Id of the elmah.io log to store messages in.",
          "type": "string",
          "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
        },
        "Application": {
          "description": "An application name to put on all error messages.",
          "type": "string"
        },
        "HandledStatusCodesToLog": {
          "description": "A list of HTTP status codes (besides 404) to log even though no exception is thrown.",
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        "TreatLoggingAsBreadcrumbs": {
          "description": "Include log messages from Microsoft.Extensions.Logging as breadcrumbs.",
          "type": "boolean"
        },
        "HeartbeatId": {
          "description": "The Id of the elmah.io heartbeat to notify.",
          "type": "string",
          "pattern": "^[0-9a-f]{32}$"
        }
      },
      "required": ["ApiKey", "LogId"]
    },
    "protocols": {
      "description": "The protocols enabled on the endpoint.",
      "type": "string",
      "enum": [
        "None",
        "Http1",
        "Http2",
        "Http1AndHttp2",
        "Http3",
        "Http1AndHttp2AndHttp3"
      ]
    },
    "certificate": {
      "title": "certificate",
      "description": "Certificate configuration.",
      "type": "object",
      "properties": {
        "Path": {
          "description": "The certificate file path. If a file path is specified then the certificate will be loaded from the file system.",
          "type": "string"
        },
        "KeyPath": {
          "description": "The certificate key file path. Available in .NET 5 and later.",
          "type": "string"
        },
        "Password": {
          "description": "The certificate password used to access the private key.",
          "type": "string"
        },
        "Subject": {
          "description": "The certificate subject. If a subject is specified then the certificate will be loaded from the certificate store.",
          "type": "string"
        },
        "Store": {
          "description": "The certificate store name. Defaults to 'My'.",
          "type": "string",
          "default": "My"
        },
        "Location": {
          "description": "The certificate store location. Defaults to 'CurrentUser'.",
          "type": "string",
          "enum": ["LocalMachine", "CurrentUser"],
          "default": "CurrentUser"
        },
        "AllowInvalid": {
          "description": "A value indicating whether or not to load certificates that are considered invalid. Defaults to false.",
          "type": "boolean",
          "default": false
        }
      }
    },
    "sslProtocols": {
      "description": "Specifies allowable SSL protocols. Defaults to 'None' which allows the operating system to choose the best protocol to use, and to block protocols that are not secure. Unless your app has a specific reason not to, you should use this default. Available in .NET 5 and later.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": ["None", "Tls", "Tls11", "Tls12", "Tls13"],
        "default": "None"
      }
    },
    "clientCertificateMode": {
      "description": "Specifies the client certificate requirements for a HTTPS connection. Defaults to 'NoCertificate'. Available in .NET 5 and later.",
      "type": "string",
      "enum": ["NoCertificate", "AllowCertificate", "RequireCertificate"],
      "default": "NoCertificate"
    },
    "kestrel": {
      "title": "kestrel",
      "type": "object",
      "description": "ASP.NET Core Kestrel server configuration.",
      "properties": {
        "Endpoints": {
          "title": "endpoints",
          "description": "Endpoints that Kestrel listens to for network requests. Each endpoint has a name specified by its JSON property name.",
          "type": "object",
          "additionalProperties": {
            "title": "endpoint options",
            "description": "Kestrel endpoint configuration.",
            "type": "object",
            "properties": {
              "Url": {
                "description": "The scheme, host name, and port the endpoint will listen on. A Url is required.",
                "type": "string",
                "format": "uri"
              },
              "Protocols": {
                "$ref": "#/definitions/protocols"
              },
              "SslProtocols": {
                "$ref": "#/definitions/sslProtocols"
              },
              "Certificate": {
                "$ref": "#/definitions/certificate"
              },
              "ClientCertificateMode": {
                "$ref": "#/definitions/clientCertificateMode"
              },
              "Sni": {
                "title": "SNI",
                "description": "Server Name Indication (SNI) configuration. This enables the mapping of client requested host names to certificates and other TLS settings. Wildcard names prefixed with '*.', as well as a top level '*' are supported. Available in .NET 5 and later.",
                "type": "object",
                "additionalProperties": {
                  "title": "SNI options",
                  "description": "Endpoint SNI configuration.",
                  "type": "object",
                  "properties": {
                    "Protocols": {
                      "$ref": "#/definitions/protocols"
                    },
                    "SslProtocols": {
                      "$ref": "#/definitions/sslProtocols"
                    },
                    "Certificate": {
                      "$ref": "#/definitions/certificate"
                    },
                    "ClientCertificateMode": {
                      "$ref": "#/definitions/clientCertificateMode"
                    }
                  }
                }
              }
            },
            "required": ["Url"]
          }
        },
        "EndpointDefaults": {
          "title": "endpoint defaults",
          "description": "Default configuration applied to all endpoints. Named endpoint specific configuration overrides defaults.",
          "type": "object",
          "properties": {
            "Protocols": {
              "$ref": "#/definitions/protocols"
            },
            "SslProtocols": {
              "$ref": "#/definitions/sslProtocols"
            },
            "ClientCertificateMode": {
              "$ref": "#/definitions/clientCertificateMode"
            }
          }
        },
        "Certificates": {
          "title": "certificates",
          "description": "Certificates that Kestrel uses with HTTPS endpoints. Each certificate has a name specified by its JSON property name. The 'Default' certificate is used by HTTPS endpoints that haven't specified a certificate.",
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/certificate"
          }
        }
      }
    },
    "logLevelThreshold": {
      "description": "Log level threshold.",
      "type": "string",
      "enum": [
        "Trace",
        "Debug",
        "Information",
        "Warning",
        "Error",
        "Critical",
        "None"
      ]
    },
    "logLevel": {
      "title": "logging level options",
      "description": "Log level configurations used when creating logs. Only logs that exceeds its matching log level will be enabled. Each log level configuration has a category specified by its JSON property name. For more information about configuring log levels, see https://docs.microsoft.com/aspnet/core/fundamentals/logging/#configure-logging.",
      "type": "object",
      "additionalProperties": {
        "$ref": "#/definitions/logLevelThreshold"
      }
    },
    "logging": {
      "title": "logging options",
      "type": "object",
      "description": "Configuration for Microsoft.Extensions.Logging.",
      "properties": {
        "LogLevel": {
          "$ref": "#/definitions/logLevel"
        },
        "Console": {
          "properties": {
            "LogLevel": {
              "$ref": "#/definitions/logLevel"
            },
            "FormatterName": {
              "description": "Name of the log message formatter to use. Defaults to 'simple'.",
              "type": "string",
              "default": "simple"
            },
            "FormatterOptions": {
              "title": "formatter options",
              "description": "Log message formatter options. Additional properties are available on the options depending on the configured formatter. The formatter is specified by FormatterName.",
              "type": "object",
              "properties": {
                "IncludeScopes": {
                  "description": "Include scopes when true. Defaults to false.",
                  "type": "boolean",
                  "default": false
                },
                "TimestampFormat": {
                  "description": "Format string used to format timestamp in logging messages. Defaults to null.",
                  "type": "string"
                },
                "UseUtcTimestamp": {
                  "description": "Indication whether or not UTC timezone should be used to for timestamps in logging messages. Defaults to false.",
                  "type": "boolean",
                  "default": false
                }
              }
            },
            "LogToStandardErrorThreshold": {
              "description": "The minimum level of messages are written to Console.Error.",
              "$ref": "#/definitions/logLevelThreshold"
            }
          }
        },
        "EventSource": {
          "properties": {
            "LogLevel": {
              "$ref": "#/definitions/logLevel"
            }
          }
        },
        "Debug": {
          "properties": {
            "LogLevel": {
              "$ref": "#/definitions/logLevel"
            }
          }
        },
        "EventLog": {
          "properties": {
            "LogLevel": {
              "$ref": "#/definitions/logLevel"
            }
          }
        },
        "ElmahIo": {
          "properties": {
            "LogLevel": {
              "$ref": "#/definitions/logLevel"
            }
          }
        },
        "ElmahIoBreadcrumbs": {
          "properties": {
            "LogLevel": {
              "$ref": "#/definitions/logLevel"
            }
          }
        }
      },
      "additionalProperties": {
        "title": "provider logging settings",
        "type": "object",
        "description": "Logging configuration for a provider. The provider name must match the configuration's JSON property property name.",
        "properties": {
          "LogLevel": {
            "$ref": "#/definitions/logLevel"
          }
        }
      }
    },
    "allowedHosts": {
      "description": "ASP.NET Core host filtering middleware configuration. Allowed hosts is a semicolon-delimited list of host names without port numbers. Requests without a matching host name will be refused. Host names may be prefixed with a '*.' wildcard, or use '*' to allow all hosts.",
      "type": "string"
    },
    "connectionStrings": {
      "title": "connection string options",
      "description": "Connection string configuration. Get connection strings with the IConfiguration.GetConnectionString(string) extension method.",
      "type": "object",
      "additionalProperties": {
        "description": "Connection string configuration. Each connection string has a name specified by its JSON property name.",
        "type": "string"
      }
    },
    "NLog": {
      "title": "NLog options",
      "type": "object",
      "description": "NLog configuration",
      "default": {},
      "properties": {
        "autoReload": {
          "type": "boolean",
          "description": "Automatically reload the NLog configuration when notified that appsettings.json file has changed.",
          "default": false
        },
        "throwConfigExceptions": {
          "type": ["boolean", "null"],
          "description": "Throws an exception when there is a config error? If not set, then throwExceptions will be used for this setting.",
          "default": false
        },
        "throwExceptions": {
          "type": "boolean",
          "description": "Throws an exception when there is an error. For unit testing only and advanced troubleshooting.",
          "default": false
        },
        "internalLogLevel": {
          "type": "string",
          "description": "The minimal log level for the internal logger.",
          "enum": ["Trace", "Debug", "Info", "Warn", "Error", "Fatal", "Off"],
          "default": "Off"
        },
        "internalLogFile": {
          "type": "string",
          "description": "Write internal log to the specified filepath"
        },
        "internalLogToConsole": {
          "type": "boolean",
          "description": "Write internal log to a console",
          "default": "false"
        },
        "internalLogToConsoleError": {
          "type": "boolean",
          "description": "Write internal log to a console with error stream",
          "default": "false"
        },
        "globalThreshold": {
          "type": "string",
          "description": "Log events below this threshold are not logged.",
          "enum": ["Trace", "Debug", "Info", "Warn", "Error", "Fatal", "Off"],
          "default": "Off"
        },
        "autoShutdown": {
          "type": "boolean",
          "description": "Automatically call `LogFactory.Shutdown` on AppDomain.Unload or AppDomain.ProcessExit",
          "default": "true"
        },
        "extensions": {
          "type": "array",
          "description": "Load NLog extension packages for additional targets and layouts",
          "default": [],
          "items": {
            "title": "extension",
            "type": "object",
            "description": "",
            "default": {},
            "properties": {
              "assembly": {
                "type": "string",
                "description": "Assembly Name of the NLog extension package."
              },
              "prefix": {
                "type": "string",
                "description": "Appends prefix to all type-names loaded from the assembly",
                "default": ""
              },
              "assemblyFile": {
                "type": "string",
                "description": "Absolute filepath to the Assembly-file of the NLog extension package.",
                "default": ""
              }
            }
          }
        },
        "variables": {
          "title": "variables",
          "type": "object",
          "description": "Key-value pair of variables",
          "propertyNames": {
            "pattern": "^[A-Za-z0-9_.-]+$"
          },
          "patternProperties": {
            ".*": {
              "type": ["number", "string", "boolean"]
            }
          }
        },
        "targetDefaultWrapper": {
          "title": "default wrapper",
          "type": "object",
          "description": "Wrap all defined targets with this custom target wrapper.",
          "default": {},
          "required": ["type"],
          "properties": {
            "type": {
              "type": "string",
              "description": ""
            }
          }
        },
        "targets": {
          "title": "targets",
          "type": "object",
          "description": "",
          "default": {},
          "properties": {
            "async": {
              "type": "boolean",
              "description": "Wrap all defined targets using AsyncWrapper with OverflowAction=Discard for better performance."
            }
          }
        },
        "rules": {
          "oneOf": [
            {
              "type": "array",
              "description": "",
              "default": [],
              "items": {
                "$ref": "#/definitions/NLogRulesItem"
              }
            },
            {
              "title": "rules",
              "type": "object",
              "propertyNames": {
                "pattern": "^[0-9]+$"
              },
              "patternProperties": {
                ".*": {
                  "$ref": "#/definitions/NLogRulesItem"
                }
              }
            }
          ]
        }
      }
    },
    "NLogRulesItem": {
      "title": "NLog rule item",
      "type": "object",
      "description": "Redirect LogEvents from matching Logger objects to specified targets",
      "default": {},
      "required": ["logger"],
      "properties": {
        "logger": {
          "type": "string",
          "description": "Match Logger objects based on their Logger-name. Can use wildcard characters ('*' or '?')."
        },
        "ruleName": {
          "type": "string",
          "description": "Rule identifier to allow rule lookup with Configuration.FindRuleByName and Configuration.RemoveRuleByName."
        },
        "level": {
          "anyOf": [
            {
              "type": "string",
              "description": "",
              "enum": ["Trace", "Debug", "Info", "Warn", "Error", "Fatal"]
            },
            {
              "type": "string"
            }
          ]
        },
        "levels": {
          "type": "string",
          "description": "Comma separated list of levels that this rule matches."
        },
        "minLevel": {
          "anyOf": [
            {
              "type": "string",
              "description": "",
              "enum": ["Trace", "Debug", "Info", "Warn", "Error", "Fatal"]
            },
            {
              "type": "string"
            }
          ]
        },
        "maxLevel": {
          "anyOf": [
            {
              "type": "string",
              "description": "",
              "enum": ["Trace", "Debug", "Info", "Warn", "Error", "Fatal"]
            },
            {
              "type": "string"
            }
          ]
        },
        "finalMinLevel": {
          "anyOf": [
            {
              "type": "string",
              "description": "",
              "enum": ["Trace", "Debug", "Info", "Warn", "Error", "Fatal"]
            },
            {
              "type": "string"
            }
          ]
        },
        "writeTo": {
          "type": "string",
          "description": "Name or names of a target - separated by comma. Remove this property for sending events to the blackhole."
        },
        "final": {
          "type": "boolean",
          "description": "Ignore further rules if this one matches.",
          "default": false
        },
        "enabled": {
          "type": "boolean",
          "description": "",
          "default": true
        },
        "filters": {
          "oneOf": [
            {
              "type": "array",
              "description": "",
              "default": [],
              "items": {
                "title": "filter",
                "type": "object",
                "description": "",
                "default": {},
                "required": ["type"],
                "properties": {
                  "type": {
                    "type": "string",
                    "description": ""
                  },
                  "action": {
                    "type": "string",
                    "description": "Result action when filter matches logevent.",
                    "enum": [
                      "Neutral",
                      "Log",
                      "Ignore",
                      "LogFinal",
                      "IgnoreFinal"
                    ],
                    "default": "Neutral"
                  }
                }
              }
            },
            {
              "title": "filter",
              "type": "object",
              "description": "",
              "default": {}
            }
          ]
        },
        "filterDefaultAction": {
          "type": "string",
          "description": "Default action if none of the filters match.",
          "enum": ["Neutral", "Log", "Ignore", "LogFinal", "IgnoreFinal"],
          "default": "Ignore"
        }
      }
    },
    "umbraco": {
      "description": "Configuration of Open Source .NET CMS - Umbraco",
      "properties": {
        "CMS": {
          "title": "CMD options",
          "type": "object",
          "properties": {
            "ActiveDirectory": {
              "$ref": "#/definitions/umbracoActiveDirectory"
            },
            "Content": {
              "$ref": "#/definitions/umbracoContent"
            },
            "Debug": {
              "$ref": "#/definitions/umbracoDebug"
            },
            "Examine": {
              "properties": {
                "LuceneDirectoryFactory": {
                  "description": "Lucene directory factory type",
                  "type": "string"
                }
              }
            },
            "ExceptionFilter": {
              "properties": {
                "Disabled": {
                  "description": "Indicating whether the exception filter is disabled",
                  "type": "boolean",
                  "default": false
                }
              }
            },
            "Global": {
              "$ref": "#/definitions/umbracoGlobal"
            },
            "HealthChecks": {
              "$ref": "#/definitions/umbracoHealthChecks"
            },
            "Hosting": {
              "$ref": "#/definitions/umbracoHosting"
            },
            "Imaging": {
              "$ref": "#/definitions/umbracoImaging"
            },
            "KeepAlive": {
              "$ref": "#/definitions/umbracoKeepAlive"
            },
            "Logging": {
              "properties": {
                "MaxLogAge": {
                  "description": "Maximum age of a log file - https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
                  "type": "string",
                  "default": "1.00:00:00"
                }
              }
            },
            "ModelsBuilder": {
              "$ref": "#/definitions/umbracoModelsBuilder"
            },
            "NuCache": {
              "properties": {
                "BTreeBlockSize": {
                  "type": "integer"
                }
              }
            },
            "Plugins": {
              "properties": {
                "BrowsableFileExtensions": {
                  "description": "Allowed file extensions (including the period .) that should be accessible from the browser",
                  "type": ["string"]
                }
              }
            },
            "RequestHandler": {
              "$ref": "#/definitions/umbracoRequestHandler"
            },
            "RichTextEditor": {
              "$ref": "#/definitions/umbracoRichTextEditor"
            },
            "Runtime": {
              "properties": {
                "MaxQueryStringLength": {
                  "description": "Value for the maximum query string length",
                  "type": "integer"
                },
                "MaxRequestLength": {
                  "description": "Value for the maximum request length",
                  "type": "integer"
                }
              }
            },
            "RuntimeMinification": {
              "$ref": "#/definitions/umbracoRuntimeMinification"
            },
            "Security": {
              "$ref": "#/definitions/umbracoSecurity"
            },
            "Tours": {
              "properties": {
                "EnableTours": {
                  "description": "Indicating whether back-office tours are enabled",
                  "type": "boolean",
                  "default": true
                }
              }
            },
            "TypeFinder": {
              "properties": {
                "AssembliesAcceptingLoadExceptions": {
                  "description": "A CSV string of assemblies that accept load exceptions during type finder operations",
                  "type": "string"
                }
              }
            },
            "WebRouting": {
              "$ref": "#/definitions/umbracoWebRouting"
            },
            "Unattended": {
              "$ref": "#/definitions/umbracoUnattended"
            }
          }
        }
      },
      "required": ["CMS"]
    },
    "umbracoActiveDirectory": {
      "description": "Configuration of Active Directory for Umbraco CMS",
      "properties": {
        "Domain": {
          "type": "string",
          "description": "Active Directory Domain"
        }
      }
    },
    "umbracoContent": {
      "properties": {
        "AllowedUploadFiles": {
          "description": "Collection of file extensions without . that are allowed for upload",
          "type": ["string"]
        },
        "DisallowedUploadFiles": {
          "description": "Collection of file extensions without . that are disallowed for upload",
          "type": ["string"]
        },
        "Error404Collection": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/umbracoContentErrorPage"
          }
        },
        "Imaging": {
          "properties": {
            "AutoFillImageProperties": {
              "description": "Imaging autofill following media file upload fields",
              "properties": {
                "Alias": {
                  "default": "umbracoFile"
                },
                "ExtensionFieldAlias": {
                  "default": "umbracoExtension"
                },
                "HeightFieldAlias": {
                  "default": "umbracoHeight"
                },
                "LengthFieldAlias": {
                  "default": "umbracoBytes"
                },
                "WidthFieldAlias": {
                  "default": "umbracoWidth"
                }
              }
            },
            "ImageFileTypes": {
              "description": "Collection of accepted image file extensions",
              "type": ["string"]
            }
          }
        },
        "LoginBackgroundImage": {
          "description": "Path to the login screen background image",
          "default": "assets/img/login.jpg",
          "type": "string"
        },
        "LoginLogoImage": {
          "description": "Path to the login screen logo image",
          "default": "assets/img/application/umbraco_logo_white.svg",
          "type": "string"
        },
        "MacroErrors": {
          "description": "Macro error behaviour",
          "enum": ["Inline", "Silent", "Throw", "Content"]
        },
        "Notifications": {
          "properties": {
            "Email": {
              "description": "Email address used for notifications",
              "type": "string"
            },
            "DisableHtmlEmail": {
              "description": "Whether HTML email notifications should be disabled",
              "type": "boolean",
              "default": false
            }
          }
        },
        "PreviewBadge": {
          "description": "Preview badge mark-up",
          "type": "string"
        },
        "ResolveUrlsFromTextString": {
          "description": "URLs should be resolved from text strings",
          "type": "boolean",
          "default": false
        },
        "ShowDeprecatedPropertyEditors": {
          "description": "Deprecated property editors should be shown",
          "type": "boolean",
          "default": false
        }
      }
    },
    "umbracoContentErrorPage": {
      "properties": {
        "ContentId": {
          "description": "An int of the content",
          "type": "integer"
        },
        "ContentKey": {
          "description": "A guid of the content",
          "type": "string"
        },
        "ContentXPath": {
          "description": "An XPath query for the content",
          "type": "string"
        },
        "Culture": {
          "description": "Content culture",
          "type": "string"
        }
      }
    },
    "umbracoDebug": {
      "properties": {
        "LogIncompletedScopes": {
          "description": "Indicating whether incompleted scopes should be logged",
          "type": "boolean",
          "default": false
        },
        "DumpOnTimeoutThreadAbort": {
          "description": "Indicating whether memory dumps on thread abort should be taken",
          "type": "boolean",
          "default": false
        }
      }
    },
    "umbracoGlobal": {
      "properties": {
        "ReservedUrls": {
          "description": "CSV string of reserved URLs (must end with a comma)",
          "type": "string",
          "default": "~/config/splashes/noNodes.aspx,~/.well-known,"
        },
        "ReservedPaths": {
          "description": "CSV string of reserved paths (must end with a comma)",
          "type": "string",
          "default": "~/app_plugins/,~/install/,~/mini-profiler-resources/,~/umbraco/,"
        },
        "TimeOut": {
          "description": "Duration of timeout https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
          "type": "string",
          "default": "00:20:00"
        },
        "DefaultUILanguage": {
          "description": "Default UI language of Umbraco backoffice",
          "type": "string",
          "default": "en-US"
        },
        "HideTopLevelNodeFromPath": {
          "description": "Indicating whether to hide the top level node from the path",
          "type": "boolean",
          "default": false
        },
        "UseHttps": {
          "description": "Indicating whether HTTPS should be used",
          "type": "boolean",
          "default": false
        },
        "VersionCheckPeriod": {
          "description": "Check for new version. Period in days",
          "type": "integer",
          "default": 7
        },
        "IconsPath": {
          "description": "Path to Umbraco Icons for backoffice",
          "type": "string",
          "default": "~/umbraco/assets/icons"
        },
        "UmbracoCssPath": {
          "description": "Path to store CSS files used for website built with Umbraco",
          "type": "string",
          "default": "~/css"
        },
        "UmbracoMediaPath": {
          "description": "Path to store media files",
          "type": "string",
          "default": "~/media"
        },
        "InstallMissingDatabase": {
          "description": "Indicating whether to install the database when it is missing",
          "type": "boolean",
          "default": false
        },
        "DisableElectionForSingleServer": {
          "description": "Indicating whether to disable the election for a single server",
          "type": "boolean",
          "default": false
        },
        "NoNodesViewPath": {
          "description": "Path to view when the website built with Umbraco has no content nodes",
          "type": "string",
          "default": "~/umbraco/UmbracoWebsite/NoNodes.cshtml"
        },
        "DatabaseServerRegistrar": {
          "properties": {
            "WaitTimeBetweenCalls": {
              "description": "The amount of time to wait between calls to the database on the background thread https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "00:01:00"
            },
            "StaleServerTimeout": {
              "description": "The time span to wait before considering a server stale, after it has last been accessed https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "00:02:00"
            }
          }
        },
        "DatabaseServerMessenger": {
          "properties": {
            "MaxProcessingInstructionCount": {
              "description": "The maximum number of instructions that can be processed at startup; otherwise the server cold-boots (rebuilds its caches)",
              "type": "integer",
              "default": 1000
            },
            "TimeToRetainInstructions": {
              "description": "The time to keep instructions in the database. Records older than this number will be pruned https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "2.00:00:00"
            },
            "TimeBetweenSyncOperations": {
              "description": "The time to wait between each sync operations https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "00:00:05"
            },
            "TimeBetweenPruneOperations": {
              "description": "The time to wait between each prune operations https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "00:01:00"
            }
          }
        },
        "Smtp": {
          "properties": {
            "From": {
              "description": "Email address to use for messages",
              "type": "string"
            },
            "Host": {
              "description": "SMTP Server hostname",
              "type": "string"
            },
            "Port": {
              "description": "SMTP Server Port Number",
              "type": "integer"
            },
            "SecureSocketOptions": {
              "description": "Secure socket options for SMTP server",
              "enum": [
                "None",
                "Auto",
                "SslOnConnect",
                "StartTls",
                "StartTlsWhenAvailable"
              ],
              "default": "Auto"
            },
            "PickupDirectoryLocation": {
              "description": "SMTP pick-up directory path",
              "type": "string"
            },
            "DeliveryMethod": {
              "description": "SMTP delivery method",
              "enum": [
                "Network",
                "SpecifiedPickupDirectory",
                "PickupDirectoryFromIis"
              ],
              "default": "Network"
            },
            "Username": {
              "description": "SMTP server username",
              "type": "string"
            },
            "Password": {
              "description": "SMTP server password",
              "type": "string"
            }
          }
        }
      }
    },
    "umbracoHealthChecks": {
      "properties": {
        "DisabledChecks": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/umbracoDisabledHealthChecks"
          }
        },
        "Notification": {
          "properties": {
            "Enabled": {
              "description": "Indicating whether health check notifications are enabled",
              "type": "boolean",
              "default": false
            },
            "FirstRunTime": {
              "description": "The first run time of a healthcheck notification in crontab format",
              "type": "string"
            },
            "Period": {
              "description": "The period of the healthcheck notifications are run https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "1.00:00:00"
            },
            "NotificationMethods": {
              "title": "notification methods",
              "description": "A collection of health check notification methods that are set by their alias such as 'email'",
              "type": "object",
              "additionalProperties": {
                "title": "notification method options",
                "type": "object",
                "properties": {
                  "Enabled": {
                    "description": "Indicating whether the health check notification method is enabled",
                    "type": "boolean"
                  },
                  "Verbosity": {
                    "description": "The health check notifications reporting verbosity",
                    "enum": ["Summary", "Detailed"],
                    "default": "Summary"
                  },
                  "FailureOnly": {
                    "description": "Indicating whether the health check notifications should occur on failures only",
                    "type": "boolean",
                    "default": false
                  },
                  "Settings": {
                    "title": "options",
                    "description": "An object of Health Check Notification provider specific settings. For the email notification it uses a setting 'RecipientEmail'",
                    "type": "object"
                  }
                }
              }
            },
            "DisabledChecks": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/umbracoDisabledHealthChecks"
              }
            }
          }
        }
      }
    },
    "umbracoDisabledHealthChecks": {
      "properties": {
        "Id": {
          "description": "Guid of healthcheck to disable",
          "type": "string"
        }
      }
    },
    "umbracoHosting": {
      "properties": {
        "ApplicationVirtualPath": {
          "type": "string"
        },
        "Debug": {
          "description": "Indicating whether umbraco is running in [debug mode]",
          "type": "boolean",
          "default": false
        },
        "LocalTempStorageLocation": {
          "description": "The location of temporary files",
          "default": "Default",
          "enum": ["Default", "EnvironmentTemp"]
        }
      }
    },
    "umbracoImaging": {
      "properties": {
        "Cache": {
          "properties": {
            "BrowserMaxAge": {
              "description": "Browser image cache maximum age https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "7.00:00:00"
            },
            "CacheMaxAge": {
              "description": "Image cache maximum age https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings",
              "type": "string",
              "default": "365.00:00:00"
            },
            "CachedNameLength": {
              "description": "Length of the cached name",
              "type": "integer",
              "default": 8
            },
            "CacheFolder": {
              "description": "Location of media cache folder",
              "type": "string",
              "default": "..\\umbraco\\mediacache"
            }
          }
        },
        "Resize": {
          "properties": {
            "MaxWidth": {
              "description": "Value for the maximum resize width",
              "type": "integer",
              "default": 5000
            },
            "MaxHeight": {
              "description": "Value for the maximum resize height",
              "type": "integer",
              "default": 5000
            }
          }
        }
      }
    },
    "umbracoKeepAlive": {
      "properties": {
        "DisableKeepAliveTask": {
          "description": "Indicating whether the keep alive task is disabled",
          "type": "boolean",
          "default": false
        },
        "KeepAlivePingUrl": {
          "description": "Keep alive ping URL. {umbracoApplicationUrl} is replaced",
          "type": "string",
          "default": "{umbracoApplicationUrl}/api/keepalive/ping"
        }
      }
    },
    "umbracoRichTextEditor": {
      "properties": {
        "Commands": {
          "description": "Commands to add to the TinyMCE Richtext editor",
          "type": "array",
          "items": {
            "$ref": "#/definitions/umbracoRichTextEditorCommands"
          }
        },
        "Plugins": {
          "description": "An array of TinyMCE Plugins to load such as 'paste', 'table'",
          "type": ["string"]
        },
        "CustomConfig": {
          "title": "TinyMCE options",
          "description": "Custom configuration for TinyMCE and its plugins",
          "type": "object"
        },
        "ValidElements": {
          "description": "A CSV string of valid HTML elements in the richtext editor. Ex: iframe[*],button[class|title]",
          "type": "string"
        },
        "InvalidElements": {
          "description": "A CSV string of invalid HTML elements in the richtext editor. Ex: font",
          "type": "string"
        }
      }
    },
    "umbracoRichTextEditorCommands": {
      "properties": {
        "Name": {
          "description": "Friendly name of Richtext Editor Command",
          "type": "string"
        },
        "Alias": {
          "description": "Alias of the Richtext Editor Command",
          "type": "string"
        },
        "Mode": {
          "description": "Set how the Richtext Editor Command can be used. Such as when a selection is made",
          "enum": ["Insert", "Selection", "All"]
        }
      }
    },
    "umbracoRequestHandler": {
      "properties": {
        "AddTrailingSlash": {
          "description": "Indicating whether to add a trailing slash to URLs",
          "type": "boolean",
          "default": true
        },
        "CharCollection": {
          "description": "Character collection for replacements",
          "type": "array",
          "items": {
            "$ref": "#/definitions/umbracoCharCollection"
          }
        },
        "ConvertUrlsToAscii": {
          "description": "Indicating whether to convert URLs to ASCII (valid values: true, try or false)",
          "enum": ["try", "true", "false"],
          "default": "try"
        }
      }
    },
    "umbracoCharCollection": {
      "required": ["Char", "Replacement"],
      "properties": {
        "Char": {
          "type": "string",
          "default": "ä"
        },
        "Replacement": {
          "type": "string",
          "default": "ae"
        }
      }
    },
    "umbracoRuntimeMinification": {
      "properties": {
        "UseInMemoryCache": {
          "type": "boolean",
          "default": false
        },
        "CacheBuster": {
          "description": "Cache buster type to use",
          "enum": ["Version", "AppDomain", "Timestamp"],
          "default": "Version"
        }
      }
    },
    "umbracoSecurity": {
      "properties": {
        "AllowPasswordReset": {
          "description": "Indicating whether to allow user password reset",
          "type": "boolean",
          "default": true
        },
        "AuthCookieDomain": {
          "description": "Authorization cookie domain",
          "type": "string"
        },
        "AuthCookieName": {
          "description": "The authorization cookie name",
          "type": "string",
          "default": "UMB_UCONTEXT"
        },
        "HideDisabledUsersInBackOffice": {
          "description": "Indicating whether to hide disabled users in the back-office",
          "type": "boolean",
          "default": false
        },
        "KeepUserLoggedIn": {
          "description": "Indicating whether to keep the user logged in",
          "type": "boolean",
          "default": false
        },
        "MemberPassword": {
          "$ref": "#/definitions/umbracoMemberPassword"
        },
        "UsernameIsEmail": {
          "description": "Indicating whether the user's email address is to be considered as their username",
          "type": "boolean",
          "default": true
        },
        "UserPassword": {
          "$ref": "#/definitions/umbracoUserPassword"
        }
      }
    },
    "umbracoMemberPassword": {
      "properties": {
        "RequiredLength": {
          "type": "integer",
          "default": 10
        },
        "RequireNonLetterOrDigit": {
          "type": "boolean",
          "default": false
        },
        "RequireDigit": {
          "type": "boolean",
          "default": false
        },
        "RequireLowercase": {
          "type": "boolean",
          "default": false
        },
        "RequireUppercase": {
          "type": "boolean",
          "default": false
        },
        "MaxFailedAccessAttemptsBeforeLockout": {
          "type": "integer",
          "default": 5
        },
        "HashAlgorithmType": {
          "type": "string",
          "default": "HMACSHA256"
        }
      }
    },
    "umbracoUserPassword": {
      "properties": {
        "RequiredLength": {
          "type": "integer",
          "default": 10
        },
        "RequireNonLetterOrDigit": {
          "type": "boolean",
          "default": false
        },
        "RequireDigit": {
          "type": "boolean",
          "default": false
        },
        "RequireLowercase": {
          "type": "boolean",
          "default": false
        },
        "RequireUppercase": {
          "type": "boolean",
          "default": false
        },
        "MaxFailedAccessAttemptsBeforeLockout": {
          "type": "integer",
          "default": 5
        },
        "HashAlgorithmType": {
          "type": "string",
          "default": "PBKDF2.ASPNETCORE.V3"
        }
      }
    },
    "umbracoWebRouting": {
      "properties": {
        "TryMatchingEndpointsForAllPages": {
          "description": "Indicating whether to check if any routed endpoints match a front-end request before the Umbraco dynamic router tries to map the request to an Umbraco content item",
          "type": "boolean",
          "default": false
        },
        "TrySkipIisCustomErrors": {
          "description": "Indicating whether IIS custom errors should be skipped",
          "type": "boolean",
          "default": false
        },
        "InternalRedirectPreservesTemplate": {
          "description": "Indicating whether an internal redirect should preserve the template",
          "type": "boolean",
          "default": false
        },
        "DisableAlternativeTemplates": {
          "description": "Indicating whether the use of alternative templates are disabled",
          "type": "boolean",
          "default": false
        },
        "ValidateAlternativeTemplates": {
          "description": "Indicating whether the use of alternative templates should be validated",
          "type": "boolean",
          "default": false
        },
        "DisableFindContentByIdPath": {
          "description": "Indicating whether find content ID by path is disabled",
          "type": "boolean",
          "default": false
        },
        "DisableRedirectUrlTracking": {
          "description": "Indicating whether redirect URL tracking is disabled",
          "type": "boolean",
          "default": false
        },
        "UrlProviderMode": {
          "enum": ["Default", "Relative", "Absolute", "Auto"],
          "default": "Auto"
        },
        "UmbracoApplicationUrl": {
          "type": "string"
        }
      }
    },
    "umbracoUnattended": {
      "properties": {
        "InstallUnattended": {
          "description": "Indicating whether unattended installs are enabled",
          "type": "boolean",
          "default": false
        },
        "UpgradeUnattended": {
          "description": "Indicating whether unattended upgrades are enabled",
          "type": "boolean",
          "default": false
        },
        "UnattendedUserName": {
          "description": "Use for creating a user with a name for Unattended Installs",
          "type": "string"
        },
        "UnattendedUserEmail": {
          "description": "Use for creating a user with an email for Unattended Installs",
          "type": "string"
        },
        "UnattendedUserPassword": {
          "description": "Use for creating a user with a password for Unattended Installs",
          "type": "string"
        }
      }
    },
    "umbracoModelsBuilder": {
      "properties": {
        "ModelsMode": {
          "description": "ModelsBuilder generation mode",
          "enum": [
            "Nothing",
            "InMemoryAuto",
            "SourceCodeManual",
            "SourceCodeAuto"
          ],
          "default": "InMemoryAuto"
        },
        "ModelsNamespace": {
          "type": "string",
          "description": "Namespace to use when generating strongly typed models",
          "default": "Umbraco.Cms.Web.Common.PublishedModels"
        },
        "ModelsDirectory": {
          "type": "string",
          "description": "Location to generate ModelsBuilder models",
          "default": "~/umbraco/models"
        },
        "DebugLevel": {
          "type": "integer",
          "description": "Indicates the debug level. For internal / development use. Set to greater than zero to enable detailed logging.",
          "default": 0
        },
        "AcceptUnsafeModelsDirectory": {
          "type": "boolean",
          "description": "Indicates that the directory indicated in ModelsDirectory is allowed to be outside the website root (e.g. ~/../../some/place). Because that can be a potential security risk, it is not allowed by default.",
          "default": false
        },
        "FlagOutOfDateModels": {
          "type": "boolean",
          "description": "Indicates whether out-of-date models (i.e. after a content type or data type has been modified) should be flagged.",
          "default": true
        }
      }
    }
  },
  "id": "https://json.schemastore.org/appsettings.json",
  "patternProperties": {
    "^WebOptimizer$": {
      "$ref": "#/definitions/webOptimizer"
    },
    "^webOptimizer$": {
      "$ref": "#/definitions/webOptimizer"
    },
    "^weboptimizer$": {
      "$ref": "#/definitions/webOptimizer"
    },
    "^(cdn|Cdn)$": {
      "$ref": "#/definitions/cdn"
    },
    "^(pwa|PWA|Pwa)$": {
      "$ref": "#/definitions/pwa"
    },
    "^(ElmahIo|Elmahio|elmahIo|elmahio)$": {
      "$ref": "#/definitions/ElmahIo"
    },
    "^(nlog|Nlog|NLog)$": {
      "$ref": "#/definitions/NLog"
    },
    "^(Umbraco|umbraco)$": {
      "$ref": "#/definitions/umbraco"
    }
  },
  "properties": {
    "Kestrel": {
      "$ref": "#/definitions/kestrel"
    },
    "Logging": {
      "$ref": "#/definitions/logging"
    },
    "AllowedHosts": {
      "$ref": "#/definitions/allowedHosts"
    },
    "ConnectionStrings": {
      "$ref": "#/definitions/connectionStrings"
    }
  },
  "title": "JSON schema ASP.NET Core's appsettings.json file",
  "type": "object"
}