{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$comment": "There are other properties not listed in this schema that are added by Windows Admin Center. This includes 'target', 'origin' and 'modules'",
    "description": "JSON Schema for module of Windows Admin Center. A module is a descriptive manifest of packaged UX Extensions. These packages are installed/uninstalled together and share a common codebase.",
    "type": "object",
    "additionalProperties": false,
    "required": [
        "$schema",
        "name",
        "displayName",
        "description"
    ],
    "definitions": {
        "extensionIdentifier": {
            "description": "Defines a string identifier for an extension within a module. The pattern should be '<module name>!<extension/entrypoint name>'",
            "type": "string",
            "pattern": ".+!.+"
        },
        "resourceSchemaIdentifier": {
            "description": "Defines a schema lookup string for a schema from this manifests 'resources' section",
            "type": "string",
            "pattern": "schemas:.+"
        },
        "extensionMethodIdentifier": {
            "description": "Defines an object that describes the identity of an extension method",
            "type": "object",
            "properties": {
                "module": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                },
                "method": {
                    "type": "string"
                },
                "version": {
                    "type": "number"
                }
            }
        },
        "extensionDialogIdentifier": {
            "description": "Defines an object that describes the identity of an extension dialog",
            "type": "object",
            "properties": {
                "module": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                },
                "version": {
                    "type": "number"
                }
            }
        },
        "conditionalExpression": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "operator": {
                    "description": "The operator of the condition",
                    "type": "string",
                    "enum": [
                        "gt",
                        "ge",
                        "lt",
                        "le",
                        "eq",
                        "ne",
                        "is",
                        "not",
                        "contains",
                        "notContains",
                        "anyEq",
                        "anyNe",
                        "anyContains",
                        "anyNotContains"
                    ]
                },
                "type": {
                    "description": "The data type of value",
                    "type": "string",
                    "enum": [
                        "version",
                        "number",
                        "string",
                        "boolean",
                        "numberArray",
                        "stringArray"
                    ]
                },
                "value": {
                    "description": "The test value of the condition",
                    "oneOf": [{
                            "type": "string"
                        },
                        {
                            "type": "number"
                        },
                        {
                            "type": "boolean"
                        },
                        {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        {
                            "type": "array",
                            "items": {
                                "type": "number"
                            }
                        }
                    ]
                }
            }
        },
        "powerShellCommand": {
            "description": "Describes a PowerShell command for execution.",
            "oneOf": [{
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                        "script": {
                            "description": "A PowerShell script string. This is used in most scenarios. For JEA support, use module and command in addition to script.",
                            "type": "string"
                        }
                    },
                    "required": [
                        "script"
                    ]
                },
                {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "For JEA support, additional parameters are required to call a specific module and command.",
                    "properties": {
                        "module": {
                            "description": "The name of PowerShell module. (optional, it uses default module if not specified.)",
                            "type": "string"
                        },
                        "command": {
                            "description": "The command name in the PowerShell module to execute",
                            "type": "string"
                        },
                        "script": {
                            "description": "A PowerShell script string. This is used in most scenarios. For JEA support, use module and command in addition to script.",
                            "type": "string"
                        }
                    },
                    "required": [
                        "script",
                        "command"
                    ]
                }
            ]
        },
        "entryPointRequirements": {
            "description": "Describes the conditions under which this tool should be available. The tool will be available should any element in the array be satisfied.",
            "type": "array",
            "minItems": 1,
            "items": {
                "description": "Describes a single requirement. At least one requirement should be met for a tool to show",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "solutionIds": {
                        "description": "Determines what solutions this tool will show under when all other conditions are met",
                        "type": "array",
                        "minItems": 1,
                        "uniqueItems": true,
                        "items": {
                            "description": "The id of a solution that this tool applies too. Should be a valid extension identifier that points to a 'solution' from any module",
                            "$ref": "#/definitions/extensionIdentifier"
                        }
                    },
                    "connectionTypes": {
                        "description": "Determines what connection types this tool will show for when all other conditions are met",
                        "type": "array",
                        "minItems": 1,
                        "uniqueItems": true,
                        "items": {
                            "description": "The id of a connection type that this tool applies too",
                            "type": "string"
                        }
                    },
                    "conditions": {
                        "description": "Determine tool visibility based on a variety of conditions. All conditions in this array must be satisfied for a tool to show.",
                        "type": "array",
                        "minItems": 1,
                        "items": {
                            "type": "object",
                            "minProperties": 1,
                            "additionalProperties": false,
                            "properties": {
                                "localhost": {
                                    "description": "Checks if connection is to the localhost",
                                    "type": "boolean"
                                },
                                "installationTypes": {
                                    "description": "Checks installation type",
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "inventory": {
                                    "description": "Checks specific conditions of a servers inventory data. (Only applies to servers)",
                                    "type": "object",
                                    "additionalProperties": {
                                        "$ref": "#/definitions/conditionalExpression"
                                    }
                                },
                                "properties": {
                                    "description": "Checks specific conditions of a connections property bag.",
                                    "type": "object",
                                    "additionalProperties": {
                                        "$ref": "#/definitions/conditionalExpression"
                                    }
                                },
                                "script": {
                                    "description": "DEPRECATED. Use 'PowerShell' property instead. Checks if this a condition applies using PowerShell."
                                },
                                "powerShell": {
                                    "description": "Runs a PowerShell script to determine if the tool should show. the value result of the script should be an object similar to: { state: 'Available' | 'NotConfigured'  | 'NotSupported'; message: string; keyValuePairs: [ { name: string, value: string, type: string } ] }",
                                    "$ref": "#/definitions/powerShellCommand"
                                }
                            }
                        }
                    }
                },
                "required": [
                    "solutionIds"
                ]
            }
        },
        "propertyDescriptor": {
            "description": "A property descriptor defining a property for other extensions to reference",
            "type": "object",
            "properties": {
                "type": {
                    "type": "string",
                    "enum": [
                        "array",
                        "boolean",
                        "null",
                        "object",
                        "number",
                        "string"
                    ]
                }
            },
            "oneOf": [{
                    "additionalProperties": false,
                    "properties": {
                        "schema": {
                            "description": "A reference to a schema resource defining this property",
                            "$ref": "#/definitions/resourceSchemaIdentifier"
                        },
                        "comment": {
                            "description": "Tells other extension developers more information about this property",
                            "type": "string"
                        },
                        "required": {
                            "description": "Indicates if this field is required",
                            "type": "boolean",
                            "default": false
                        },
                        "defaultsTo": {
                            "description": "The default value of the type"
                        }
                    },
                    "required": [
                        "schema"
                    ]
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "const": "null"
                        },
                        "comment": {
                            "description": "Tells other extension developers more information about this property",
                            "type": "string"
                        },
                        "required": {
                            "description": "Indicates if this field is required",
                            "type": "boolean",
                            "default": false
                        }
                    },
                    "required": [
                        "type"
                    ]
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "const": "boolean"
                        },
                        "defaultsTo": {
                            "description": "The default value of the type",
                            "type": "boolean"
                        },
                        "comment": {
                            "description": "Tells other extension developers more information about this property",
                            "type": "string"
                        },
                        "required": {
                            "description": "Indicates if this field is required",
                            "type": "boolean",
                            "default": false
                        }
                    },
                    "required": [
                        "type"
                    ]
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "const": "number"
                        },
                        "defaultsTo": {
                            "description": "The default value of the type",
                            "type": "number"
                        },
                        "comment": {
                            "description": "Tells other extension developers more information about this property",
                            "type": "string"
                        },
                        "required": {
                            "description": "Indicates if this field is required",
                            "type": "boolean",
                            "default": false
                        }
                    },
                    "required": [
                        "type"
                    ]
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "const": "string"
                        },
                        "defaultsTo": {
                            "description": "The default value of the type",
                            "type": "string"
                        },
                        "comment": {
                            "description": "Tells other extension developers more information about this property",
                            "type": "string"
                        },
                        "required": {
                            "description": "Indicates if this field is required",
                            "type": "boolean",
                            "default": false
                        }
                    },
                    "required": [
                        "type"
                    ]
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "const": "array"
                        },
                        "items": {
                            "description": "The contract for the items in this array",
                            "$ref": "#/definitions/propertyDescriptor"
                        },
                        "defaultsTo": {
                            "description": "The default value of the type",
                            "type": "array"
                        },
                        "comment": {
                            "description": "Tells other extension developers more information about this property",
                            "type": "string"
                        },
                        "required": {
                            "description": "Indicates if this field is required",
                            "type": "boolean",
                            "default": false
                        }
                    },
                    "required": [
                        "type",
                        "items"
                    ]
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "const": "object"
                        },
                        "properties": {
                            "type": "object",
                            "additionalProperties": {
                                "$ref": "#/definitions/propertyDescriptor"
                            }
                        },
                        "defaultsTo": {
                            "description": "The default value of the type",
                            "type": "object"
                        },
                        "comment": {
                            "description": "Tells other extension developers more information about this property",
                            "type": "string"
                        },
                        "required": {
                            "description": "Indicates if this field is required",
                            "type": "boolean",
                            "default": false
                        }
                    },
                    "required": [
                        "type",
                        "properties"
                    ]
                }
            ]
        },
        "contract": {
            "description": "Describes the method contract exposed for other modules to call. When making breaking changes, make sure to use the version properties so dependent modules still work with an older contract",
            "type": "array",
            "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "version": {
                        "description": "The version of this method. Create a new version for every breaking change",
                        "type": "number"
                    },
                    "method": {
                        "description": "The name of the method",
                        "type": "string"
                    },
                    "comment": {
                        "description": "a comment describing this method to consumers",
                        "type": "string"
                    },
                    "arguments": {
                        "description": "Defines the arguments expected to be passed to this method",
                        "type": "object",
                        "additionalProperties": {
                            "$ref": "#/definitions/propertyDescriptor"
                        }
                    },
                    "returns": {
                        "description": "Defines the contract that this method will return",
                        "$ref": "#/definitions/propertyDescriptor"
                    }
                },
                "required": [
                    "method",
                    "returns"
                ]
            }
        }
    },
    "properties": {
        "$schema": {
            "type": "string"
        },
        "name": {
            "description": "The name/id of the module",
            "type": "string"
        },
        "version": {
            "description": "The version of the module that this manifest represents.",
            "type": "string"
        },
        "displayName": {
            "description": "Display name of module. This is how the user will identify your extensions for installation, uninstallation, and modification",
            "type": "string"
        },
        "description": {
            "$comment": "right know this is plain text, but could specify a markdown, a uri, etc. in the future.",
            "description": "Description of module. This should tell the user what you want them to known about your extension",
            "type": "string"
        },
        "catalog": {
            "description": "Indicating the manifest complies fully for new catalog generator format. Localization, Icon, Package Type and Dependencies are all described in the manifest.json.",
            "type": "boolean"
        },
        "icon": {
            "description": "icon url or smeIcon reference. Built in font icons can be specified using the 'sme-icon:' prefix. External icon urls can be used instead, these will be placed in a 'background-image' style property as a url. The url can be absolute or relative to the root of your module.",
            "type": "string"
        },
        "icon_catalog": {
            "description": "icon path generated by the catalog tool. Don't use this field, this is auto generated. Icon image is stored in the catalog package.",
            "type": "string"
        },
        "target": {
            "description": "The relative path to load on the file system.",
            "type": "string"
        },
        "keywords": {
            "$comment": "Not Currently Implemented",
            "description": "keywords for to identify this module when the user is browsing extensions in Windows Admin Center.",
            "type": "array",
            "items": {
                "type": "string"
            }
        },
        "powerShellModuleName": {
            "description": "The name of the PowerShell module (if it exists) that is used in this module. This is necessary for features such as show script and JEA support.",
            "type": "string"
        },
        "jea": {
            "description": "If provided, indicates that JEA is supported in this module",
            "type": "boolean"
        },
        "licenseUrl": {
            "description": "A link to the module license. This is used for modules that are distributed with a license other than the Windows Admin Center EULA",
            "type": "string"
        },
        "allowList": {
            "description": "A list of sites to allow http requests to.",
            "type": "array",
            "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "url": {
                        "description": "site to allow",
                        "type": "string"
                    }
                },
                "required": [
                    "url"
                ]
            }
        },
        "assets": {
            "description": "A list named assets that this extension makes available to other repositories",
            "type": "object",
            "additionalProperties": {
                "description": "A mapping of version strings to relative paths",
                "type": "object",
                "additionalProperties": {
                    "description": "The relative path in this module to the shared asset",
                    "type": "string"
                }
            }
        },
        "extensionTargets": {
            "description": "Defines the what can be targeted for extension by other extensions",
            "type": "array",
            "minItems": 1,
            "items": {
                "type": "object",
                "properties": {
                    "extensionTargetType": {
                        "type": "string",
                        "enum": [
                            "workerTarget"
                        ]
                    }
                },
                "$comment": "This is a complex type that pivots schema based on the  value of 'extensionTargetType'",
                "if": {
                    "properties": {
                        "extensionTargetType": {
                            "type": "string",
                            "const": "workerTarget"
                        }
                    }
                },
                "then": {
                    "$comment": "The 'workerTarget' extension target type",
                    "description": "This type provides a named target that workers entry points can extend with async functionality",
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                        "extensionTargetType": {
                            "type": "string",
                            "const": "workerTarget"
                        },
                        "experimentKeys": {
                            "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        "description": {
                            "$comment": "right know this is plain text, but could specify a markdown, a uri, etc. in the future.",
                            "description": "Description of the workerTarget. This should tell the consumer what workers who target this are expected to do.",
                            "type": "string"
                        },
                        "name": {
                            "description": "The name of this extension target. Should be unique to this modules other extension targets",
                            "type": "string"
                        },
                        "contract": {
                            "description": "The contract that is expected to be fulfilled by worker entry points that extend this target",
                            "type": "array",
                            "minItems": 1,
                            "items": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                    "version": {
                                        "description": "The version of this contract. Create a new contract for every breaking change",
                                        "type": "number"
                                    },
                                    "method": {
                                        "description": "The method name that will be called by this module on workers that extend this target",
                                        "type": "string"
                                    },
                                    "arguments": {
                                        "description": "Defines the arguments that are expected to be passed to this method when called on the worker",
                                        "type": "array",
                                        "items": {
                                            "$ref": "#/definitions/propertyDescriptor"
                                        }
                                    },
                                    "returns": {
                                        "description": "Defines what the worker method is expected to return to this module",
                                        "$ref": "#/definitions/propertyDescriptor"
                                    }
                                },
                                "required": [
                                    "method",
                                    "arguments",
                                    "returns",
                                    "version"
                                ]
                            }
                        }
                    },
                    "required": [
                        "extensionTargetType",
                        "name",
                        "description",
                        "contract"
                    ]
                },
                "else": {
                    "$comment": "This is empty for future extension target types"
                }
            }
        },
        "entryPoints": {
            "description": "Defines the individual extensions within you module including tools, solutions, and connectionProviders",
            "type": "array",
            "minItems": 1,
            "items": {
                "type": "object",
                "properties": {
                    "entryPointType": {
                        "type": "string",
                        "enum": [
                            "connectionProvider",
                            "solution",
                            "tool",
                            "settingsForm",
                            "groupProvider",
                            "worker",
                            "dialog",
                            "service",
                            "snapIn",
                            "wacCopilot",
                            "wacCopilotAngular"
                        ]
                    }
                },
                "$comment": "This is a complex type that pivots schema based on the  value of 'entryPointType'",
                "if": {
                    "properties": {
                        "entryPointType": {
                            "type": "string",
                            "const": "connectionProvider"
                        }
                    }
                },
                "then": {
                    "$comment": "The 'connectionProvider' entry point type",
                    "description": "This type provides a way to add a connection to Windows Admin Center",
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                        "entryPointType": {
                            "type": "string",
                            "const": "connectionProvider"
                        },
                        "description": {
                            "$comment": "right know this is plain text, but could specify a markdown, a uri, etc. in the future.",
                            "description": "Description of connection provider. This should tell the user what you want them to known about your connection provider.",
                            "type": "string"
                        },
                        "experimentKeys": {
                            "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        "displayName": {
                            "description": "display name of connectionProvider, This is the name of the connection type as it appears in plural situations (servers, clusters, etc..)",
                            "type": "string"
                        },
                        "icon": {
                            "description": "icon url or smeIcon reference. Built in font icons can be specified using the 'sme-icon:' prefix. External icon urls can be used instead, these will be placed in a 'background-image' style property as a url. The url can be absolute or relative to the root of your module.",
                            "type": "string"
                        },
                        "icon_catalog": {
                            "description": "icon path to the catalog package. Don't use this field, this is auto generated. The icon is stored into the catalog package.",
                            "type": "string"
                        },
                        "name": {
                            "description": "The name of this entrypoint. Should be unique to this modules other entrypoints",
                            "type": "string"
                        },
                        "path": {
                            "description": "The path relative to the modules target to get to the entrypoint. This path is used to load the 'add' experience for this connectionProvider in an iframe.",
                            "type": "string"
                        },
                        "searchBar": {
                            "description": "If true, the search bar will shown tools list for this connection provider, otherwise search bar will be hidden. Default is true.",
                            "type": "boolean"
                        },
                        "experiences": {
                            "description": "Provides the experiences to manipulate connections (add, create, destroy, etc...)",
                            "type": "object",
                            "additionalProperties": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                    "path": {
                                        "description": "The path relative to the modules target to get to the entrypoint. This path is used to load the experience in an iframe.",
                                        "type": "string"
                                    },
                                    "label": {
                                        "description": "The label to display for selecting connection type.",
                                        "type": "string"
                                    },
                                    "dialogMode": {
                                        "description": "The dialog mode to use for the dialog that contains this experience",
                                        "type": "string",
                                        "enum": [
                                            "normal",
                                            "wide",
                                            "compact",
                                            "fullscreen"
                                        ]
                                    }
                                }
                            },
                            "patternProperties": {
                                "^add$": {},
                                "^create$": {}
                            }
                        },
                        "connectionType": {
                            "description": "This is the identification for your connection type. It must be globally unique.",
                            "type": "string"
                        },
                        "connectionTypeUrlName": {
                            "description": "The friendly url name to use to reference this connection type. This must be unique among all connection types.",
                            "type": "string"
                        },
                        "connectionTypeName": {
                            "description": "This is the friendly name of your connection type in singular form (ie. Server, Cluster, etc...)",
                            "type": "string"
                        },
                        "connectionTypeDefaultSolution": {
                            "description": "The default solution with which to open the connection with",
                            "$ref": "#/definitions/extensionIdentifier"
                        },
                        "connectionStatusProvider": {
                            "description": "Defines how to get the status for this connection type",
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "powerShell": {
                                    "description": "Specifies to run a script against a node to get status. The script must accept a locale as an input. It must return an object in the form: {status: {label?: string, type:statusEnum, details?: string}} any siblings of status in the object will be stored as properties that can be alter accessed through the UX",
                                    "$ref": "#/definitions/powerShellCommand"
                                },
                                "relativeGatewayUrl": {
                                    "description": "Specifies to get the connection status from a gateway url. Relative from /api. If $connectionName is found in the url, it will be replaced with the name of the connection and return a ConnectionStatusResult",
                                    "type": "string"
                                },
                                "worker": {
                                    "description": "Specifies to get the connection status from a worker extension method. The worker method is expected to take a connection name as its only input and return a ConnectionStatusResult",
                                    "$ref": "#/definitions/extensionMethodIdentifier"
                                },
                                "service": {
                                    "description": "Specifies to get the connection status from a service extension method. The service method is expected to take a connection name as its only input and return a ConnectionStatusResult",
                                    "$ref": "#/definitions/extensionMethodIdentifier"
                                },
                                "displayValueMap": {
                                    "description": "A mapping of values to their display strings. This can be used for enums or string constants and their localized display values",
                                    "type": "object",
                                    "additionalProperties": {
                                        "type": "string",
                                        "description": "The display values for strings. Preferably resources strings"
                                    }
                                },
                                "skipStatusCheck": {
                                    "description": "Specifies to skip the connection status check",
                                    "type": "boolean"
                                }
                            }
                        },
                        "manageAsScheme": {
                            "description": "Defines how to apply manage as scenarios to this connection type",
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "configurationDialog": {
                                    "description": "Specifies to configure manage as credentials from an extension dialog",
                                    "$ref": "#/definitions/extensionDialogIdentifier"
                                },
                                "managingAsProvider": {
                                    "description": "Defines how to collect active managing as data",
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                        "worker": {
                                            "description": "Specifies to get the managing as status from a worker extension method. The worker method is expected to take a connection name as its only input and return a ManagingAsDescription",
                                            "$ref": "#/definitions/extensionMethodIdentifier"
                                        },
                                        "service": {
                                            "description": "Specifies to get the managing as status from a service extension method. The service method is expected to take a connection name as its only input and return a ManagingAsDescription",
                                            "$ref": "#/definitions/extensionMethodIdentifier"
                                        }
                                    }
                                }
                            },
                            "required": [
                                "configurationDialog",
                                "managingAsProvider"
                            ]
                        }
                    },
                    "required": [
                        "entryPointType",
                        "name",
                        "displayName",
                        "description",
                        "connectionType",
                        "connectionTypeUrlName",
                        "connectionTypeName",
                        "connectionTypeDefaultSolution"
                    ]
                },
                "else": {
                    "if": {
                        "properties": {
                            "entryPointType": {
                                "type": "string",
                                "const": "solution"
                            }
                        }
                    },
                    "then": {
                        "$comment": "The 'solution' entrypoint type",
                        "description": "This entry point type represents a launching point for top level experiences in Windows Admin Center.",
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                            "entryPointType": {
                                "type": "string",
                                "const": "solution"
                            },
                            "experimentKeys": {
                                "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "displayName": {
                                "description": "display name of module",
                                "type": "string"
                            },
                            "description": {
                                "$comment": "right know this is plain text, but could specify a markdown, a uri, etc. in the future.",
                                "description": "Description of solution. This should tell the user what you want them to known about your solution.",
                                "type": "string"
                            },
                            "urlName": {
                                "description": "The display name of the tool in the url. Must be unique among all other tools.",
                                "type": "string"
                            },
                            "icon": {
                                "description": "icon url or smeIcon reference. Absolute or relative urls ",
                                "type": "string"
                            },
                            "icon_catalog": {
                                "description": "icon path to the catalog package. Don't use this field, this is auto generated. The icon is stored into the catalog package.",
                                "type": "string"
                            },
                            "name": {
                                "description": "The name of this entrypoint. Should be unique to this modules other entrypoints",
                                "type": "string"
                            },
                            "path": {
                                "description": "Only applicable when 'rootNavigationBehavior' us set to 'path'. The path used to load this solutions experience",
                                "type": "string"
                            },
                            "rootNavigationBehavior": {
                                "description": "Defines how navigating to the root of this solution will behave. Setting this to 'path' will load this module to the 'path' property. Setting this to 'connections' will navigate instead to the connections list, customized for this solution",
                                "type": "string",
                                "enum": [
                                    "path",
                                    "connections",
                                    "tools"
                                ]
                            },
                            "connections": {
                                "description": "Only applicable when 'rootNavigationBehavior' is set to 'connections'. Describes how to customize the view of the connections list.",
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                    "header": {
                                        "description": "The title of the connections list for this solution. Optional. A default header will be provided if this field is left out",
                                        "type": "string"
                                    },
                                    "connectionTypes": {
                                        "description": "List of connections types to show in the view of the connections list",
                                        "type": "array",
                                        "minItems": 1,
                                        "items": {
                                            "description": "The id of a connection type that points to a 'connectionProvider' from any other module",
                                            "type": "string"
                                        }
                                    }
                                },
                                "required": [
                                    "connectionTypes"
                                ]
                            },
                            "tools": {
                                "description": "If provided, Configures the tools menu for this solution.",
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                    "enabled": {
                                        "description": "Enables/Disable ths tools menu",
                                        "type": "boolean"
                                    },
                                    "title": {
                                        "description": "Indicates the title to use on the tools menu",
                                        "type": "string"
                                    },
                                    "searchTitle": {
                                        "description": "Indicates the title to use on the search field of the tools menu",
                                        "type": "string"
                                    },
                                    "defaultTool": {
                                        "description": "Indicates the default tool to open if no tool is provided. Must be the name of an entrypoint within this module.",
                                        "type": "string"
                                    },
                                    "predefined": {
                                        "description": "The list of known tools that will be displayed at the first section of tool menu.",
                                        "type": "array",
                                        "minItems": 1,
                                        "uniqueItems": true,
                                        "items": {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "properties": {
                                                "id": {
                                                    "description": "The id of a tool to place in the menu. Should be a valid extension identifier that points to a 'tool' from any module",
                                                    "$ref": "#/definitions/extensionIdentifier"
                                                },
                                                "group": {
                                                    "description": "The group display name",
                                                    "type": "string"
                                                },
                                                "priority": {
                                                    "description": "The ordering priority (0 is highest)",
                                                    "minimum": 0,
                                                    "type": "number"
                                                },
                                                "settings": {
                                                    "description": "Forces this tool into the settings menu",
                                                    "type": "boolean"
                                                }
                                            },
                                            "required": [
                                                "id"
                                            ]
                                        }
                                    }
                                }
                            }
                        },
                        "if": {
                            "properties": {
                                "rootNavigationBehavior": {
                                    "const": "path"
                                }
                            }
                        },
                        "then": {
                            "required": [
                                "entryPointType",
                                "displayName",
                                "description",
                                "name",
                                "icon",
                                "rootNavigationBehavior",
                                "path"
                            ]
                        },
                        "else": {
                            "if": {
                                "properties": {
                                    "rootNavigationBehavior": {
                                        "const": "tools"
                                    }
                                }
                            },
                            "then": {
                                "required": [
                                    "entryPointType",
                                    "displayName",
                                    "description",
                                    "name",
                                    "icon",
                                    "rootNavigationBehavior",
                                    "tools"
                                ]
                            },
                            "else": {
                                "required": [
                                    "entryPointType",
                                    "displayName",
                                    "description",
                                    "name",
                                    "icon",
                                    "rootNavigationBehavior",
                                    "connections"
                                ]
                            }
                        }
                    },
                    "else": {
                        "if": {
                            "properties": {
                                "entryPointType": {
                                    "type": "string",
                                    "const": "groupProvider"
                                }
                            }
                        },
                        "then": {
                            "$comment": "The 'groupProvider' entrypoint type",
                            "description": "This entry point type represents a groupProvider for other entry points",
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "entryPointType": {
                                    "type": "string",
                                    "const": "groupProvider"
                                },
                                "experimentKeys": {
                                    "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "displayName": {
                                    "description": "Display name of the group",
                                    "type": "string"
                                },
                                "description": {
                                    "$comment": "right know this is plain text, but could specify a markdown, a uri, etc. in the future.",
                                    "description": "Description of group provider. This should tell the user what you want them to known about your group provider.",
                                    "type": "string"
                                },
                                "groupId": {
                                    "description": "The id of the group provider that the other entry points can use to specify a group",
                                    "type": "string"
                                }
                            },
                            "required": [
                                "entryPointType",
                                "description",
                                "displayName",
                                "groupId"
                            ]
                        },
                        "else": {
                            "if": {
                                "properties": {
                                    "entryPointType": {
                                        "type": "string",
                                        "const": "settingsForm"
                                    }
                                }
                            },
                            "then": {
                                "$comment": "The 'settingsForm' entrypoint type",
                                "description": "This entry point type represents a settings form item for a connection's settings page",
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                    "entryPointType": {
                                        "type": "string",
                                        "const": "settingsForm"
                                    },
                                    "experimentKeys": {
                                        "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "displayName": {
                                        "description": "Display name of the settings form",
                                        "type": "string"
                                    },
                                    "description": {
                                        "$comment": "right know this is plain text, but could specify a markdown, a uri, etc. in the future.",
                                        "description": "Description of settings form. This should tell the user what you want them to known about your settings form.",
                                        "type": "string"
                                    },
                                    "urlName": {
                                        "description": "The display name of the settings form in the url. Must be unique among all other settings forms.",
                                        "type": "string"
                                    },
                                    "icon": {
                                        "description": "icon url or smeIcon reference for the settings tab. Absolute or relative urls ",
                                        "type": "string"
                                    },
                                    "icon_catalog": {
                                        "description": "icon path to the catalog package. Don't use this field, this is auto generated. The icon is stored into the catalog package.",
                                        "type": "string"
                                    },
                                    "name": {
                                        "description": "The name of this entrypoint. Should be unique to this modules other entrypoints",
                                        "type": "string"
                                    },
                                    "groupId": {
                                        "description": "The id of the group provider that the settingsForm should be grouped under",
                                        "type": "string"
                                    },
                                    "path": {
                                        "description": "The path used to load this settings form's experience",
                                        "type": "string"
                                    },
                                    "iframeId": {
                                        "description": "The identity to share the same iframe when loaded.",
                                        "type": "string"
                                    },
                                    "keywords": {
                                        "description": "Keywords to identify this Settings when the user is searching through Settings Items in Windows Admin Center.",
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "requirements": {
                                        "$ref": "#/definitions/entryPointRequirements"
                                    }
                                },
                                "required": [
                                    "entryPointType",
                                    "displayName",
                                    "description",
                                    "name",
                                    "path",
                                    "requirements"
                                ]
                            },
                            "else": {
                                "if": {
                                    "properties": {
                                        "entryPointType": {
                                            "type": "string",
                                            "const": "worker"
                                        }
                                    }
                                },
                                "then": {
                                    "$comment": "The 'worker' entrypoint type",
                                    "description": "This entry point type represents a worker",
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                        "entryPointType": {
                                            "type": "string",
                                            "const": "worker"
                                        },
                                        "experimentKeys": {
                                            "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                                            "type": "array",
                                            "items": {
                                                "type": "string"
                                            }
                                        },
                                        "description": {
                                            "$comment": "right now this is plain text, but could specify a markdown, a uri, etc. in the future.",
                                            "description": "Description of settings form. This should tell the user what you want them to known about your settings form.",
                                            "type": "string"
                                        },
                                        "name": {
                                            "description": "The name of this entrypoint. Should be unique to this modules other entrypoints",
                                            "type": "string"
                                        },
                                        "displayName": {
                                            "description": "The display name of this entrypoint. Used for extension discovery.",
                                            "type": "string"
                                        },
                                        "path": {
                                            "description": "The path used to load this settings form's experience",
                                            "type": "string"
                                        },
                                        "lifetime": {
                                            "description": "Defines the lifetime of this worker. By default, the worker will close when the calling extension either calls 'close' or closes itself. When lifetime is set to 'long', The worker will begin independently of any other extension and run until it tells the shell it is done.",
                                            "type": "string",
                                            "enum": [
                                                "default",
                                                "long"
                                            ]
                                        },
                                        "extends": {
                                            "$comment": "When provided, the library will provide this worker to the workerTarget",
                                            "description": "Defines specific extensionTargets to provide this worker to",
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "additionalProperties": false,
                                                "properties": {
                                                    "module": {
                                                        "description": "The module to target",
                                                        "type": "string"
                                                    },
                                                    "target": {
                                                        "description": "The name of the workerTarget (within the 'module') to provide this worker to",
                                                        "type": "string"
                                                    },
                                                    "methodVersions": {
                                                        "description": "A map of method names to the versions that are implemented in this worker",
                                                        "additionalProperties": {
                                                            "type": "number"
                                                        }
                                                    }
                                                },
                                                "required": [
                                                    "module",
                                                    "target"
                                                ]
                                            }
                                        },
                                        "exposes": {
                                            "description": "Describes the method contract exposed by this worker for other modules to call. When making breaking changes, make sure to use the version properties so dependent modules still work with an older contract",
                                            "$ref": "#/definitions/contract"
                                        }
                                    },
                                    "required": [
                                        "entryPointType",
                                        "description",
                                        "name",
                                        "path"
                                    ]
                                },
                                "else": {
                                    "if": {
                                        "properties": {
                                            "entryPointType": {
                                                "type": "string",
                                                "const": "service"
                                            }
                                        }
                                    },
                                    "then": {
                                        "$comment": "The 'service' entrypoint type",
                                        "description": "This entry point type represents a service",
                                        "type": "object",
                                        "additionalProperties": false,
                                        "properties": {
                                            "entryPointType": {
                                                "type": "string",
                                                "const": "service"
                                            },
                                            "experimentKeys": {
                                                "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                                                "type": "array",
                                                "items": {
                                                    "type": "string"
                                                }
                                            },
                                            "description": {
                                                "$comment": "right now this is plain text, but could specify a markdown, a uri, etc. in the future.",
                                                "description": "Description of settings form. This should tell the user what you want them to known about your settings form.",
                                                "type": "string"
                                            },
                                            "name": {
                                                "description": "The name of this entrypoint. Should be unique to this modules other entrypoints",
                                                "type": "string"
                                            },
                                            "displayName": {
                                                "description": "The display name of this entrypoint. Used for extension discovery.",
                                                "type": "string"
                                            },
                                            "path": {
                                                "description": "The path used to load this settings form's experience",
                                                "type": "string"
                                            },
                                            "startupType": {
                                                "description": "Defines the startup type of this service. By default, the service will start on demand when it is first requested. When startup type is set to 'automatic', The service asynchronously with at application startup",
                                                "type": "string",
                                                "enum": [
                                                    "onDemand",
                                                    "automatic"
                                                ]
                                            },
                                            "cleanupType": {
                                                "description": "Defines the cleanup type of this service. By default, the service will clean up when no requests are made for a period of time, this is considered to be an 'idle' state. When cleanup type is set to 'never', The service is expected to live until the application is closed",
                                                "type": "string",
                                                "enum": [
                                                    "onIdle",
                                                    "never"
                                                ]
                                            },
                                            "exposes": {
                                                "description": "Describes the method contract exposed by this service for other modules to call. When making breaking changes, make sure to use the version properties so dependent modules still work with an older contract",
                                                "$ref": "#/definitions/contract"
                                            }
                                        },
                                        "required": [
                                            "entryPointType",
                                            "description",
                                            "name",
                                            "path"
                                        ]
                                    },
                                    "else": {
                                        "if": {
                                            "properties": {
                                                "entryPointType": {
                                                    "type": "string",
                                                    "const": "dialog"
                                                }
                                            }
                                        },
                                        "then": {
                                            "$comment": "The 'dialog' entrypoint type",
                                            "description": "This entry point type represents a dialog",
                                            "type": "object",
                                            "additionalProperties": false,
                                            "properties": {
                                                "entryPointType": {
                                                    "type": "string",
                                                    "const": "dialog"
                                                },
                                                "description": {
                                                    "$comment": "right now this is plain text, but could specify a markdown, a uri, etc. in the future.",
                                                    "description": "Description of dialog. This should tell the user what you want them to known about your dialog.",
                                                    "type": "string"
                                                },
                                                "name": {
                                                    "description": "The name of this entrypoint. Should be unique to this module's other entrypoints",
                                                    "type": "string"
                                                },
                                                "displayName": {
                                                    "description": "The display name of this entrypoint. Used for extension discovery.",
                                                    "type": "string"
                                                },
                                                "path": {
                                                    "description": "The path used to load this dialog's experience",
                                                    "type": "string"
                                                },
                                                "dialogMode": {
                                                    "description": "The dialog mode to use for the dialog on load",
                                                    "type": "string",
                                                    "enum": [
                                                        "pane",
                                                        "wide-pane",
                                                        "compact",
                                                        "compact-square",
                                                        "fullscreen",
                                                        "centered",
                                                        "centered-large"
                                                    ]
                                                },
                                                "clickBackdrop": {
                                                    "description": "Boolean to allow clicking on the backdrop to exit or not",
                                                    "type": "boolean",
                                                    "default": true
                                                },
                                                "declaration": {
                                                    "description": "Describes the method contract exposed by this worker for other modules to call. When making breaking changes, make sure to use the version properties so dependent modules still work with an older contract",
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "additionalProperties": false,
                                                        "properties": {
                                                            "version": {
                                                                "description": "The version of this dialog. Create a new version for every breaking change",
                                                                "type": "number"
                                                            },
                                                            "comment": {
                                                                "description": "a comment describing this dialog to consumers",
                                                                "type": "string"
                                                            },
                                                            "arguments": {
                                                                "description": "Defines the arguments expected to be passed to this dialog",
                                                                "type": "object",
                                                                "additionalProperties": {
                                                                    "$ref": "#/definitions/propertyDescriptor"
                                                                }
                                                            },
                                                            "returns": {
                                                                "description": "Defines the contract that this dialog will return",
                                                                "$ref": "#/definitions/propertyDescriptor"
                                                            }
                                                        },
                                                        "required": [
                                                            "returns"
                                                        ]
                                                    }
                                                }
                                            },
                                            "required": [
                                                "entryPointType",
                                                "description",
                                                "name",
                                                "path",
                                                "declaration"
                                            ]
                                        },
                                        "else": {
                                            "if": {
                                                "properties": {
                                                    "entryPointType": {
                                                        "type": "string",
                                                        "const": "snapIn"
                                                    }
                                                }
                                            },
                                            "then": {
                                                "$comment": "The 'snapIn' entrypoint type",
                                                "description": "This entry point type represents a snapIn",
                                                "type": "object",
                                                "additionalProperties": false,
                                                "properties": {
                                                    "entryPointType": {
                                                        "type": "string",
                                                        "const": "snapIn"
                                                    },
                                                    "description": {
                                                        "$comment": "right now this is plain text, but could specify a markdown, a uri, etc. in the future.",
                                                        "description": "Description of snapIn. This should tell the user what you want them to known about your snapIn.",
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "description": "The name of this entrypoint. Should be unique to this module's other entrypoints.",
                                                        "type": "string"
                                                    },
                                                    "displayName": {
                                                        "description": "The display name of this entrypoint. Used for extension discovery.",
                                                        "type": "string"
                                                    },
                                                    "path": {
                                                        "description": "The path used to load this snapIn's experience.",
                                                        "type": "string"
                                                    },
                                                    "icon": {
                                                        "description": "icon url or smeIcon reference. Absolute or relative urls.",
                                                        "type": "string"
                                                    },
                                                    "icon_catalog": {
                                                        "description": "icon path to the catalog package. Don't use this field, this is auto generated. The icon is stored into the catalog package.",
                                                        "type": "string"
                                                    },
                                                    "iconScale": {
                                                        "description": "The scale of light theme icon. (1.0 is default)",
                                                        "type": "number"
                                                    },
                                                    "darkTheme": {
                                                        "description": "The dark theme of advertisement data.",
                                                        "type": "object",
                                                        "additionalProperties": false,
                                                        "properties": {
                                                            "icon": {
                                                                "description": "The icon of dark theme.",
                                                                "type": "string"
                                                            },
                                                            "icon_catalog": {
                                                                "description": "icon path to the catalog package. Don't use this field, this is auto generated. The icon is stored into the catalog package.",
                                                                "type": "string"
                                                            },
                                                            "iconScale": {
                                                                "description": "The scale of dark theme icon. (1.0 is default)",
                                                                "type": "number"
                                                            }
                                                        },
                                                        "required": [
                                                            "icon"
                                                        ]
                                                    },
                                                    "author": {
                                                        "description": "(Optional) display name of author of the snap-in entry point.",
                                                        "type": "string"
                                                    },
                                                    "sizeConstraints": {
                                                        "minWidth": {
                                                            "description": "The minimum width of the snapIn",
                                                            "type": "number"
                                                        },
                                                        "minHeight": {
                                                            "description": "The minimum height of the snapIn",
                                                            "type": "number"
                                                        },
                                                        "maxWidth": {
                                                            "description": "The maximum width of the snapIn",
                                                            "type": "number"
                                                        },
                                                        "maxHeight": {
                                                            "description": "The maximum height of the snapIn",
                                                            "type": "number"
                                                        }
                                                    },
                                                    "interaction": {
                                                        "description": "Describes the method contract exposed by this snapIn for other modules to call. When making breaking changes, make sure to use the version properties so dependent modules still work with an older contract",
                                                        "type": "array",
                                                        "items": {
                                                            "type": "object",
                                                            "additionalProperties": false,
                                                            "properties": {
                                                                "version": {
                                                                    "description": "The version of this snapIn. Create a new version for every breaking change",
                                                                    "type": "number"
                                                                },
                                                                "comment": {
                                                                    "description": "a comment describing this snapIn to consumers",
                                                                    "type": "string"
                                                                },
                                                                "inputs": {
                                                                    "description": "Defines the arguments expected to be passed to this snapIn",
                                                                    "type": "object",
                                                                    "additionalProperties": {
                                                                        "$ref": "#/definitions/propertyDescriptor"
                                                                    }
                                                                },
                                                                "outputs": {
                                                                    "description": "Defines the contract that this snapIn will return",
                                                                    "type": "object",
                                                                    "additionalProperties": {
                                                                        "$ref": "#/definitions/propertyDescriptor"
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    },
                                                    "requirements": {
                                                        "$ref": "#/definitions/entryPointRequirements"
                                                    }
                                                },
                                                "required": [
                                                    "entryPointType",
                                                    "description",
                                                    "name",
                                                    "path",
                                                    "displayName"
                                                ]
                                            },
                                            "else": {
                                                "$comment": "The 'tool' entrypoint type",
                                                "description": "This entry point type represents a launching point for secondary experiences in Windows Admin Center.",
                                                "type": "object",
                                                "additionalProperties": false,
                                                "properties": {
                                                    "entryPointType": {
                                                        "type": "string",
                                                        "const": "tool"
                                                    },
                                                    "experimentKeys": {
                                                        "description": "The experiment keys to hide this entry point under. If provided, this entry point will not be available unless all experiment keys are turned on",
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "displayName": {
                                                        "description": "Display name of the tool",
                                                        "type": "string"
                                                    },
                                                    "urlName": {
                                                        "description": "The display name of the tool in the url. Must be unique among all other tools.",
                                                        "type": "string"
                                                    },
                                                    "description": {
                                                        "description": "Description of the tool",
                                                        "type": "string"
                                                    },
                                                    "icon": {
                                                        "description": "icon url or smeIcon reference. Absolute or relative urls ",
                                                        "type": "string"
                                                    },
                                                    "icon_catalog": {
                                                        "description": "icon path to the catalog package. Don't use this field, this is auto generated. The icon is stored into the catalog package.",
                                                        "type": "string"
                                                    },
                                                    "name": {
                                                        "description": "The name of this entrypoint. Should be unique to this modules other entrypoints",
                                                        "type": "string"
                                                    },
                                                    "path": {
                                                        "description": "The path used to load this tools experience",
                                                        "type": "string"
                                                    },
                                                    "iframeId": {
                                                        "description": "The identity to share the same iframe when loaded.",
                                                        "type": "string"
                                                    },
                                                    "keywords": {
                                                        "$comment": "Not Currently Implemented",
                                                        "description": "Keywords to identify this tool when the user is searching through installed tools in Windows Admin Center.",
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "requirements": {
                                                        "$ref": "#/definitions/entryPointRequirements"
                                                    },
                                                    "groupId": {
                                                        "description": "The id of the group provider that the settingsForm should be grouped under",
                                                        "type": "string"
                                                    }
                                                },
                                                "required": [
                                                    "entryPointType",
                                                    "displayName",
                                                    "description",
                                                    "icon",
                                                    "name",
                                                    "path",
                                                    "requirements"
                                                ]
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "schemas": {
            "description": "Schemas provided for use in this manifest. Any property descriptor in this manifest can refer to one of these schemas using this syntax: 'schemas:<schemaKey>'",
            "type": "object",
            "additionalProperties": {
                "$ref": "#/definitions/propertyDescriptor"
            }
        },
        "resources": {
            "description": "Identifies localized resources for use by this manifest.",
            "type": "array",
            "items": {
                "type": "object",
                "additionalProperties": false,
                "minItems": 19,
                "maxItems": 19,
                "uniqueItems": true,
                "properties": {
                    "locale": {
                        "description": "The local key to identify this set of resources",
                        "type": "string",
                        "enum": [
                            "default",
                            "cs-CZ",
                            "de-DE",
                            "en-US",
                            "es-ES",
                            "fr-FR",
                            "hu-HU",
                            "id-ID",
                            "it-IT",
                            "ja-JP",
                            "ko-KR",
                            "nl-NL",
                            "pl-PL",
                            "pt-BR",
                            "pt-PT",
                            "ru-RU",
                            "sv-SE",
                            "tr-TR",
                            "zh-CN",
                            "zh-TW"
                        ]
                    },
                    "strings": {
                        "description": "Strings specific to this local. Any string value in this manifest can refer to one of these localized strings using this syntx: 'resources:strings:<resource object path>'",
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    }
                },
                "required": [
                    "locale",
                    "strings"
                ]
            }
        }
    }
}
