{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "mpdev-schema.json",
  "allOf": [
    {
      "$ref": "#/definitions/Package"
    }
  ],
  "definitions": {
    "Package": {
      "type": "object",
      "description": "Common package-level details. Properties in this section will be automatically inherited by all specific packages.",
      "properties": {
        "outputTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "msi",
              "msix"
            ]
          },
          "description": "Package output types.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        },
        "msi": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiPackage"
            }
          ],
          "description": "MSI package-specific details and common value overrides.\r\nValidators:"
        },
        "msix": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsixPackage"
            }
          ],
          "description": "MSIX package-specific details and common value overrides.\r\nValidators:"
        },
        "outputDirectory": {
          "type": "string",
          "description": "Output directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "outputFileName": {
          "type": "string",
          "description": "Output file name without extension. Extension will be automatically added depending on the package being built.",
          "default": "Combined value of $.packageName $.version.$.outputType. Example - MyPackage 1.0.0.msi."
        },
        "packageName": {
          "type": "string",
          "description": "Package name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "publisher": {
          "type": "string",
          "description": "Package publisher.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid publisher - Publisher must follow \u0022Distinguished Name\u0022 format when MSIX package is built without a digital signature provided in the $.digitalSignature section.",
          "minLength": 1
        },
        "version": {
          "type": "string",
          "description": "Package version.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid version - Specific validator for the $.(msi/msix).version property. Common and MSI version must follow Major.Minor.Build.Revision format where Major cannot be 0 and Revision is optional. MSIX version must follow Major.Minor.Build.Revision format where Major cannot be 0.",
          "minLength": 1
        },
        "platform": {
          "type": "string",
          "enum": [
            "x86",
            "x64",
            "Arm",
            "Arm64",
            "Neutral"
          ],
          "description": "Package platform.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        },
        "installDir": {
          "type": "string",
          "description": "Package install directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid absolute path - Validates that the property\u0027s value is a valid absolute file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "icon": {
          "type": "string",
          "description": "Source path of an icon file used to provide the icon displayed when installing/uninstalling the package. Supported icon sources include .ico, .png, .exe, and .dll files. To select a specific icon from an .exe or .dll file, append the path with an ,index. For example: \u0022icon\u0022: \u0022C:\\\\MyPackage\\\\MyApp.exe,2\u0022.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid icon source - Validates that the property\u0027s value is a valid source from which to extract an icon. Valid sources for the property\u0027s value include .ico, .png, .exe, and .dll files.",
          "minLength": 1
        },
        "compressionLevel": {
          "type": "string",
          "enum": [
            "None",
            "Normal",
            "Min",
            "Max"
          ],
          "description": "Package compression level.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "Normal"
        },
        "fileSystemEntries": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FileSystemEntry"
              }
            ]
          },
          "description": "Directories and files in the package.\r\nValidators:"
        },
        "registries": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Registry"
              }
            ]
          },
          "description": "Registries in the package.\r\nValidators:\r\n \u2022 duplicate registry check - Validates if entries in registries array are unique by registry key and name combination."
        },
        "shortcuts": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Shortcut"
              }
            ]
          },
          "description": "Application shortcuts.\r\nValidators:\r\n \u2022 at least one msix shortcut required - At least one $.shortcuts object is required to build an MSIX package."
        },
        "urlShortcuts": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/UrlShortcut"
              }
            ]
          },
          "description": "Web url shortcuts, a.k.a files with .url extension.\r\nValidators:"
        },
        "environmentVariables": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/EnvVar"
              }
            ]
          },
          "description": "Environment variables.\r\nValidators:"
        },
        "fileAssociations": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FileAssociation"
              }
            ]
          },
          "description": "File associations.\r\nValidators:"
        },
        "contextMenu": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/ContextMenu"
              }
            ]
          },
          "description": "Context menu configuration.\r\nValidators:\r\n \u2022 digital signature required - context menu - Windows context menu extensions for MSI packages are enabled through the deployment of a sparse MSIX package that provides identity to Win32 applications. To deploy this sparse MSIX package, a digital signature is required. Therefore, this validator checks if the $.digitalSignature section is provided."
        },
        "services": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Service"
              }
            ]
          },
          "description": "Windows service applications.\r\nValidators:"
        },
        "startup": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Startup"
              }
            ]
          },
          "description": "Application startup conditions.\r\nValidators:"
        },
        "firewallExceptions": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FirewallException"
              }
            ]
          },
          "description": "Firewall exceptions.\r\nValidators:"
        },
        "digitalSignature": {
          "type": "object",
          "oneOf": [
            {
              "$ref": "#/definitions/AzureTrustedSigningSignature"
            },
            {
              "$ref": "#/definitions/TestCertificateSignature"
            },
            {
              "$ref": "#/definitions/ThumbprintSignature"
            }
          ],
          "description": "Digital signature of the package and files in the package. When this section is provided, all files with missing digital signature and following file extensions will be automatically signed during the build - .cab, .cat, .com, .dll, .exe, .js, .jse, .msi, .msp, .ocx, .ps1, .ps1xml, .psm1, .sys, .vbs, .vbe, .wsf. Supports Trusted Signing, local certificate matched by the certificate\u0027s thumbprint, or, for testing purposes, new, generated, self-signed certificate.\r\nValidators:\r\n \u2022 valid-azure-trusted-signing - When $.digitalSignature.signWith == \u0027AzureTrustedSigning\u0027, validates that it\u0027s possible to establish successful connection to Azure Trusted Signing server."
        }
      },
      "required": [
        "outputTypes"
      ],
      "allOf": [
        {
          "if": {
            "anyOf": [
              {
                "allOf": [
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  },
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msi"
                    ]
                  },
                  {
                    "properties": {
                      "msi": {
                        "not": {
                          "required": [
                            "outputDirectory"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msix"
                    ]
                  },
                  {
                    "properties": {
                      "msix": {
                        "not": {
                          "required": [
                            "outputDirectory"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            ]
          },
          "then": {
            "properties": {
              "outputDirectory": {}
            },
            "required": [
              "outputDirectory"
            ]
          }
        },
        {
          "if": {
            "anyOf": [
              {
                "allOf": [
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  },
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msi"
                    ]
                  },
                  {
                    "properties": {
                      "msi": {
                        "not": {
                          "required": [
                            "packageName"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msix"
                    ]
                  },
                  {
                    "properties": {
                      "msix": {
                        "not": {
                          "required": [
                            "packageName"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            ]
          },
          "then": {
            "properties": {
              "packageName": {}
            },
            "required": [
              "packageName"
            ]
          }
        },
        {
          "if": {
            "anyOf": [
              {
                "allOf": [
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  },
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msi"
                    ]
                  },
                  {
                    "properties": {
                      "msi": {
                        "not": {
                          "required": [
                            "publisher"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msix"
                    ]
                  },
                  {
                    "properties": {
                      "msix": {
                        "not": {
                          "required": [
                            "publisher"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            ]
          },
          "then": {
            "properties": {
              "publisher": {}
            },
            "required": [
              "publisher"
            ]
          }
        },
        {
          "if": {
            "anyOf": [
              {
                "allOf": [
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  },
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msi"
                    ]
                  },
                  {
                    "properties": {
                      "msi": {
                        "not": {
                          "required": [
                            "version"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msix"
                    ]
                  },
                  {
                    "properties": {
                      "msix": {
                        "not": {
                          "required": [
                            "version"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            ]
          },
          "then": {
            "properties": {
              "version": {}
            },
            "required": [
              "version"
            ]
          }
        },
        {
          "if": {
            "anyOf": [
              {
                "allOf": [
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  },
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msi"
                    ]
                  },
                  {
                    "properties": {
                      "msi": {
                        "not": {
                          "required": [
                            "platform"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msix"
                    ]
                  },
                  {
                    "properties": {
                      "msix": {
                        "not": {
                          "required": [
                            "platform"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            ]
          },
          "then": {
            "properties": {
              "platform": {}
            },
            "required": [
              "platform"
            ]
          }
        },
        {
          "if": {
            "anyOf": [
              {
                "allOf": [
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  },
                  {
                    "not": {
                      "required": [
                        "msi"
                      ]
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msi"
                    ]
                  },
                  {
                    "properties": {
                      "msi": {
                        "not": {
                          "required": [
                            "installDir"
                          ]
                        }
                      }
                    }
                  }
                ]
              },
              {
                "allOf": [
                  {
                    "required": [
                      "msix"
                    ]
                  },
                  {
                    "properties": {
                      "msix": {
                        "not": {
                          "required": [
                            "installDir"
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            ]
          },
          "then": {
            "properties": {
              "installDir": {}
            },
            "required": [
              "installDir"
            ]
          }
        }
      ]
    },
    "MsiPackage": {
      "type": "object",
      "description": "MSI-specific package details. This section defines fields that are specific to MSI packages and provides the ability to override common-level package details, if necessary.",
      "properties": {
        "cabName": {
          "type": "string",
          "description": "Cabinet name. Determines how the CAB file will be stored and specifies the name by which the CAB file will be referenced within the MSI file. # prefix - embedded, no prefix - outside, empty - noncompressed.",
          "default": "#Disk.cab"
        },
        "cabSizeInBytes": {
          "type": "integer",
          "description": "Size in bytes of the built cabinet file. Value is ignored for noncompressed builds.",
          "default": 314572800
        },
        "baseMsi": {
          "type": "string",
          "description": "The MSI file, which is used as the base for the built package.\r\nValidators:\r\n \u2022 valid path on disk - Validates that the property\u0027s value is a valid file path pointing to a file or directory that exists in the provided location.",
          "default": "The Default.msi file, which comes with Master Packager Dev."
        },
        "upgradeCode": {
          "type": "string",
          "description": "The upgrade code is used to search for previous versions of the product that will be uninstalled before installation. It should be the same for different versions of the same product.\r\nValidators:\r\n \u2022 valid upgrade code - Validates that upgrade code is not null or empty and is a valid GUID."
        },
        "secondaryUpgradeCodes": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/SecondaryUpgradeCode"
              }
            ]
          },
          "description": "Upgrade codes for previous product versions. This section is only required if previous product versions had different upgrade codes in past.\r\nValidators:"
        },
        "properties": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiProperty"
              }
            ]
          },
          "description": "MSI properties.\r\nValidators:"
        },
        "iniFiles": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiIniFile"
              }
            ]
          },
          "description": "MSI INI files in the package.\r\nValidators:"
        },
        "customActions": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiCustomAction"
            }
          ],
          "description": "MSI custom actions in the package.\r\nValidators:\r\n \u2022 unique custom action name - Validates that the names of all defined custom actions are unique."
        },
        "installDialog": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiInstallDialog"
            }
          ],
          "description": "MSI installation dialog customizations. If this section is not provided, installer will use the native MSI UI.\r\nValidators:"
        },
        "detectRunningProcesses": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The MSI engine will automatically detect whether any file installed by the package is currently in use by a running process. The purpose of this section is to provide an additional list of processes that need to be detected before installing the package. Each value provided in this section must be a properly formatted and escaped regular expression that will be tested against the process name and executable path. The detected processes will be displayed in the installer UI."
        },
        "packageDependencies": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiPackageDependency"
              }
            ]
          },
          "description": "MSI package dependencies.\r\nValidators:"
        },
        "updater": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiUpdater"
            }
          ],
          "description": "Configures automatic or on-demand update mechanism.\r\nValidators:\r\n \u2022 digital signature required - updater - Valid digital signature is required to run the updater. Therefore, this validator checks if the $.digitalSignature section is provided.\r\n \u2022 valid install dir - updater - Install directory ($.installDir) must be set as sub-directory of the %ProgramFiles% or %ProgramFiles(x86)% directory to enable updater for MSI packages."
        },
        "outputDirectory": {
          "type": "string",
          "description": "Output directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "outputFileName": {
          "type": "string",
          "description": "Output file name without extension. Extension will be automatically added depending on the package being built.",
          "default": "Combined value of $.packageName $.version.$.outputType. Example - MyPackage 1.0.0.msi."
        },
        "packageName": {
          "type": "string",
          "description": "Package name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "publisher": {
          "type": "string",
          "description": "Package publisher.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid publisher - Publisher must follow \u0022Distinguished Name\u0022 format when MSIX package is built without a digital signature provided in the $.digitalSignature section.",
          "minLength": 1
        },
        "version": {
          "type": "string",
          "description": "Package version.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid version - Specific validator for the $.(msi/msix).version property. Common and MSI version must follow Major.Minor.Build.Revision format where Major cannot be 0 and Revision is optional. MSIX version must follow Major.Minor.Build.Revision format where Major cannot be 0.",
          "minLength": 1
        },
        "platform": {
          "type": "string",
          "enum": [
            "x86",
            "x64",
            "Arm",
            "Arm64",
            "Neutral"
          ],
          "description": "Package platform.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        },
        "installDir": {
          "type": "string",
          "description": "Package install directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid absolute path - Validates that the property\u0027s value is a valid absolute file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "icon": {
          "type": "string",
          "description": "Source path of an icon file used to provide the icon displayed when installing/uninstalling the package. Supported icon sources include .ico, .png, .exe, and .dll files. To select a specific icon from an .exe or .dll file, append the path with an ,index. For example: \u0022icon\u0022: \u0022C:\\\\MyPackage\\\\MyApp.exe,2\u0022.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid icon source - Validates that the property\u0027s value is a valid source from which to extract an icon. Valid sources for the property\u0027s value include .ico, .png, .exe, and .dll files.",
          "minLength": 1
        },
        "compressionLevel": {
          "type": "string",
          "enum": [
            "None",
            "Normal",
            "Min",
            "Max"
          ],
          "description": "Package compression level.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "Normal"
        },
        "fileSystemEntries": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FileSystemEntry"
              }
            ]
          },
          "description": "Directories and files in the package.\r\nValidators:"
        },
        "registries": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Registry"
              }
            ]
          },
          "description": "Registries in the package.\r\nValidators:\r\n \u2022 duplicate registry check - Validates if entries in registries array are unique by registry key and name combination."
        },
        "shortcuts": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Shortcut"
              }
            ]
          },
          "description": "Application shortcuts.\r\nValidators:\r\n \u2022 at least one msix shortcut required - At least one $.shortcuts object is required to build an MSIX package."
        },
        "urlShortcuts": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/UrlShortcut"
              }
            ]
          },
          "description": "Web url shortcuts, a.k.a files with .url extension.\r\nValidators:"
        },
        "environmentVariables": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/EnvVar"
              }
            ]
          },
          "description": "Environment variables.\r\nValidators:"
        },
        "fileAssociations": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FileAssociation"
              }
            ]
          },
          "description": "File associations.\r\nValidators:"
        },
        "contextMenu": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/ContextMenu"
              }
            ]
          },
          "description": "Context menu configuration.\r\nValidators:\r\n \u2022 digital signature required - context menu - Windows context menu extensions for MSI packages are enabled through the deployment of a sparse MSIX package that provides identity to Win32 applications. To deploy this sparse MSIX package, a digital signature is required. Therefore, this validator checks if the $.digitalSignature section is provided."
        },
        "services": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Service"
              }
            ]
          },
          "description": "Windows service applications.\r\nValidators:"
        },
        "startup": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Startup"
              }
            ]
          },
          "description": "Application startup conditions.\r\nValidators:"
        },
        "firewallExceptions": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FirewallException"
              }
            ]
          },
          "description": "Firewall exceptions.\r\nValidators:"
        },
        "digitalSignature": {
          "type": "object",
          "oneOf": [
            {
              "$ref": "#/definitions/AzureTrustedSigningSignature"
            },
            {
              "$ref": "#/definitions/TestCertificateSignature"
            },
            {
              "$ref": "#/definitions/ThumbprintSignature"
            }
          ],
          "description": "Digital signature of the package and files in the package. When this section is provided, all files with missing digital signature and following file extensions will be automatically signed during the build - .cab, .cat, .com, .dll, .exe, .js, .jse, .msi, .msp, .ocx, .ps1, .ps1xml, .psm1, .sys, .vbs, .vbe, .wsf. Supports Trusted Signing, local certificate matched by the certificate\u0027s thumbprint, or, for testing purposes, new, generated, self-signed certificate.\r\nValidators:\r\n \u2022 valid-azure-trusted-signing - When $.digitalSignature.signWith == \u0027AzureTrustedSigning\u0027, validates that it\u0027s possible to establish successful connection to Azure Trusted Signing server."
        }
      }
    },
    "MsixPackage": {
      "type": "object",
      "description": "MSIX-specific package details. This section defines fields that are specific to MSIX packages and provides the ability to override common-level package details, if necessary.",
      "properties": {
        "packageDisplayName": {
          "type": "string",
          "description": "Package display name.",
          "default": "$.packageName"
        },
        "publisherDisplayName": {
          "type": "string",
          "description": "Publisher display name.",
          "default": "$.publisher"
        },
        "packageDescription": {
          "type": "string",
          "description": "Package description."
        },
        "minVersion": {
          "type": "string",
          "description": "The minimum version of the device family that your app is targeting. Used for applicability at deployment time. If the device family version of the system is lower than MinVersion, then the app is not considered applicable.\r\nValidators:\r\n \u2022 valid version - Specific validator for the $.(msi/msix).version property. Common and MSI version must follow Major.Minor.Build.Revision format where Major cannot be 0 and Revision is optional. MSIX version must follow Major.Minor.Build.Revision format where Major cannot be 0.",
          "default": "10.0.16299.0"
        },
        "maxVersionTested": {
          "type": "string",
          "description": "The maximum version of the device family that your app is targeting that you have tested it against.\r\nValidators:\r\n \u2022 valid version - Specific validator for the $.(msi/msix).version property. Common and MSI version must follow Major.Minor.Build.Revision format where Major cannot be 0 and Revision is optional. MSIX version must follow Major.Minor.Build.Revision format where Major cannot be 0.",
          "default": "10.0.26100.0"
        },
        "capabilities": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "accessoryManager",
              "allJoyn",
              "allowElevation",
              "appointments",
              "backgroundMediaPlayback",
              "blockedChatMessages",
              "chat",
              "codeGeneration",
              "contacts",
              "customInstallActions",
              "documentsLibrary",
              "enterpriseAuthentication",
              "gazeInput",
              "globalMediaControl",
              "graphicsCapture",
              "graphicsCaptureProgrammatic",
              "graphicsCaptureWithoutBorder",
              "internetClient",
              "internetClientServer",
              "lowLevelDevices",
              "musicLibrary",
              "objects3D",
              "offlineMapsManagement",
              "phoneCall",
              "phoneCallHistoryPublic",
              "picturesLibrary",
              "privateNetworkClientServer",
              "recordedCallsFolder",
              "remoteSystem",
              "removableStorage",
              "runFullTrust",
              "sharedUserCertificates",
              "spatialPerception",
              "systemManagement",
              "uiAccess",
              "unvirtualizedResources",
              "userAccountInformation",
              "userDataTasks",
              "userNotificationListener",
              "videosLibrary",
              "voipCall"
            ]
          },
          "description": "Capabilities required for the MSIX package. MPDEV will detect and add MSIX capabilities, such as localSystemServices, packagedServices, and allowElevation, based on the package content. However, not all capabilities can be automatically detected. Please use this property to specify needed capabilities. To specific device capabilities please use deviceCapabilities property instead.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated."
        },
        "deviceCapabilities": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsixDeviceCapability"
              }
            ]
          },
          "description": "Device capabilities required by the MSIX package.\r\nValidators:"
        },
        "packageDependencies": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsixPackageDependency"
              }
            ]
          },
          "description": "Dependencies on another MSIX packages that are marked as a framework packages.\r\nValidators:"
        },
        "manifest": {
          "type": "string",
          "description": "Path to the MSIX manifest. This property is optional, as MPDEV will automatically generate the manifest file based on the package contents. When provided, it will fully override the MPDEV-generated manifest file."
        },
        "allowExternalContent": {
          "type": "boolean",
          "description": "Allow external content. Used for building sparse MSIX packages.",
          "default": false
        },
        "psf": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/Psf"
            }
          ],
          "description": "Package Support Framework configuration. By default, when this section is not provided or left empty, MPDEV will attempt to automatically detect and apply necessary PSF fixups.\r\nValidators:"
        },
        "installDialog": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsixInstallDialog"
            }
          ],
          "description": "MSIX installation dialog customizations.\r\nValidators:"
        },
        "outputDirectory": {
          "type": "string",
          "description": "Output directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "outputFileName": {
          "type": "string",
          "description": "Output file name without extension. Extension will be automatically added depending on the package being built.",
          "default": "Combined value of $.packageName $.version.$.outputType. Example - MyPackage 1.0.0.msi."
        },
        "packageName": {
          "type": "string",
          "description": "Package name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "publisher": {
          "type": "string",
          "description": "Package publisher.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid publisher - Publisher must follow \u0022Distinguished Name\u0022 format when MSIX package is built without a digital signature provided in the $.digitalSignature section.",
          "minLength": 1
        },
        "version": {
          "type": "string",
          "description": "Package version.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid version - Specific validator for the $.(msi/msix).version property. Common and MSI version must follow Major.Minor.Build.Revision format where Major cannot be 0 and Revision is optional. MSIX version must follow Major.Minor.Build.Revision format where Major cannot be 0.",
          "minLength": 1
        },
        "platform": {
          "type": "string",
          "enum": [
            "x86",
            "x64",
            "Arm",
            "Arm64",
            "Neutral"
          ],
          "description": "Package platform.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        },
        "installDir": {
          "type": "string",
          "description": "Package install directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid absolute path - Validates that the property\u0027s value is a valid absolute file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "icon": {
          "type": "string",
          "description": "Source path of an icon file used to provide the icon displayed when installing/uninstalling the package. Supported icon sources include .ico, .png, .exe, and .dll files. To select a specific icon from an .exe or .dll file, append the path with an ,index. For example: \u0022icon\u0022: \u0022C:\\\\MyPackage\\\\MyApp.exe,2\u0022.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid icon source - Validates that the property\u0027s value is a valid source from which to extract an icon. Valid sources for the property\u0027s value include .ico, .png, .exe, and .dll files.",
          "minLength": 1
        },
        "compressionLevel": {
          "type": "string",
          "enum": [
            "None",
            "Normal",
            "Min",
            "Max"
          ],
          "description": "Package compression level.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "Normal"
        },
        "fileSystemEntries": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FileSystemEntry"
              }
            ]
          },
          "description": "Directories and files in the package.\r\nValidators:"
        },
        "registries": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Registry"
              }
            ]
          },
          "description": "Registries in the package.\r\nValidators:\r\n \u2022 duplicate registry check - Validates if entries in registries array are unique by registry key and name combination."
        },
        "shortcuts": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Shortcut"
              }
            ]
          },
          "description": "Application shortcuts.\r\nValidators:\r\n \u2022 at least one msix shortcut required - At least one $.shortcuts object is required to build an MSIX package."
        },
        "urlShortcuts": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/UrlShortcut"
              }
            ]
          },
          "description": "Web url shortcuts, a.k.a files with .url extension.\r\nValidators:"
        },
        "environmentVariables": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/EnvVar"
              }
            ]
          },
          "description": "Environment variables.\r\nValidators:"
        },
        "fileAssociations": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FileAssociation"
              }
            ]
          },
          "description": "File associations.\r\nValidators:"
        },
        "contextMenu": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/ContextMenu"
              }
            ]
          },
          "description": "Context menu configuration.\r\nValidators:\r\n \u2022 digital signature required - context menu - Windows context menu extensions for MSI packages are enabled through the deployment of a sparse MSIX package that provides identity to Win32 applications. To deploy this sparse MSIX package, a digital signature is required. Therefore, this validator checks if the $.digitalSignature section is provided."
        },
        "services": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Service"
              }
            ]
          },
          "description": "Windows service applications.\r\nValidators:"
        },
        "startup": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Startup"
              }
            ]
          },
          "description": "Application startup conditions.\r\nValidators:"
        },
        "firewallExceptions": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/FirewallException"
              }
            ]
          },
          "description": "Firewall exceptions.\r\nValidators:"
        },
        "digitalSignature": {
          "type": "object",
          "oneOf": [
            {
              "$ref": "#/definitions/AzureTrustedSigningSignature"
            },
            {
              "$ref": "#/definitions/TestCertificateSignature"
            },
            {
              "$ref": "#/definitions/ThumbprintSignature"
            }
          ],
          "description": "Digital signature of the package and files in the package. When this section is provided, all files with missing digital signature and following file extensions will be automatically signed during the build - .cab, .cat, .com, .dll, .exe, .js, .jse, .msi, .msp, .ocx, .ps1, .ps1xml, .psm1, .sys, .vbs, .vbe, .wsf. Supports Trusted Signing, local certificate matched by the certificate\u0027s thumbprint, or, for testing purposes, new, generated, self-signed certificate.\r\nValidators:\r\n \u2022 valid-azure-trusted-signing - When $.digitalSignature.signWith == \u0027AzureTrustedSigning\u0027, validates that it\u0027s possible to establish successful connection to Azure Trusted Signing server."
        }
      }
    },
    "FileSystemEntry": {
      "type": "object",
      "description": "File or directory included in the package. \r\n \u2022 If sourcePath is a directory, then targetPath will also be treated as a directory. The sourcePath will be recursively scanned for all files and sub-directories, which will be automatically added to the targetPath directory while preserving the original directory and file name structure.\r\n \u2022 If sourcePath is a file, then targetPath will also be treated as a file. However, you can also provide targetPath as a directory path. If targetPath ends with a \u0022\\\u0022 character, it will be considered a directory. In this case, the file name from sourcePath will be automatically appended to the targetPath.\r\n \u2022 Concrete sourcePath declarations take priority over recursively detected paths.\r\n \u2022 There are no filters to exclude files from the package, and this is intentional. Our goal is to ensure that the packaged application contains the same files and directories as were tested by the developer. Use post-build events to filter out unneeded files or declare each file individually in this section.",
      "properties": {
        "sourcePath": {
          "type": "string",
          "description": "Source path of the file or directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path on disk - Validates that the property\u0027s value is a valid file path pointing to a file or directory that exists in the provided location.",
          "minLength": 1
        },
        "targetPath": {
          "type": "string",
          "description": "Target path of the file or directory.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid absolute path - Validates that the property\u0027s value is a valid absolute file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        }
      },
      "required": [
        "sourcePath",
        "targetPath"
      ]
    },
    "Registry": {
      "type": "object",
      "description": "Windows registry included in the package.\r\n \u2022 To create a registry with a default value, do not provide a name, or set the name as null or an empty string.\r\n \u2022 Registry values for registry types other than strings follow the same format as in the output of the .reg file. For example, if a decimal 12345 DWORD value in a .reg file is dword:00003039, in the package file it must be provided as 00003039.",
      "properties": {
        "key": {
          "type": "string",
          "description": "Registry key.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid registry key - Validates that the key property\u0027s value is a valid registry key. Valid registry keys must start with: HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE,  HKEY_USERS, HKEY_CURRENT_CONFIG.",
          "minLength": 1
        },
        "name": {
          "type": "string",
          "description": "Registry name. Use null or empty name for default registry name."
        },
        "type": {
          "type": "string",
          "enum": [
            "String",
            "ExpandString",
            "Binary",
            "DWord",
            "MultiString",
            "QWord"
          ],
          "description": "Registry type.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "String"
        },
        "value": {
          "type": "string",
          "description": "Registry value as per .reg file value format."
        }
      },
      "required": [
        "key"
      ]
    },
    "Shortcut": {
      "type": "object",
      "description": "Shortcut (application in MSIX) definition.",
      "properties": {
        "target": {
          "type": "string",
          "description": "Shortcut target.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "name": {
          "type": "string",
          "description": "Shortcut name.",
          "default": "File name from the shortcut\u0027s $.target property minus the file extension."
        },
        "location": {
          "type": "string",
          "description": "Shortcut location.\r\nValidators:",
          "default": "%PROGRAMDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\ or %PROGRAMDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$.packageName if there is more than one shortcut in package."
        },
        "arguments": {
          "type": "string",
          "description": "Shortcut arguments."
        },
        "workingDirectory": {
          "type": "string",
          "description": "Shortcut working directory."
        },
        "description": {
          "type": "string",
          "description": "Shortcut description."
        },
        "icon": {
          "type": "string",
          "description": "Source path of an icon file used to provide the icon for the shortcut. Supported icon sources include .ico, .png, .exe, and .dll files. To select a specific icon from an .exe or .dll file, append the path with an ,index. For example: \u0022icon\u0022: \u0022C:\\\\MyPackage\\\\MyApp.exe,2\u0022.\r\nValidators:\r\n \u2022 valid icon source - Validates that the property\u0027s value is a valid source from which to extract an icon. Valid sources for the property\u0027s value include .ico, .png, .exe, and .dll files.",
          "default": "Icon extracted from shortcut\u0027s $.target."
        }
      },
      "required": [
        "target"
      ]
    },
    "UrlShortcut": {
      "type": "object",
      "description": "Web url shortcuts, a.k.a files with .url extension.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Url shortcut name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 unique url shortcut name - Validates that the names of all defined url shortcuts are unique.",
          "minLength": 1
        },
        "url": {
          "type": "string",
          "description": "Url shortcut target.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid http url - Validates that the property\u0027s value is a valid HTTP/HTTPS URL.",
          "minLength": 1
        },
        "location": {
          "type": "string",
          "description": "Url shortcut location.\r\nValidators:",
          "default": "%PROGRAMDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\ or %PROGRAMDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$.packageName if there is more than one shortcut in package."
        }
      },
      "required": [
        "name",
        "url"
      ]
    },
    "EnvVar": {
      "type": "object",
      "description": "Environment variable definition.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Environment variable name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "value": {
          "type": "string",
          "description": "Environment variable value.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "msi": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiEnvVarConfig"
            }
          ],
          "description": "Environment variable configuration specific to MSI packages.\r\nValidators:",
          "default": {
            "type": "System",
            "onInstall": "CreateOrUpdate",
            "onUninstall": "Remove",
            "valueAction": "AppendEnd"
          }
        }
      },
      "required": [
        "name",
        "value"
      ]
    },
    "FileAssociation": {
      "type": "object",
      "description": "File type association definition.",
      "properties": {
        "fileType": {
          "type": "string",
          "description": "File type, a.k.a, file extension without the \u0022.\u0022, for example, \u0022txt\u0022.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "executable": {
          "type": "string",
          "description": "Executable associated with the file type.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "icon": {
          "type": "string",
          "description": "Source path of an icon file used to provide the icon for the file association. Supported icon sources include .ico, .png, .exe, and .dll files. To select a specific icon from an .exe or .dll file, append the path with an ,index. For example: \u0022icon\u0022: \u0022C:\\\\MyPackage\\\\MyApp.exe,2\u0022.\r\nValidators:\r\n \u2022 valid icon source - Validates that the property\u0027s value is a valid source from which to extract an icon. Valid sources for the property\u0027s value include .ico, .png, .exe, and .dll files."
        },
        "progId": {
          "type": "string",
          "description": "Prog ID.",
          "default": "Depends on $.fileType property - \u0022$.fileType_auto_file\u0022, for example, \u0022txt_auto_file\u0022."
        },
        "verbs": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/Verb"
              }
            ]
          },
          "description": "Verbs.",
          "default": [
            {
              "name": "Open",
              "arguments": "\u0022%1\u0022"
            }
          ]
        }
      },
      "required": [
        "fileType",
        "executable"
      ]
    },
    "ContextMenu": {
      "type": "object",
      "description": "Windows context menu customizations.",
      "properties": {
        "fileType": {
          "type": "string",
          "enum": [
            "*",
            "Directory",
            "Directory\\Background"
          ],
          "description": "File type association - \u0022*\u0022, \u0022Directory\u0022 or any file extension, for example \u0022txt\u0022.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        },
        "executable": {
          "type": "string",
          "description": "Executable file to invoke via context menu.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "name": {
          "type": "string",
          "description": "Display name in the context menu.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "icon": {
          "type": "string",
          "description": "Icon displayed in the context menu. Path to this icon must be an existing file that will be available on the system after installing the package. Supported icon sources are .ico, .exe, and .dll files.\r\nValidators:\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk."
        },
        "arguments": {
          "type": "string",
          "description": "Arguments passed when invoking the executable via context menu.",
          "default": "\u0022%1\u0022"
        },
        "condition": {
          "type": "string",
          "description": "A regex expression used to evaluate the visibility of a context menu item. The expression is evaluated against the file path of the selected items for which the context menu was opened."
        }
      },
      "required": [
        "fileType",
        "executable",
        "name"
      ]
    },
    "Service": {
      "type": "object",
      "description": "Windows service application definition.",
      "properties": {
        "name": {
          "type": "string",
          "description": "String that gives the service name to install. The string has a maximum length of 256 characters. The service control manager database preserves the case of the characters in the service name, but comparisons of service names are case insensitive. Forward-slash (/) and back-slash (\\) are invalid service name characters.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 max - Value cannot have more than 256 character(s).\r\n \u2022 illegal characters - Validates that the property\u0027s value does not contain illegal characters. The list of illegal characters depends on the property being validated.",
          "minLength": 1,
          "maxLength": 256
        },
        "displayName": {
          "type": "string",
          "description": "String that user interface programs use to identify the service. The string has a maximum length of 256 characters. The service control manager preserves the case of the display name, but display name comparisons are case insensitive.\r\nValidators:\r\n \u2022 max - Value cannot have more than 256 character(s).",
          "maxLength": 256
        },
        "executable": {
          "type": "string",
          "description": "Executable path of the service within the package.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path in package - Validates that the property\u0027s value is a valid target path pointing to a file included in the package under the fileSystemEntries array.",
          "minLength": 1
        },
        "arguments": {
          "type": "string",
          "description": "Command line arguments or properties required to run the service."
        },
        "startAccount": {
          "type": "string",
          "enum": [
            "LocalSystem",
            "LocalService",
            "NetworkService"
          ],
          "description": "Name of the account under which the service is logged on. A service account can be defined as one of the following: \u0022LocalSystem\u0022, \u0022LocalService\u0022, \u0022NetworkService\u0022 or, for MSI packages only, any custom value.For MSIX packages custom service start account values are not allowed. For MSI, if $.msi.serviceType=\u0022OwnProcess\u0022 use an account name in the form: DomainName\\UserName. If the account belongs to the built-in domain it is allowed to specify .\\UserName. The \u0022LocalSystem\u0022 account must be used if the $.msi.serviceType=\u0022ShareProcess\u0022 or \u0022$.msi.interactive=true\u0022.\r\nValidators:\r\n \u2022 valid service start account - Specific validator for the $.(msi/msix).services.n.startupType property. Setting a start account that is not LocalSystem, LocalService or NetworkService is only supported by MSI packages.",
          "default": "LocalSystem"
        },
        "startupType": {
          "type": "string",
          "enum": [
            "Auto",
            "Manual",
            "Disabled"
          ],
          "description": "Specifies when to start the service.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "Auto"
        },
        "description": {
          "type": "string",
          "description": "Description for the service being configured."
        },
        "dependencies": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of service names or load ordering groups that the system must start before this service."
        },
        "msi": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiServiceConfig"
            }
          ],
          "description": "MSI package-specific Windows service application configuration.\r\nValidators:",
          "default": {
            "loadOrderGroup": null,
            "errorControl": "Normal",
            "serviceType": "OwnProcess",
            "interactive": false,
            "description": null
          }
        }
      },
      "required": [
        "name",
        "executable"
      ]
    },
    "Startup": {
      "type": "object",
      "description": "Defines application startup conditions.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "OnLogin",
            "AfterInstall"
          ],
          "description": "Startup type.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        },
        "executable": {
          "type": "string",
          "description": "Executable to invoke.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path in package - Validates that the property\u0027s value is a valid target path pointing to a file included in the package under the fileSystemEntries array.",
          "minLength": 1
        },
        "arguments": {
          "type": "string",
          "description": "Arguments for the executable."
        },
        "workingDirectory": {
          "type": "string",
          "description": "Working directory."
        }
      },
      "required": [
        "type",
        "executable"
      ]
    },
    "FirewallException": {
      "type": "object",
      "description": "Firewall exceptions.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Firewall exception name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "path": {
          "type": "string",
          "description": "Path to a file within or outside of the package.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "bound": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "in",
              "out"
            ]
          },
          "description": "Specifies whether the firewall exception should configured for inbound or outbound connections.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        },
        "profile": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "private",
              "public",
              "domain",
              "any"
            ]
          },
          "description": "Windows Firewall offers three network profiles: domain, private and public. The network profiles are used to assign rules. For example, you can allow a specific application to communicate on a private network, but not on a public network.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        },
        "protocol": {
          "type": "string",
          "enum": [
            "tcp",
            "udp",
            "any"
          ],
          "description": "Allows to specify the network protocol (such as TCP, UDP) for which you want to configure firewall rules. This enables users to control network traffic based on specific protocols.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "minLength": 1
        }
      },
      "required": [
        "name",
        "path",
        "bound",
        "profile",
        "protocol"
      ]
    },
    "AzureTrustedSigningSignature": {
      "type": "object",
      "description": "Sign with Trusted Signing (formerly Azure Code Signing). This signing method requires successful authentication against Azure Trusted Signing server. By default only EnvironmentCredential auth method is enabled. Modify $.digitalSignature.Credentials array to include other authentication methods: https://learn.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-dotnet If one auth method fails, it attempts the next one until authentication is successful. When using default EnvironmentCredential auth method, set following environment variables to provide authentication details before executing mpdev build command - AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET.",
      "properties": {
        "signWith": {
          "type": "string",
          "description": "Specifies signing method.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "const": "AzureTrustedSigning",
          "minLength": 1
        },
        "endpoint": {
          "type": "string",
          "description": "URI that aligns with the region where you created your Trusted Signing account and certificate profile.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid http url - Validates that the property\u0027s value is a valid HTTP/HTTPS URL.",
          "minLength": 1
        },
        "codeSigningAccountName": {
          "type": "string",
          "description": "Code signing account name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "certificateProfileName": {
          "type": "string",
          "description": "Certificate profile name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "correlationId": {
          "type": "string",
          "description": "Optional string value that you can provide to correlate sign requests with your own workflows, such as build identifiers or machine names."
        },
        "credentials": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "EnvironmentCredential",
              "ManagedIdentityCredential",
              "WorkloadIdentityCredential",
              "SharedTokenCacheCredential",
              "VisualStudioCredential",
              "AzureCliCredential",
              "AzurePowerShellCredential",
              "AzureDeveloperCliCredential",
              "InteractiveBrowserCredential"
            ]
          },
          "description": "Optional array of supported authentication credentials. Include one or many from: https://learn.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-dotnet\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": [
            "EnvironmentCredential"
          ]
        },
        "timestampServer": {
          "type": "string",
          "description": "Url of the timestamp server used in file signing process. Trusted Signing recommends the use of Trusted Signing\u2019s Microsoft Public RSA Time Stamping Authority: http://timestamp.acs.microsoft.com/\r\nOther commonly used time stamp servers are:\r\n \u2022 http://timestamp.comodoca.com\r\n \u2022 http://timestamp.sectigo.com\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid http url - Validates that the property\u0027s value is a valid HTTP/HTTPS URL.\r\n \u2022 valid timestamp server - Specific validator for the $.digitalSignature.timestampServer property. Validates that the property\u0027s value is a valid HTTP/HTTPS URL and returns a successful (HTTP Status 200) response.",
          "minLength": 1
        },
        "exclusions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of file path patterns as RegEx expression that will be excluded during file signing.\r\nValidators:\r\n \u2022 valid regex - Validates that the property\u0027s value is a valid regex expression."
        }
      },
      "required": [
        "signWith",
        "endpoint",
        "codeSigningAccountName",
        "certificateProfileName",
        "timestampServer"
      ]
    },
    "TestCertificateSignature": {
      "type": "object",
      "description": "Sign with a new, generated, self-signed certificate. Please note that this signing option is exclusively intended for testing purposes and should not be utilized for production applications.Certificate should be imported to Trusted Root Certification Authorities. The password is empty.",
      "properties": {
        "signWith": {
          "type": "string",
          "description": "Specifies signing method.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "const": "GenerateTestCertificate",
          "minLength": 1
        },
        "timestampServer": {
          "type": "string",
          "description": "Url of the timestamp server used in file signing process. Trusted Signing recommends the use of Trusted Signing\u2019s Microsoft Public RSA Time Stamping Authority: http://timestamp.acs.microsoft.com/\r\nOther commonly used time stamp servers are:\r\n \u2022 http://timestamp.comodoca.com\r\n \u2022 http://timestamp.sectigo.com\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid http url - Validates that the property\u0027s value is a valid HTTP/HTTPS URL.\r\n \u2022 valid timestamp server - Specific validator for the $.digitalSignature.timestampServer property. Validates that the property\u0027s value is a valid HTTP/HTTPS URL and returns a successful (HTTP Status 200) response.",
          "minLength": 1
        },
        "exclusions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of file path patterns as RegEx expression that will be excluded during file signing.\r\nValidators:\r\n \u2022 valid regex - Validates that the property\u0027s value is a valid regex expression."
        }
      },
      "required": [
        "signWith",
        "timestampServer"
      ]
    },
    "ThumbprintSignature": {
      "type": "object",
      "description": "Sign with a thumbprint of a valid, active certificate with a private key, which is imported into the Personal certificate store. The certificate\u0027s thumbprint can be found by checking the properties of the certificate file or, when it\u0027s imported, in certmgr.exe app.",
      "properties": {
        "signWith": {
          "type": "string",
          "description": "Specifies signing method.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "const": "Thumbprint",
          "minLength": 1
        },
        "thumbprint": {
          "type": "string",
          "description": "Certificate\u0027s thumbprint.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid thumbprint - Specific validator for the $.digitalSignature.thumbprint property. Validates that the property\u0027s value is a thumbprint of a valid, active certificate with a private key, which is imported into the Personal certificate store.",
          "minLength": 1
        },
        "timestampServer": {
          "type": "string",
          "description": "Url of the timestamp server used in file signing process. Trusted Signing recommends the use of Trusted Signing\u2019s Microsoft Public RSA Time Stamping Authority: http://timestamp.acs.microsoft.com/\r\nOther commonly used time stamp servers are:\r\n \u2022 http://timestamp.comodoca.com\r\n \u2022 http://timestamp.sectigo.com\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid http url - Validates that the property\u0027s value is a valid HTTP/HTTPS URL.\r\n \u2022 valid timestamp server - Specific validator for the $.digitalSignature.timestampServer property. Validates that the property\u0027s value is a valid HTTP/HTTPS URL and returns a successful (HTTP Status 200) response.",
          "minLength": 1
        },
        "exclusions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of file path patterns as RegEx expression that will be excluded during file signing.\r\nValidators:\r\n \u2022 valid regex - Validates that the property\u0027s value is a valid regex expression."
        }
      },
      "required": [
        "signWith",
        "thumbprint",
        "timestampServer"
      ]
    },
    "SecondaryUpgradeCode": {
      "type": "object",
      "description": "Upgrade codes for previous product versions. This section is only required if previous product versions had different upgrade codes in past.",
      "properties": {
        "upgradeCode": {
          "type": "string",
          "description": "Upgrade code for previous product version.\r\nValidators:\r\n \u2022 valid upgrade code - Validates that upgrade code is not null or empty and is a valid GUID.\r\n \u2022 unique upgrade code - Upgrade code in $.msi.upgradeCode and $.msi.secondaryUpgradeCodes.n.upgradeCode must be unique."
        },
        "version": {
          "type": "string",
          "description": "Previous product version.\r\nValidators:\r\n \u2022 valid upgrade version - The version must follow the following format: Major.Minor.Build. The first field is the major version and has a maximum value of 255. The second field is the minor version and has a maximum value of 255. The third field is called the build version or the update version and has a maximum value of 65,535.",
          "default": "Current package version taken from $.version property."
        }
      }
    },
    "MsiProperty": {
      "type": "object",
      "description": "MSI property definition.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Property name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "value": {
          "type": "string",
          "description": "Property value. Optional when $.saveOnRepair is set as true.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "saveOnRepair": {
          "type": "boolean",
          "description": "Save on repair.",
          "default": false
        }
      },
      "required": [
        "name"
      ]
    },
    "MsiIniFile": {
      "type": "object",
      "description": "MSI INI file included in the package. Creates new INI file or overrides existing INI file entries included in the $.fileSystemEntries section.",
      "properties": {
        "targetPath": {
          "type": "string",
          "description": "Target path of the INI file in the package.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.",
          "minLength": 1
        },
        "sections": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiIniFileSection"
              }
            ]
          },
          "description": "INI file sections.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        }
      },
      "required": [
        "targetPath",
        "sections"
      ]
    },
    "MsiCustomAction": {
      "type": "object",
      "description": "Defines different types of MSI custom actions.",
      "properties": {
        "exe": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiCustomActionExe"
              }
            ]
          },
          "description": "MSI custom actions with executable files.\r\nValidators:"
        },
        "dll": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiCustomActionDll"
              }
            ]
          },
          "description": "MSI custom actions with DLL files.\r\nValidators:"
        },
        "registerDll": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiCustomActionRegisterDll"
              }
            ]
          },
          "description": "MSI custom actions that register a DLL with regsvr32 executable.\r\nValidators:"
        },
        "powershell": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiCustomActionPowershell"
              }
            ]
          },
          "description": "MSI custom actions with Powershell files.\r\nValidators:"
        },
        "installDriver": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiCustomActionInstallDriver"
              }
            ]
          },
          "description": "MSI custom actions with driver files.\r\nValidators:"
        },
        "setProperty": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiCustomActionSetProperty"
              }
            ]
          },
          "description": "MSI custom actions that allows to set conditional properties.\r\nValidators:"
        }
      }
    },
    "MsiInstallDialog": {
      "type": "object",
      "description": "Install/repair/uninstall dialog customizations.",
      "properties": {
        "packageDescription": {
          "type": "string",
          "description": "Package description. Will be displayed in the main page of the install dialog."
        },
        "publisherUrl": {
          "type": "string",
          "description": "Publisher url, for example, http url to companies website. Will be displayed in the main page of the install dialog."
        },
        "releaseNotesUrl": {
          "type": "string",
          "description": "Release notes url. Will be displayed in the main page of the install dialog."
        },
        "eulaUrl": {
          "type": "string",
          "description": "EULA url. Will be displayed in the main page of the install dialog."
        },
        "primaryAccent": {
          "type": "string",
          "description": "Primary accent color code as Hex RGB, for example, #B2DB9F."
        },
        "promptAppsAfterInstall": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiPromptAppsAfterInstall"
              }
            ]
          },
          "description": "Apps that will be displayed for the user to select and launch after a successful installation.\r\nValidators:"
        }
      }
    },
    "MsiPackageDependency": {
      "type": "object",
      "description": "MSI package dependency. Dependencies will be automatically detected before attempting to install the package. The default detection mechanism will read all applications under the HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall and HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall registry keys. It will then match the DisplayValue from the registry against the $.namePattern regex pattern and validate whether the DisplayVersion is the same or higher than $.minVersion. Custom dependency detection logic can be enabled by providing a PowerShell script under the $.detectionScript property. To completely bypass dependency detection, set the MP_SKIPDEPCHECK=1 property when launching the installer.",
      "properties": {
        "displayName": {
          "type": "string",
          "description": "Dependency display name. Will be displayed in the installer UI and logs.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "namePattern": {
          "type": "string",
          "description": "Dependency name search pattern. Must be a valid regex expression.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "minVersion": {
          "type": "string",
          "description": "Minimum version of the dependency."
        },
        "detectionScript": {
          "type": "string",
          "description": "Custom PowerShell script for dependency detection. Overrides the default detection mechanism. The script will receive values of $.name, $.displayName, $.minVersion, $.optional properties as arguments and should return true/false value in response where true means the dependency was detected on the machine, and false otherwise.\r\nValidators:\r\n \u2022 valid path on disk - Validates that the property\u0027s value is a valid file path pointing to a file or directory that exists in the provided location."
        },
        "install": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiPackageDependencyInstall"
            }
          ],
          "description": "This section defines how to install missing dependencies. If left empty, the main package will fail installation when a missing dependency is detected. When provided, dependencies will only get installed when launching the installer in Full (/qf) or Reduced (/qr) UI modes. In Basic (/qb) or Silent (/qn) install modes, dependencies will be checked, but not installed.\r\nValidators:"
        }
      },
      "required": [
        "displayName",
        "namePattern"
      ]
    },
    "MsiUpdater": {
      "type": "object",
      "description": "Configures automatic or on-demand update mechanism. Updater is registered as a system service and runs elevated, allowing non-elevated users to receive updates without needing to request elevation. Updates can be scheduled silently at specific intervals or when the application is launched. Updater requires a valid digital signature specified in the $.digitalSignature section and a GET API over HTTPS that provides information from where to download and how to validate latest version of the application.The update process will fail if digital signature on updater executable and installer file does not match.Install directory ($.installDir) must be set as sub-directory of the %ProgramFiles% or %ProgramFiles(x86)% directory to enable updater for MSI packages.",
      "properties": {
        "serviceName": {
          "type": "string",
          "description": "Name of the service.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "serviceDisplayName": {
          "type": "string",
          "description": "Display name of the service."
        },
        "serviceDescription": {
          "type": "string",
          "description": "Description of the service."
        },
        "latestVersionDescriptor": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiUpdaterLatestVersionDescriptor"
            }
          ],
          "description": "Describes retrieval and parsing of the latest available version metadata.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        },
        "scheduling": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiUpdaterScheduling"
            }
          ],
          "description": "Update scheduling configuration.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        },
        "notifications": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiUpdaterNotifications"
            }
          ],
          "description": "Update notification configuration.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        },
        "logging": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiUpdaterLogging"
            }
          ],
          "description": "Logging configuration.\r\nValidators:",
          "default": {
            "installerLogsRetentionDays": 30
          }
        }
      },
      "required": [
        "serviceName",
        "latestVersionDescriptor",
        "scheduling",
        "notifications"
      ]
    },
    "MsixDeviceCapability": {
      "type": "object",
      "description": "Defines device capability required by the MSIX package to function properly.",
      "properties": {
        "name": {
          "type": "string",
          "enum": [
            "activity",
            "bluetooth",
            "humaninterfacedevice",
            "location",
            "lowLevel",
            "microphone",
            "optical",
            "pointOfService",
            "proximity",
            "radios",
            "serialcommunication",
            "usb",
            "webcam",
            "wiFiControl"
          ],
          "description": "The name of the device capability, either specified as a friendly name or a device interface class GUID.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        },
        "devices": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsixDevice"
              }
            ]
          },
          "description": "Declares a function for a device that is associated with the device capability.\r\nValidators:\r\n \u2022 max - Array cannot have more than 1000 item(s).",
          "maxItems": 1000
        }
      },
      "required": [
        "name"
      ]
    },
    "MsixPackageDependency": {
      "type": "object",
      "description": "Dependency on another MSIX package that is marked as a framework package.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name as it appears in the Name attribute of the Identity element of the dependency package.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value must have at least 3 character(s).\r\n \u2022 max - Value cannot have more than 50 character(s).\r\n \u2022 unique name - MSIX package dependency names must be unique.",
          "minLength": 3,
          "maxLength": 50
        },
        "publisher": {
          "type": "string",
          "description": "The publisher as it appears in the Publisher attribute of the Identity element of the dependency package.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 max - Value cannot have more than 8192 character(s).\r\n \u2022 valid distinguished names - Validates that value is provided in a valid Distinguished Names format (RFC-1779).",
          "minLength": 1,
          "maxLength": 8192
        },
        "minVersion": {
          "type": "string",
          "description": "The minimum version of the dependency package.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid version - Specific validator for the $.(msi/msix).version property. Common and MSI version must follow Major.Minor.Build.Revision format where Major cannot be 0 and Revision is optional. MSIX version must follow Major.Minor.Build.Revision format where Major cannot be 0.",
          "minLength": 1
        }
      },
      "required": [
        "name",
        "publisher",
        "minVersion"
      ]
    },
    "Psf": {
      "type": "object",
      "description": "https://learn.microsoft.com/en-us/windows/msix/psf/package-support-framework configuration. Please note that if your application (files provided in $.fileSystemEntries or $.msix.fileSystemEntries sections) already contains a file named config.json, the PSF framework will not be enabled.",
      "properties": {
        "disable": {
          "type": "boolean",
          "description": "Indicates if usage of Package Support Framework must be disabled.",
          "default": false
        },
        "configFile": {
          "type": "string",
          "description": "MPDEV will attempt to automatically detect and apply necessary application fixups; however, not all fixups can be identified automatically. This property allows you to supply a custom PSF config file and automatically detected fixups will be ignored.\r\nValidators:\r\n \u2022 valid path on disk - Validates that the property\u0027s value is a valid file path pointing to a file or directory that exists in the provided location."
        }
      }
    },
    "MsixInstallDialog": {
      "type": "object",
      "description": "MSIX install/repair/uninstall dialog customizations.",
      "properties": {
        "primaryAccent": {
          "type": "string",
          "description": "Primary accent color code as Hex RGB, for example, #B2DB9F."
        },
        "appInstallerDataFilePath": {
          "type": "string",
          "description": "A valid path to a custom MSIXAppInstallerData.xml file. When this path is set, default MPDEV installer UI and the values of $.primaryAccent and $.eulaUrl will be ignored. https://learn.microsoft.com/en-us/windows/msix/app-installer/how-to-create-custom-app-installer-ux#create-your-custom-msixappinstallerdataxml-file\r\nValidators:\r\n \u2022 valid path on disk - Validates that the property\u0027s value is a valid file path pointing to a file or directory that exists in the provided location."
        }
      }
    },
    "MsiEnvVarConfig": {
      "type": "object",
      "description": "MSI package-specific environment variable configuration.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "System",
            "User"
          ],
          "description": "Environment variable type.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "System"
        },
        "onInstall": {
          "type": "string",
          "enum": [
            "Create",
            "CreateOrUpdate",
            "Remove"
          ],
          "description": "Actions taken with environment variable during MSI package installation.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "CreateOrUpdate"
        },
        "onUninstall": {
          "type": "string",
          "enum": [
            "Remove",
            "Keep"
          ],
          "description": "Actions taken with environment variable during MSI package uninstallation.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "Remove"
        },
        "valueAction": {
          "type": "string",
          "enum": [
            "Replace",
            "AppendStart",
            "AppendEnd"
          ],
          "description": "Actions taken with an existing environment variable during MSI package installation.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "AppendEnd"
        }
      }
    },
    "Verb": {
      "type": "object",
      "description": "Verb definition.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Verb name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "arguments": {
          "type": "string",
          "description": "Verb arguments."
        }
      },
      "required": [
        "name"
      ]
    },
    "MsiServiceConfig": {
      "type": "object",
      "description": "MSI package-specific Windows service application configuration.",
      "properties": {
        "loadOrderGroup": {
          "type": "string",
          "description": "Load ordering group to which this service belongs."
        },
        "errorControl": {
          "type": "string",
          "enum": [
            "Ignore",
            "Normal",
            "Critical"
          ],
          "description": "Action taken by the startup program if the service fails to start during startup.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "Normal"
        },
        "serviceType": {
          "type": "string",
          "enum": [
            "OwnProcess",
            "ShareProcess"
          ],
          "description": "Specifies whether the service runs in its own process or shares a process with other services.\r\nValidators:\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "OwnProcess"
        },
        "interactive": {
          "type": "boolean",
          "description": "Additional property to specify the service type. Indicates whether the service interacts with the desktop. It can be used in conjunction with any value of the $.serviceType field. The $.startAccount must be set to \u0022LocalSystem\u0022 when using this flag.",
          "default": false
        },
        "startAccountPassword": {
          "type": "string",
          "description": "Password to the account name specified in the $.startAccount property.\r\nValidators:\r\n \u2022 valid start account password - Specific validator for the $.(msi).services.n.msi.startAccountPassword property. Start account password cannot be set when startAccount is LocalSystem, LocalService or NetworkService. Use custom start account value instead."
        }
      }
    },
    "MsiIniFileSection": {
      "type": "object",
      "description": "MSI INI file section definition.",
      "properties": {
        "section": {
          "type": "string",
          "description": "Section name in the INI file.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "values": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsiIniFileValue"
              }
            ]
          },
          "description": "Key-value pairs in the INI file, within this section.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        }
      },
      "required": [
        "section",
        "values"
      ]
    },
    "MsiCustomActionExe": {
      "type": "object",
      "description": "Defines an MSI custom action that triggers the execution of an executable file at particular stage of the installation.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the custom action.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "filePath": {
          "type": "string",
          "description": "Path to the executable file\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path - Validates that the property\u0027s value is a valid file system path and does not contain any illegal characters. This validator does not check the entry\u0027s existence on disk.\r\n \u2022 valid file type - Validates that the provided value is a file path with a specific file type.",
          "minLength": 1
        },
        "arguments": {
          "type": "string",
          "description": "Arguments provided when invoking the executable file."
        },
        "condition": {
          "type": "string",
          "description": "Custom action invocation condition. Some common conditions are: \r\n \u2022 Awalys execute - null or empty.\r\n \u2022 During installation - NOT Installed\r\n \u2022 During repair - Installed and NOT REMOVE\r\n \u2022 During uninstallation - REMOVE~=\u0022ALL\u0022\r\n \u2022 Windows 10 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 Windows 11 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 x86 OS - NOT VersionNT64\r\n \u2022 x64 OS - VersionNT64\r\nFor more information on MSI conditions, please refer to the  https://learn.microsoft.com/en-us/windows/win32/msi/conditional-statement-syntax guidelines."
        },
        "sequence": {
          "type": "string",
          "anyOf": [
            {
              "enum": [
                "StartOfExecution",
                "EndOfExecution"
              ]
            },
            {
              "pattern": "^-?[0-9]\u002B$"
            }
          ],
          "description": "Execution sequence of the custom action. This property accepts 3 types of values:\r\n \u2022 StartOfExecution - Custom action will be executed at the start of the installation process, before the install/uninstall/repair operations take place.\r\n \u2022 EndOfExecution -  Custom action will be executed at the end of the installation process, after the install/uninstall/repair operations have taken place.\r\n \u2022 Any short integer (-32768/32768) - Sequence value can be any short integer. The custom action will be executed at the specified sequence.\r\nValidators:\r\n \u2022 valid custom action sequence - Validates that the value of the property is either equal to a StartOfExecution or EndOfExecution string, or any short integer value (-32768 to 32768).",
          "default": "EndOfExecution"
        },
        "continueOnError": {
          "type": "boolean",
          "description": "Specifies whether the installation should proceed in case an error occurs during the execution of the custom action.",
          "default": false
        }
      },
      "required": [
        "name",
        "filePath"
      ]
    },
    "MsiCustomActionDll": {
      "type": "object",
      "description": "Defines an MSI custom action that triggers the execution of a DLL file at particular stage of the installation.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the custom action.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "filePath": {
          "type": "string",
          "description": "Path to the DLL file.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path on disk - Validates that the property\u0027s value is a valid file path pointing to a file or directory that exists in the provided location.\r\n \u2022 valid file type - Validates that the provided value is a file path with a specific file type.",
          "minLength": 1
        },
        "entryPoint": {
          "type": "string",
          "description": "DLL entry point. Value must match the name of the exported function in the DLL."
        },
        "arguments": {
          "type": "string",
          "description": "Arguments provided when invoking the executable file."
        },
        "condition": {
          "type": "string",
          "description": "Custom action invocation condition. Some common conditions are: \r\n \u2022 Awalys execute - null or empty.\r\n \u2022 During installation - NOT Installed\r\n \u2022 During repair - Installed and NOT REMOVE\r\n \u2022 During uninstallation - REMOVE~=\u0022ALL\u0022\r\n \u2022 Windows 10 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 Windows 11 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 x86 OS - NOT VersionNT64\r\n \u2022 x64 OS - VersionNT64\r\nFor more information on MSI conditions, please refer to the https://learn.microsoft.com/en-us/windows/win32/msi/conditional-statement-syntax guidelines."
        },
        "sequence": {
          "type": "string",
          "anyOf": [
            {
              "enum": [
                "StartOfExecution",
                "EndOfExecution"
              ]
            },
            {
              "pattern": "^-?[0-9]\u002B$"
            }
          ],
          "description": "Execution sequence of the custom action. This property accepts 3 types of values:\r\n \u2022 StartOfExecution - Custom action will be executed at the start of the installation process, before the install/uninstall/repair operations take place.\r\n \u2022 EndOfExecution -  Custom action will be executed at the end of the installation process, after the install/uninstall/repair operations have taken place.\r\n \u2022 Any short integer (-32768/32768) - Sequence value can be any short integer. The custom action will be executed at the specified sequence.\r\nValidators:\r\n \u2022 valid custom action sequence - Validates that the value of the property is either equal to a StartOfExecution or EndOfExecution string, or any short integer value (-32768 to 32768).",
          "default": "EndOfExecution"
        },
        "continueOnError": {
          "type": "boolean",
          "description": "Specifies whether the installation should proceed in case an error occurs during the execution of the custom action.",
          "default": false
        }
      },
      "required": [
        "name",
        "filePath"
      ]
    },
    "MsiCustomActionRegisterDll": {
      "type": "object",
      "description": "Defines an MSI custom action, that registers a DLL with regsvr32 executable.",
      "properties": {
        "filePath": {
          "type": "string",
          "description": "Path to a DLL that must be registered when a package is installed.\r\nValidators:\r\n \u2022 valid path in package - Validates that the property\u0027s value is a valid target path pointing to a file included in the package under the fileSystemEntries array.\r\n \u2022 valid file type - Validates that the provided value is a file path with a specific file type."
        },
        "unregisterOnUninstall": {
          "type": "boolean",
          "description": "Indicates if DLL must be unregistered when the package is uninstalled.",
          "default": true
        }
      }
    },
    "MsiCustomActionPowershell": {
      "type": "object",
      "description": "Defines an MSI custom action that triggers the execution of a Powershell file at particular stage of the installation.",
      "properties": {
        "filePath": {
          "type": "string",
          "description": "Path to the .ps1 file in package. This path is the source path and must exist on a disk before building the MSI package, as the contents of the script file will be embedded into the MSI.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path on disk - Validates that the property\u0027s value is a valid file path pointing to a file or directory that exists in the provided location.\r\n \u2022 valid file type - Validates that the provided value is a file path with a specific file type.",
          "minLength": 1
        },
        "condition": {
          "type": "string",
          "description": "Custom action invocation condition. Some common conditions are: \r\n \u2022 Awalys execute - null or empty.\r\n \u2022 During installation - NOT Installed\r\n \u2022 During repair - Installed and NOT REMOVE\r\n \u2022 During uninstallation - REMOVE~=\u0022ALL\u0022\r\n \u2022 Windows 10 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 Windows 11 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 x86 OS - NOT VersionNT64\r\n \u2022 x64 OS - VersionNT64\r\nFor more information on MSI conditions, please refer to the  https://learn.microsoft.com/en-us/windows/win32/msi/conditional-statement-syntax guidelines."
        },
        "sequence": {
          "type": "string",
          "anyOf": [
            {
              "enum": [
                "StartOfExecution",
                "EndOfExecution"
              ]
            },
            {
              "pattern": "^-?[0-9]\u002B$"
            }
          ],
          "description": "Execution sequence of the custom action. This property accepts 3 types of values:\r\n \u2022 StartOfExecution - Custom action will be executed at the start of the installation process, before the install/uninstall/repair operations take place.\r\n \u2022 EndOfExecution -  Custom action will be executed at the end of the installation process, after the install/uninstall/repair operations have taken place.\r\n \u2022 Any short integer (-32768/32768) - Sequence value can be any short integer. The custom action will be executed at the specified sequence.\r\nValidators:\r\n \u2022 valid custom action sequence - Validates that the value of the property is either equal to a StartOfExecution or EndOfExecution string, or any short integer value (-32768 to 32768).",
          "default": "EndOfExecution"
        },
        "continueOnError": {
          "type": "boolean",
          "description": "Specifies whether the installation should proceed in case an error occurs during the execution of the custom action.",
          "default": false
        }
      },
      "required": [
        "filePath"
      ]
    },
    "MsiCustomActionInstallDriver": {
      "type": "object",
      "description": "Defines an MSI custom action, that installs a driver.",
      "properties": {
        "filePath": {
          "type": "string",
          "description": "Path to an inf file that will be installed when a package is installed.\r\nValidators:\r\n \u2022 valid path in package - Validates that the property\u0027s value is a valid target path pointing to a file included in the package under the fileSystemEntries array.\r\n \u2022 valid file type - Validates that the provided value is a file path with a specific file type."
        },
        "importCertificate": {
          "type": "boolean",
          "description": "Indicates if driver\u0027s certificate will be imported to TrustedPublishers store before installation.",
          "default": false
        },
        "removeOnUninstall": {
          "type": "boolean",
          "description": "Indicates if driver will be removed when the package is uninstalled.",
          "default": true
        }
      }
    },
    "MsiCustomActionSetProperty": {
      "type": "object",
      "description": "Defines an MSI custom actions that allows to set conditional properties.",
      "properties": {
        "propertyName": {
          "type": "string",
          "description": "Property name.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "propertyValue": {
          "type": "string",
          "description": "Property value.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "condition": {
          "type": "string",
          "description": "Custom action invocation condition. Some common conditions are: \r\n \u2022 Awalys execute - null or empty.\r\n \u2022 During installation - NOT Installed\r\n \u2022 During repair - Installed and NOT REMOVE\r\n \u2022 During uninstallation - REMOVE~=\u0022ALL\u0022\r\n \u2022 Windows 10 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 Windows 11 - (VersionNT = 1100 AND MsiNTProductType = 1)\r\n \u2022 x86 OS - NOT VersionNT64\r\n \u2022 x64 OS - VersionNT64\r\nFor more information on MSI conditions, please refer to the  https://learn.microsoft.com/en-us/windows/win32/msi/conditional-statement-syntax guidelines."
        },
        "sequence": {
          "type": "string",
          "anyOf": [
            {
              "enum": [
                "StartOfExecution",
                "EndOfExecution"
              ]
            },
            {
              "pattern": "^-?[0-9]\u002B$"
            }
          ],
          "description": "Execution sequence of the custom action. This property accepts 3 types of values:\r\n \u2022 StartOfExecution - Custom action will be executed at the start of the installation process, before the install/uninstall/repair operations take place.\r\n \u2022 EndOfExecution -  Custom action will be executed at the end of the installation process, after the install/uninstall/repair operations have taken place.\r\n \u2022 Any short integer (-32768/32768) - Sequence value can be any short integer. The custom action will be executed at the specified sequence.\r\nValidators:\r\n \u2022 valid custom action sequence - Validates that the value of the property is either equal to a StartOfExecution or EndOfExecution string, or any short integer value (-32768 to 32768).",
          "default": "StartOfExecution"
        }
      },
      "required": [
        "propertyName",
        "propertyValue"
      ]
    },
    "MsiPromptAppsAfterInstall": {
      "type": "object",
      "description": "Apps that will be displayed for the user to select and launch after a successful installation.",
      "properties": {
        "displayName": {
          "type": "string",
          "description": "Display name of the application.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "file": {
          "type": "string",
          "description": "Path to a file in the package that will be launched as new process.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid path in package - Validates that the property\u0027s value is a valid target path pointing to a file included in the package under the fileSystemEntries array.",
          "minLength": 1
        },
        "arguments": {
          "type": "string",
          "description": "Arguments provided when launching the app."
        }
      },
      "required": [
        "displayName",
        "file"
      ]
    },
    "MsiPackageDependencyInstall": {
      "type": "object",
      "description": "This section defines how to install missing dependencies. If left empty, the main package will fail installation when a missing dependency is detected. When provided, dependencies will only get installed when launching the installer in Full (/qf) or Reduced (/qr) UI modes. In Basic (/qb) or Silent (/qn) install modes, dependencies will be checked but not installed.",
      "properties": {
        "winGet": {
          "type": "object",
          "allOf": [
            {
              "$ref": "#/definitions/MsiPackageDependencyInstallWinGet"
            }
          ],
          "description": "Package dependency installation configuration via https://github.com/microsoft/winget-cli.\r\nValidators:"
        }
      }
    },
    "MsiUpdaterLatestVersionDescriptor": {
      "type": "object",
      "description": "Describes how to retrieve and parse information about the latest available version. Latest version information can only be retrieved via a GET API over HTTPS. The response format for this GET API is not strict and can be anything - JSON, XML, plain text, etc. Specifically tailored RegEx expressions are required, to extract data from the response.",
      "properties": {
        "url": {
          "type": "string",
          "description": "URL for the GET API that returns simple response (JSON, XML, plain text, etc.) from where to download and how to validate the latest version of the application. Must be an HTTPS URL.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 valid http url - Validates that the property\u0027s value is a valid HTTP/HTTPS URL.",
          "minLength": 1
        },
        "versionMatcher": {
          "type": "string",
          "description": "RegEx pattern to read the value of the latest version that will be compared with the currently installed version and displayed in the update notification.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "versionUrlMatcher": {
          "type": "string",
          "description": "RegEx pattern to read the value of the version URL (usually release notes) displayed in the update notification. By default, when provided, version URL is read from the already installed app. This property allows to override the default value with value from the API."
        },
        "installerUrlMatcher": {
          "type": "string",
          "description": "RegEx pattern to read URL from which to download the latest installer file.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "checkSumMatcher": {
          "type": "string",
          "description": "RegEx pattern to read the SHA256 checksum that will be compared with the checksum of the downloaded file.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        }
      },
      "required": [
        "url",
        "versionMatcher",
        "installerUrlMatcher",
        "checkSumMatcher"
      ]
    },
    "MsiUpdaterScheduling": {
      "type": "object",
      "description": "Update scheduling configuration. Configures if/when to schedule silent automatic updates.",
      "properties": {
        "enabled": {
          "type": "boolean",
          "description": "Indicates if scheduling is enabled. Value can be overridden when installing the package with the UPDATE_SCHEDULING_ENABLED property.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        },
        "initialDelay": {
          "type": "integer",
          "description": "Delay in milliseconds before the first update check is scheduled after the updater service starts. Value can be overridden when installing the package with the UPDATE_SCHEDULING_STARTUP_DELAY property.",
          "default": 60000
        },
        "interval": {
          "type": "integer",
          "description": "Interval in milliseconds for how often to check for updates. Value can be overridden when installing the package with the UPDATE_SCHEDULING_INTERVAL property.",
          "default": 86400000
        },
        "retryInterval": {
          "type": "integer",
          "description": "Interval in milliseconds until an update is retried after the previous attempt failed because the application being updated is running or another application is being installed. Value can be overridden when installing the package with the UPDATE_SCHEDULING_RETRY_INTERVAL property.",
          "default": 180000
        }
      },
      "required": [
        "enabled"
      ]
    },
    "MsiUpdaterNotifications": {
      "type": "object",
      "description": "Update notification configuration. Configures which apps should show the update available notification.",
      "properties": {
        "enabled": {
          "type": "boolean",
          "description": "Indicates if notifications are enabled. Value can be overridden when installing the package with the UPDATE_NOTIFICATIONS_ENABLED property.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.",
          "minLength": 1
        },
        "triggers": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Application process names that trigger an update notification upon application launch."
        }
      },
      "required": [
        "enabled"
      ]
    },
    "MsiUpdaterLogging": {
      "type": "object",
      "description": "Logging configuration.",
      "properties": {
        "installerLogsRetentionDays": {
          "type": "integer",
          "description": "Number of days to retain scheduling, updater, and installer log files. Once this threshold is reached, log files are automatically cleaned up when the updater service starts. Value can be overridden when installing the package with the UPDATE_LOGGING_INSTALLER_LOGS_RETENTION_DAYS property.",
          "default": 30
        }
      }
    },
    "MsixDevice": {
      "type": "object",
      "description": "Defines device that is associated with the device capability.",
      "properties": {
        "id": {
          "type": "string",
          "description": "The identifier of the device.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 max - Value cannot have more than 512 character(s).",
          "minLength": 1,
          "maxLength": 512
        },
        "functions": {
          "type": "array",
          "items": {
            "type": "object",
            "allOf": [
              {
                "$ref": "#/definitions/MsixDeviceFunction"
              }
            ]
          },
          "description": "List of functions for the device.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Array cannot be empty.\r\n \u2022 max - Array cannot have more than 100 item(s).",
          "minLength": 1,
          "maxItems": 100
        }
      },
      "required": [
        "id",
        "functions"
      ]
    },
    "MsiIniFileValue": {
      "type": "object",
      "description": "MSI INI file key-value pair definition.",
      "properties": {
        "key": {
          "type": "string",
          "description": "INI file entry key.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "value": {
          "type": "string",
          "description": "INI file entry value.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "action": {
          "type": "string",
          "enum": [
            "CreateOrUpdate",
            "Create",
            "CreateOrAppend"
          ],
          "description": "INI file entry MSI actions.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 valid value - Validates that the property\u0027s value is a valid value. The specific list of valid values depends on the property being validated.",
          "default": "CreateOrUpdate",
          "minLength": 1
        }
      },
      "required": [
        "key",
        "value",
        "action"
      ]
    },
    "MsiPackageDependencyInstallWinGet": {
      "type": "object",
      "description": "Package dependency installation configuration via https://github.com/microsoft/winget-cli.",
      "properties": {
        "id": {
          "type": "string",
          "description": "WinGet package ID.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.",
          "minLength": 1
        },
        "arguments": {
          "type": "string",
          "description": "WinGet package installation arguments.",
          "default": "--accept-source-agreements --disable-interactivity --force --exact --source winget"
        }
      },
      "required": [
        "id"
      ]
    },
    "MsixDeviceFunction": {
      "type": "object",
      "description": "Defines the function for the device.",
      "properties": {
        "type": {
          "type": "string",
          "description": "The type of function for the device.\r\nValidators:\r\n \u2022 required - Value must be provided and cannot be null.\r\n \u2022 min - Value cannot be empty.\r\n \u2022 max - Value cannot have more than 100 character(s).",
          "minLength": 1,
          "maxLength": 100
        }
      },
      "required": [
        "type"
      ]
    }
  }
}