{
	"$schema": "http://json-schema.org/draft-07/schema#",
	"finsemble:docs": {
		"$comment": "PLEASE READ THE DOCUMENTATION THOROUGHLY BEFORE EDITING THIS FILE!!!!! --> https://docs.google.com/document/d/1AAXkVPIC5eObZy4zcl55ia7-wtzCJvSVkO7VHjTNUg0. Do not make $ref references more than one level deep because the configReferenceGenerator is not capable of following those paths. `finsemble:docs` entries will override schema entries when generating docs. The `finsemble:docs.halt` directive will cause the documentation generation to not follow the entire path for that item. "
	},
	"$ref": "#/definitions/ManifestSubschema",
	"definitions": {
		"ManifestFileSubschema": {
			"description": "Subschema corresponding to a file containing the manifest config, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {
					"type": "string"
				},
				"devtools_port": {
					"description": "Manifest property to set Chromium devTools port. ",
					"type": "number"
				},
				"startup_app": {
					"$ref": "#/definitions/manifestStartupApp"
				},
				"splashScreenImage": {
					"$ref": "#/definitions/splashScreenImage"
				},
				"splashScreenTimeout": {
					"$ref": "#/definitions/splashScreenTimeout"
				},
				"removePathInSpawnExternalApps": {
					"description": "Set to false to allow spawning by path",
					"type": "boolean"
				},
				"disableWMICalls": {
					"$ref": "#/definitions/disableWMICalls"
				},
				"appAssets": {
					"$ref": "#/definitions/appAssets"
				},
				"affinitySurrogateUrl": {
					"type": "string"
				},
				"finsemble": {
					"title": "finsemble",
					"description": "Copy of Finsemble object tto verify manifest File",
					"type": "object",
					"properties": {
						"applicationRoot": {
							"type": "string"
						},
						"documentRoot": {
							"type": "string"
						},
						"moduleRoot": {
							"type": "string"
						},
						"configRoot": {
							"type": "string"
						},
						"appd": {
							"$ref": "#/definitions/appd"
						},
						"servicesRoot": {
							"type": "string"
						},
						"configSchemaURL": {
							"type": "string"
						},
						"notificationURL": {
							"type": "string",
							"description": "(DEPRECATED) The notificationURL is no longer used by toasts or UserNotification"
						},
						"availableDashbarItems": {
							"type": "object",
							"description": "Available dashbar items to list in dashbar user preferences",
							"patternProperties": {
								"[a-zA-Z0-9]": {
									"$ref": "#/definitions/dashbarItem"
								}
							},
							"additionalProperties": false
						},
						"bootConfig": {
							"$ref": "#/definitions/boot_config"
						},
						"router": {
							"$ref": "#/definitions/router"
						},
						"logger": {
							"$ref": "#/definitions/logger"
						},
						"importConfig": {
							"$ref": "#/definitions/importConfig"
						},
						"importThirdPartyConfig": {
							"$ref": "#/definitions/importThirdPartyConfig"
						},
						"shutdownTimeout": {
							"description": "Amount of time (in milliseconds) to give services to shutdown before forcibly quitting the application. Components get 2 seconds less than services.",
							"type": "number",
							"minimum": 10000,
							"default": 30000
						},
						"systemTrayIcon": {
							"description": "Sets the location of the system tray icon (lower right corner of the terminal)",
							"type": "string",
							"default": "../../assets/img/Finsemble_SystemTray_Icon.png"
						},
						"autoSignOn": {
							"description": "Provides configuration and credentials for automatically signing a user into specified web applications",
							"type": "object",
							"deprecated": true,
							"properties": {
								"hardcoded": {
									"type": "object"
								}
							}
						},
						"toolbarMenus": {
							"$ref": "#/definitions/toolbarMenus"
						},
						"citrix": {
							"description": "Configuration for connecting to Citrix windows",
							"type": "object",
							"properties": {
								"selfServiceLocation": {
									"type": "string",
									"default": "C:/Program Files (x86)/Citrix/ICA Client/SelfServicePlugin/SelfService.exe"
								}
							}
						},
						"trustedPreloads": {
							"$ref": "#/definitions/trustedPreloads"
						},
						"extensions": {
							"$ref": "#/definitions/extensions"
						},
						"custom": {}
					},
					"required": ["bootConfig"]
				},
				"finsemble-electron-adapter": {
					"$ref": "#/definitions/electronAdapter"
				},
				"allowEvalInPreload": {
					"description": "Set to `true` to delete `unsafe-eval` and `script-src directives` from the content security policy.",
					"type": "boolean",
					"default": false
				},
				"Content-Security-Policy": {
					"$ref": "#/definitions/contentSecurityPolicy"
				},
				"custom": {}
			},
			"required": ["finsemble"],
			"additionalProperties": false
		},
		"AppDFileSubschema": {
			"description": "Subschema corresponding to a file containing UI component config, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {},
				"appd": {
					"$ref": "#/definitions/appd"
				}
			},
			"additionalProperties": false
		},
		"UIComponentsFileSubschema": {
			"description": "Subschema corresponding to a file containing UI component config, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {},
				"components": {
					"$ref": "#/definitions/components"
				}
			},
			"additionalProperties": false
		},
		"ComponentsFileSubschema": {
			"description": "Subschema corresponding to a file containing component config, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {},
				"components": {
					"description": "config for components",
					"type": "object",
					"additionalProperties": {
						"$ref": "#/definitions/component"
					}
				}
			},
			"additionalProperties": false
		},
		"ServicesFileSubschema": {
			"description": "Subschema corresponding to a file containing service config, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {
					"type": "string"
				},
				"services": {
					"description": "config for components",
					"type": "object",
					"additionalProperties": {
						"$ref": "#/definitions/service"
					}
				}
			},
			"additionalProperties": false
		},
		"ApplicationConfigFileSubschema": {
			"title": "finsemble",
			"description": "Subschema for all application config (typically application/config.json)",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {
					"description": "(DEPRECATED) (PRIVATE) Comment string inserted into config.",
					"type": "string"
				},
				"authentication": {
					"$ref": "#/definitions/authenticationProfile"
				},
				"workspaceTemplates": {
					"$ref": "#/definitions/blankWorkspaceTemplate"
				},
				"importConfig": {
					"$ref": "#/definitions/importConfig"
				},
				"importThirdPartyConfig": {
					"$ref": "#/definitions/importThirdPartyConfig"
				},
				"securityPolicies": {
					"$ref": "#/definitions/securityPolicies"
				},
				"securityPolicyRules": {
					"$ref": "#/definitions/securityPolicyRules"
				},
				"accessibleLinker": {
					"description": "(DEPRECATED)",
					"type": "boolean"
				},
				"servicesConfig": {
					"$ref": "#/definitions/servicesConfig"
				},
				"preferences": {
					"$ref": "#/definitions/preferences"
				},
				"systemTrayComponent": {
					"description": "(PUBLIC)",
					"type": "string"
				},
				"waitForUpdate": {
					"type": "boolean",
					"default": false,
					"description": "When set to true, Finsemble will wait for updates, if available, to download and install, before continuing to start up the application."
				},
				"Window Manager": {
					"$ref": "#/definitions/windowManager"
				},
				"//appDirectoryEndpoint": {
					"type": "string"
				},
				"appDirectoryEndpoint": {
					"type": "string"
				},
				"globalHotkeys": {
					"description": "(PUBLIC)",
					"type": "object"
				},
				"workspaces": {
					"$ref": "#/definitions/workspacesArray"
				},
				"components": {
					"description": "(PRIVATE) (DEPRECATED) Use of \"components\" is now reserved for internal Finsemble components. Developers should use \"appd\" to register their apps.",
					"$ref": "#/definitions/components"
				},
				"services": {
					"$ref": "#/definitions/services"
				},
				"feaURLWhitelist": {
					"description": "A regex pattern that represents a URL whitelist. If set, components will **only** be able to navigate to URLs that match the regex pattern.",
					"type": "string"
				},
				"failedComponentCloseNotification": {
					"description": "If true throw a notification when a component fails to close within the time limit specified in `finsemble[\"Window Manager\"].componentCloseTimeout`",
					"type": "boolean",
					"default": false
				},
				"initialWorkspace": {
					"description": "The workspace name specified by this config will be the first one presented to an end user the very first time they start the SmartDesktop. This overrides the default behavior set by the config: finsemble.workspaces. After the very first instance of the SmartDesktop, Finsemble will load the last workspace loaded or any workspace specified by user preferences.",
					"type": "string"
				},
				"scheduledRestart": {
					"$ref": "#/definitions/scheduledRestart"
				},
				"scheduledShutdown": {
					"$ref": "#/definitions/scheduledShutdown"
				},
				"scheduledCloseDiscardUnsavedChanges": {
					"$ref": "#/definitions/scheduledCloseDiscardUnsavedChanges"
				},
				"stackedWindow": {
					"$ref": "#/definitions/stackedWindow"
				},
				"//": {
					"description": "(PRIVATE) (DEPRECATED) Comment string inserted into config.",
					"type": "string"
				},
				"toolbarMenus": {
					"$ref": "#/definitions/toolbarMenus"
				},
				"preloads": {
					"$ref": "#/definitions/preloads"
				},
				"custom": {}
			},
			"additionalProperties": false
		},
		"SecurityPolicyFileSubschema": {
			"description": "Subschema corresponding to the security policies file, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {},
				"comment": {
					"type": "string"
				},
				"securityPolicies": {
					"$ref": "#/definitions/securityPolicies"
				},
				"securityPolicyRules": {
					"$ref": "#/definitions/securityPolicyRules"
				}
			},
			"required": ["securityPolicies", "securityPolicyRules"],
			"additionalProperties": false
		},
		"WorkspacesFileSubschema": {
			"description": "Subschema corresponding to the security policies file, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {},
				"comment": {
					"type": "string"
				},
				"workspaces": {
					"$ref": "#/definitions/workspacesArray"
				}
			},
			"required": ["workspaces"],
			"additionalProperties": false
		},
		"CoreConfigFileSubschema": {
			"description": "Subschema corresponding to a file containing the manifest config, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {
					"type": "string"
				},
				"bootTasks": {
					"$ref": "#/definitions/bootTasks"
				},
				"system": {
					"$ref": "#/definitions/system"
				},
				"servicesRoot": {
					"type": "string"
				},
				"thirdPartyRoot": {
					"type": "string"
				},
				"configVersion": {
					"type": "string"
				},
				"workspaceTemplates": {
					"$ref": "#/definitions/blankWorkspaceTemplate"
				},
				"betaFeatures": {
					"description": "(PRIVATE) (DEPRECATED)",
					"type": "object"
				},
				"importConfig": {
					"$ref": "#/definitions/importConfig"
				},
				"deprecatedConfig": {
					"$ref": "#/definitions/deprecatedConfig"
				}
			},
			"required": [
				"bootTasks",
				"system",
				"servicesRoot",
				"thirdPartyRoot",
				"configVersion",
				"betaFeatures",
				"importConfig"
			],
			"additionalProperties": false
		},
		"DashbarFileSubschema": {
			"description": "Subschema corresponding to a file containing the Dashbar items configuration, to support VSCode Intellisense.. ",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {
					"type": "string"
				},
				"availableDashbarItems": {
					"$ref": "#/definitions/availableDashbarItems"
				}
			}
		},
		"ManifestSubschema": {
			"comment": "Used by Finsemble for run-time verification",
			"description": "(PUBLIC) Highest level manifest object, which includes \"finsemble\" configuration",
			"finsemble:docs": {
				"rightnav": true
			},
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {
					"type": "string"
				},
				"devtools_port": {
					"description": "Manifest property to set Chromium devTools port. ",
					"type": "number",
					"default": 9090
				},
				"startup_app": {
					"$ref": "#/definitions/manifestStartupApp"
				},
				"splashScreenImage": {
					"$ref": "#/definitions/splashScreenImage"
				},
				"splashScreenTimeout": {
					"$ref": "#/definitions/splashScreenTimeout"
				},
				"removePathInSpawnExternalApps": {
					"description": "Set to false to allow spawning by path",
					"type": "boolean"
				},
				"disableWMICalls": {
					"$ref": "#/definitions/disableWMICalls"
				},
				"appAssets": {
					"$ref": "#/definitions/appAssets"
				},
				"finsemble": {
					"$ref": "#/definitions/FinsembleSubschema"
				},
				"finsemble-electron-adapter": {
					"$ref": "#/definitions/electronAdapter"
				},
				"affinitySurrogateUrl": {
					"type": "string"
				},
				"custom": {},
				"allowEvalInPreload": {
					"description": "Set to `true` to delete `unsafe-eval` and `script-src directives` from the content security policy.",
					"type": "boolean",
					"default": false
				},
				"Content-Security-Policy": {
					"$ref": "#/definitions/contentSecurityPolicy"
				}
			},
			"required": ["startup_app", "finsemble"],
			"additionalProperties": false
		},
		"BootManifestSubschema": {
			"comment": "Used by Finsemble for run-time verification",
			"description": "The boot subschema, including manifest and partial finsemble",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"comment": {
					"type": "string"
				},
				"devtools_port": {
					"description": "Manifest property to set Chromium devTools port. ",
					"type": "number"
				},
				"startup_app": {
					"$ref": "#/definitions/manifestStartupApp"
				},
				"splashScreenImage": {
					"$ref": "#/definitions/splashScreenImage"
				},
				"splashScreenTimeout": {
					"$ref": "#/definitions/splashScreenTimeout"
				},
				"removePathInSpawnExternalApps": {
					"description": "Set to false to allow spawning by path",
					"type": "boolean"
				},
				"disableWMICalls": {
					"$ref": "#/definitions/disableWMICalls"
				},
				"affinitySurrogateUrl": {
					"type": "string"
				},
				"appAssets": {
					"title": "appAssets",
					"description": "Manifest array of external assets to be automatically loading by FEA. ",
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"src": {
								"type": "string"
							},
							"version": {
								"type": "string"
							},
							"alias": {
								"type": "string"
							},
							"target": {
								"type": "string"
							}
						}
					}
				},
				"finsemble": {
					"title": "finsemble",
					"description": "Subschema for config required to boot finsemble",
					"type": "object",
					"properties": {
						"applicationRoot": {
							"type": "string"
						},
						"documentRoot": {
							"type": "string"
						},
						"moduleRoot": {
							"type": "string"
						},
						"configRoot": {
							"type": "string"
						},
						"appd": {
							"$ref": "#/definitions/appd"
						},
						"servicesRoot": {
							"type": "string"
						},
						"thirdPartyRoot": {
							"type": "string"
						},
						"configVersion": {
							"type": "string"
						},
						"configSchemaURL": {
							"type": "string"
						},
						"notificationURL": {
							"type": "string",
							"description": "(DEPRECATED) The notificationURL is no longer used by toasts or UserNotification"
						},
						"bootConfig": {
							"$ref": "#/definitions/boot_config"
						},
						"router": {
							"$ref": "#/definitions/router"
						},
						"bootTasks": {
							"$ref": "#/definitions/bootTasks"
						},
						"system": {
							"$ref": "#/definitions/system"
						},
						"shutdownTimeout": {
							"description": "Amount of time (in milliseconds) to give services to shutdown before forcibly quitting the application. Components get 2 seconds less than services.",
							"type": "number",
							"minimum": 10000,
							"default": 30000
						},
						"deprecatedConfig": {
							"$ref": "#/definitions/deprecatedConfig"
						},
						"trustedPreloads": {
							"$ref": "#/definitions/trustedPreloads"
						}
					},
					"required": [
						"applicationRoot",
						"moduleRoot",
						"servicesRoot",
						"thirdPartyRoot",
						"configVersion",
						"bootConfig",
						"bootTasks",
						"system"
					]
				},
				"finsemble-electron-adapter": {
					"$ref": "#/definitions/electronAdapter"
				},
				"allowEvalInPreload": {
					"description": "Set to `true` to delete `unsafe-eval` and `script-src directives` from the content security policy.",
					"type": "boolean",
					"default": false
				},
				"Content-Security-Policy": {
					"$ref": "#/definitions/contentSecurityPolicy"
				},
				"custom": {}
			},
			"required": ["startup_app", "finsemble"],
			"additionalProperties": false
		},
		"FinsembleSubschema": {
			"comment": "Used by Finsemble for run-time verification",
			"title": "finsemble",
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "Finsemble's root runtime config. This can be found int \"manifest-local.html\".",
			"type": "object",
			"properties": {
				"$schema": {
					"type": "string"
				},
				"applicationRoot": {
					"description": "(PUBLIC) Should point to the root of your application. Finsemble will use this to build URLs internally.",
					"type": "string",
					"default": "https://localhost:3375"
				},
				"documentRoot": {
					"type": "string"
				},
				"authentication": {
					"$ref": "#/definitions/authenticationProfile"
				},
				"moduleRoot": {
					"description": "(PUBLIC) Where you are serving the Finsemble core library from. This is important for resolving URLs internally.",
					"type": "string",
					"default": "https://localhost:3375/finsemble"
				},
				"configRoot": {
					"type": "string"
				},
				"appd": {
					"$ref": "#/definitions/appd"
				},
				"servicesRoot": {
					"description": "(PRIVATE) Default location of core services. ",
					"type": "string"
				},
				"notificationURL": {
					"type": "string",
					"description": "(DEPRECATED) The notificationURL is no longer used by toasts or UserNotification"
				},
				"availableDashbarItems": {
					"$ref": "#/definitions/availableDashbarItems"
				},
				"bootConfig": {
					"$ref": "#/definitions/boot_config"
				},
				"router": {
					"$ref": "#/definitions/router"
				},
				"logger": {
					"$ref": "#/definitions/logger"
				},
				"bootTasks": {
					"$ref": "#/definitions/bootTasks"
				},
				"system": {
					"$ref": "#/definitions/system"
				},
				"thirdPartyRoot": {
					"description": "(PRIVATE) (DEPRECATED) Required location of third-party services. ",
					"type": "string"
				},
				"workspaceTemplates": {
					"$ref": "#/definitions/blankWorkspaceTemplate"
				},
				"configVersion": {
					"description": "(PUBLIC) Version of this schema. ",
					"type": "string"
				},
				"configSchemaURL": {
					"description": "(PUBLIC) URL of this schema.  Used for run-time verification of configuration. ",
					"type": "string"
				},
				"importConfig": {
					"$ref": "#/definitions/importConfig"
				},
				"importThirdPartyConfig": {
					"$ref": "#/definitions/importThirdPartyConfig"
				},
				"securityPolicies": {
					"$ref": "#/definitions/securityPolicies"
				},
				"securityPolicyRules": {
					"$ref": "#/definitions/securityPolicyRules"
				},
				"accessibleLinker": {
					"description": "(PUBLIC) (DEPRECATED)",
					"type": "boolean"
				},
				"servicesConfig": {
					"$ref": "#/definitions/servicesConfig"
				},
				"preferences": {
					"$ref": "#/definitions/preferences"
				},
				"//systemTrayIcon": {
					"type": "string"
				},
				"systemTrayIcon": {
					"description": "(PUBLIC) Sets the location of the system tray icon (lower right corner of the terminal)",
					"type": "string"
				},
				"systemTrayComponent": {
					"description": "(PUBLIC)",
					"type": "string"
				},
				"waitForUpdate": {
					"type": "boolean",
					"default": false,
					"description": "When set to true, Finsemble will wait for updates, if available, to download and install, before continuing to start up the application."
				},
				"Window Manager": {
					"finsemble:docs": {
						"halt": true,
						"type": "object",
						"description": "Global options for the windowTitleBar. <i>See \"Window Manager\" under appd.manifest for options...</i>"
					},
					"$ref": "#/definitions/windowManager"
				},
				"betaFeatures": {
					"description": "(PRIVATE) (DEPRECATED)",
					"type": "object"
				},
				"//appDirectoryEndpoint": {
					"description": "(PRIVATE)",
					"type": "string"
				},
				"appDirectoryEndpoint": {
					"type": "string"
				},
				"globalHotkeys": {
					"description": "(PUBLIC)",
					"type": "object"
				},
				"workspaces": {
					"$ref": "#/definitions/workspacesArray"
				},
				"components": {
					"description": "(PRIVATE) (DEPRECATED) Use of \"components\" is now reserved for internal Finsemble components. Developers should use \"appd\" to register their apps.",
					"$ref": "#/definitions/components"
				},
				"services": {
					"$ref": "#/definitions/services"
				},
				"feaURLWhitelist": {
					"description": "A regex pattern that represents a URL whitelist. If set, components will **only** be able to navigate to URLs that match the regex pattern.",
					"type": "string"
				},
				"cssOverridePath": {
					"description": "(DEPRECATED) (PRIVATE)",
					"type": "string"
				},
				"debugServiceDelay": {
					"description": "(DEPRECATED) (PRIVATE)",
					"type": "number"
				},
				"failedComponentCloseNotification": {
					"description": "If true throw a notification when a component fails to close within the time limit specified in `finsemble[\"Window Manager\"].componentCloseTimeout`",
					"type": "boolean",
					"default": false
				},
				"initialWorkspace": {
					"description": "The workspace name specified by this config will be the first one presented to an end user the very first time they start the SmartDesktop. This overrides the default behavior set by the config: finsemble.workspaces. After the very first instance of the SmartDesktop, Finsemble will load the last workspace loaded or any workspace specified by user preferences.",
					"type": "string"
				},
				"isAuthEnabled": {
					"description": "(DEPRECATED) (PRIVATE)",
					"type": "boolean",
					"default": false
				},
				"shutdownTimeout": {
					"description": "Amount of time (in milliseconds) to give services to shutdown before forcibly quitting the application. Components get 2 seconds less than services.",
					"type": "number",
					"minimum": 10000,
					"default": 30000
				},
				"scheduledRestart": {
					"$ref": "#/definitions/scheduledRestart"
				},
				"scheduledShutdown": {
					"$ref": "#/definitions/scheduledShutdown"
				},
				"scheduledCloseDiscardUnsavedChanges": {
					"$ref": "#/definitions/scheduledCloseDiscardUnsavedChanges"
				},
				"stackedWindow": {
					"$ref": "#/definitions/stackedWindow"
				},
				"menus": {
					"description": "Legacy config to configure menus. Still used in some configuration examples",
					"$ref": "#/definitions/menus"
				},
				"configSetDone": {
					"type": "boolean"
				},
				"comment": {
					"description": "(DEPRECATED) (PRIVATE) Comment string inserted into config.",
					"type": "string"
				},
				"//": {
					"description": "(PRIVATE) (DEPRECATED) Comment string inserted into config.",
					"type": "string"
				},
				"deprecatedConfig": {
					"$ref": "#/definitions/deprecatedConfig"
				},
				"toolbarMenus": {
					"$ref": "#/definitions/toolbarMenus"
				},
				"preloads": {
					"$ref": "#/definitions/preloads"
				},
				"trustedPreloads": {
					"$ref": "#/definitions/trustedPreloads"
				},
				"extensions": {
					"$ref": "#/definitions/extensions"
				},
				"custom": {}
			},
			"required": [
				"applicationRoot",
				"moduleRoot",
				"servicesRoot",
				"bootConfig",
				"bootTasks",
				"system",
				"thirdPartyRoot",
				"workspaceTemplates",
				"securityPolicies",
				"securityPolicyRules",
				"accessibleLinker",
				"servicesConfig",
				"preferences",
				"systemTrayComponent",
				"Window Manager",
				"betaFeatures",
				"globalHotkeys",
				"workspaces",
				"components",
				"appd",
				"services"
			],
			"additionalProperties": false
		},
		"manifestStartupApp": {
			"description": "Manifest property for the initial startup app, which reference Finsemble's System Manager.",
			"type": "object",
			"properties": {
				"name": {
					"type": "string",
					"description": "Defaults to the name of the application as specified in installer.json. This is used for certain dialogs and in the central logger. The name must be alphanumeric characters and spaces. Don't use any other characters",
					"pattern": "^[A-Za-z0-9\\s]*$"
				},
				"url": {
					"type": "string"
				},
				"uuid": {
					"type": "string",
					"description": "Uniquely differentiates environmental instances of the same application (see server-environment-startup.json) to avoid storage conflicts. The uuid must be alphanumeric characters. Do not use spaces. The uuid is available for use in storage keys, such as those generated by the IndexedDBStorageAdapter.",
					"pattern": "^[A-Za-z0-9\\s\\-]*$",
					"default": "Finsemble"
				},
				"requireHandshake": {
					"type": "boolean"
				},
				"applicationIcon": {
					"type": "string"
				},
				"defaultTop": {
					"type": "number",
					"deprecated": true
				},
				"defaultLeft": {
					"type": "number",
					"deprecated": true
				},
				"defaultHeight": {
					"type": "number",
					"deprecated": true
				},
				"defaultWidth": {
					"type": "number",
					"deprecated": true
				},
				"showTaskbarIcon": {
					"type": "boolean",
					"deprecated": true
				},
				"autoShow": {
					"type": "boolean",
					"deprecated": true
				},
				"frame": {
					"type": "boolean",
					"deprecated": true
				},
				"resizable": {
					"type": "boolean",
					"deprecated": true
				},
				"maximizable": {
					"type": "boolean",
					"deprecated": true
				},
				"delay_connection": {
					"type": "boolean",
					"deprecated": true
				},
				"contextMenu": {
					"type": "boolean",
					"deprecated": true
				},
				"cornerRounding": {
					"$ref": "#/definitions/cornerRounding",
					"deprecated": true
				},
				"alwaysOnTop": {
					"type": "boolean",
					"deprecated": true
				}
			},
			"required": [],
			"examples": [
				{
					"startup_app": {
						"name": "My App",
						"url": "http://localhost:3375/finsemble/services/systemManager/systemManager.html",
						"uuid": "MyAppAndOrEnvironment",
						"requireHandshake": true,
						"applicationIcon": "http://localhost:3375/assets/img/Finsemble_Taskbar_Icon.png"
					}
				}
			]
		},
		"appAssets": {
			"title": "appAssets",
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "Manifest array of external assets to be automatically downloaded by FEA (as Zip files) and unpacked for use as native applications.",
			"type": "array",
			"items": {
				"type": "object",
				"properties": {
					"src": {
						"description": "URI from which to download a Zip file containing the asset",
						"type": "string",
						"format": "uri-reference"
					},
					"version": {
						"description": "A version number for the asset to be downloaded. FEA will only download an asset if it has not already downloaded and cached a copy of the asset with the specified version number.",
						"type": "string"
					},
					"alias": {
						"description": "The downloaded asset is referred to in application configurations by alias. Replace the window.path field of a native application with window.alias to use the appAsset",
						"type": "string"
					},
					"target": {
						"description": "The path within the appAsset Zip file to use to launch the application. This will usually be a path to a .exe, .jar or .bat file.",
						"type": "string"
					}
				}
			}
		},
		"windowManager": {
			"title": "Window Manager",
			"description": "(PUBLIC) Configurations specific to an app's window title bar.",
			"type": "object",
			"properties": {
				"alwaysOnTopIcon": {
					"description": "When set to `true`, all windows can be pinned so that they are always on top (like a sticky note). You can override this setting for specific components in their config.",
					"type": "boolean",
					"default": false
				},
				"disableBrowserView": {
					"description": "(DEPRECATED) Use titlebarType instead. When set to `true`, the window titlebar will be injected directly into the window's content pane, rather than separated out into a separate browserview within the window.",
					"type": "boolean",
					"default": false,
					"deprecated": true
				},
				"titlebarType": {
					"type": "string",
					"description": "Determines how the window titlebar is added to web windows. The default 'browserview' separates the titlebar and content pane into separate browserviews and can resolve rare display issues with the injected title bar, at the cost of disabling process grouping via affinity for the content pane. Setting 'injected' causes the title bar and its styles to be inserted directly into your web page's DOM and its layout to be lightly adjusted to accommodate.",
					"enum": ["browserview", "injected"],
					"default": "browserview"
				},
				"FSBLHeader": {
					"description": "This config controls the Finsemble window title bar UI component. FSBLHeader can be true, false or an object. If true then the window title bar will be injected into the component and the maximize, minimize, and close buttons will be displayed. If false, the title bar will not be displayed. If an object, you can tweak several details as to whether buttons are shown or how content is loaded under the title bar.",
					"type": ["boolean", "object"],
					"default": true,
					"properties": {
						"hideMaximize": {
							"description": "When set to true, the Maximize icon will be hidden from the component's titlebar.",
							"type": "boolean",
							"default": false
						},
						"hideMinimize": {
							"description": "When set to true, the Minimize icon will be hidden from the component's titlebar.",
							"type": "boolean",
							"default": false
						},
						"hideClose": {
							"description": "Value indicating whether the close button is hidden in the component titlebar",
							"type": "boolean",
							"default": false
						},
						"title": {
							"description": "(DEPRECATED) Sets the title in the window title bar. Instead, please set the title in your HTML and Finsemble will pick it up.",
							"type": "boolean",
							"default": false
						},
						"persistWindowState": {
							"description": "(DEPRECATED) If the component is part of the workspace, this tells Finsemble whether it should persist the position of the window when it moves but windowClient saves and loads window dimensions through updateOptions, for Internal Use. ",
							"type": "boolean",
							"default": false
						},
						"zoomDefault": {
							"description": "Default zoom level to set for the component when using the zoom.js sample preload.",
							"type": "number"
						},
						"showLinker": {
							"description": "(DEPRECATED Set this to true only when using deprecated linkerClient. The linker will now automatically display when the FDC3 Interop client is activated with an API call. `showLinker: false` will override, preventing the linker from being displayed if you have a use case where you don't want to display the linker.",
							"type": "boolean",
							"default": false
						},
						"hackScrollbar": {
							"description": "Unless set to false, a window's vertical scrollbar will be positioned underneath the Finsemble window title bar using html{ overflow-y: none} and body{ overflow-y: auto}",
							"type": "boolean",
							"default": false
						},
						"adjustContentHeights": {
							"description": "Unless set to false, the height of content sized to fit the window will be adjusted to fit within the adjusted bounds of the window when the Finsemble window title bar is injected into the DOM.",
							"type": "boolean",
							"default": true
						},
						"bumpElements": {
							"type": "object",
							"$ref": "#/definitions/bumpElements"
						}
					}
				},
				"floatingTitlebarComponent": {
					"type": "string",
					"description": "This config sets which component Finsemble will use as a title bar for native application components. By default, the only value is \"FloatingTitlebar.\" This config exists in the event you wish to customize this behavior with a customized title bar component and created a configuration for it in <i>components.json</i>"
				},
				"deliveryMechanism": {
					"description": "Which delivery method to use for scripts (e.g., FSBL, title bar, etc.) - Valid values are:\r\n\"injection\" - Injects the code into the window.",
					"type": "string",
					"enum": ["injection", "preload"],
					"default": "injection"
				},
				"zoom": {
					"description": "Configuration for the zoom.js preload",
					"type": "object",
					"properties": {
						"timeout": {
							"description": "The number of milliseconds the zoom pop up should be displayed before it is hidden.",
							"type": "number",
							"default": 3000
						},
						"step": {
							"description": "How much the zoom should increase or decrease when zooming in or out.",
							"type": "number",
							"default": 0.1
						},
						"max": {
							"description": "The maximum allowed zoom level.",
							"type": "number",
							"default": 5.0
						},
						"min": {
							"description": "The minimum allowed zoom level.",
							"type": "number",
							"default": 0.2
						}
					},
					"additionalProperties": false
				},
				"componentCloseTimeout": {
					"type": "number",
					"default": 5000,
					"description": "Time (in ms) to wait for the component to close successfully. If the component hasn't closed within this limit, it will be force closed."
				}
			}
		},
		"bumpElements": {
			"description": "Optional settings that adjust the height and position of absolute/fixed positioned elements when the window titlebar is injected. May be used to mitigate rare display issues that can occur due to the injected titlebar.",
			"type": "object",
			"properties": {
				"absolute": {
					"description": "Either none, \"all\" or \"0Positioned\". If all, all fixed elements are moved. 0Positioned only moves elements that have top 0. Only applies to children of the document.body.",
					"enum": ["none", "all", "0Positioned"]
				},
				"bumpBy": {
					"description": "Sets the amount to bump elements by (e.g. \"25px\").",
					"type": "string",
					"pattern": "[0-9]+px/"
				},
				"fixed": {
					"description": "Either none, \"all\" or \"0Positioned\". If all, all fixed elements are moved. 0Positioned only moves elements that have top 0.",
					"enum": ["none", "all", "0Positioned"]
				},
				"monitorFixedAdditions": {
					"description": "Unless set to false, mutations to the DOM will be observed and fixed positioned elements with a top style of '0px' will be bumped by the title bar height.",
					"type": "boolean"
				}
			}
		},
		"authenticationProfile": {
			"description": "Contains authentication profiles. The special “STARTUP” profile will be run when your SmartDesktop launches.",
			"finsemble:docs": {
				"rightnav": true
			},
			"type": "object",
			"additionalProperties": {
				"type": "object",
				"title": "authentication profile name",
				"description": "Declare an authentication profile that uses simple password collection or any other type of custom authentication process.",
				"properties": {
					"adapter": {
						"type": "string",
						"description": "The authentication \"adapter\" (module) which will be used for this authentication profile. (See the Authentication Tutorial).",
						"enum": ["PASSWORD", "OAUTH2"]
					},
					"scope": {
						"type": ["string", "null"],
						"description": "When used with OAUTH2 adapter, the \"scope\" as specified by your Identity Provider (IP).",
						"default": "openid"
					},
					"client_id": {
						"type": "string",
						"description": "When used with OAUTH2 adapter, the \"client ID\" provided by your Identity Provider (IP)."
					},
					"authorization_endpoint": {
						"type": "string",
						"description": "When used with OAUTH2 adapter, the authorization endpoint for your Identity Provider (IP)."
					},
					"backchannel_endpoint": {
						"type": "string",
						"description": "When used with OAUTH2 adapter, your backchannel endpoint URL."
					},
					"redirect_url": {
						"type": "string",
						"description": "The component to handle the response from your IP. If you don't provide this, *components/authentication/oauthResponse.html* will be used.",
						"default": "$applicationRoot/components/authentication/oauthResponse.html"
					},
					"component": {
						"type": "string",
						"description": "The UI component to use for this authentication profile. Typically this would be \"authentication.html\" used by the \"PASSWORD\" adapter to display a user/login form."
					}
				},
				"required": ["adapter"]
			}
		},
		"blankWorkspaceTemplate": {
			"title": "workspaceTemplates",
			"type": "object",
			"properties": {
				"Blank Template": {
					"$ref": "#/definitions/workspaceTemplate"
				}
			}
		},
		"preferences": {
			"title": "preferences",
			"description": "DEPRECATED - configurations used as user preferences can be found in the finsemble.servicesConfig section",
			"type": "object",
			"default": {},
			"properties": {
				"workspaceService": {
					"type": "object",
					"properties": {
						"promptUserOnDirtyWorkspace": {
							"description": "DEPRECATED - This config was moved to finsemble.servicesConfig.workspace",
							"type": "boolean"
						}
					}
				}
			}
		},
		"servicesConfig": {
			"title": "servicesConfig",
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "(PUBLIC) Configurations that override the defaults for Finsemble's built-in services. (Defaults are stored in \"finsemble.services\" and cannot be directly overridden.",
			"type": "object",
			"properties": {
				"distributedStore": {
					"title": "distributedStore",
					"type": "object",
					"description": "Distributed Store configuration",
					"properties": {
						"affinity": {
							"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity",
							"type": ["string", "boolean"]
						},
						"visible": {
							"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
							"type": "boolean",
							"default": false
						},
						"initialStores": {
							"title": "initialStores",
							"description": "Foundations for any stores which should be seeded on startup",
							"type": "array",
							"items": {
								"type": "object",
								"properties": {
									"name": {
										"type": "string",
										"description": "The name of the store to seed"
									},
									"preferPreviousState": {
										"type": "boolean",
										"default": true,
										"description": "Advanced App Launcher specific config to control the loading of data. If true, any changes from a previous run will be overridden and the state will be restored on every restart to the initial config provided. If true and no foundation is provided, nothing will be affected."
									},
									"foundation": {
										"title": "foundation",
										"description": "The data to seed into the store",
										"type": "object",
										"properties": {
											"appFolders": {
												"title": "appFolders",
												"type": "object",
												"properties": {
													"list": {
														"type": "array",
														"items": {
															"type": "string"
														}
													},
													"folders": {
														"title": "folders",
														"type": "object",
														"properties": {
															"Advanced App Launcher": {
																"$ref": "#/definitions/foldersAppDefinition"
															},
															"Favorites": {
																"$ref": "#/definitions/foldersAppDefinition"
															}
														}
													}
												}
											},
											"appDefinitions": {
												"type": "object"
											}
										}
									},
									"default": {
										"title": "default",
										"type": "object",
										"properties": {
											"activeLauncherTags": {
												"type": "array"
											},
											"filterText": {
												"type": "string"
											},
											"filterTags": {
												"type": "array"
											},
											"activeTags": {
												"type": "array"
											},
											"filteredApps": {
												"type": "array"
											},
											"activeFolder": {
												"type": "string"
											},
											"sortBy": {
												"type": "string"
											}
										}
									}
								}
							}
						}
					},
					"required": ["initialStores"],
					"additionalProperties": false
				},
				"docking": {
					"title": "docking",
					"description": "Configs specific to the docking service",
					"type": "object",
					"properties": {
						"alwaysOnTopLevel": {
							"type": "string",
							"description": "The always on top level when setting components `alwaysOnTop` to true. See the <a href=\"https://www.electronjs.org/docs/api/browser-window#winsetalwaysontopflag-level-relativelevel\">Electron alwaysOnTop documentation</a> for valid values."
						},
						"visible": {
							"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
							"type": "boolean",
							"default": false
						},
						"enabled": {
							"type": "boolean"
						},
						"headerHeight": {
							"description": "This defines the height of the window title bar.",
							"type": "number",
							"default": 32
						},
						"headerWidth": {
							"description": "This defines the width of the window title bar.",
							"type": "number",
							"default": 32
						},
						"MINIMUM_HEIGHT": {
							"description": "The smallest height to allow a window to shrink on resize.",
							"type": "number",
							"default": 28
						},
						"MINIMUM_WIDTH": {
							"description": "The smallest width to allow a window to shrink on resize.",
							"type": "number",
							"default": 98
						},
						"requireRectangularityForGroupResize": {
							"description": " If a group of windows forms a rectangle, it can be resized. By turning this to `false`, the user can resize any shaped group by grabbing a corner that is not on another window's edge.",
							"type": "boolean",
							"default": true
						},
						"undockDisbandsEntireGroup": {
							"description": "By default, when a user clicks the \"Undock\" button in the title bar, it will leave the group without destroying that group. Set this value to `true` if you would like to eliminate the group when the user clicks the \"Undock\" button.",
							"type": "boolean",
							"default": false
						},
						"fillHolesOnUndock": {
							"description": "If set to `true`, a rectangular group will maintain its rectangularity when windows leave the group.",
							"type": "boolean",
							"default": true
						},
						"tabbing": {
							"type": "object",
							"properties": {
								"enabled": {
									"description": "Allows windows to tab onto each other.",
									"type": "boolean",
									"default": false
								},
								"allowEditing": {
									"description": "DEPRECATED - Use servicesConfig.window.allowWindowTitleRenaming",
									"type": "boolean",
									"default": true
								}
							},
							"additionalProperties": false
						},
						"tiling": {
							"type": "object",
							"properties": {
								"enabled": {
									"description": "Allows windows to tile onto each other.",
									"type": "boolean",
									"default": false
								}
							},
							"additionalProperties": false
						},
						"ALLOW_GROUPS_TO_SNAP": {
							"description": "Allows groups to snap to one another.",
							"type": "boolean",
							"default": true
						},
						"BUFFER_SIZE": {
							"description": "The zone around a window that will cause it to snap to other windows. This value is in pixels.",
							"type": "number",
							"default": 20
						},
						"enableWindowsAeroSnap": {
							"description": "If `true`, windows aero snap keyboard shortcuts (WINDOWS KEY + UP, RIGHT, DOWN, or LEFT arrow key) will move the current window when pressed. Windows will move the window and Finsemble will respond by updating bounds within the Window Service. If `false` (default), these actions will be cancelled by Finsemble.",
							"type": "boolean",
							"default": false
						},
						"fillHolesOnUndock ": {
							"description": "If set to `true`, a rectangular group will maintain its rectangularity when windows leave the group.",
							"default": true
						},
						"GROUP_MODE": {
							"type": "object",
							"properties": {
								"enabled": {
									"description": "Whether to allow windows to group to one another.",
									"type": "boolean",
									"default": true
								},
								"behavior ": {
									"type": "string",
									"enum": ["explicit", "implicit"],
									"default": "explicit"
								}
							},
							"additionalProperties": false
						},
						"groupTileBuffer": {
							"type": "number",
							"default": 30,
							"description": "Defines the size of the buffer in pixels wherein a dragged window will trigger a tile operation."
						},
						"RESIZE_EVENT_THROTTLE_PERIOD": {
							"description": "Value (in milliseconds) to throttle resize events. If you find that the quantity of resize events is causing poor performance, tweak this value until you are happy with the performance.",
							"type": "number",
							"default": 0
						},
						"SNAPPING_OPACITY": {
							"description": "The opacity windows change to when other windows encroach on their buffer zone.",
							"type": "number",
							"default": 0.8
						},
						"claimSpace": {
							"description": "Settings for claiming space on Desktop at the operating System level. Windows Only.",
							"type": "object",
							"properties": {
								"enabled": {
									"description": "If true, docked windows will behave like the Windows Taskbar and claimed space on the operating system",
									"type": "boolean",
									"default": true
								},
								"alwaysOnTop": {
									"description": "If true, docked windows that claim space will be always on top when docked",
									"type": "boolean",
									"default": false
								}
							}
						},
						"preventOverlapClaimSpace": {
							"description": "If a user moves a window so that it's top edge overlaps operating system claimed space (e.g. the toolbar area on MS Windows), then it will be automatically repositioned below or above the claimed space unless this value is set to `false`",
							"type": "boolean",
							"default": true
						},
						"allowAppropriatedWindowsToGroup": {
							"description": "Allow Appropriated Windows (Freestanding Applications and windows opened with window.open) to group",
							"type": "boolean",
							"default": false
						}
					},
					"required": [
						"enabled",
						"groupTileBuffer",
						"headerHeight",
						"MINIMUM_WIDTH",
						"requireRectangularityForGroupResize",
						"undockDisbandsEntireGroup",
						"fillHolesOnUndock",
						"tiling"
					],
					"additionalProperties": false
				},
				"interop": {
					"title": "interop",
					"type": "object",
					"description": "Interop Service config options",
					"properties": {
						"affinity": {
							"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity",
							"type": ["string", "boolean"]
						},
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"visible": {
							"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
							"type": "boolean",
							"default": false
						},
						"showDevConsoleOnVisible": {
							"type": "boolean",
							"default": true,
							"description": "Automatically spawns a dev console when visible is true. Note that if a service is set to type \"script\" then you should not use this but instead debug serviceManager.html."
						},
						"bootParams": {
							"$ref": "#/definitions/bootParamsProperties"
						},
						"addIntentListenerMaxInitializationTimeout": {
							"description": "Maximum time the interop service will wait for the addIntendListener to be invoked by a component.",
							"type": "number",
							"default": 15000
						}
					},
					"additionalProperties": false
				},
				"launcher": {
					"title": "launcher",
					"type": "object",
					"description": "Launcher Service config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"defaultComponentAffinity": {
							"description": "Global default render process affinity for all non-service components and applications, set to false to disable grouping of render processes via affinity. This setting can be overridden by component level config",
							"type": ["string", "boolean"],
							"default": "WorkspaceComponents"
						},
						"defaultServiceAffinity": {
							"description": "Global default render process affinity for all services excluding the four micro-kernel services (System Manager, Router, Logger and Config) which cannot access the config. Set to false to disable grouping of render processes for services via affinity. This setting can be overridden by service level config",
							"type": ["string", "boolean"],
							"default": "Finsemble"
						},
						"affinity": {
							"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity",
							"type": ["string", "boolean"]
						},
						"visible": {
							"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
							"type": "boolean",
							"default": false
						},
						"concurrentSpawnLimit": {
							"description": "This specifies the number of components that can be spawned concurrently during Workspace load. The default is machine's number of processor cores divided by 2. More than one window per core can potentially cause performance issues on processor-intensive components. Defaults to the machine's number of processor cores divided by 2",
							"type": "number",
							"minimum": 1
						},
						"staggerPixels": {
							"type": "number",
							"default": 40,
							"description": "Set the amount of \"stagger\" pixels when components are launched on top of another. Staggering is like laying cards out on a table."
						},
						"unknownComponent": {
							"type": "string",
							"default": "nonConfiguredComponent",
							"description": "This corresponds to a component's key in one of your component JSON files. Our default is the \"nonConfiguredComponent\". The unknown component serves as a placeholder for a component that a user loses permissions to. The unknown component will show up as a substitute to an existing component when Finsemble cannot find this component's configuration (e.g., the user no longer has access to this component). This unknown component will be saved to the workspace so that the original component will return in the future if Finsemble is able to find it."
						},
						"search": {
							"description": "Allows you to control the component search built into finsemble",
							"type": "object",
							"properties": {
								"enabled": {
									"description": "Set to false to disable component search.",
									"type": "boolean",
									"default": true
								},
								"options": {
									"type": "object",
									"description": "An object containing fuse.js configuration options.",
									"properties": {}
								}
							},
							"additionalProperties": false
						},
						"defaultPreloads": {
							"type": "object",
							"description": "(DEPRECATED) Use finsemble.extensions.preloads instead",
							"properties": {
								"allComponents": {
									"type": "array",
									"default": [],
									"description": "An array of URLs that will be preloaded into all components.",
									"items": {
										"type": "string",
										"description": "A URL of a preload"
									}
								},
								"launchableComponents": {
									"type": "array",
									"default": [],
									"description": "An array of URLs that will be preloaded into components that are launchable by the user.",
									"items": {
										"type": "string",
										"description": "A URL of a preload"
									}
								}
							}
						}
					},
					"required": ["staggerPixels", "unknownComponent"]
				},
				"linker": {
					"title": "linker",
					"type": "object",
					"description": "Linker config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"enabled": {
							"description": "Set this to `true` in order to use Linker Client on client side. Otherwise the FDC3 client will be used.",
							"type": "boolean",
							"default": false
						}
					}
				},
				"logger": {
					"title": "logger",
					"type": "object",
					"description": "Central Logger config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"affinity": {
							"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity.",
							"type": ["string", "boolean"]
						},
						"visible": {
							"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
							"type": "boolean",
							"default": false
						},
						"hotkeyShowCentralLogger": {
							"description": "Sets the hotkey for showing the Central Logger. Leave this config out to disable the hotkey.",
							"type": "array",
							"items": {
								"type": "string"
							},
							"default": ["ctrl", "shift", "L"]
						},
						"defaultClientLogLevels": {
							"$ref": "#/definitions/loggerClientLogLevels"
						},
						"logToDiskLevels": {
							"$ref": "#/definitions/logToDiskLevels"
						},
						"skipLargeObjects": {
							"$comment": "Not documented to allow for changing the default behaviour at a later date (discoverable via IntelliSense)",
							"type": "boolean",
							"default": true
						}
					},
					"additionalProperties": false
				},
				"storage": {
					"title": "storage",
					"type": "object",
					"description": "Storage Service config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"adapterOperationTimeout": {
							"description": "The timeout, in milliseconds, of each storageAdapter operation",
							"default": 10000,
							"type": "number"
						},
						"affinity": {
							"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity",
							"type": ["string", "boolean"]
						},
						"visible": {
							"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
							"type": "boolean",
							"default": false
						},
						"defaultStorage": {
							"description": "The default storage model to use when saving and loading data.",
							"type": "string",
							"default": "IndexedDBAdapter"
						},
						"dataStoreAdapters": {
							"title": "dataStoreAdapters",
							"description": "Storage adapters that the storage service will load and can be mapped to storage topics. Each entry specifies the path (which may contain manifest macros) to built a storage adapter javascript file. See the Storing Data tutorial for details on how to build a custom adapter.",
							"type": "object",
							"properties": {},
							"additionalProperties": {
								"$ref": "#/definitions/dataStoreAdaptersEntry"
							},
							"examples": [
								{
									"LocalStorageAdapter": "$applicationRoot/adapters/localStorageAdapter.js",
									"IndexedDBAdapter": "$applicationRoot/adapters/indexedDBAdapter.js"
								}
							]
						},
						"topicToDataStoreAdapters": {
							"title": "topicToDataStoreAdapters",
							"type": "object",
							"description": "Mapping of storage topic to the name of storage adapter.",
							"properties": {
								"finsemble": {
									"description": "Which storage adapter to use when persisting non-workspace-related information.",
									"type": "string",
									"default": "IndexedDBAdapter"
								},
								"finsemble.workspace": {
									"description": "Which storage adapter to use when persisting workspace-related information.",
									"type": "string",
									"default": "IndexedDBAdapter"
								},
								"finsemble.workspace.cache": {
									"description": "Which storage adapter to use when caching workspace-related information.",
									"type": "string",
									"default": "IndexedDBAdapter"
								},
								"finsemble.notifications": {
									"description": "Sets the storage adapter for notification persistence",
									"type": "string",
									"default": "IndexedDBAdapter"
								}
							},
							"required": ["finsemble", "finsemble.workspace", "finsemble.workspace.cache"]
						}
					},
					"required": ["defaultStorage", "dataStoreAdapters", "topicToDataStoreAdapters"]
				},
				"workspace": {
					"type": "object",
					"description": "Configurations related to the workspace service.",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"affinity": {
							"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity",
							"type": ["string", "boolean"]
						},
						"visible": {
							"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
							"type": "boolean",
							"default": false
						},
						"persistURL": {
							"description": "A global config for component URL persistence. When true, components automatically save their last URL instead of using the one in the config. The component config will overwrite the global config.",
							"default": false
						},
						"closeWorkspaceTimeout": {
							"description": "Number of milliseconds the workspace service should wait for all of the windows to close when switching to another workspace. Workspaces are locked until a close action completes or times out. If this timeout value is exceeded the user will be provided with a notification and an empty workspace will be loaded. Set to null for no timeout.",
							"type": "number",
							"default": 30000
						},
						"closeFailureNotificationMessage": {
							"description": "Override the default notification message that appears to the end user when closeWorkspaceTimeout is triggered. Set to \"\" to stop a message from being sent.",
							"type": "string"
						},
						"disableDirtyShutdownCheck": {
							"description": "Disable the check for dirty shutdown when Workspace Service starts that causes the last active workspace to be used",
							"type": "boolean"
						},
						"emptyWorkspaceName": {
							"type": "string",
							"default": "Empty Workspace",
							"description": "Allows you to set the name of the empty workspace created if the user has no workspaces and no default workspace is configured, or a workspace switch fails."
						},
						"loadFailureNotificationMessage": {
							"type": "string",
							"description": "Override the default message that appears to users in a pop-up notification when a workspace fails to load."
						},
						"search": {
							"description": "Allows you to control the workspace search built into finsemble",
							"type": "object",
							"properties": {
								"enabled": {
									"description": "Set to false to disable workspace search.",
									"type": "boolean",
									"default": true
								},
								"options": {
									"type": "object",
									"description": "An object containing fuse.js configuration options.",
									"properties": {}
								}
							},
							"additionalProperties": false
						},
						"promptUserOnDirtyWorkspace": {
							"description": "When set to `false`, the user's workspace automatically saves to the last configuration when switching workspaces or closing Finsemble. When set to `true`, the user is prompted to save the current workspace configuration if there are unsaved changes.",
							"type": "boolean",
							"default": true
						},
						"permanentWorkspaces": {
							"description": "Allows you to declare what workspaces should not be renameable and deletable by users.",
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"discardUnsavedChanges": {
							"description": "When set to `true`, unsaved workspace changes will be discarded automatically. This setting is ignored if promptUserOnDirtyWorkspace is set to true.",
							"type": "boolean",
							"default": false
						}
					},
					"additionalProperties": false
				},
				"assimilation": {
					"$ref": "#/definitions/serviceAssimilationConfig"
				},
				"notifications": {
					"description": "configs specific to the notifications service",
					"type": "object",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"notificationsCenterComponentType": {
							"description": "(Experimental) This value tells the notification service which component to use as the Notification Center. This component should spawn, hide and show when clicking the notification bell.",
							"type": "string",
							"default": "NotificationsCenter"
						},
						"defaultSnoozePeriodSeconds": {
							"description": "The default snooze period for notifications",
							"type": "number",
							"default": 300
						},
						"newNotificationHaloPeriodSeconds": {
							"description": "The default period for new notifications halo",
							"type": "number",
							"default": 180
						},
						"maxNotificationsToRetain": {
							"description": "The maximum number of notifications the service should store in memory",
							"type": "number",
							"default": 1000
						},
						"disableDotOnToolbarIcon": {
							"type": "boolean",
							"default": false,
							"description": "Disables the dot on the toolbar notifications icon when there are unread notifications."
						},
						"showDotOnToolbarIconForMutedNotifications": {
							"type": "boolean",
							"default": false,
							"description": "Shows the new notification dot on the toolbar for muted notifications (if disableDotOnToolbarIcon is false)."
						},
						"toastTimeoutOnActionableNotifications": {
							"type": "boolean",
							"default": true,
							"description": "If set to false, Actionable Notification Toasts will stay on screen until manually removed."
						},
						"maxNotificationRetentionPeriodSeconds": {
							"description": "The maximum amount of time to retain notifications in seconds",
							"type": "number",
							"default": 604800
						},
						"informationalNotificationToastPeriodSeconds": {
							"description": "The number of seconds a toast will show for informational notifications (Any notifications without actions)",
							"type": "number",
							"default": 45
						},
						"proxyToWebApiFilter": {
							"description": "Broadcast any notifications that match this filter to the Notification Web API to appear in the OS.",
							"type": ["object", "boolean"],
							"properties": {
								"include": {
									"type": ["array", "boolean"],
									"items": {
										"$ref": "#/definitions/notification"
									}
								},
								"exclude": {
									"type": ["array", "boolean"],
									"items": {
										"$ref": "#/definitions/notification"
									}
								}
							}
						},
						"defaultDismissButtonText": {
							"description": "If the service needs to add dismiss actions to the button. The text will default to the value set here as a last resort. There is a hardcoded value if this not set.",
							"type": "string",
							"default": "Dismiss"
						},
						"types": {
							"description": "'types' provide a way of setting default values on notifications based on the INotification.type",
							"type": "object",
							"properties": {
								"default": {
									"description": "'default' is a reserved name. If there any notifications with notification.type that do not match any of the keys in the config. The values in default will be applied.",
									"$ref": "#/definitions/notificationType"
								}
							},
							"additionalProperties": {
								"$ref": "#/definitions/notificationType"
							}
						},
						"applyNotificationOverrides": {
							"description": "The applyNotificationOverrides enables Finsemble to display notifications triggered by a browser view.",
							"type": "boolean",
							"default": false
						},
						"userPreferences": {
							"deprecated": true,
							"type": "object"
						}
					},
					"additionalProperties": false
				},
				"window": {
					"title": "window",
					"type": "object",
					"description": "Window Service config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						},
						"additionalWorkspaceFields": {
							"description": "Additional fields for window data that are allowed to be stored in the Workspace",
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"ignoreFieldsForDirtyingWorkspace": {
							"description": "Changes in these fields do not cause workspaces to be dirty",
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"allowWindowTitleRenaming ": {
							"description": "When set to true, allows to double-click on a window title (or tab) and rename it.",
							"type": "boolean",
							"default": false
						}
					}
				},
				"search": {
					"type": "object",
					"description": "Search service config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						}
					}
				},
				"hotkeys": {
					"type": "object",
					"description": "Hotkeys service config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						}
					}
				},
				"authentication": {
					"type": "object",
					"description": "Authentication service config options",
					"properties": {
						"spawnAs": {
							"$ref": "#/definitions/spawnAs"
						}
					}
				}
			},
			"additionalProperties": false
		},
		"importConfig": {
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "(PUBLIC) Defines an array of JSON URLs to be imported into the top-level finsemble object. Note that this will overwrite any existing config settings, with two exceptions: New services defined under finsemble.services will be added to the list of existing services (as opposed to replacing the existing list of services). New components defined under finsemble.components will be added to the list of existing components (as opposed to replacing the list of existing components).",
			"type": "array",
			"items": {
				"type": "string"
			},
			"examples": [
				[
					"$applicationRoot/configs/application/UIComponents.json",
					"$applicationRoot/configs/application/components.json"
				]
			]
		},
		"importThirdPartyConfig": {
			"description": "(PUBLIC) This import is essentially the same as importConfig with one notable difference: the imported configuration settings cannot overwrite any existing settings. In this case, the settings for any potential overwrite will be discarded with a warning message written to the Config Service's log.",
			"type": "array",
			"items": [
				{
					"type": "string"
				}
			],
			"additionalItems": false
		},
		"router": {
			"title": "router",
			"description": "(PUBLIC) Configurations for Router's communication mechanism.",
			"type": "object",
			"properties": {
				"crossDomainTransport": {
					"description": "The interface for communicating between cross-domain components - When set to `IPCBus`, the default,, all cross-domain components will use IPC to communicate. When set to `FinsembleTransport`, cross-domain components will use IAC. You might switch the `crossDomainTransport` if you are having connection issues involving firewalls, your CSP, etc. Available values are 'IPCBus' and 'FinsembleTransport'.",
					"type": "string",
					"enum": ["IPCBus", "SharedWorker", "FinsembleTransport"],
					"default": "IPCBus"
				},
				"sameDomainTransport": {
					"description": "The transport for components and services with Finsemble's domain. ",
					"type": "string",
					"enum": ["IPCBus", "SharedWorker", "FinsembleTransport"],
					"default": "SharedWorker"
				},
				"transportSettings": {
					"title": "transportSettings",
					"description": "The specific setting for certain transports.",
					"type": "object",
					"properties": {
						"FinsembleTransport": {
							"title": "FinsembleTransport",
							"description": " Configuration for the FinsembleTransport (IAC) if chosen as the communication mechanism for cross-domain components. IAC uses WebSocket as its communication protocol.",
							"type": "object",
							"properties": {
								"serverAddress": {
									"description": "URI for the WebSocket server. To use a secure connection, use 'wss://localhost.chartiq.com:3376'",
									"type": "string",
									"default": "ws://127.0.0.1:3376"
								}
							},
							"required": ["serverAddress"]
						}
					},
					"required": ["FinsembleTransport"],
					"default": {}
				},
				"promptBeforeAllowingExternalApps": {
					"title": "promptBeforeAllowingExternalApps",
					"description": "(DEPRECATED) this capability will be deprecated in order to support freestanding apps",
					"type": "boolean",
					"default": false
				},
				"trafficSnapshotMilliseconds": {
					"description": "if defined how often to take the traffic snapshot for diagnostics",
					"type": "number"
				},
				"trafficSnapMinCountSize": {
					"description": "if traffic snapshot enable, then filter from output if not this many messages for the channel/topic",
					"type": "number"
				}
			},
			"additionalProperties": false,
			"examples": [
				{
					"router": {
						"crossDomainTransport": "IPCBus",
						"sameDomainTransport": "SharedWorker",
						"transportSettings": {
							"FinsembleTransport": {
								"serverAddress": "ws://127.0.0.1:3376"
							}
						}
					}
				}
			]
		},
		"system": {
			"title": "system",
			"description": "(PRIVATE) Core configuration for system. Much of this is boot config.",
			"type": "object",
			"properties": {
				"FSBLVersion": {
					"type": "string"
				},
				"gitHash": {
					"type": "string"
				},
				"finsembleLibraryPath": {
					"type": "string"
				},
				"premiumRoot": {
					"type": "string"
				},
				"addFSBLWrappers": {
					"type": "boolean"
				},
				"saveLogToFileOnShutDown": {
					"type": "boolean"
				},
				"scheduledRestart": {
					"$ref": "#/definitions/scheduledRestart"
				},
				"scheduledShutdown": {
					"$ref": "#/definitions/scheduledShutdown"
				},
				"isolateCrossDomainComponents": {
					"type": "boolean"
				},
				"requiredServicesConfig": {
					"title": "requiredServicesConfig",
					"description": "Core System Configuration that is typically never modified by users. ",
					"type": "object",
					"properties": {
						"routerService": {
							"type": "object",
							"properties": {
								"bootParams": {
									"$ref": "#/definitions/bootParamsProperties"
								},
								"spawnAs": {
									"type": "string"
								},
								"name": {
									"type": "string"
								},
								"visible": {
									"type": "boolean"
								},
								"html": {
									"type": "string"
								},
								"file": {
									"type": "string"
								}
							}
						},
						"loggerService": {
							"type": "object",
							"properties": {
								"bootParams": {
									"$ref": "#/definitions/bootParamsProperties"
								},
								"spawnAs": {
									"type": "string"
								},
								"name": {
									"type": "string"
								},
								"visible": {
									"type": "boolean"
								},
								"html": {
									"type": "string"
								},
								"file": {
									"type": "string"
								}
							}
						},
						"dataStoreService": {
							"type": "object",
							"properties": {
								"bootParams": {
									"$ref": "#/definitions/bootParamsProperties"
								},
								"spawnAs": {
									"type": "string"
								},
								"name": {
									"type": "string"
								},
								"visible": {
									"type": "boolean"
								},
								"html": {
									"type": "string"
								},
								"file": {
									"type": "string"
								},
								"frame": {
									"type": "boolean"
								}
							},
							"additionalProperties": false
						},
						"configService": {
							"type": "object",
							"properties": {
								"bootParams": {
									"$ref": "#/definitions/bootParamsProperties"
								},
								"spawnAs": {
									"type": "string"
								},
								"name": {
									"type": "string"
								},
								"visible": {
									"type": "boolean"
								},
								"html": {
									"type": "string"
								},
								"file": {
									"type": "string"
								},
								"changeApplicationStateBeforeLoad": {
									"type": "string"
								},
								"changeApplicationStateAfterLoad": {
									"type": "string"
								},
								"frame": {
									"type": "boolean"
								}
							},
							"additionalProperties": false
						}
					},
					"required": ["routerService", "loggerService", "dataStoreService", "configService"],
					"additionalProperties": false
				}
			},
			"required": [
				"FSBLVersion",
				"gitHash",
				"finsembleLibraryPath",
				"premiumRoot",
				"addFSBLWrappers",
				"saveLogToFileOnShutDown",
				"scheduledRestart",
				"scheduledShutdown",
				"isolateCrossDomainComponents",
				"requiredServicesConfig"
			],
			"additionalProperties": false
		},
		"bootTasks": {
			"title": "bootTasks",
			"description": "(PRIVATE) Startup configuration of internal boot tasks. ",
			"type": "object",
			"properties": {
				"initializeDeepLinkingTask": {
					"$ref": "#/definitions/bootParams"
				},
				"initializeRouterTask": {
					"$ref": "#/definitions/bootParams"
				},
				"initializeFinsemblePubsubTask": {
					"$ref": "#/definitions/bootParams"
				},
				"initializeSystemStateHandersTask": {
					"$ref": "#/definitions/bootParams"
				},
				"updateServiceLauncherConfigTask": {
					"$ref": "#/definitions/bootParams"
				},
				"waitForAuthenticatedTask": {
					"$ref": "#/definitions/bootParams"
				},
				"initializeSystemManagerAPITask": {
					"$ref": "#/definitions/bootParams"
				},
				"startLoggerTask": {
					"$ref": "#/definitions/bootParams"
				},
				"loadUserDefinedComponentsTask": {
					"$ref": "#/definitions/bootParams"
				},
				"loadAppDInstalledComponentsTask": {
					"$ref": "#/definitions/bootParams"
				},
				"loadSystemTrayIconTask": {
					"$ref": "#/definitions/bootParams"
				},
				"registerHotkeysTask": {
					"$ref": "#/definitions/bootParams"
				},
				"setupSearchLauncherTask": {
					"$ref": "#/definitions/bootParams"
				},
				"checkForScheduledRestartTask": {
					"$ref": "#/definitions/bootParams"
				},
				"checkForScheduledShutdownTask": {
					"$ref": "#/definitions/bootParams"
				}
			},
			"additionalProperties": {
				"$ref": "#/definitions/bootParams"
			}
		},
		"boot_config": {
			"title": "bootConfig",
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "(PUBLIC) Boot/startup configuration parameters used by the System Manager.",
			"type": "object",
			"properties": {
				"onErrorMakeSystemManagerVisible": {
					"type": "boolean",
					"default": true
				},
				"defaults": {
					"title": "defaults",
					"type": "object",
					"description": "Default startup-up properties for System Manager",
					"properties": {
						"startServiceTimeout": {
							"description": "Default timeout value in milliseconds for services",
							"type": "number",
							"minimum": 0,
							"maximum": 999999,
							"default": 15000
						},
						"startComponentTimeout": {
							"description": "Default timeout value in milliseconds for components",
							"type": "number",
							"minimum": 0,
							"default": 15000
						},
						"startTaskTimeout": {
							"type": "number",
							"minimum": 0,
							"maximum": 999999,
							"default": 10000
						}
					},
					"additionalProperties": false
				}
			},
			"additionalProperties": false,
			"examples": [
				{
					"bootConfig": {
						"defaults": {
							"startServiceTimeout": 10000,
							"startComponentTimeout": 15000
						}
					}
				}
			]
		},
		"bootParams": {
			"description": "Startup boot parameters for services, components, and boot tasks",
			"type": "object",
			"properties": {
				"bootParams": {
					"$ref": "#/definitions/bootParamsProperties"
				}
			},
			"additionalProperties": false
		},
		"bootParamsProperties": {
			"title": "bootParams",
			"description": "Boot parameter properties",
			"type": "object",
			"properties": {
				"stage": {
					"description": "Specifies at which stage the app is launched.",
					"type": "string",
					"enum": [
						"microkernel",
						"kernel",
						"pre-authentication",
						"authentication",
						"system-preuser",
						"preuser",
						"preuser2",
						"preuser3",
						"preuser4",
						"earlyuser",
						"user"
					]
				},
				"stopOnFailure": {
					"description": "Specifies whether the app should stop if one or more of its dependencies fail to start. Only relevant to apps with dependencies. Set to false if you want the app to continue startup even if its dependencies fail.",
					"default": true,
					"type": "boolean"
				},
				"autoStart": {
					"description": "Specifies whether to automatically start during the system manager's startup phase",
					"default": true,
					"type": "boolean"
				},
				"customFailureMessage": {
					"description": "The custom message to output to the system log if the app fails to start",
					"type": "string"
				},
				"timeout": {
					"description": "The maximum time the app can take to start up. If the startup doesn't complete in this time, it's marked as a failure. If you don't specify this property, Finsemble will use the default timeout value under the manifest's 'bootConfig.startComponentTimeout' property.",
					"type": "number"
				},
				"dependencies": {
					"description": "Specifies other services this service relies on.",
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"checkpoints": {
					"title": "checkpoints",
					"type": "object"
				}
			},
			"additionalProperties": false
		},
		"availableDashbarItems": {
			"type": "object",
			"description": "Available dashbar items to list in dashbar user preferences",
			"additionalProperties": {
				"$ref": "#/definitions/dashbarItem"
			}
		},
		"dashbarItem": {
			"title": "dashbarItem",
			"description": "Dashbar item properties",
			"type": "object",
			"properties": {
				"title": {
					"description": "the text displayed in the title bar of the dashbar item",
					"type": "string"
				},
				"url": {
					"description": "the URL path of the content of the dashbar item",
					"type": "string"
				},
				"width": {
					"description": "(optional) the width of the dashbar item",
					"type": "integer"
				}
			},
			"required": ["title", "url"]
		},
		"dataStoreAdaptersEntry": {
			"title": "dataStoreAdaptersEntry",
			"type": "string"
		},
		"appd": {
			"title": "appd",
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "(PUBLIC) Contains Finsemble's app configurations. App config is the primary way that Finsemble learns about apps. Finsemble uses this to create its launcher menus and for driving data integration (interop).",
			"type": "object",
			"properties": {},
			"additionalProperties": {
				"$ref": "#/definitions/AppDEntry"
			}
		},
		"AppDEntry": {
			"title": "AppD entry",
			"description": "(PUBLIC) AppD entries describe apps. (This format follows the FDC3 AppD specification).",
			"type": "object",
			"properties": {
				"appId": {
					"type": "string",
					"description": "A unique identifier for the app which is used programatically and should follow the AppD specification for fully qualified naming: https://fdc3.finos.org/docs/1.0/appd-discovery#application-id-namespace-syntax-host-resolution."
				},
				"contactEmail": {
					"type": "string",
					"description": "Email address to contact for information about the app. (Used when apps are picked out of a third party app catalog.)"
				},
				"description": {
					"type": "string",
					"description": "Textual description of the app."
				},
				"icons": {
					"type": "array",
					"description": "Set of icons for the app. Finsemble will attempt to pick the best matching icon but best practice is a single png size 64x64 with a transparent background.",
					"items": {
						"type": "object",
						"properties": {
							"src": {
								"type": "string",
								"description": "The url path for the icon image"
							},
							"sizes": {
								"type": "string",
								"description": "The size of the icon in the form 32x32. Multiple sizes may be provided for certain image types. This follows the Web Manifest specification."
							},
							"url": {
								"type": "string",
								"description": "(PRIVATE) Inadvertently used in some components though it's not legal"
							},
							"icon": {
								"type": "string",
								"description": "(DEPRECATED) FDC3 1.0 - 1.2 version of 'src' field"
							}
						}
					}
				},
				"images": {
					"type": "array",
					"description": "Set of \"screenshots\" that describe the app. (This is used when picking apps out of an app catalog.)",
					"items": {
						"type": "object",
						"properties": {
							"url": {
								"type": "string"
							},
							"tooltip": {
								"type": "string"
							}
						},
						"required": ["url"]
					}
				},
				"intents": {
					"type": "array",
					"description": "The set of intents that this app will be listening for. (See Interop tutorial)",
					"items": {
						"$ref": "#/definitions/intent"
					}
				},
				"manifest": {
					"$ref": "#/definitions/component"
				},
				"manifestType": {
					"type": "string",
					"description": "The type of manifest. This is always equivalent to \"finsemble\" and can be omitted."
				},
				"name": {
					"type": "string",
					"description": "The name of the app."
				},
				"publisher": {
					"type": "string",
					"description": "The name of the organization who publishes the app. (This is used when picking apps out of third party catalogs.)"
				},
				"releaseNotes": {
					"type": "string",
					"description": "Release notes for this version of the app."
				},
				"supportEmail": {
					"type": "string",
					"description": "An email address to contact for support with this app."
				},
				"tags": {
					"type": "array",
					"description": "A set of searchable tags. (Used when picking apps out of an app catalog)",
					"items": {
						"type": "string"
					}
				},
				"title": {
					"type": "string",
					"description": "A human readable name that describes the app. The app will appear in the launcher menu under this title."
				},
				"tooltip": {
					"type": "string",
					"description": "(PRIVATE) The tooltip that displays when hovering over the app in a launcher (not currently used by Finsemble)"
				},
				"lang": {
					"type": "string",
					"description": "A language tag that specifies the primary language of both the application and its AppD entry, as defined by IETF RFC 5646. For example, \"fr\" for French or \"en-CA\" for Canadian English."
				},
				"version": {
					"type": "string",
					"description": "The version of the app. This should follow semantic versioning rules."
				}
			},
			"required": ["appId", "name", "manifest"]
		},
		"intent": {
			"type": "object",
			"description": "An intent (following the FDC3 format)",
			"properties": {
				"contexts": {
					"type": "array",
					"description": "A filter stating that this app only handles intents for *these* context types. (Intents may have one or more possible context types.)",
					"items": {
						"type": "string"
					}
				},
				"displayName": {
					"type": "string",
					"description": "Friendly printable name for the intent. This will appear in the \"UI Resolver\" when an end user is asked to decide which app to send the intent (whenever there is more than one possible resolution)."
				},
				"name": {
					"type": "string",
					"description": "The official name of the intent. This name is referenced in interop config."
				}
			},
			"required": ["name", "contexts"]
		},
		"components": {
			"title": "components",
			"description": "(PRIVATE) Set of component configurations. Used internally by Finsemble to register \"UI Components\".",
			"type": "object",
			"properties": {},
			"required": [
				"Toolbar",
				"windowTitleBar",
				"Docking Move Mask",
				"yesNo",
				"singleInput",
				"dialogModal",
				"UserPreferences",
				"SystemTrayComponent",
				"linkerWindow",
				"Process Monitor",
				"nonConfiguredComponent"
			],
			"additionalProperties": {
				"$ref": "#/definitions/component"
			}
		},
		"component": {
			"description": "The name of the component you are configuring",
			"title": "component name",
			"finsemble:docs": {
				"rightnav": true
			},
			"type": "object",
			"forceDefaults": false,
			"properties": {
				"bootParams": {
					"$ref": "#/definitions/bootParamsProperties"
				},
				"signatureKey": {
					"type": "object",
					"description": "Public authentication key to decrypt static AuthenticationTokens within interopService.",
					"additionalProperties": true,
					"properties": {
						"alg": {
							"type": "string",
							"description": "The algorithm used to generate the keys."
						},
						"ext": {
							"type": "boolean",
							"description": "(PRIVATE) Short of 'extractable'. This is an extension of the JWK format, supported by the WebCrypto API.",
							"default": true
						},
						"key_ops": {
							"type": "array",
							"description": "(PRIVATE) The operations that the key is intended to be used for. One of these items should be 'sign'.",
							"items": {
								"type": "string"
							}
						},
						"kty": {
							"type": "string",
							"description": "(PRIVATE) The key type, such as 'RSA' or 'EC'."
						},
						"n": {
							"type": "string",
							"description": "(PRIVATE) The modulus of an RSA key"
						},
						"e": {
							"type": "string",
							"description": "(PRIVATE) The exponent of an RSA key"
						}
					}
				},
				"signatureKeyURL": {
					"type": "string",
					"default": false,
					"description": "(PUBLIC) URL specifying the location of the signature key."
				},
				"isAnApp": {
					"type": "boolean",
					"default": false,
					"description": "(PRIVATE) This field is added dynamically by Finsemble's config service to indicate that the app came from AppD rather than from component.json. It is generally used in the code to distinguish between apps and UI components. It should never be set in json but is required in the schema to avoid phantom schema validation errors."
				},
				"appService": {
					"type": "boolean",
					"default": false,
					"description": "(PUBLIC) When true, the app will be treated as an app service."
				},
				"appDConfig": {
					"type": "object",
					"description": "(PRIVATE) This should never be set in raw json. Internally, Finsemble's config service converts appd entries to component entries which then contain this field. It is necessary for this field to exist in the schema to avoid phantom schema validation errors."
				},
				"waitForInitialization": {
					"type": "boolean",
					"default": false,
					"description": "(PUBLIC) When true, startup will wait for the app to explicitly signal it is ready."
				},
				"interop": {
					"description": "Interop (data integration) related config for this app",
					"finsemble:docs": {
						"rightnav": true
					},
					"type": "object",
					"properties": {
						"useLinker": {
							"type": "boolean",
							"description": "The linker is turned on by default for any app that uses FDC3. Set this flag to false in order to turn off the linker for this app. For instance, if your app only uses App Channels (i.e. 'well known' named channels)."
						},
						"autoConnect": {
							"type": "boolean",
							"default": false,
							"description": "If set to true then the app will automatically connect to the Interop service. In most cases, this will cause the linker to display. If set to false (the default) then the app will connect upon the first call to any `fdc` function. "
						},
						"selectConnect": {
							"type": "array",
							"description": "(Experimental). Interop messaging rules to support no-code integration of modules. It allows you to specify precisely which modules can communicate and in what way.",
							"items": {
								"type": "object",
								"description": "A specific selectConnect rule that consists of one or more properties.",
								"properties": {
									"authorize": {
										"type": "array",
										"items": {
											"type": "object",
											"description": "When set, messages will be restricted to apps that meet the authorization criteria. Note: using 'authorize' is the same as using both 'to' and 'from'.",
											"properties": {
												"name": {
													"type": "string",
													"description": "When set, messages will be delivered to or received from apps with this name only. App name is verified by Finsemble."
												}
											}
										}
									},
									"to": {
										"type": "array",
										"items": {
											"type": "object",
											"description": "When set,  messages will be sent only to apps that meet the authorization criteria.",
											"properties": {
												"name": {
													"type": "string",
													"description": "When set, messages will be sent only to apps with this name. App name is verified by Finsemble."
												}
											}
										}
									},
									"from": {
										"type": "array",
										"items": {
											"type": "object",
											"description": "When set, messages can be received only from apps that meet the authorization criteria.",
											"properties": {
												"name": {
													"type": "string",
													"description": "When set, messages will be received only from apps with this name. App name is verified by Finsemble."
												}
											}
										}
									},
									"cc": {
										"type": "string",
										"description": "The name of a valid selectConnect module. When cc is set, that module will receive a copy of the message. cc works on both outgoing and incoming traffic."
									},
									"contextType": {
										"type": "string",
										"description": "Apply this rule only to this specific context type. (optional)"
									},
									"fwd": {
										"type": "string",
										"description": "The name of a valid selectConnect module. When fwd is set, that module will receive the message *instead* of the original description. fwd is intended primarily for outgoing traffic but will also work on incoming traffic."
									},
									"autoAssociate": {
										"type": "object",
										"description": "defines app’s autoAssociate property",
										"properties": {
											"allChildren": {
												"type": "boolean",
												"description": "if true all apps spawned or opened by this app will automatically associated (i.e. auto-joined to common channel)"
											},
											"selectChildren": {
												"type": "array",
												"description": "any app in this list when spawned or opened by this app will automatically associated.",
												"items": {
													"type": "string",
													"description": "appId of child app"
												}
											},
											"usingConnectId": {
												"type": "string",
												"description": "specifies a fixed association (as opposed to dynamic) using the specified connectId -- all apps with this connectId will automatically associated"
											}
										}
									}
								}
							}
						}
					}
				},
				"window": {
					"title": "window",
					"finsemble:docs": {
						"rightnav": true
					},
					"type": "object",
					"description": "Configurations that manage placement of the application's window on the screen. <i><a href=\"/docs/smart-desktop/windows-and-workspaces/API-LauncherClient#spawn\">Configuration settings in this section may also be passed as parameters to `LauncherClient.spawn()`.</a></i>",
					"properties": {
						"//": {
							"type": "string",
							"description": "(PRIVATE)"
						},
						"addToWorkspace": {
							"type": "boolean",
							"default": true,
							"description": "Specifies whether to add the new component to the workspace. The value set in the component manifest takes priority over any value passed as a parameter to `LauncherClient.spawn` or related functions."
						},
						"affinity": {
							"type": ["string", "boolean"],
							"description": "Process affinity allows you to control how render processes for web windows, served from the same 'site' (registered domain and protocol) are grouped together, reducing their memory footprint, at the cost of increasing CPU resource contention (as a render thread can only process one window at a time). As most user interface components are only active while the user is interacting with them, process grouping via affinity is an effective way to reduce memory footprint. Conversely, you may wish to disable or customize the affinity setting for CPU intensive applications that are driven by outside events (for example a ticking blotter or chart driven by an external data source). In this way, you can strike a balance between performance and memory footprint. Group applications together thoughtfully by setting them to the same string value or disable render process group by setting affinity to false. See the <a href=\"/docs/how-finsemble-works/processManagement\">Process Management tutorial</a> for more information."
						},
						"alias": {
							"type": "string",
							"description": "May be used with native applications (i.e. when windowType is \"native\" or \"assimilation\") instead of `path`. Specifies the alias of a bundled asset to launch."
						},
						"alwaysOnTop": {
							"type": "boolean",
							"deprecated": true
						},
						"arguments": {
							"type": "string",
							"description": "Specifies the arguments to be sent to a native application (i.e. when windowType is \"native\" or \"assimilation\") on launch. Separate the arguments by spaces: `--arg1 foo --arg2 bar` except when `params.argumentsAsQueryString` is true, in which case set this parameter to be single string in URI format: `arg=1&arg=2`"
						},
						"argumentsAsQueryString": {
							"type": "boolean",
							"description": "For native applications (i.e. when windowType is \"native\" or \"assimilation\"), causes the generated arguments (the automatically generated arguments and any supplied as the \"arguments\" parameter) to be encoded as a query string and appended to the URI. This is useful for applications launched via a protocol handler or online ClickOnce deployment, where the path parameter is a URI."
						},
						"autoShow": {
							"type": "boolean",
							"deprecated": true
						},
						"bottom": {
							"type": ["string", "number", "null"],
							"description": "A pixel value representing the distance from the top edge of the viewport as defined by \"position\". A percentage value may also be used, representing the percentage distance from the top edge of the viewport relative to the viewport's height."
						},
						"canGroup": {
							"type": "boolean",
							"description": "(DEPRECATED) Use foreign.services.windowService.allowGrouping",
							"deprecated": true
						},
						"claimMonitorSpace": {
							"type": "boolean",
							"description": "For use with permanent toolbars. The available space for other components will be reduced by the amount of space covered by the newly spawned component. Users will be prevented from moving windows to a position that covers the claimed space."
						},
						"closeComponentsTogether": {
							"type": "boolean",
							"default": false,
							"description": "Whether to close all components within a launchGroup at the same time."
						},
						"component": {
							"description": "Type of component to spawn."
						},
						"data": {
							"type": ["array", "boolean", "integer", "null", "number", "object", "string"],
							"description": "Optional data to pass to the opening window. If set, then the spawned window can use WindowClient.getSpawnData to retrieve the data."
						},
						"defaultHeight": {
							"type": "number"
						},
						"dockable": {
							"description": "Parts of the monitor that the component can dock to. Valid values are `top` and `bottom`. The `[]` value is equal `false`. The `true` value is equal `['top', 'bottom']`.",
							"type": ["array", "boolean"],
							"items": {
								"type": "string"
							},
							"enum": [true, false, [], ["top"], ["bottom"], ["top", "bottom"]]
						},
						"docked": {
							"type": "string",
							"description": "Which part of the monitor that the component will dock to on spawn. Only valid if combined with the `dockable` property.",
							"enum": ["top", "bottom"]
						},
						"dockedHeight": {
							"type": "number"
						},
						"dockOnSpawn": {
							"type": "boolean",
							"description": "(DEPRECATED) this capability will be deprecated in favor of groupOnSpawn. If true, will automatically dock the window with the \"relative\" window (dock to the parent window unless specified in params.relativeWindow). Note that you must also position the window in a valid position for docking, for example, by setting the \"left\" or \"top\" parameters to \"adjacent\"."
						},
						"ephemeral": {
							"type": "boolean",
							"description": "Indicates that this window is ephemeral. An ephemeral window is a dialog, menu, or other window that is temporarily displayed but usually hidden. Ephemeral windows automatically have the following settings assigned: resizable: false, showTaskbarIcon: false, alwaysOnTop: true. Note: Use `options:{autoShow: false}` to prevent an ephemeral window from showing automatically."
						},
						"env": {
							"description": "Sets environment variables for a spawned native application. Create a map (JSON) object of names to values. This is only available when running Assimilation."
						},
						"forceOntoMonitor": {
							"type": ["boolean", "string"],
							"enum": [true, false, "availableRect", "monitorRect"],
							"description": "If true, tries to make the window have no edges outside the monitor boundary."
						},
						"frame": {
							"type": "boolean"
						},
						"groupOnSpawn": {
							"type": "boolean",
							"description": "Groups the window to the `relativeWindow` based on their adjacent position."
						},
						"height": {
							"type": ["number", "string"],
							"description": "A pixel or percentage value."
						},
						"id": {
							"type": "string"
						},
						"left": {
							"type": ["string", "number", "null"],
							"description": "A pixel value representing the distance from the left edge of the viewport as defined by \"position\". A percentage value may also be used, representing the percentage distance from the left edge of the viewport relative to the viewport's width.<br/><b>\"adjacent\"</b> will snap to the right edge of the spawning or relative window.<br/><b>\"center\"</b> will center the window. If neither left nor right are provided, then the default will be to stagger the window based on the last spawned window."
						},
						"maxHeight": {
							"type": ["number", "boolean", "null"],
							"description": "Maximum height window can be resized to."
						},
						"maxWidth": {
							"type": ["number", "boolean", "null"],
							"description": "Maximum width window can be resized to."
						},
						"minHeight": {
							"type": ["number", "boolean", "null"],
							"description": "Minimum height window can be resized to."
						},
						"minWidth": {
							"type": ["number", "boolean", "null"],
							"description": "Minimum width window can be resized to."
						},
						"monitor": {
							"type": ["number", "string"],
							"description": "Specifies which monitor to place the new window.<br/><b>\"mine\"</b> - Place the window on the same monitor as the calling window.<br/>Integer value from 0-n (0 being the primary monitor).<br/><b>\"primary\"</b> indicates the user's primary monitor.<br/><b>\"all\"</b> - Put a copy of the component on all monitors."
						},
						"name": {
							"type": "string",
							"description": "Window name to apply to the application. The name is not normally specified, allowing Finsemble to generate a random one from the component type. If specified in the configuration, only a single copy of the component can exist at a time."
						},
						"options": {
							"title": "options",
							"description": "Low level window behavior options.  Note that `options` may not be passed as arguments to `LauncherClient.spawn` and related API calls",
							"type": "object",
							"properties": {
								"autoShow": {
									"type": "boolean",
									"default": true,
									"description": "When set to true, the window will be visible when it is spawned. When set to false, the window will be spawned as an invisible window."
								},
								"backgroundThrottling": {
									"description": "Whether to throttle animations and timers when the page becomes backgrounded. This also affects the Page Visibility API. Defaults to true",
									"type": "boolean"
								},
								"contextMenu": {
									"type": "boolean",
									"description": "A flag to show the context menu when right-clicking on a window. Gives access to the Developer Console for the Window.",
									"default": true
								},
								"Content-Security-Policy": {
									"description": "Custom content security policy (CSP) that will override the manifest CSP and the CSP received from this app's HTTP server. This can be a string or an array of strings. See https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP",
									"type": ["array", "string"],
									"items": {
										"type": "string"
									},
									"examples": [["script-src *;"]]
								},
								"permissions": {
									"type": "object",
									"description": "Change an application's individual permissions to be different than from those in its security policy by adding additional configs under this config. See the <a href=\"/docs/how-finsemble-works/SecurityPolicies#customized-security-policies\">Security Policies tutorial</a> for more information.",
									"properties": {}
								},
								"securityPolicy": {
									"type": "string",
									"description": "Set an application's security policy by name, for example to the default \"trusted\" or \"untrusted\" policies or to a custom policy. See the <a href=\"/docs/how-finsemble-works/SecurityPolicies#changing-a-security-policy\">Security Policies tutorial</a> for more information."
								},
								"showTaskbarIcon": {
									"type": "boolean",
									"description": "Specifies whether the application should be displayed in the Windows taskbar."
								},
								"smallWindow": {
									"type": "boolean",
									"deprecated": true
								},
								"maximizable": {
									"type": "boolean",
									"deprecated": true
								},
								"cornerRounding": {
									"$ref": "#/definitions/cornerRounding"
								},
								"opacity": {
									"type": "number",
									"default": 1,
									"description": "Sets the opacity of the window."
								},
								"openLinksInExternalBrowser": {
									"type": "boolean",
									"default": false,
									"description": "When set to true, links (anchor tags) will be open in the OS default browser. See 'navigation' property for restricting navigation."
								},
								"allowedNavigationUrls": {
									"description": "Controls whether the app can navigate to other urls. If unspecified, the default is to allow all urls.  This will change in a future version to allowing only same-origin urls, those with the same domain, protocol, and port as the window itself. An empty array indicates no navigation is allowed, even to the origin domain. To allow specific domains, add those domains to the array. The origin domain must also be added.",
									"type": "array",
									"items": {
										"type": "string",
										"description": "A list of domains to which this app is allowed to navigate or open pop-up windows. If a domain is not fully qualified then it will be treated as a wildcard, '*.domain.com'"
									}
								},
								"allowedWindowOpenUrls": {
									"description": "Controls whether the app can programmatically open a window with `window.open()` based on the url. If unspecified, the default is to allow all urls.  This will change in a future version to allowing only same-origin urls, those with the same domain, protocol, and port as the window itself. An empty array indicates no navigation is allowed, even to the origin domain. To allow specific domains, add those domains to the array. The origin domain must also be added.",
									"type": "array",
									"items": {
										"type": "string",
										"description": "A list of domains to which this app is allowed to navigate or open pop-up windows. If a domain is not fully qualified then it will be treated as a wildcard, '*.domain.com'"
									}
								},
								"resizable": {
									"type": "boolean",
									"default": true,
									"description": "When set to false, the window's edges cannot be resized by the end user and won't participate in Windows aero snap."
								},
								"alwaysOnTop": {
									"type": "boolean",
									"default": false,
									"description": "When set to true, the window will always be on top (like a sticky note) of any window with alwaysOnTop set to false."
								},
								"isEvergreen": {
									"type": "boolean",
									"default": false,
									"description": "When set to true, the window will hide and show when switching between workspaces rather than opening and closing. The same <b>singleton</b> instance of the window is used across multiple workspaces. **Note**:  Tabbing and tiling is set to false for Evergreen components. If you're using set/getComponentState, the state is different per workspace. Listen for the 'component-state-changed' event on the window to update your application accordingly. Or fetch the new state in the Workspace 'load-complete' event in the case of a native application."
								},
								"windowSpawnTimeout": {
									"type": "number",
									"default": 30,
									"description": "Number of seconds before a native application component spawn times out."
								},
								"windowTitleBarUrl": {
									"type": "string",
									"description": "When specified, will override the default Finsemble window titlebar."
								},
								"transparent": {
									"type": "boolean",
									"description": "When set to true the window will be transparent. This will only work if no background color has been set on the window, including through css tags. Dynamically removing background color styles will _not_ work on Mac (there must be no initial css styles for background or background-color)."
								}
							}
						},
						"path": {
							"type": "string",
							"description": "Specifies the path to a native application (i.e. when windowType is \"native\" or \"assimilation\"). The path can be: <ul><li>The name of an exe that is on the system path (e.g., notepad.exe).</li><li>The full path to an executable on the user's machine (e.g., C:\\Program Files\\app.exe).</li><li>A system installed URI (e.g., myuri://advancedapplauncher).</li></ul>When windowType is \"native\" then additional arguments will be automatically appended to the path or the URI. These arguments can be captured by the native application in order to tie it to Finsemble's window tracking. When building an application with finsemble.dll, this is handled automatically. Those arguments are:<ul><li><b>uuid</b> - A generated UUID that uniquely identifies this window.</li><li><b>left</b> - The x coordinate of the new window</li><li><b>top</b> - The y coordinate of the new window</li><li><b>width</b> - The width of the new window</li><li><b>height</b> - The height of the new window</li><li><b>finsembleWindowName</b> - The name of the window in the Finsemble config</li><li><b>componentType</b> - The component type in the Finsemble config</li><li><b>appName</b> - The name of the application in the Finsemble appd.</li></ul> A common troublesome problem is when a native application needs to be launched from an intermediary application (such as a launcher or batch script) or a window needs to be created by a multi-process. multi-window application. The intermediary application or process can pass these parameters along to the final application or thread, which will use them to connect back to Finsemble."
						},
						"position": {
							"type": "string",
							"enum": ["available", "monitor", "relative", "virtual", "absolute"],
							"description": "Defines a \"viewport\" for the spawn, with one of the Position Types:<ul><li><b>available</b> - Positioned according to the coordinates available on the monitor itself, less space claimed by the operating system (such as the windows toolbar). For instance, `bottom:0` will place the new component with its bottom flush against the windows toolbar.</li><li><b>monitor</b> - Positioned according to the absolute size of the monitor. For instance, `top:0` will place the component overlapping the toolbar.</li><li><b>relative</b> - Positioned relative to the relativeWindow. For instance, `left:0;top:0` will join the top left corner of the new component with the top left corner of the relative window.</li><li><b>virtual</b> - Deprecated. Positioned against coordinates on the virtual screen. The virtual screen is the full viewing area of all monitors combined into a single theoretical monitor.</li><li><b>absolute</b> - Positioned using native operating system coordinates.</li></ul>"
						},
						"relativeWindow": {
							"description": "The window to use when calculating any relative launches. If not set then the window from which spawn() was called. Primarily used as an argument to `LauncherClient.spawn()` and related functions."
						},
						"resizable": {
							"type": "boolean",
							"deprecated": true
						},
						"right": {
							"type": ["string", "number", "null"],
							"description": "A pixel value representing the distance from the right edge of the viewport as defined by \"position\". A percentage value may also be used, representing the percentage distance from the right edge of the viewport relative to the viewport's width."
						},
						"setBoundsOnly": {
							"type": "boolean",
							"description": "If true, then visibility of window will not be changed. In other words, a hidden window will not be made visible. Primarily used as an argument to `LauncherClient.showWindow()` and related functions."
						},
						"show": {
							"type": "boolean"
						},
						"showTaskbarIcon": {
							"type": "boolean",
							"deprecated": true
						},
						"slave": {
							"type": "boolean",
							"description": "If true then the new window will act as a slave to the relativeWindow (or the launching window if relativeWindow is not specified). Slave windows will automatically close when their parent windows close."
						},
						"staggerPixels": {
							"type": "number",
							"description": "Number of pixels to stagger (default when neither left, right, top or bottom are set)."
						},
						"top": {
							"type": ["string", "number", "null"],
							"description": "A pixel value representing the distance from the right edge of the viewport as defined by \"position\". A percentage value may also be used, representing the percentage distance from the bottom edge of the viewport relative to the viewport's width."
						},
						"toSpawn": {
							"type": "array",
							"description": "(EXPERIMENTAL) An array of objects defining the components to spawn. Each entry may either represent a single component in the form `{componentType, spawnOptions}` or a tabbed window of components in the form `{components, spawnOptions}`, where `components` is an array of single component definitions (again in the form `{componentType, spawnOptions}`). Most arguments that are normally passed to `LauncherClient.spawn` are supported, although positioning will be interpreted as relative to the group's coordinates and dimensions for single components and ignored for tabbed components (as these use the position specified in the group's spawnOptions). Note - This param will only be taken into account if the \"windowType\" param is \"launchGroup\".",
							"items": {
								"type": "object",
								"properties": {
									"components": {
										"type": "array",
										"description": "An array of components to spawn as a tabbed group within the launchGroup",
										"items": {
											"componentType": {
												"type": "string",
												"description": "The name of the component to spawn"
											},
											"spawnOptions": {
												"$ref": "#/definitions/spawnOptions"
											}
										},
										"spawnOptions": {
											"$ref": "#/definitions/spawnOptions"
										}
									},
									"componentType": {
										"type": "string",
										"description": "The name of a component to spawn"
									},
									"spawnOptions": {
										"$ref": "#/definitions/spawnOptions"
									}
								}
							},
							"examples": [
								[
									{
										"componentType": "Welcome Component",
										"spawnOptions": {
											"top": 0,
											"left": 0,
											"height": 250,
											"width": 600,
											"data": {}
										}
									},
									{
										"components": [
											{
												"componentType": "Welcome Component",
												"spawnOptions": {
													"data": {}
												}
											},
											{
												"componentType": "Process Monitor",
												"spawnOptions": {
													"data": {}
												}
											}
										],
										"spawnOptions": {
											"top": 250,
											"left": 0,
											"height": 250,
											"width": 600
										}
									},
									{
										"componentType": "Welcome Component",
										"spawnOptions": {
											"top": 500,
											"left": 0,
											"height": 200,
											"width": 600,
											"data": {}
										}
									},
									{
										"componentType": "Process Monitor",
										"spawnOptions": {
											"top": 0,
											"left": 600,
											"height": 700,
											"width": 300,
											"data": {}
										}
									}
								]
							]
						},
						"url": {
							"type": "string",
							"description": "The URL to load for a web application (i.e. when `windowType` is `undefined`, 'WebWindow' or 'application')."
						},
						"width": {
							"type": ["number", "string"],
							"description": "A pixel or percentage value."
						},
						"windowType": {
							"type": "string",
							"description": "Describes which type of component to spawn.<ul><li><b>WebWindow</b> - A normal HTML window. Requires \"url\" to be specified.</li><li><b>assimilation</b> - A window that is managed by the Finsemble assimilation process (usually a native window without source code access). Requires \"path\" or \"alias\" to be specified.</li><li><b>native</b> - A native window that has implemented finsemble.dll. Requires \"path\" or \"alias\" to be specified.</li><li><b>application</b> - A standalone application. This launch a component in its own browser process (splintered, giving it dedicated CPU and memory). This can also point to a standalone web application (such as from a third party). Requires \"url\" to be specified.</li><li><b>launchGroup</b> - (EXPERIMENTAL) A component made of other components, usually grouped together. See toSpawn property.</li></ul>"
						}
					},
					"additionalProperties": true
				},
				"component": {
					"type": "object",
					"finsemble:docs": {
						"rightnav": true
					},
					"description": "Properties associated with how Finsemble manages this application",
					"properties": {
						"category": {
							"type": "string",
							"description": "During dynamic configuration, Finsemble can overwrite components already in the configuration . To prevent this from happening, set this value to \"system\". This setting is used, for example, to prevent system UI components from being dropped out of the config."
						},
						"mode": {
							"type": "string"
						},
						"advertiseReceivers": {
							"type": ["array", "string"],
							"items": {
								"type": "string"
							}
						},
						"spawnOnStartup": {
							"type": "boolean",
							"default": false,
							"description": "When true, Finsemble will automatically launch this application when the application starts."
						},
						"spawnOnAllMonitors": {
							"type": "boolean"
						},
						"canMinimize": {
							"description": "(DEPRECATED) Use foreign.services.windowService.allowMinimize",
							"type": "boolean"
						},
						"canMaximize": {
							"description": "(DEPRECATED) Use foreign.services.windowService.allowMaximize",
							"type": "boolean"
						},
						"useAppCatalog": {
							"type": "boolean"
						},
						"singleton": {
							"type": "boolean",
							"default": false,
							"description": "If set to `true`, the application will behave as a singleton; only a single instance can be launched. If the application has already been launched, attempting to launch it will bring it to front."
						},
						"showDevConsoleOnVisible": {
							"type": "boolean",
							"default": false,
							"description": "If set to `true`, a Chrome developer console will spawn along with the application to assist with debugging."
						},
						"allowQuickComponent": {
							"type": "string"
						},
						"neededClients": {
							"description": "(DEPRECATED) Clients no longer need to be specfied for initialization",
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"displayName": {
							"type": "string",
							"description": "Changes the applications's name in the launcher and its label in the pinned item section."
						},
						"centralLoggerNamePrefix": {
							"type": "string",
							"description": "Prefixes the windowDisplayName for the entry in the Central logger."
						},
						"preload": {
							"type": ["boolean", "string", "array"],
							"description": "A preload is a JavaScript file that is inserted into browser page and runs before any other content. Specify a full path for your preloads. You can specify a list of files to be included. Learn more about preloads in <a href=\"/docs/working-with-apps/native/IntegratingNativeApps\">Integrating HTML Applications</a>.",
							"items": {
								"type": "string"
							}
						},
						"inject": {
							"type": ["boolean", "string"],
							"description": "(DEPRECATED) (PRIVATE)"
						},
						"spawnOnHotkey": {
							"description": "The application will be launched when this global hotkey combination is activated by the end user. Example: [\"ctrl\",\"alt\",\"a\"]",
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"enableGrpc": {
							"description": "(DEPRECATED) Enables GRPC. Can be used from Browserview based applications. grpc is a global variable available at window.grpc or at fin.grpc. Note: sandbox is disabled for these applications.",
							"type": "boolean"
						},
						"reloadTimeout": {
							"description": "Reload timeout for the component's webcontents.",
							"type": "number",
							"minimum": 0,
							"maximum": 999999,
							"default": 60000
						},
						"maxReloadAttempts": {
							"description": "Number of maximum reload attempts that should be executed if the component's webcontents fails to load.",
							"type": "number",
							"minimum": 0,
							"maximum": 60,
							"default": 0
						},
						"custom": {}
					},
					"additionalProperties": false
				},
				"foreign": {
					"title": "foreign",
					"finsemble:docs": {
						"rightnav": true
					},
					"description": "This section contains configurations that other applications and services read when they interact with this component.",
					"type": "object",
					"properties": {
						"agentLabel": {
							"type": "string"
						},
						"clients": {
							"title": "clients",
							"type": "object",
							"description": "(PRIVATE) (DEPRECATED)",
							"properties": {
								"dialogManager": {
									"title": "dialogManager",
									"type": "object",
									"properties": {
										"isDialog": {
											"type": "boolean"
										}
									},
									"additionalProperties": false
								}
							},
							"additionalProperties": false
						},
						"services": {
							"type": "object",
							"description": "Configurations for services that will interact with this application.",
							"properties": {
								"windowService": {
									"type": "object",
									"description": "Configurations that the window service will apply to this app.",
									"properties": {
										"global": {
											"type": "boolean"
										},
										"allowSnapping": {
											"type": "boolean",
											"default": true,
											"description": "If `true`, this window can be snapped. If `false`, this window cannot benefit from snapping."
										},
										"isArrangable": {
											"type": "boolean",
											"description": "(DEPRECATED) as of 3.6"
										},
										"allowGrouping": {
											"type": "boolean",
											"default": true,
											"description": "If `true`, the window can form groups with other windows. If `false`, this window cannot be placed into a group."
										},
										"allowAutoArrange": {
											"type": "boolean",
											"default": true,
											"description": "If `true`, the window can be auto arranged. If `false`, will disable the window's ability to be auto arranged by the Window Service."
										},
										"allowTabbing": {
											"type": "boolean",
											"default": false,
											"description": "If `true`, the window's titlebar will include a tab header that can be dragged or have other tabs dropped onto it. If `false`, tabbing will be disabled for this window."
										},
										"allowTiling": {
											"type": "boolean",
											"default": false,
											"description": "If `true`, the window can be tiled on by other windows by dragging tab headers onto its body (below the titlebar). If `false`, tiling will be disabled for this window."
										},
										"allowMinimize": {
											"type": "boolean",
											"default": true,
											"description": "If `true`, the window can be minimized to the taskbar. If `false`, the window cannot be minimized."
										},
										"allowMaximize": {
											"type": "boolean",
											"default": true,
											"description": "If `true`, the window can be maximized. If `false`, the window cannot be maximized."
										},
										"shouldRegister": {
											"type": "boolean"
										},
										"manageWindowMovement": {
											"type": "boolean",
											"default": true,
											"description": "If `true`, the Window Service will manage the window's movement. Unless otherwise specified by the following params, this means the Window Service can perform actions on this window: move, group, snap, minimize, maximize, etc. When this parameter is `false` it could be overwritten by `allowSnapping`, `allowGrouping`, `allowAutoArrange`, `allowTabbing`, `allowTiling`, `allowMinimize`, `allowMaximize`, `window.dockable`, `FSBLHeader` if any from them is `true`"
										},
										"persistURL": {
											"type": "boolean"
										},
										"addToWorkspace": {
											"type": "boolean"
										}
									}
								},
								"workspace": {
									"type": "object",
									"description": "Configurations related to the workspace service.",
									"properties": {
										"persistURL": {
											"type": "boolean",
											"description": "A global config for application URL persistence. When true, components automatically save their last URL instead of using the one in the config. The application config will override the global config.",
											"default": false
										},
										"persistPath": {
											"type": "boolean",
											"default": false,
											"description": "When true, the application will automatically persist its path through restarts and workspace reloads, even when the path changes in the config. Path is used for \"native\" (aka \"assimilation\") windows."
										}
									}
								},
								"dockingService": {
									"type": "object",
									"description": "(DEPRECATED) (PRIVATE)",
									"properties": {
										"canGroup": {
											"type": "boolean"
										},
										"additionalProperties": false
									}
								},
								"additionalProperties": false
							}
						},
						"components": {
							"type": "object",
							"description": "Configurations specific to other applications that wish to interact with this app.",
							"properties": {
								"App Launcher": {
									"type": "object",
									"description": "App launcher is a drop down menu that launches other application.",
									"properties": {
										"launchableByUser": {
											"type": "boolean",
											"description": "If true, then an App Launcher menu may include this application.",
											"default": false
										}
									},
									"default": {}
								},
								"Toolbar": {
									"type": "object",
									"description": "Configurations related to the global toolbar (at the top of the monitor).",
									"properties": {
										"iconURL": {
											"type": "string",
											"description": "(DEPRECATED) Instead, use the 'icons' array at the top level of the AppD entry.",
											"deprecated": true,
											"examples": [
												{
													"iconURL": "$applicationRoot/assets/img/Finsemble_Taskbar_Icon.png"
												}
											]
										},
										"iconClass": {
											"type": "string",
											"description": "A CSS class character to display when this application is pinned in the toolbar. See \"fin-font\" or use font-awesome or similar. This setting will override AppD icons.",
											"examples": [
												{
													"iconClass": "ff-ungrid"
												}
											]
										}
									}
								},
								"Window Manager": {
									"$ref": "#/definitions/windowManager"
								}
							},
							"default": {}
						},
						"custom": {},
						"additionalProperties": false
					},
					"default": {}
				},
				"childWindowOptions": {
					"finsemble:docs": {
						"halt": true,
						"type": "object",
						"description": "Configuration for all child windows created via window.open for this app. Child windows may not join workspaces, group, tab, or tile. <i>childWindowOptions supports the same properties as component...</i>"
					},
					"$ref": "#/definitions/component"
				},
				"custom": {
					"type": "object",
					"description": "This area is free-form and can support any custom elements associated with the app.",
					"properties": {},
					"additionalProperties": true
				}
			},
			"additionalProperties": false
		},
		"services": {
			"description": "(PRIVATE) The set of service configurations. These are defined internally for Finsemble and can be overridden by equivalent entries in servicesConfig.",
			"type": "object",
			"additionalProperties": {
				"$ref": "#/definitions/service"
			}
		},
		"service": {
			"description": "<b>[service name]</b> The name of the service you are configuring",
			"type": "object",
			"properties": {
				"bootParams": {
					"$ref": "#/definitions/bootParamsProperties"
				},
				"name": {
					"description": "name of service",
					"type": "string"
				},
				"spawnAs": {
					"$ref": "#/definitions/spawnAs"
				},
				"affinity": {
					"type": ["string", "boolean"],
					"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity"
				},
				"visible": {
					"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
					"type": "boolean",
					"default": false
				},
				"html": {
					"type": "string",
					"description": "The location of the services code",
					"examples": [
						{
							"html": "$servicesRoot/workspace/workspace.html"
						}
					]
				},
				"file": {
					"type": "string"
				},
				"category": {
					"type": "string",
					"enum": ["system"]
				},
				"showDevConsoleOnVisible": {
					"type": "boolean",
					"default": true,
					"description": "Automatically spawns a dev console when visible is true. Note that if a service is set to type \"script\" then you should not use this but instead debug serviceManager.html."
				},
				"debugServiceDelay": {
					"type": "integer",
					"description": "(DEPRECATED) (PRIVATE)"
				},
				"window": {
					"title": "window",
					"description": "Logger service's window config",
					"type": "object",
					"properties": {
						"defaultWidth": {
							"type": "number"
						},
						"defaultHeight": {
							"type": "number"
						},
						"accelerator": {
							"title": "accelerator",
							"type": "object",
							"properties": {
								"zoom": {
									"type": "boolean"
								},
								"reload": {
									"type": "boolean"
								},
								"devtools": {
									"type": "boolean"
								}
							}
						},
						"contextMenu": {
							"type": "boolean"
						}
					}
				},
				"config": {
					"anyOf": [
						{
							"title": "windowServiceConfig",
							"description": "Service config specific to window service",
							"type": "object",
							"properties": {
								"BUFFER_SIZE": {
									"type": "number"
								},
								"RESIZE_EVENT_THROTTLE_PERIOD": {
									"type": "number"
								},
								"MINIMUM_WIDTH": {
									"type": "number"
								},
								"MINIMUM_HEIGHT": {
									"type": "number"
								},
								"GROUP_MODE": {
									"title": "GROUP_MODE",
									"type": "object",
									"properties": {
										"enabled": {
											"type": "boolean"
										},
										"behavior": {
											"type": "string"
										}
									}
								},
								"DEBUG": {
									"type": "boolean"
								},
								"ALLOW_GROUPS_TO_SNAP": {
									"type": "boolean"
								},
								"SNAPPING_OPACITY": {
									"type": "number"
								},
								"groupTileBuffer": {
									"type": "number"
								},
								"headerHeight": {
									"type": "number"
								},
								"heartbeatResponseTimeoutDefaults": {
									"title": "heartbeatResponseTimeoutDefaults",
									"type": "object",
									"properties": {
										"min": {
											"type": "number"
										},
										"max": {
											"type": "number"
										},
										"crashed": {
											"type": "number"
										},
										"possiblyCrashed": {
											"type": "number"
										},
										"notResponding": {
											"type": "number"
										}
									}
								},
								"enableWindowsAeroSnap": {
									"type": "boolean",
									"default": false
								},
								"tabbing": {
									"type": "object",
									"properties": {
										"enabled": {
											"type": "boolean",
											"default": true
										}
									}
								},
								"tiling": {
									"type": "object",
									"properties": {
										"enabled": {
											"type": "boolean",
											"default": true
										}
									}
								}
							}
						},
						{
							"$ref": "#/definitions/serviceAssimilationConfig"
						}
					]
				},
				"channels": {
					"description": "(DEPRECATED) Only used in Linker Service",
					"type": "array",
					"items": {
						"type": "object"
					}
				},
				"custom": {}
			},
			"required": ["html"],
			"additionalProperties": false
		},
		"scheduledRestart": {
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "Set Finsemble to automatically restart. These values can be overridden by the user through user preferences.<br/>Additional property: <b>dialogTimeout</b> 10000 - When it is time to restart, the user is presented with a dialog to confirm or cancel. Since resets typically occur at night while the machine is unattended, most often the dialog will time out and Finsemble will restart. The `dialogTimeout` specifies how long to wait for a user response in milliseconds.",
			"type": ["boolean", "object"],
			"default": false,
			"$ref": "#/definitions/WeeklyRecurringTime"
		},
		"scheduledShutdown": {
			"description": "Set Finsemble to automatically shutdown. These values can be overridden by the user through user preferences.<br/>Additional property: <b>dialogTimeout</b> 10000 - When it is time to shutdown, the user is presented with a dialog to confirm or cancel. Since shutdown typically occurs at night while the machine is unattended, most often the dialog will time out and Finsemble will shutdown. The `dialogTimeout` specifies how long to wait for a user response in milliseconds.",
			"type": ["boolean", "object"],
			"default": false,
			"$ref": "#/definitions/WeeklyRecurringTime"
		},
		"WeeklyRecurringTime": {
			"type": ["boolean", "object"],
			"properties": {
				"dayOfWeek": {
					"description": "The day of the week the task will be run. Sunday - Saturday: 0 - 6. If set to false, the task will be run weekly",
					"type": ["number", "boolean"],
					"maximum": 6,
					"minimum": 0
				},
				"hour": {
					"description": "0 - 23. The hour when Finsemble should restart. This is in 24 hour time according to the user's local machine's timezone.",
					"type": "number",
					"maximum": 23,
					"minimum": 0
				},
				"minute": {
					"description": "0 - 59. The minute when Finsemble should run the task",
					"type": "number",
					"maximum": 59,
					"minimum": 0
				}
			}
		},
		"scheduledCloseDiscardUnsavedChanges": {
			"description": "If true AND Finsemble has a scheduled restart configured, it will discard any unsaved workspace changes when Finsemble closes.",
			"type": "boolean",
			"default": false
		},
		"serviceAssimilationConfig": {
			"title": "assimilationConfig",
			"description": "Assimilation of native windows. This only works on Windows operating systems.",
			"type": "object",
			"properties": {
				"spawnAs": {
					"$ref": "#/definitions/spawnAs"
				},
				"affinity": {
					"description": "Only applicable for `spawnAs: \"window\"`. When set, the service window will be given process affinity based on the string passed in. This allows aggregation of services to a specific browser process. Set to false to disable render process grouping via affinity",
					"type": ["string", "boolean"]
				},
				"visible": {
					"description": "Set this to `true` in order to reveal the hidden service window. This can be useful for debugging services.",
					"type": "boolean",
					"default": false
				},
				"enabled": {
					"description": "Set to true to turn on Assimilation",
					"type": "boolean",
					"default": true
				},
				"port": {
					"description": "Assimilation communicates with Finsemble's HTML services via a WebSocket. Set the port here.",
					"type": "number",
					"default": 8392
				},
				"useFeaSpawn": {
					"type": "boolean"
				},
				"throttle": {
					"description": "Windows sends dozens of events per second when a window is moved. This value tells the application how often to collect those events. You may see performance degradations if you set the throttle below 5.",
					"type": "number",
					"default": 15
				},
				"blacklist": {
					"type": "array"
				},
				"whitelist": {
					"type": "array"
				},
				"onlySpawned": {
					"description": "This Boolean tells assimilation whether it should restrict its scope to external applications spawned by Finsemble. If true, only applications launched from Finsemble will be controlled. If false, it will try to control the movements of all windows on the desktop.",
					"type": "boolean",
					"default": true
				},
				"focusDelay": {
					"description": "Sets the delay (in milliseconds) between the focus event being received and the actual focusing of the window. This is necessary because the focus event is called simultaneously with minimize/restore events, which causes issues with docking groups.",
					"type": "number",
					"default": 30
				},
				"eventIgnore": {
					"description": "Sets the threshold (in milliseconds) from the previous event before which focus/restore events are dropped. Certain sequences of minimize/restore/focus events can create an unwanted loop of events; therefore, restore and focus events are throttled with this property.",
					"type": "number",
					"default": 50
				},
				"hotkeyTimeout": {
					"type": "number"
				},
				"hideTitleBars": {
					"description": " Set to true to hide all Finsemble title bars for native applications.",
					"type": "boolean"
				}
			}
		},
		"workspacesArray": {
			"title": "workspaces",
			"finsemble:docs": {
				"rightnav": true
			},
			"description": "(PUBLIC)  An array of workspaces to be presented to the user the first time they start Finsemble. By default, the first workspace listed in the array will be the one first presented to an end user the first time they load their SmartDesktop.",
			"type": "array",
			"items": {
				"$ref": "#/definitions/workspaceTemplate"
			}
		},
		"workspaceTemplate": {
			"title": "Workspace Template",
			"description": "Template for config specified workspace",
			"type": "object",
			"properties": {
				"name": {
					"type": "string",
					"description": "Name of the workspace"
				},
				"type": {
					"type": "string"
				},
				"version": {
					"type": "string"
				},
				"description": {
					"type": "string"
				},
				"groups": {
					"type": "object"
				},
				"windowData": {
					"type": "array"
				},
				"permanent": {
					"description": "If set to true then this workspace cannot be deleted or renamed by end users",
					"type": "boolean"
				},
				"default": {
					"description": "If set to true then this workspace will be the default that is loaded the first time the app is run",
					"type": "boolean"
				},
				"windows": {
					"title": "windows",
					"anyOf": [
						{
							"type": "array",
							"items": {
								"type": "object",
								"properties": {
									"componentType": {
										"type": "string"
									},
									"defaultLeft": {
										"type": "number"
									},
									"defaultTop": {
										"type": "number"
									}
								}
							}
						},
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					]
				},
				"components": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"type": {
								"type": "string"
							},
							"options": {
								"type": "object",
								"properties": {
									"top": {
										"type": "number"
									},
									"bottom": {
										"type": "number"
									},
									"left": {
										"type": "number"
									},
									"right": {
										"type": "number"
									}
								}
							}
						}
					}
				},
				"componentState": {
					"type": "array",
					"items": {
						"type": "object"
					}
				},
				"guid": {
					"type": "string"
				},
				"componentStates": {
					"type": "object",
					"patternProperties": {
						"[a-zA-Z0-9\\-]": {
							"Finsemble_Linker": {
								"patternProperties": {
									"[a-zA-Z0-9]": {
										"type": "boolean"
									}
								}
							},
							"Interop-#Linker-linkedChannels": {
								"type": "array",
								"items": {
									"type": "string"
								}
							}
						}
					}
				},
				"custom": {}
			},
			"required": ["name"],
			"additionalProperties": false
		},
		"cornerRounding": {
			"description": "Specifies corner rounding for a window",
			"properties": {
				"width": {
					"type": "number",
					"default": 0
				},
				"height": {
					"type": "number",
					"default": 0
				}
			}
		},
		"foldersAppDefinition": {
			"description": "Definition for AdvanceAppLauncher application folder",
			"type": "object",
			"properties": {
				"icon": {
					"type": "string"
				},
				"type": {
					"type": "string"
				},
				"canDelete": {
					"type": "boolean"
				},
				"apps": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"name": {
								"type": "string"
							},
							"appID": {
								"type": "string"
							}
						}
					}
				}
			}
		},
		"menus": {
			"type": "array",
			"items": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string"
					},
					"align": {
						"type": "string"
					},
					"label": {
						"type": "string"
					},
					"menuType": {
						"type": "string"
					},
					"customData": {
						"type": "object",
						"properties": {
							"mode": {
								"type": "string"
							},
							"list": {
								"type": "array",
								"items:": {
									"type": "string"
								}
							}
						}
					},
					"fontIcon": {
						"type": "string"
					},
					"icon": {
						"type": "string"
					}
				}
			}
		},
		"notification": {
			"type": "object",
			"description": "For any values on a notification not already set, these default values will be set on the Notification object. All fields in here should match those in the INotification interface",
			"properties": {
				"type": {
					"type": "string"
				},
				"source": {
					"type": "string"
				},
				"timeout": {
					"type": "number"
				},
				"headerLogo": {
					"type": "string"
				},
				"contentLogo": {
					"type": "string"
				},
				"cssClassName": {
					"type": "string"
				},
				"meta": {
					"type": "object",
					"additionalProperties": true
				}
			},
			"additionalProperties": false
		},
		"notificationType": {
			"description": "object Type. The values inside this object will only be applied to notifications with the property 'type' set to the key value.",
			"type": "object",
			"properties": {
				"defaultDismissButtonText": {
					"description": "Will add a dismiss action to the Notification if one is not already set.",
					"type": "string",
					"default": "Dismiss"
				},
				"showDismissAction": {
					"description": "Add a dismiss action to the notification if one does not exists. Default set to false.",
					"type": "boolean",
					"default": false
				},
				"defaults": {
					"$ref": "#/definitions/notification"
				}
			},
			"additionalProperties": false
		},
		"stackedWindow": {
			"description": "Configuration for tabbed and tiled windows",
			"type": "object",
			"properties": {
				"addReadyTimeout": {
					"description": "Sets the time in milliseconds for a tabbed/tiled windows to become ready.",
					"type": "number",
					"default": 6500
				}
			},
			"additionalProperties": false
		},
		"spawnAs": {
			"type": "string",
			"description": "Valid values are:<br/> \"window\" - Spawns the service as a child window of the Service Manager.<br/> \"process\" - Spawns the service in its own browser process (a.k.a. application). This gives the service dedicated CPU to maximize concurrency.<br/> \"script\" - Spawns the service as a script running in the Service Manager window. This minimizes memory footprint. This setting can only be used with the following services: assimilation, storage, hotkeys, linker, search and workspace.<br />",
			"enum": ["window", "process", "script"]
		},
		"securityPolicies": {
			"title": "securityPolicies",
			"description": "(PRIVATE) FEA security policy",
			"type": "object",
			"properties": {
				"//trusted": {
					"type": "string",
					"description": "(deprecated).  Comment fields are superseded by json schema comments and will be removed in a future version.  See 'trusted' parameter."
				},
				"trusted": {
					"type": "object",
					"description": "Finsemble's default \"trusted\" policy can be used for apps that are on a trusted domain. By default, the trusted policy allows access to every API endpoint"
				},
				"untrusted": {
					"title": "untrusted",
					"description": "Finsemble's default \"untrusted\" policy can be used for apps that are on external domains",
					"type": "object",
					"properties": {
						"System": {
							"title": "System",
							"type": "object",
							"properties": {
								"clearCache": {
									"type": "boolean"
								},
								"exit": {
									"type": "boolean"
								},
								"launchExternalProcess": {
									"type": "boolean"
								}
							}
						},
						"Window": {
							"title": "Window",
							"type": "object",
							"properties": {
								"executeJavaScript": {
									"type": "boolean"
								},
								"webPreferences": {}
							}
						}
					}
				}
			}
		},
		"securityPolicyRules": {
			"title": "securityPolicyRules",
			"description": "(PRIVATE) Contains a rule to be applied to a security policy.",
			"type": "object",
			"properties": {
				"crossDomain": {
					"type": "string"
				},
				"sameDomain": {
					"type": "string"
				}
			}
		},
		"contentSecurityPolicy": {
			"description": "Overwrite the default content security policy for all components. This setting can be superceded by the application level \"Content-Security-Policy\" config. See https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP.",
			"type": ["array", "string"],
			"items": {
				"type": "string"
			},
			"examples": [["script-src *"]]
		},
		"electronAdapter": {
			"description": "Finsemble's Electron Adapter config (this is dynamically added to manifest)",
			"finsemble:docs": {
				"rightnav": true
			},
			"title": "finsemble-electron-adapter",
			"type": "object",
			"properties": {
				"manifests": {
					"description": "Allow the ability to specify manifest environments at run time by adding entries for each environment",
					"type": "object",
					"examples": [
						{
							"manifests": {
								"dev": "http://localhost:3375/configs/application/manifest-local-dev.json",
								"qa": "http://localhost:3375/configs/application/manifest-local-qa.json"
							}
						}
					]
				},
				"logHTTPErrors": {
					"description": "Set to false to prevent FEA logging of load failures in the 400-599 range",
					"type": "boolean",
					"default": true
				},
				"useDOMBasedMovement": {
					"description": "Set to false to use native window movement with Electron",
					"type": "boolean",
					"default": true
				},
				"contextIsolation": {
					"description": "(PRIVATE) When set to true, contextIsolation will be turned on for e2o.ts preloads",
					"type": "boolean",
					"default": false
				},
				"allowedManifestDomains": {
					"description": "Allow the ability to specify manifest urls at run time by setting the allowed domains where the hostname matches one of the entries. Every subdomain needs an entry. Wildcards are not allowed.",
					"type": "array",
					"items": {
						"type": "string"
					},
					"examples": [
						{
							"allowedManifestDomains": ["finsemble.com", "cosaic.io"]
						}
					]
				},
				"allowedBrowserProtocols": {
					"description": "(experimental) When calling System.openUrlWithBrowser, only URLs with `http:` and `https:` protocols are permitted for system security.  Others that are needed can be added here. A `file:` protocol is a security risk and should not be added.",
					"type": "array",
					"items": {
						"type": "string"
					},
					"examples": [
						{
							"allowedBrowserProtocols": ["http:", "https:", "fsbl:"]
						}
					]
				},
				"disableZoom": {
					"type": "boolean",
					"default": false,
					"description": "Disable the internal electron zoom action for \"Ctrl +\" and \"Ctrl -\"."
				},
				"logger": {
					"type": "object",
					"description": "Configuration for logging of low-level events, such as window creation or network requests, from the Finsemble Electron Adapter. Log messages may be written to a rotated file at %AppData%/Roaming/Electron/logs, or output to the console. They may also be transmitted to the Finsemble Central Logger allowing them to be reviewed alongside logging from Finsemble and applications running in Finsemble.",
					"properties": {
						"logLevel": {
							"type": "string",
							"default": "debug",
							"description": "The lowest level at which the logger will push messages to a file. Available log levels from highest to lowest are: 'error', 'warn', 'log','info', 'debug', and 'verbose'. Note: This level is set after the manifest is read by the Electron Adapter. As a result, you may see some debug messages prior to the log level being set.",
							"enum": ["error", "warn", "log", "info", "debug", "verbose"]
						},
						"transports": {
							"type": "object",
							"description": "Transport level configuration.",
							"properties": {
								"console": {
									"type": "object",
									"description": "The console transport controls where logs are output.",
									"properties": {
										"enable": {
											"type": "boolean",
											"default": false,
											"description": "When set to true, logs will be output to a terminal. When set to false, logs are output to file. See `logger` above."
										}
									}
								}
							}
						},
						"transmitToCentralLogger": {
							"description": "Set to 'false' to disable sending Electron Adapters logs in the Central Logger. The log levels transmitted are managed in the central logger UI and are independent of the log levels configured for logging to file.",
							"type": "boolean",
							"default": false
						}
					}
				},
				"downloadUpdatesViaElectron": {
					"type": "boolean",
					"default": false,
					"description": "Downloads the Electron/Squirrel autoUpdate packages to the local machine before checking for, and performing updates. The files are downloaded using the same proxy and headers Electron uses."
				},
				"ignoreCertificateErrorHosts": {
					"description": "Certificate errors (SSL/TLS) will be ignored for these hosts or URLs.  Useful when using self-signed TLS certificates.",
					"type": "array",
					"items": {
						"type": "string"
					},
					"examples": [
						{
							"ignoreCertificateErrorHosts": ["https://github.com:80/ChartIQ", "self-signed.badssl.com"]
						}
					]
				},
				"env-allowlist": {
					"description": "Adds ability to specify Finsemble manifest macros based on environment variables",
					"type": "array",
					"items": {
						"type": "string"
					},
					"examples": [
						{
							"env-allowlist": ["TESTVAR", "ANOTHERVAR"]
						}
					]
				}
			}
		},
		"logToDiskLevels": {
			"description": "Which logger levels should be sent from central logger to the FEA log. This can be helpful in debugging.",
			"type": "array",
			"items": {
				"type": "string",
				"enum": ["error", "warn", "info", "log", "debug", "verbose"]
			}
		},
		"loggerClientLogLevels": {
			"description": "Sets the default logging state of each client in the Central Logger if no previous state is found",
			"type": "object",
			"properties": {
				"Error": {
					"description": "Set to 'true' to see 'Error' as a default client logging level",
					"type": "boolean",
					"default": true
				},
				"Warn": {
					"description": "Set 'true' to see 'Warn' as a default client logging level",
					"type": "boolean",
					"default": true
				},
				"Info": {
					"description": "Set to 'true' to see 'Info' as a default client logging level",
					"type": "boolean",
					"default": false
				},
				"Log": {
					"description": "Set to 'true' to see 'Log' as a default client logging level",
					"type": "boolean",
					"default": true
				},
				"Debug": {
					"description": "Set to 'true' to see 'Debug' as a default client logging level",
					"type": "boolean",
					"default": false
				},
				"Verbose": {
					"description": "Set to 'true' to see 'Verbose' as a default client logging level",
					"type": "boolean",
					"default": false
				},
				"LocalOnly": {
					"description": "Set to 'true' to see 'LocalOnly' as a default client logging level",
					"type": "boolean",
					"default": false
				}
			}
		},
		"logger": {
			"title": "Logger configuration",
			"description": "(PUBLIC)",
			"type": "object",
			"properties": {
				"defaultClientLogLevels": {
					"ref": "#/definitions/loggerClientLogLevels"
				},
				"logToDiskLevels": {
					"ref": "#/definitions/logToDiskLevels"
				},
				"allowNativeErrorNotifications": {
					"description": "Set to 'true' to allow electron.Notifications for FEA errors",
					"type": "boolean",
					"default": false
				}
			}
		},
		"deprecatedConfig": {
			"type": "array",
			"description": "(PRIVATE) contains operations to handle deprecated config",
			"examples": [
				[
					{
						"versionDeprecated": "5.1",
						"operation": "logMessage",
						"description": "example of only logging message for deprecated config",
						"property": "finsemble.logger.defaultClientLogLevels.Info",
						"userMessage": "Please upgrade property to new config schema.",
						"userMessageType": "error"
					},
					{
						"versionDeprecated": "5.1",
						"operation": "removeProperty",
						"description": "example of removing a deprecated property",
						"property": "finsemble.testXYZ",
						"userMessageType": "error"
					},
					{
						"versionDeprecated": "5.1",
						"operation": "setValue",
						"description": "example of updating a specific value to a new specific value",
						"property": "finsemble.unknownComponent",
						"ifOldValue": "nonConfiguredComponent",
						"newValue": "unknownComponent",
						"userMessage": "Please upgrade to new config schema.",
						"userMessageType": "warn"
					},
					{
						"versionDeprecated": "5.1",
						"operation": "moveProperty",
						"description": "renames a leave property",
						"oldProperty": "finsemble.servicesConfig.launcher.staggerPixels",
						"newProperty": "finsemble.servicesConfig.launcher.windowStaggerOffset",
						"userMessage": "Please upgrade to new config schema."
					},
					{
						"versionDeprecated": "5.1",
						"operation": "moveProperty",
						"oldProperty": "finsemble.components.*.window.url",
						"newProperty": "finsemble.components.*.window.uri",
						"description": "a set of object properties can be referenced with wildcards",
						"removeOld": false,
						"userMessageType": "error"
					},
					{
						"versionDeprecated": "5.1",
						"operation": "moveProperty",
						"oldProperty": "finsemble.components.*.foreign.services.*.allowAutoArrange",
						"newProperty": "finsemble.components.*.foreign.services.*.autoArrangeEnabled",
						"description": "multiple wildcards can be used",
						"removeOld": false,
						"userMessageType": "error",
						"when": {
							"bootConfig": false,
							"mainConfig": true,
							"dynamicConfig": false
						}
					}
				]
			],
			"items": {
				"type": "object",
				"description": "List of run-time operations to migrate deprecated config.",
				"required": ["versionDeprecated", "operation"],
				"properties": {
					"versionDeprecated": {
						"type": "string",
						"description": "the Finsemble version the property was deprecated under."
					},
					"operation": {
						"type": "string",
						"enum": ["logMessage", "setValue", "removeProperty", "moveProperty"],
						"title": "The operation schema",
						"description": "the operation to perform"
					},
					"description": {
						"type": "string",
						"description": "for additional info to describe the deprecated-config operation."
					},
					"property": {
						"type": "string",
						"description": "For logMessage, setValue, and removeProperty this contains the property path to operate on."
					},
					"oldProperty": {
						"type": "string",
						"description": "For moveProperty, this contains the source path of the deprecatedProperty to move. Wildcards within the path"
					},
					"newProperty": {
						"type": "string",
						"description": "For moveProperty, this contains the target path that oldProperty will be moved to."
					},
					"removeOld": {
						"type": "boolean",
						"description": "For moveProperty, if true then remove oldProperty after moving to new. Use false if customer code references old config location (which should be rare).",
						"default": true
					},
					"clone": {
						"type": "boolean",
						"description": "For moveProperty, if true then clone oldProperty before moving to new. Only set to false if removeOld is false and value change dynamically.",
						"default": false
					},
					"userMessage": {
						"type": "string",
						"description": "Additional log message to explain the handling of this deprecated config."
					},
					"userMessageType": {
						"type": "string",
						"enum": ["error", "warn", "log"],
						"description": "The log type to use when logging this operation.",
						"default": "warn"
					},
					"when": {
						"type": "object",
						"description": "When within Finsemble the operation should be invoked.",
						"required": ["bootConfig", "mainConfig", "dynamicConfig"],
						"properties": {
							"bootConfig": {
								"type": "boolean",
								"description": "if true then invoke before bootConfig is validated in the System Manager.",
								"default": true
							},
							"mainConfig": {
								"type": "boolean",
								"description": "if true then invoke before full config is validated in the Config Service.",
								"default": true
							},
							"dynamicConfig": {
								"type": "boolean",
								"description": "if true then invoke after dynamical config is added within the Config Service, but before revalidation.",
								"default": true
							}
						}
					}
				}
			}
		},
		"splashScreenTimeout": {
			"title": "Splash screen timeout",
			"description": "Amount of time (in milliseconds) to show the splash screen. The default value 0 causes the splash screen to hide in the `user` stage. This is after the UI Components have loaded and the same time that Workspace components start loading. If you set it to a negative number, you must call `FSBL.System.hideSplashScreen()` in a component when you want to hide the splash screen.",
			"type": "number",
			"default": 0
		},
		"disableWMICalls": {
			"description": "(Deprecated) When set to true, Finsemble will not make calls that require Windows Management Instrumentation Command-line (WMIC).  This option fills GPU information for the getHostSpecs method and will be removed in a future version.",
			"type": "boolean",
			"default": true
		},
		"splashScreenImage": {
			"title": "Splash screen image",
			"description": "URL to use for the splash screen when starting Finsemble. The URL can point to either an HTML page or SVG file. Both HTML and SVG splash screen's support transparency. Use an HTML splash screen if you want to use a .PNG image with transparent background or desire more flexibility in styling or animating your splash screen.",
			"type": "string",
			"default": "http://localhost:3375/assets/img/FinsembleSplash.svg"
		},
		"spawnOptions": {
			"title": "Spawn Options",
			"description": "Minimal definition for component spawn options",
			"type": "object",
			"properties": {
				"top": {
					"type": ["number", "string"]
				},
				"left": {
					"type": ["number", "string"]
				},
				"height": {
					"type": ["number", "string"]
				},
				"width": {
					"type": ["number", "string"]
				},
				"data": {
					"type": "object"
				}
			}
		},
		"toolbarMenus": {
			"type": "object",
			"description": "Optional configuration for custom launcher menus on the Finsemble Toolbar",
			"finsemble:docs": {
				"rightnav": true
			},
			"properties": {},
			"additionalProperties": {
				"$ref": "#/definitions/toolbarMenu"
			}
		},
		"toolbarMenu": {
			"type": "object",
			"description": "toolbar menu entries provide configuration for an individual menu",
			"properties": {
				"displayName": {
					"type": "string",
					"description": "The name of the menu, to be displayed on the toolbar"
				},
				"applications": {
					"type": "array",
					"items": {
						"type": "string",
						"description": "An array of application names, as defined in the appD configuration, to include in the menu"
					}
				},
				"position": {
					"type": "number",
					"description": "Used to sort menus into order on the Toolbar (higher position values are displayed further to the right)"
				}
			}
		},
		"preloads": {
			"type": "array",
			"items": {
				"type": "object",
				"properties": {
					"alias": {
						"type": "string"
					},
					"url": {
						"type": "string"
					}
				}
			}
		},
		"extensions": {
			"description": "Register preload extensions for Finsemble apps",
			"type": "object",
			"properties": {
				"preloads": {
					"description": "Registered aliases and details for preloads",
					"type": "object",
					"additionalProperties": {
						"description": "Preload alias",
						"type": "object",
						"properties": {
							"url": {
								"description": "The URL of the hosted preload",
								"type": "string"
							},
							"autoload": {
								"description": "Specifies whether the preload should automatically be applied to all or all launchable apps",
								"enum": ["all", "launchable", "none"],
								"default": "none"
							}
						}
					},
					"examples": [
						{
							"preloads": {
								"zoom": {
									"url": "https://assets.finsemble.com/preloads/zoom.js",
									"autoload": "launchable"
								}
							}
						}
					]
				}
			}
		},
		"trustedPreloads": {
			"type": "array",
			"items": {
				"type": "string"
			}
		}
	}
}
