{
	"$schema": "https://json-schema.org/draft/2020-12/schema",
	"line_endings": "unix",
	"$id": "https://qualisys.com/schemas/paf-module",
	"title": "Qualisys PAF Module",
	"description": "A settings.paf file used by Qualisys Project Automation Framework (PAF) Modules",
	"type": "object",

	"properties": {
		"Project ID": {
			"title": "Project ID",
			"description": "A human readable name that identifies the project. This name is recorded in data files and should not be changed once data collection has started as doing so will render data files useless.",
			"type": "string"
		},
		"Root type": {
			"title": "Root type",
			"description": "Reference to the class or type name to use at the highest level in the PAF item hierarchy.",
			"type": "string"
		},
		"Date format": {
			"title": "Date format",
			"description": "Specifies what date format to use in this project. Applies mainly to exports and column values but not to the field edit dialog. Accepted values are Iso, Little endian and Middle endian.",
			"enum": ["Iso", "Little endian", "Middle endian"]
		},
		"Date separator": {
			"title": "Date separator",
			"description": "Specifies which token to use to separate the parts of the dates when formatting them. Accepted values are Dash, Slash, Dot and None.",
			"enum": ["Dash", "Slash", "Dot", "None"]
		},
		"Time format": {
			"title": "Time format",
			"description": "Specifies what time format to use in this project. Applies mainly to exports and column values but not to the field edit dialog. Accepted values are 12-hour and 24-hour.",
			"enum": ["12-hour", "24-hour"]
		},
		"Filename filter": {
			"title": "Filename filter",
			"description": "A regular expression that determines which files (in addition to the qtm files) that will be visible in the tree view.",
			"type": "string"
		},
		"Export c3d settings": {
			"title": "Export c3d settings",
			"description": "This section is optional and is used when exporting to c3d file.",
			"type": "object",
			"properties": {
				"Point units": {
					"title": "Point units in C3D export",
					"description": "Possible units are: mm, cm or m.",
					"enum": ["mm", "cm", "m"]
				}
			}
		},
		"Default fields": {
			"title": "Default fields",
			"description": "A sequence of names of fields that will be added to all types. QTM also adds a number of default fields automatically. For a list of these, see the Default Fields section.",
			"type": "array",
			"items": {
				"type": "string"
			},
			"minItems": 1
		},

		"Package Information": {
			"description": "This section contains information that the package management system uses. It is used mainly when installing packages and when creating new projects based on a package.",
			"type": "object",
			"properties": {
				"Name": {
					"title": "Package name",
					"description": "The name of the package. Shown when creating a new project and used to keep the connection between a project and the package it was created from to, for instance, know if there is a new version of a package. This means that this value should not be changed unless strictly necessary because that will break the connection between existing projects and new versions of the package.",
					"type": "string"
				},
				"Version": {
					"title": "Module version",
					"description": "Two numbers separated by a period sign (e.g. 44.23), three numbers separated by period signs (e.g. 1.45.3214), or three numbers separated by a period sign and a build number separated by a plus sign (e.g. 1.3.0+188). The version of the package. Used to keep track of which version a project is based on. Visible in the about box when a project is open. Useful for debugging purposes and for knowing if the package can be upgraded.",
					"type": "string",
					"pattern": "^\\d+\\.\\d+(\\.\\d+(\\+\\d+)?)?$"
				},
				"Required QTM version": {
					"title": "Required QTM version",
					"description": "Two or three digits separated by a period sign. The QTM version that is required for this package to work properly. Checked on install time. Must include major and minor version number and can optionally include build number too.",
					"type": "string",
					"pattern": "^\\d+\\.\\d+(\\.\\d+)?$"
				},
				"Previous names": {
					"title": "Previous names",
					"description": "A sequence of names that this package has had earlier in development. This is used only when checking if a project should be upgraded and allows for packages to be renamed without losing the project upgrade path.",
					"type": "array",
					"items": {
						"type": "string"
					},
					"minItems": 1
				}
			},
			"required": [
				"Name",
				"Version",
				"Required QTM version"
			]
		},

		"Types": {
			"title": "Types definition",
			"description": "",
			"type": "object",
			"patternProperties": {
				".+": {
					"title": "Type",
					"description": "All type names have to be unique. Each class definition is a map that contains the type names as keys and the type definitions as values.",
					"properties": {
						"Fields": {
							"title": "Field reference",
							"description": "Naming any field as a key and a default value for that field in this type is permitted. Any default value given here overrides the default value from the field specification. The default value should always be a scalar except for string fields that also support sequences. See documentation of the Default property in the Fields section for more information.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								{
									"type": "string"
								},
								{
									"type": "null"
								}
							]
						}
					},
					"patternProperties": {
						".+": {
							"title": "Class",
							"description": "All class names have to be unique. Each class definition is a map that contains the type names as keys and the type definitions as values.",
							"properties": {
								"Fields": {
									"title": "Class fields",
									"description": "Fields to use for this class. If this key is present it should contain a map or sequence that contains fields that should be defined for each type of this class. If the fields are given as a map they also specify default values for the fields. A type can override the default value of a field by including the field name as part of its own definition but it cannot undefine a field that has been defined in the class.",
									"anyOf": [
										{
											"type": "array",
											"items": {
												"type": "string"
											},
											"minItems": 1
										},
										{
											"type": "object",
											"patternProperties": {
												".+": {
													"type": "string"
												}
											}
										}
									]
								},
								"Children": {
									"title": "Children types or classes",
									"description": "A sequence of references to class or type names that can be created as children to items of this type. A type that has children cannot have measurements.",
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								"Measurements": {
									"title": "Measurements",
									"description": "A sequence of measurement type names. If a type has the measurement property, it is considered to be a session-like type. It cannot have other children and it will have a wizard interface containing measurements (of the types specified by this parameter) and analyses.",
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								"Analyses": {
									"title": "Analyses",
									"description": "A sequence of analysis names. These will be shown in the Analyze dropdown of the session wizard. The first analysis in the list will be the default analysis that is run when the button itself is clicked.",
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								"Display order": {
									"title": "Field display order",
									"description": "A sequence of field names denoting the order in which to display the fields of items of this type. Inherited fields can also be entered. Fields named here will be displayed first in field lists. Fields that are not named are displayed afterwards in an arbitrary order.",
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								"Heading": {
									"title": "Field display order",
									"description": "An optional string displayed instead of the type name as a heading for the measurement type in the wizard pane.",
									"type": "string"
								},
								"PDF guide": {
									"title": "Path to PDF guide",
									"description": "The path to a PDF file to show when the user clicks the Show guide button in the wizard pane.",
									"type": "string"
								},
								"Directory pattern": {
									"title": "Directory pattern",
									"description": "A naming pattern for the directory created for each item (except measurements, for which this property is useless).\n\nThe pattern can contain any text as well as names of items braced by $ signs, so for instance the directory pattern “Patient $ID$” would be expanded to Patient followed by the contents of the ID field of that item. In addition to the field names $ClassName$, $TypeName$, $WorkingDirectory$, $TemplateDirectory$ and $InstanceNumber$ can also be used in the naming patterns.\n\nAn item reference can also specify additional formatting options, inspired by those of the printf format strings. The syntax is: $[Opt. pad char][Minimum length]:Field name$ so for instance $08:ID$ would print the id field and pad it with zeros to a width of 8 characters.\n\nThe default naming pattern is $TypeName$. If directory names clash when a new directory is created, a counter is appended to the name to make it unique.",
									"type": "string"
								},
								"Icon": {
									"title": "Path to icon file",
									"description": "The path to an icon file (.ico) to show at the side of the item in the tree view. The path is relative to the `Templates` folder.",
									"type": "string"
								}
							},
							"patternProperties": {
								".+": {
									"title": "Field reference",
									"description": "Naming any field as a key and a default value for that field in this type is permitted. Any default value given here overrides the default value from the field specification. The default value should always be a scalar except for string fields that also support sequences. See documentation of the Default property in the Fields section for more information.",
									"anyOf": [
										{
											"type": "array",
											"items": {
												"type": "string"
											}
										},
										{
											"type": "string"
										},
										{
											"type": "null"
										}
									]
								}
							},
							"oneOf": [
								{ "required": ["Children"] },
								{ "required": ["Measurements"] }
							]
						}
					}
				}
			}
		},

		"Measurements": {
			"title": "Measurement definitions",
			"description": "",
			"type": "object",
			"patternProperties": {
				".+": {
					"title": "Measurement",
					"description": "A uniquely named measurement, defining its properties.",
					"properties": {
						"Fields": {
							"title": "Class fields",
							"description": "Fields to use for this class. If this key is present it should contain a map or sequence that contains fields that should be defined for each type of this class. If the fields are given as a map they also specify default values for the fields. A type can override the default value of a field by including the field name as part of its own definition but it cannot undefine a field that has been defined in the class.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									},
									"minItems": 1
								},
								{
									"type": "object",
									"patternProperties": {
										".+": {
											"type": "string"
										}
									}
								}
							]
						},
						"Count": {
							"title": "Default measurement button count",
							"description": "The default number of measurement buttons that kind of measurement in a new session.",
							"type": "integer",
							"minimum": 0
						},
						"Minimum count": {
							"title": "Minimum measurement count",
							"description": "The minimum number of measurements of that kind in a session. The +/- buttons will not allow the count to go below this and if any analysis lists this kind of measurement as a prerequisite, the analysis will not be available until the minimum number of measurements have been performed.",
							"type": "integer",
							"minimum": 0
						},
						"Maximum count": {
							"title": "Maximum measurement count",
							"description": "The maximum number of measurements of that kind in a session.",
							"type": "integer",
							"minimum": 0
						},
						"Measurement length": {
							"title": "Measurement recording length",
							"description": "The default length of this kind of measurement.",
							"type": "number",
							"minimum": 0
						},
						"Pretrigger length": {
							"title": "Pretrigger length",
							"description": "The length of the pretrigger buffer. Setting this to zero disables pretrigger. Leaving this option out uses the project setting for pretrigger.",
							"type": "number",
							"minimum": 0
						},
						"Frequency": {
							"title": "Measurement frequency",
							"description": "The frequency used for this kind of measurement. If omitted, the frequency is not changed when starting the measurement.",
							"type": "number",
							"minimum": 1
						},
						"AIM models": {
							"title": "AIM models",
							"description": "A semicolon separated list (not a YAML sequence) of AIM models that should be applied to measurements of this kind.",
							"type": "string"
						},
						"Display fields dialog after creation": {
							"title": "Display fields dialog after creation",
							"description": "If this value is set to true, the fields dialog will be displayed when a measurement has finished to allow the user to edit the fields of the measurement item in the same way that dialog is displayed when other (non-measurement) items are created.",
							"$ref": "#/$defs/yaml-boolean"
						},
						"Heading": {
							"title": "Measurement heading",
							"description": "An optional string displayed instead of the type name as a heading for the measurement type in the wizard pane.",
							"type": "string"
						},
						"Display order": {
							"title": "Field display order",
							"description": "A sequence of field names denoting the order in which to display the fields of items of this type. Inherited fields can also be entered. Fields named here will be displayed first in field lists. Fields that are not named are displayed afterwards in an arbitrary order.",
							"type": "array",
							"items": {
								"type": "string"
							},
							"minItems": 1
						},
						"Measurement pattern": {
							"title": "Measurement pattern",
							"description": "A naming pattern for measurements created for each item. The pattern can contain any text as well as names of items braced by $ signs, so for instance the measurement pattern “Patient $ID$” would be expanded to Patient followed by the contents of the ID field of that item. In addition to the field names $ClassName$, $TypeName$, $WorkingDirectory$, $TemplateDirectory$ and $InstanceNumber$ can also be used in the naming patterns.\n\nAn item reference can also specify additional formatting options, inspired by those of the printf format strings. The syntax is: $[Opt. pad char][Minimum length]:Field name$ so for instance $08:ID$ would print the id field and pad it with zeros to a width of 8 characters.\n\nThe default naming pattern is $TypeName$. If directory names clash when a new directory is created, a counter is appended to the name to make it unique. The file extension .qtm will be added automatically. The default value is $TypeName$ $InstanceNumber$.",
							"type": "string"
						}
					},
					"patternProperties": {
						".+": {
							"title": "Field reference",
							"description": "Naming any field as a key and a default value for that field in this type is permitted. Any default value given here overrides the default value from the field specification. The default value should always be a scalar except for string fields that also support sequences. See documentation of the Default property in the Fields section for more information.",
							"anyOf": [
								{
									"type": "string"
								},
								{
									"type": "null"
								}
							]
						}
					}
				}
			}
		},

		"Analyses": {
			"title": "Analysis definitions",
			"description": "",
			"type": "object",
			"patternProperties": {
				".+": {
					"title": "Analysis",
					"description": "A uniquely named analysis, defining its properties.",
					"properties": {
						"Type": {
							"title": "Analysis type",
							"description": "Names of the analysis type. Valid values are External program, Visual3D, Report, Compound, HTTPRequest, Instantiate template, Create skeleton, Solve skeleton.\n\nNote: only External program and Compound are available to all users. Other types require the Project Automation Framework developer license which is used for internal Qualisys development and by development partners.",
							"enum": ["External program", "Visual3D", "Report", "Compound", "HTTPRequest", "Instantiate template", "Create skeleton", "Solve skeleton"]
						},
						"Prerequisites": {
							"title": "Measurement and/or analysis prerequisites",
							"description": "A sequence of measurement type names and analysis names that has to be completed before this analysis can be run. Measurement types are considered complete for the current session when the user has made at least the number of measurements given by that measurement type’s Minimum count field. Analyses are considered complete when the file denoted by the Output file field exists.",
							"type": "array",
							"items": {
								"type": "string"
							},
							"minItems": 1
						},
						"Output file": {
							"title": "Output file",
							"description": "The name of a file that is created when this analysis is run. QTM uses this to check if the analysis has been completed. It is also used to issue a warning if this file has been changed since the analysis was last run for the current session. This property can contain patterns.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									},
									"minItems": 1
								},
								{
									"type": "string"
								}
							]
						},


						"Program display name": {
							"title": "Program display name",
							"description": "External program only: The name to be displayed in the directories tab in project options where the user will have to locate the external executable. NB: Because this path varies between computers rather than between projects, it is not stored in the project, but in computer-global settings file.\n\nSeveral analyses in different projects may share the same Program display name and QTM will automatically use the same executable path for all of them.",
							"type": "string"
						},
						"Export session": {
							"title": "Export session",
							"description": "External program only: Optional. If present, the metadata of the session, all its ancestors and the measurements are exported into a file called session.xml.",
							"$ref": "#/$defs/yaml-boolean"
						},
						"Export measurements": {
							"title": "Formats for measurement exports",
							"description": "External program only: Optional. A single string or an array containing any combination of the following values: “TSV”, “C3D”, “MAT”. Will make QTM export all the selected measurements to the corresponding formats before running the external program. Use “xml settings” to export a file with measurement settings (e.g. capture start time and analog channel names). The file will be named [file name].settings.xml.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string",
										"enum": ["TSV", "C3D", "MAT", "JSON", "tsv", "c3d", "mat", "json", "xml settings"]
									},
									"minItems": 1
								},
								{
									"enum": ["TSV", "C3D", "MAT", "JSON", "tsv", "c3d", "mat", "json", "xml settings"]
								}
							]
						},
						"Template files": {
							"title": "Template files",
							"description": "External program only: Optional. A single string or an array containing names of files in the template directory. Each file will be run through the PHP engine and the result written to a file with the same name in the session directory. Standard Windows wildcards are supported, but note that if the asterisk is used to match a part of the filename, the pattern must be enclosed in single quotation marks to make sure it is not parsed as a YAML alias.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									},
									"minItems": 1
								},
								{
									"type": "string"
								}
							]
						},
						"Working directory": {
							"title": "Working directory",
							"description": "External program only: Optional. The working directory set when the program is launched. Defaults to the session directory.",
							"type": "string"
						},
						"Arguments": {
							"title": "Arguments",
							"description": "Optional. An array of arguments to be sent to the program being started. Each argument will be subject to pattern expansion and if the result contains spaces, it will be enclosed in double quotation marks when the command line is built.",
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"Show output file": {
							"title": "Show output file",
							"description": "External program only: Optional. If set, and if the Output file property has been specified, and if the execution of the external program is successful (exit code 0), the output file will be shown in the systems standard program for that file type (as if it was double-clicked in the windows explorer).",
							"$ref": "#/$defs/yaml-boolean"
						},
						"Do not wait for Application": {
							"title": "Do not wait for Application",
							"description": "External program only: Optional. If analysis includes this property, QTM does not wait for external program to finish the processing. If property does not exit, to continue with subsequent analyses, external program must be closed manually (> QTM 2019.1).",
							"$ref": "#/$defs/yaml-boolean"
						},

						"Pipeline template": {
							"title": "Pipeline template",
							"description": "Visual3D analysis only: Required. The name of a template file in the Templates directory. This file will be instantiated and used as the pipeline script in visual 3d.",
							"type": "string"
						},
						"Do not wait for Visual3D": {
							"title": "Do not wait for Visual3D",
							"description": "Visual3D analysis only: Optional. If analysis includes this property, QTM does not wait for Visual3D to finish the processing. If property does not exit, to continue with subsequent analyses, Visual3D must be closed manually or Exit_Workspace; command has to be added to the very end of Visual3D script.",
							"$ref": "#/$defs/yaml-boolean"
						},
						"Close Visual3D": {
							"title": "Deprecated: Close Visual3D",
							"deprecated": true,
							"description": "Visual3D analysis only: Deprecated (> QTM 2.16).",
							"enum": ["Never", "No Warnings"]
						},

						"Components": {
							"title": "Compound analysis components",
							"description": "Compound analysis only. Required. An array of analysis steps.",
							"type": "array",
							"items": {
								"type": "string"
							}
						},

						"Template": {
							"title": "Template to instantiate",
							"description": "Instantiate template analysis only: Required. The name of the input file. If this name contains any path delimiter tokens, it will be considered to be relative to the project directory, otherwise QTM will assume that the input file is placed in the templates folder.",
							"type": "string"
						},

						"Measurements": {
							"title": "Measurements where skeleton should be solved",
							"description": "Create / Solve skeleton analyses only: Required. A string or list of strings to specify the file names to solve the skeletons. Wildcard can be used in the name to specify multiple files at once. To specify all measurements, simply use the wildcard character. Only measurements that are marked as used in the PAF pane will be affected.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								{
									"type": "string"
								}
							]
						},
						"Exclude": {
							"title": "Measurements where skeleton should _not_ be solved",
							"description": "Create / Solve skeleton analyses only: Optional. A string or list of strings to specify the file names to exclude. Wildcard can be used in the name to specify multiple files at once. Only measurements that are marked as used in the PAF pane will be affected.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								{
									"type": "string"
								}
							]
						}
					}
				}
			}
		},

		"Fields": {
			"title": "Field definitions",
			"description": "",
			"type": "object",
			"patternProperties": {
				".+": {
					"title": "Field",
					"description": "A uniquely named field, defining its properties.",
					"properties": {
						"Type": {
							"title": "Field type",
							"description": "Required. Defines the type of the field. Possible values are Integer, Float, String, Date, TimeOfDay, Enum or Boolean.",
							"enum": ["Integer", "Float", "String", "Date", "TimeOfDay", "Enum", "Boolean"]
						},
						"Hidden": {
							"title": "Hidden field",
							"description": "If the value is Yes or True, this field will not be displayed in the GUI (and thus will not be editable by the user) but will be exported to files. It will keep its default value.",
							"$ref": "#/$defs/yaml-boolean"
						},
						"Readonly": {
							"title": "Readonly field",
							"description": "If the value is Yes or True this field will be displayed, but the user will not be able to edit it. It will keep its default value.",
							"$ref": "#/$defs/yaml-boolean"
						},
						"Inherit": {
							"title": "Inherit from parent fields",
							"description": "This field will be inherited by all subitems of the item that contains it. There are two modes of inheritance Copy and Connect and the value of this property has to be one of them.\n\nCopy: Inheritance by copying means that when a child to an item that has an inheritable field is created, a field with the same name is created in the child and the value of the field in the parent is copied to that field.\n\nConnect fields work the same way when an item is created, but if the field is changed in any of the items (any ancestor or heir) it is updated in all the items that have inherited this field from the same origin. If, for instance, a value is inherited by connection from a patient to a number of sessions and the measurements in those sessions and it is changed in one of the sessions it is changed in all those objects, but not in other patients and the sessions of those patients.\n\nFields are inherited all the down to the leaves from the item including the fields so if the root item would include an inherited field, it would be copied to all items in the tree.",
							"enum": ["Copy", "Connect"]
						},
						"Default": {
							"title": "Default field value",
							"description": "The default value that this field will get when an item that contains it is created. This can be overridden in the item type specification and by inheritance. The value of this property should have the same data type as the field. String fields can also specify a sequence as default value. The sequence will be converted into a string containing the elements of the sequence separated by semicolon.",
							"anyOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								{
									"type": "string"
								},
								{
									"type": "number"
								},
								{
									"type": "boolean"
								},
								{
									"type": "null"
								}
							]
						},

						"Max": {
							"title": "Maximum value",
							"description": "Integer / Float types only: The maximum value that can be entered in this field.",
							"type": "number"
						},
						"Min": {
							"title": "Minimum value",
							"description": "Integer / Float types only: The minimum value that can be entered in this field.",
							"type": "number"
						},
						"Quantity": {
							"title": "Field physical quantity",
							"description": "Float type only: The physical quantity that this field represents. This list contains the basic physical quantities but also some derived quantities because there is no possibility to combine quantities.",
							"enum": [
								"Length",
								"Mass",
								"Voltage",
								"Current",
								"Force",
								"Moment",
								"Power",
								"Angle",
								"Time",
								"Frequency",
								"Temperature",
								"Speed",
								"Acceleration",
								"Magnetic field strength",
								"Rotational speed"
							]
						},
						"Unit": {
							"title": "Field unit",
							"description": "Float type only: The unit of this field. Can only be specified if a quantity has been specified. Different units apply to different quantities. Either the unit name or the abbreviation can be given. If a unit is not entered, the S/I unit is used.",
							"enum": [
								"meters",
								"ångstroms",
								"nanometers",
								"microns",
								"millimeters",
								"centimeters",
								"kilometers",
								"inches",
								"feet",
								"yards",
								"miles",
								"kilograms",
								"micrograms",
								"milligrams",
								"grams",
								"ounces",
								"pounds",
								"volts",
								"nanovolts",
								"microvolts",
								"millivolts",
								"kilovolts",
								"ampere",
								"nanoampere",
								"microampere",
								"milliampere",
								"kiloampere",
								"newtons",
								"millinewtons",
								"kilonewtons",
								"meganewtons",
								"kiloponds",
								"pounds force",
								"newtonmeter",
								"newtonmillimeter",
								"watt",
								"radians",
								"degrees",
								"seconds",
								"minutes",
								"hours",
								"hertz",
								"kilohertz",
								"megahertz",
								"revolutions per minute",
								"beats per minute",
								"kelvin",
								"degrees celsius",
								"degrees farenheit",
								"meters per second",
								"millimeters per second",
								"kilometers per hour",
								"feet per second",
								"miles per hour",
								"knots",
								"meters per second squared",
								"millimeters per second squared",
								"feet per second squared",
								"standard gravity",
								"tesla",
								"millitesla",
								"degrees per second",
								"Meters",
								"Ångstroms",
								"Nanometers",
								"Microns",
								"Millimeters",
								"Centimeters",
								"Kilometers",
								"Inches",
								"Feet",
								"Yards",
								"Miles",
								"Kilograms",
								"Micrograms",
								"Milligrams",
								"Grams",
								"Ounces",
								"Pounds",
								"Volts",
								"Nanovolts",
								"Microvolts",
								"Millivolts",
								"Kilovolts",
								"Ampere",
								"Nanoampere",
								"Microampere",
								"Milliampere",
								"Kiloampere",
								"Newtons",
								"Millinewtons",
								"Kilonewtons",
								"Meganewtons",
								"Kiloponds",
								"Pounds force",
								"Newtonmeter",
								"Newtonmillimeter",
								"Watt",
								"Radians",
								"Degrees",
								"Seconds",
								"Minutes",
								"Hours",
								"Hertz",
								"Kilohertz",
								"Megahertz",
								"Revolutions per minute",
								"Beats per minute",
								"Kelvin",
								"Degrees celsius",
								"Degrees farenheit",
								"Meters per second",
								"Millimeters per second",
								"Kilometers per hour",
								"Feet per second",
								"Miles per hour",
								"Knots",
								"Meters per second squared",
								"Millimeters per second squared",
								"Feet per second squared",
								"Standard gravity",
								"Tesla",
								"Millitesla",
								"Degrees per second",
								"m/s"
							]
						},
						"Decimals": {
							"title": "Field decimal count",
							"description": "Float type only: The number of decimals to present to the user.",
							"type": "integer"
						},

						"Force": {
							"title": "Force non-empty string",
							"description": "String type only: Force the string to be non-empty.",
							"$ref": "#/$defs/yaml-boolean"
						},
						"JSON": {
							"title": "Treat string as JSON object",
							"description": "String type only: The string should be returned as JSON object when queried from the REST api. JSON fields are not exported to session.xml during the analysis step. (Available from QTM 2.14).",
							"$ref": "#/$defs/yaml-boolean"
						},

						"Values": {
							"title": "Enum values",
							"description": "Enum type only: The enum field defines an enumeration. To the user it will be presented as a multiple selection and internally it will be saved as a numeric value. The possible values that an enum can have has to be specified in the Values property. This property can be either a sequence or a map.\n\nIf it is a sequence it simply lists the choices of the enum and these will be assigned an integer value automatically.\n\nIf it is a map it is a map from the choices to the numeric value of each particular choice.",
							"type": "array",
							"items": {
								"anyOf": [
									{
										"type": "string"
									},
									{
										"type": "number"
									},
									{
										"type": "boolean"
									},
									{
										"type": "null"
									}
								]
							}
						},

						"Display": {
							"title": "Boolean display",
							"description": "Boolean type only: Controls how this value will be displayed. Can be one of yesno, checkbox or truefalse.",
							"enum": [
								"yesno",
								"checkbox",
								"truefalse",
								"YesNo",
								"Checkbox",
								"TrueFalse"
							]
						}
					},
					"required": [
						"Type"
					]
				}
			}
		},

		"Columns": {
			"title": "Column definitions",
			"description": "The columns section specifies the columns of the tree view in the project view. It allows the PAF file to specify multiple column setups. The idea is that the users should be able to switch between different configurations and possibly also add their own but currently only the first setup is used.",
			"type": "object",
			"patternProperties": {
				".+": {
					"title": "Column setup",
					"description": "A uniquely named column setup. Each setup contains an arbitrary number of columns.",
					"patternProperties": {
						".+": {
							"title": "Column",
							"description": "A uniquely named column. Each column can specify a width (in pixels) and a way of determining the value displayed in the column. A key to understanding the column values is the understanding that each row in the tree view might contain a different type of item.",
							"properties": {
								"Width": {
									"title": "Column width",
									"description": "The width (in pixels) of this column.",
									"type": "integer"
								},
								"Field": {
									"title": "Column field",
									"description": "The column will contain the value of the field named by this property regardless of the type of the item on the row.",
									"type": "string"
								},
								"Fields": {
									"title": "Column fields (with name mapping)",
									"description": "A map from the item type name to the field to use. For each item type that is present as a key in the map the value of the field named will be used. For item types that are not named in the map the default field name will be used.",
									"type": "object",
									"properties": {
										"Default": {
											"title": "Default field",
											"description": "Name used for item types not named in the map.",
											"type": "string"
										}
									},
									"patternProperties": {
										".+": {
											"title": "Field mapping",
											"description": "Name used for item types not named in the map.",
											"anyOf": [
												{
													"type": "string"
												},
												{
													"type": "object",
													"properties": {
														"Name": {
															"title": "Type name",
															"description": "",
															"type": "string"
														},
														"Editable": {
															"title": "Editable values",
															"description": "If yes or true, the value of the field can be edited directly in the tree.",
															"$ref": "#/$defs/yaml-boolean"
														}
													}
												}
											]
										}
									}
								}
							}
						}
					}
				}
			}
		}
	},
	"required": [ 
		"Project ID",
		"Root type",
		"Types",
		"Columns"
	],
	"$defs": {
		"yaml-boolean": {
			"oneOf": [
				{
					"type": "boolean"
				},
				{
					"type": "string",
					"enum": ["Yes", "yes", "No", "no"]
				}
			]
			
		}
	}
}