# Common Elements

All of the common elements used within this specification are described in this Document. Common elements include the data types, and their properties used in this specificaiton.

## Cardinality

All the variables in the specification will have a cardinality. The cardinality attribute defines the number of values allowed for the variable and whether the variables are ordered.

Supported types of cardinality are:

* *single*: only one value is allowed for the variable
* *multiple*: one or more values are allowed for the variable
* *ordered*: ordered list of values are allowed for the variable

## Data Types

### string

String data types should be used to represent string literal values.

### integer

Integer data types should be used to represent numbers without a fractional part.

### float

Float data types should be used to represent numbers with a fractional part.

### boolean

Boolean data types should be used to represent values with two states: true or false.

### uri

URI data types should be used to represent Uniform Resource Identifier (URI) reference values.

### map

Map data type should be used for variables whose values are key-value pairs. Map is a non-primitive data type with the following attributes.

| Attribute | Schema                                                     | Description                                                                                                           |
| --------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| key       | dataType: *string*,   required: *true*                     | a map cannot contain duplicate keys and each key can map at most one value                                            |
| value     | dataType: *any*,   required: *false*, defaultValue: *NULL* | value can be of any other data type defined in QuML. value is optional and is by default set to NULL, if not provided |

### coordinate

Coordinate data type should be used to represent coordinates (x and y) of a single point in a canvas.

| Attribute | Schema                                | Description                     |
| --------- | ------------------------------------- | ------------------------------- |
| x         | dataType: *float*,   required: *true* | x-coordinate value of the point |
| y         | dataType: *float*,   required: *true* | y-coordinate value of the point |

### points

Points data type should be used for variables whose values represent an area on a canvas. Points are made up of a shape and the coordinates that define the boundary of the area.

| Attribute   | Schema                                                                                          | Description                                                                                            |
| ----------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| shape       | dataType: *string*,   required: *true*,   range: *“point”, “circle”, “ellipse”, “poly”, “rect”* | represents the shape of points. it must be equal one of the predefined values defined in the range     |
| coordinates | dataType: *list of coordinate objects*,   required: *true*                                      | Coordinates should have at least one coordinate object. The number of coordinates depend on the shape. |

### media

Media data type should be used for representing a single media file. Media are re-usable to create assets which are used in questions and/or tests.

| Attribute | Schema                                 | Description                                                                                                                                                                                                   |
| --------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id        | dataType: *string*,   required: *true* | identifier of the media object                                                                                                                                                                                |
| mimeType  | dataType: *string*,   required: *true* | technical mime type of the asset used by QuML players to understand the format of the asset. Supported types are image/png, audio/mp3, video/mp4, and video/webm                                              |
| mediaType | dataType: *string*, required: *true*   | type of the asset. this should be auto-derived from the mimeType value, current supported types are image, audio and video                                                                                    |
| src       | dataType: *string*, required: *true*   | path of the media file. QuML players will use this value to load all the media used in a question/test                                                                                                        |
| baseUrl   | dataType: *string*, required: *false*  | baseUrl of the server where the media is stored. Base URL can be used by QuML players to load media in a browser without CORS issues. this is achieved by QuML server proxying path to the provided base url. |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://quml.sunbird.org/v1/common.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
