From 8ad34bd7ec25fd9d7a561ad300534c141ce4afe4 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Thu, 24 Oct 2024 11:32:06 +0100 Subject: [PATCH 001/192] structure of Presentation 4 --- source/presentation/4.0/index.md | 156 ++++++++++++++++++++++++++ source/presentation/4.0/properties.md | 35 ++++++ source/presentation/4/context.json | 1 + 3 files changed, 192 insertions(+) create mode 100644 source/presentation/4.0/index.md create mode 100644 source/presentation/4.0/properties.md create mode 100644 source/presentation/4/context.json diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md new file mode 100644 index 000000000..fe5616888 --- /dev/null +++ b/source/presentation/4.0/index.md @@ -0,0 +1,156 @@ +# Presentation 4 + +## How this stuff works + +Manifests, Containers, Annotations oh my! +Manifest as unit of distribution + +## Content Resources? + +There is stuff that we want to show + +## Containers + +"painting" +"supplementing" + +"Nesting" (see 3d draft) + +### Timeline + +* has continuous duration in seconds + +### Canvas + +* has integer, unitless width and height +* has optional continuous duration in seconds + +### Scene + +* has continuous, unitless x,y,z cartesian coordinate space +* has optional continuous duration in seconds + +Bring in https://github.com/IIIF/3d/blob/main/temp-draft-4.md#scenes + + +## Putting stuff into Containers (composition) + +### Annotation + +"non-painting" + +"target" and "body" + + +### Annotation Page + +### Annotation Collection + + +### Manifest + +### Collection + +#### Paging + +### Range + +## Content State + +(introduce motivation and reasons) + +Separate Content State Sharing spec (protocols for sharing annotations) + +content state intended to: + + - load a view of some resource (existing spec) + - load a view of some resource AND modify the Container (show you my new anno, add camera) + - modify the Container in a particular context (`scope`, storytelling) + - contribute additional information permanently (rerum **inbox** - move to protocol doc) + + +## Selectors + +### SpecificResource + +### PointSelector + + +## Scene-Specific Resources + +### 3D considerations / principles + +"models" (content resources in 3D) +"local coordinate spaces" + +### Camera + +### Light + +### Transforms + +#### ScaleTransform + +#### RotateTransform + +#### TranslateTransform + +"Relative Rotation" + +"Excluding" + +## Advanced Association Features + + +### Segments + +### Embedded Content + +### Choice of Alternative Resources + +### Non Rectangular Segments + +### Style + +### Rotation + +### Comment Annotations + +### Hotspot Linking + +### Activation + +### Using Content State + + - modify the Container in a particular context (`scope`, storytelling) + + + +### Physical Dimension Service + + + +## HTTP Requests and Responses + +### URI Recommendations + +### Requests + +### Responses + +### Authentication + + +## Appendices + +### Summary of Property Requirements + +### Example Manifest Response + +### Versioning + +### Acknowledgements + +### Change Log + +"Exclude Audio" \ No newline at end of file diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md new file mode 100644 index 000000000..a65d8bb14 --- /dev/null +++ b/source/presentation/4.0/properties.md @@ -0,0 +1,35 @@ +# Vocabulary? + +## Resource Properties + +### Descriptive Properties + +#### label (etc) + +### Linking Properties + +### Technical Properties + +### Structural Properties + +### Values + + + +## JSON-LD Considerations + +### Case Sensitivity + +### Resource Representations + +### Properties with Multiple Values + +### Language of Property Values + +### HTML Markup in Property Values + +### Linked Data Context and Extensions + +### Term Collisions between Contexts + +### Keyword Mappings \ No newline at end of file diff --git a/source/presentation/4/context.json b/source/presentation/4/context.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/source/presentation/4/context.json @@ -0,0 +1 @@ +{} \ No newline at end of file From f7d2aafbb7d7449d884080e743e145d0aa9f7a6b Mon Sep 17 00:00:00 2001 From: tomcrane Date: Thu, 24 Oct 2024 11:37:58 +0100 Subject: [PATCH 002/192] container desc --- source/presentation/4.0/index.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index fe5616888..06f32011a 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -5,28 +5,39 @@ Manifests, Containers, Annotations oh my! Manifest as unit of distribution -## Content Resources? +## Content Resources -There is stuff that we want to show +There is stuff that we want to show - images, video, audio, 3D models etc ## Containers +This is where we put content resources "painting" + +And we can also put other things: "supplementing" +And we can nest them "Nesting" (see 3d draft) + ### Timeline +A Container that represents a bounded temporal range, without any spatial coordinates. + * has continuous duration in seconds ### Canvas +A Container that represents a bounded, two-dimensional space and has content resources associated with all or parts of it. It may also have a bounded temporal range in the same manner as a Timeline. + * has integer, unitless width and height * has optional continuous duration in seconds ### Scene +A Container that represents a boundless three-dimensional space and has content resources positioned at locations within it. Rendering a Scene requires the use of Cameras and Lights. It may also have a bounded temporal range in the same manner as a Timeline. + * has continuous, unitless x,y,z cartesian coordinate space * has optional continuous duration in seconds From ef1ee247c207a4aa541224b6caf1585bd1041333 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Thu, 24 Oct 2024 11:59:46 +0100 Subject: [PATCH 003/192] add 3d props to properties doc --- source/presentation/4.0/properties.md | 154 ++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index a65d8bb14..ced32bfea 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -6,10 +6,164 @@ #### label (etc) + + ### Linking Properties ### Technical Properties +#### backgroundColor + +This property sets the background color behind any painted resources on a spatial resource, such as a Canvas or Scene. + +The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is client-dependent. + + * A Canvas _MAY_ have the `backgroundColor` property
+ Clients _SHOULD_ render `backgroundColor` on any resource type. + * A Scene _MAY_ have the `backgroundColor` property
+ Clients _SHOULD_ render `backgroundColor` on any resource type. + * Other resources _MUST NOT_ have the `backgroundColor` property. + +```json +"backgroundColor": "#FFFFFF" +``` + +
+❓Can you set bgColor on a transparent image? An area? Conflict with `style` on a SpecificResource? +
+ + + +##### near + +This property gives the distance from the camera from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. + +The value is a non-negative floating point number. If this property is not specified, then the default value is client-dependent. + +* A Camera _MAY_ have the `near` property
+ Clients _SHOULD_ process the `near` property on Cameras. + +```json +"near": 1.5 +``` + +##### far + +This property gives the distance from the camera after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. + +The value is a non-negative floating point number, and _MUST_ be greater than the value for `near` on the same camera. If this property is not specified, then the default value is client-dependent. + +* A Camera _MAY_ have the `far` property
+ Clients _SHOULD_ process the `far` property on Cameras. + +```json +"far": 200.0 +``` + +##### fieldOfView + +_Summary here_ + +The value _MUST_ be a floating point number greater than 0 and less than 180. If this property is not specified, then the default value is client-dependent. + +* A PerspectiveCamera _SHOULD_ have the `fieldOfView` property.
+ Clients _SHOULD_ process the `fieldOfView` property on Cameras. + +```json + "fieldOfView": 50.0 +``` + +##### angle + +_Summary here_ + +The value _MUST_ be a floating point number greater than 0 and less than 90. If this property is not specified, then the default value is client-dependent. + +* A SpotLight _SHOULD_ have the `angle` property.
+ Clients _SHOULD_ process the `angle` property on SpotLights. + +```json + "angle": 15.0 +``` + +##### lookAt + +_Summary here_ + +The value _MUST_ be a JSON object, conforming to either a reference to an Annotation with an `id` and a `type` of "Anntoation", or a PointSelector. If this property is not specified, then the default value is null -- the camera or light is not looking at anything. + +```json +"lookAt": { + "type": "PointSelector", + "x": 3, + "y": 0, + "z": -10 +} +``` + +##### color + +This property sets the color of a Light. + +The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is "#FFFFFF". + + * A Light _SHOULD_ have the `color` property
+ Clients _SHOULD_ render `color` on any resource type. + * Other resources _MUST NOT_ have the `color` property. + +```json +"color": "#FFA0A0" +``` + +##### intensity + +This property sets the strength or brightness of a Light. + +The value _MUST_ be a JSON object, that has the `type`, `value` and `unit` properties. All three properties are required. The value of `type` _MUST_ be the string "Value". The value of `value` is a floating point number. The value of `unit` is a string, drawn from a controlled vocabulary of units. If this property is not specified, then the default intensity value is client-dependent. + +This specification defines the unit value of "relative" which constrains the value to be a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). + +* A Light _SHOULD_ have the `intensity` property.
+ Clients _SHOULD_ process the `intensity` property on Lights. + +```json +{ + "intensity": {"type": "Value", "value": 0.5, "unit": "relative"} +} +``` + +##### Exclude + +_Summary here_ + +_On Annotation, a list of strings drawn from table_ + +| Value | Description | +|------------|-------------| +| Audio | | +| Animations | | +| Cameras | | +| Lights | | + +```json +"exclude": [ "Audio", "Lights", "Cameras", "Animations" ] +``` + + +##### transform + +_Summary here_ + +The value of this property is an array of JSON objects, each of which is a Transform. + +##### x + +##### y + +##### z + + + ### Structural Properties ### Values From 6d5bb5ed445848ae824912e7816c2090624bcff0 Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 10:56:13 +0000 Subject: [PATCH 004/192] last changed at Oct 24, 2024 11:55 AM, pushed by Julie Winchester --- source/presentation/4.0/index.md | 395 ++++++++++++++++++++++++++++++- 1 file changed, 388 insertions(+), 7 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 06f32011a..fd8a73db0 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1,10 +1,12 @@ # Presentation 4 -## How this stuff works +## Introduction Manifests, Containers, Annotations oh my! Manifest as unit of distribution + - + ## Content Resources There is stuff that we want to show - images, video, audio, 3D models etc @@ -20,12 +22,132 @@ And we can also put other things: And we can nest them "Nesting" (see 3d draft) +As multiple models, lights, cameras, and other resources can be associated with and placed within a Scene container, Scenes provide a straightforward way of grouping content resources together within a space. Scenes, as well as other IIIF containers such as Canvases, can also be embedded within a Scene, allowing for the nesting of content resources. + +A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. + +As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in [Transforms](transforms_section). + +A simple example painting one Scene into another: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }, + "target": "https://example.org/iiif/scene2" +} +``` + + +Content resources of the appropriate dimension(s) may be annotated into a Container that has those dimensions. + ### Timeline A Container that represents a bounded temporal range, without any spatial coordinates. * has continuous duration in seconds + for all or part of its duration. + + +A Timeline _MUST_ have a `duration` property that defines its length in seconds. The `duration` value must be a positive floating point number. + +An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. + +A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": -1.0, + "z": 3.0, + "refinedBy": { + "type": "FragmentSelector", + "value": "t=45,95" + } + } + ] + } +} +``` + +When using a URL fragment in place of a SpecificResource, the parameter `t` can be used to select the temporal region: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": "https://example.org/iiif/scene1#xyz=-1,-1,3&t=45,95" +} +``` + +An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": -1.0, + "z": 3.0, + "instant": 45.0 + } + ] + } +} +``` + +The Annotation's [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) can be used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. + +It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. + + + + ### Canvas @@ -41,13 +163,97 @@ A Container that represents a boundless three-dimensional space and has content * has continuous, unitless x,y,z cartesian coordinate space * has optional continuous duration in seconds -Bring in https://github.com/IIIF/3d/blob/main/temp-draft-4.md#scenes +A Scene in IIIF is a virtual container that represents a boundless three-dimensional space and has content resources, lights and cameras positioned at locations within it. It may also have a duration to allow the sequencing of events and timed media. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. +The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](link to wikipedia)). + +The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the [physical dimensions pattern](fwd-ref-to-phys-dims). + +diagram of Right handed cartesian coordinate system + + +As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the [nesting section][fwd-ref-to-nesting]. + +```json +{ + "id": "https://example.org/iiif/scenes/1", + "type": "Scene", + "label": {"en": ["Chessboard"]}, + "backgroundColor": "#000000", + "items": [ + "Note: Annotations Live Here" + ] +} +``` + ## Putting stuff into Containers (composition) ### Annotation + +Annotations follow the [Web Annotation][org-w3c-webanno] data model and are used to associate models, lights, cameras, and IIIF containers such as Canvases, with Scenes. They have a `type` of "Annotation", a `body` (being the resource to be added to the scene) and a `target` (being the scene or a position within the scene). They must have a `motivation` property with the value of "painting" to assert that the resource is being painted into the Scene, rather than the Annotation being a comment about the Scene. + +A construct called a Selector is used to select a part of a resource, such as a point within a Scene. The use of a Selector necessitates the creation of a `SpecificResource` that groups together the resource being selected (the `source`) and the instance of the Selector. This SpecificResource can then be used as either the `body` or the `target` of the Annotation. + +All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. + +Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). + +Example Annotation that positions a model at a point within a Scene: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": 0.0, + "z": 1.0 + } + ] + } +} +``` + +#### URI Fragments + +The point may instead be defined using a short-hand form of a URI Fragment at the end of the `id` of the Scene as the `target` of the Annotation. The name of the fragment parameter is `xyz` and its value is the x, y and z values separated by commas. Each value can be expressed as either an integer or a floating point number. + +The annotation above could be expressed as its fragment-based equivalent: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": "https://example.org/iiif/scene1#xyz=-1,0,1" +} +``` + + + + + "non-painting" "target" and "body" @@ -96,22 +302,197 @@ content state intended to: ### Camera +A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. + +
+❓Does this prevent extension cameras from requiring a fixed aspect ratio? +
+ +This specification defines two types of Camera: + +| Class | Description | +| ------------------- | ------------ | +| `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | +| `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | + +Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If either the position or direction is not specified, then the position defaults to the origin, and direction defaults to facing along the z axis towards negative infinity. + +The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. + +The `near` property defines the minimum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything nearer to the camera than this distance will not be viewed. Conversely, the `far` property defines a maximum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything further away will not be viewed. + +For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. + +If any of these properties are not specified explicitly, they default to the choice of the client implementation. + +drawing of a geometrical frustrum truncated by near and far distances + + +If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. + +```json +{ + "id": "https://example.org/iiif/camera/1", + "type": "PerspectiveCamera", + "near": 1.0, + "far": 100.0, + "fieldOfView": 45.0 +} +``` + + + ### Light +One or more Lights MUST be present within the Scene in order to have objects within it be visible to the Cameras. + +This specification defines four types of Light: + +| Class | Description | +| ----- | ------------ | +| `AmbientLight` | AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. | +| `DirectionalLight` | DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. | +| `PointLight` | PointLight emits from a single point within the scene in all directions. | +| `SpotLight` | SpotLight emits a cone of light from a single point in a given direction. | + +Lights defined in this specification have a `color` and an `intensity`. The color is given as an RGB value, such as "#FFFFFF" for white. The intensity is the strength or brightness of the light, and described using a `Value` construct. + +SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. + +diagram of cone geometry showing how the angle of the cone is defined + +Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). If a Light does not have an explicit position in the coordinate space, then the default is at the origin. + +This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. + +If there are no Lights present within the Scene, then the viewer MUST add at least one Light. The types and properties of Lights added in this way are client-dependent. + +```json +{ + "id": "https://example.org/iiif/light/1", + "type": "AmbientLight", + "color": "#FFFFFF", + "intensity": {"type": "Value", "value": 0.6, "unit": "relativeUnit"} +} +``` + + + ### Transforms -#### ScaleTransform +The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. + +This specification defines a new class of manipulations for SpecificResources called a `Transform`, with three specific sub-classes. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. + + +| Class | Description | +| --------------- | ------------ | +| ScaleTransform | A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 | +| RotateTransform | A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 | +| TranslateTransform | A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 | -#### RotateTransform +Transforms are added to a SpecificResource using the `transform` property. The value of the property is an array, which determines the order in which the transforms are to be applied. The resulting state of the first transform is the input state for the second transform, and so on. Different orders of the same set of transforms can have different results, so attention must be paid when creating the array and when processing it. -#### TranslateTransform +The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. + +Transforms are only used in the Presentation API when the SpecificResource is the `body` of the Annotation, and are applied before the resource is painted into the scene at the point given in the `target`. + +```json +{ + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "transform": [ + { + "type": "RotateTransform", + "x": 0.0, + "y": 180.0, + "z": 0.0 + }, + { + "type": "TranslateTransform", + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + ] +} +``` + + +#### Relative Rotation + +It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector or the URI of an Annotation which paints something into the current Scene. + +If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the direction the resource is facing that point. + +
+❓What happens if the Annotation targets a Polygon or other non-Point? Calculate centroid? Error? First point given in the Poly / center of a sphere? +
+ +This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. As the z axis is not affected by the rotation, any RotateTransform that changes z will be retained, but any change to x or y will be lost. + +```json +"lookAt": { + "type": "PointSelector", + "x": 3, + "y": 0, + "z": -10 +} +``` + + +#### Excluding + +Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. + +Painting a Scene into another while excluding import of several types of resources: +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "exclude": ["Audio", "Lights", "Cameras", "Animations"], + "body": { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }, + "target": "https://example.org/iiif/scene2" +} +``` -"Relative Rotation" -"Excluding" ## Advanced Association Features +### Nesting + +A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. + +When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the pixel origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (e.g., is colinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (e.g., is colinear to) the negative y axis extending from the coordinate origin. The Canvas is scaled to the Scene such that the pixel dimensions correspond to 3D coordinate units - a Canvas 200 pixels wide and 400 pixels high will extend 200 coordinate units across the x axis and 400 coordinate units across the y axis. Please note: direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted. + +A Canvas in a Scene has a specific forward face and a backward face. By default, the forward face of a Canvas should point in the direction of the positive z axis. If the property `backgroundColor` is used, this color should be used for the backward face of the Canvas. Otherwise, a reverse view of the forward face of the Canvas should be visible on the backward face. + +
+ To Do: Add an image demonstrating default Canvas placement in Scene +
+ +A `PointSelector` can be used to modify the point at which the Canvas will be painted, by establishing a new point to align with the top-left corner of the Canvas instead of the Scene coordinate origin. Transforms can also be used to modify Canvas rotation, scale, or translation. + +It may be desirable to exercise greater control over how the Canvas is painted into the Scene by selecting the coordinate points in the Scene that should correspond to each corner of the Canvas. This provides fine-grained manipulation of Canvas placement and/or scale, and for optionally introducing Canvas distortion or skew. Annotations may use a type of Selector called a `PolygonZSelector` to select different points in the Scene to align with the top-left, bottom-left, bottom-right, and top-right corners of the Canvas. PolygonZSelectors have a single property, `value`, which is a string listing a WKT `POLYGONZ` expression containing four coordinate points, with each coordinate separated by commas, and axes within a coordinate separated by spaces. The four Scene coordinates should be listed beginning with the coordinate corresponding to the top-left corner of the Canvas, and should proceed in a counter-clockwise winding order around the Canvas, with coordinates corresponding to bottom-left, bottom-right, and top-right corners in order respectively. The use of PolygonZSelector overrides any use of Transforms on the Canvas Annotation. + +Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at (1, 0, 0); and top-right at (1, 1, 0): +```json +"selector": [ + { + "type": "PolygonZSelector", + "value": "POLYGONZ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" + } +] +``` + ### Segments From bd0eca81ce8990741b2579d90953dcdb18a99b2e Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:03:38 +0000 Subject: [PATCH 005/192] last changed at Oct 24, 2024 1:01 PM, pushed by Julie Winchester --- source/presentation/4.0/properties.md | 956 +++++++++++++++++++++++++- 1 file changed, 944 insertions(+), 12 deletions(-) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index ced32bfea..b41dcdfc9 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -4,14 +4,549 @@ ### Descriptive Properties -#### label (etc) +##### label + +A human readable label, name or title. The `label` property is intended to be displayed as a short, textual surrogate for the resource if a human needs to make a distinction between it and similar resources, for example between objects, pages, or options for a choice of images to display. The `label` property can be fully internationalized, and each language can have multiple values. This pattern is described in more detail in the [languages][prezi30-languages] section. + +The value of the property _MUST_ be a JSON object, as described in the [languages][prezi30-languages] section. + + * A Collection _MUST_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on a Collection. + * A Manifest _MUST_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on a Manifest. + * A Canvas _SHOULD_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on a Canvas, and _SHOULD_ generate a `label` for Canvases that do not have them. + * A content resource _MAY_ have the `label` property with at least one entry. If there is a Choice of content resource for the same Canvas, then they _SHOULD_ each have at least the `label` property with at least one entry.
+ Clients _MAY_ render `label` on content resources, and _SHOULD_ render them when part of a Choice. + * A Range _SHOULD_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on a Range. + * An Annotation Collection _SHOULD_ have the `label` property with at least one entry.
+ Clients _SHOULD_ render `label` on an Annotation Collection. + * Other types of resource _MAY_ have the `label` property with at least one entry.
+ Clients _MAY_ render `label` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "label": { "en": [ "Example Object Title" ] } } +``` +##### metadata + +An ordered list of descriptions to be displayed to the user when they interact with the resource, given as pairs of human readable `label` and `value` entries. The content of these entries is intended for presentation only; descriptive semantics _SHOULD NOT_ be inferred. An entry might be used to convey information about the creation of the object, a physical description, ownership information, or other purposes. + +The value of the `metadata` property _MUST_ be an array of JSON objects, where each item in the array has both `label` and `value` properties. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi30-languages] section. + + * A Collection _SHOULD_ have the `metadata` property with at least one item.
+ Clients _MUST_ render `metadata` on a Collection. + * A Manifest _SHOULD_ have the `metadata` property with at least one item.
+ Clients _MUST_ render `metadata` on a Manifest. + * A Canvas _MAY_ have the `metadata` property with at least one item.
+ Clients _SHOULD_ render `metadata` on a Canvas. + * Other types of resource _MAY_ have the `metadata` property with at least one item.
+ Clients _MAY_ render `metadata` on other types of resource. + +Clients _SHOULD_ display the entries in the order provided. Clients _SHOULD_ expect to encounter long texts in the `value` property, and render them appropriately, such as with an expand button, or in a tabbed interface. + +{% include api/code_header.html %} +``` json-doc +{ + "metadata": [ + { + "label": { "en": [ "Creator" ] }, + "value": { "en": [ "Anne Artist (1776-1824)" ] } + } + ] +} +``` + +##### summary + +A short textual summary intended to be conveyed to the user when the `metadata` entries for the resource are not being displayed. This could be used as a brief description for item level search results, for small-screen environments, or as an alternative user interface when the `metadata` property is not currently being rendered. The `summary` property follows the same pattern as the `label` property described above. + +The value of the property _MUST_ be a JSON object, as described in the [languages][prezi30-languages] section. + + * A Collection _SHOULD_ have the `summary` property with at least one entry.
+ Clients _SHOULD_ render `summary` on a Collection. + * A Manifest _SHOULD_ have the `summary` property with at least one entry.
+ Clients _SHOULD_ render `summary` on a Manifest. + * A Canvas _MAY_ have the `summary` property with at least one entry.
+ Clients _SHOULD_ render `summary` on a Canvas. + * Other types of resource _MAY_ have the `summary` property with at least one entry.
+ Clients _MAY_ render `summary` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "summary": { "en": [ "This is a summary of the object." ] } } +``` + +##### requiredStatement + +Text that _MUST_ be displayed when the resource is displayed or used. For example, the `requiredStatement` property could be used to present copyright or ownership statements, an acknowledgement of the owning and/or publishing institution, or any other text that the publishing organization deems critical to display to the user. Given the wide variation of potential client user interfaces, it will not always be possible to display this statement to the user in the client's initial state. If initially hidden, clients _MUST_ make the method of revealing it as obvious as possible. + +The value of the property _MUST_ be a JSON object, that has the `label` and `value` properties, in the same way as a `metadata` property entry. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi30-languages] section. + + * Any resource type _MAY_ have the `requiredStatement` property.
+ Clients _MUST_ render `requiredStatement` on every resource type. + +{% include api/code_header.html %} +``` json-doc +{ + "requiredStatement": { + "label": { "en": [ "Attribution" ] }, + "value": { "en": [ "Provided courtesy of Example Institution" ] } + } +} +``` + +##### rights + +A string that identifies a license or rights statement that applies to the content of the resource, such as the JSON of a Manifest or the pixels of an image. The value _MUST_ be drawn from the set of [Creative Commons][org-cc-licenses] license URIs, the [RightsStatements.org][org-rs-terms] rights statement URIs, or those added via the [extension][prezi30-ldce] mechanism. The inclusion of this property is informative, and for example could be used to display an icon representing the rights assertions. + +If displaying rights information directly to the user is the desired interaction, or a publisher-defined label is needed, then it is _RECOMMENDED_ to include the information using the `requiredStatement` property or in the `metadata` property. + +The value _MUST_ be a string. If the value is drawn from Creative Commons or RightsStatements.org, then the string _MUST_ be a URI defined by that specification. + + * Any resource type _MAY_ have the `rights` property.
+ Clients _MAY_ render `rights` on any resource type. + +{% include api/code_header.html %} +``` json-doc +{ "rights": "http://creativecommons.org/licenses/by/4.0/" } +``` + +__Machine actionable URIs and links for users__
+The machine actionable URIs for both Creative Commons licenses and RightsStatements.org right statements are `http` URIs. In both cases, human readable descriptions are available from equivalent `https` URIs. Clients may wish to rewrite links presented to users to use these equivalent `https` URIs. +{: .note} + +##### provider + +An organization or person that contributed to providing the content of the resource. Clients can then display this information to the user to acknowledge the provider's contributions. This differs from the `requiredStatement` property, in that the data is structured, allowing the client to do more than just present text but instead have richer information about the people and organizations to use in different interfaces. + +The organization or person is represented as an `Agent` resource. + +* Agents _MUST_ have the `id` property, and its value _MUST_ be a string. The string _MUST_ be a URI that identifies the agent. +* Agents _MUST_ have the `type` property, and its value _MUST_ be the string "Agent". +* Agents _MUST_ have the `label` property, and its value _MUST_ be a JSON object as described in the [languages][prezi30-languages] section. +* Agents _SHOULD_ have the `homepage` property, and its value _MUST_ be an array of JSON objects as described in the [homepage][prezi30-homepage] section. +* Agents _SHOULD_ have the `logo` property, and its value _MUST_ be an array of JSON objects as described in the [logo][prezi30-logo] section. +* Agents _MAY_ have the `seeAlso` property, and its value _MUST_ be an array of JSON object as described in the [seeAlso][prezi30-seealso] section. + +The value _MUST_ be an array of JSON objects, where each item in the array conforms to the structure of an Agent, as described above. + + * A Collection _SHOULD_ have the `provider` property with at least one item.
+ Clients _MUST_ render `provider` on a Collection. + * A Manifest _SHOULD_ have the `provider` property with at least one item.
+ Clients _MUST_ render `provider` on a Manifest. + * Other types of resource _MAY_ have the `provider` property with at least one item.
+ Clients _SHOULD_ render `provider` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "provider": [ + { + "id": "https://example.org/about", + "type": "Agent", + "label": { "en": [ "Example Organization" ] }, + "homepage": [ + { + "id": "https://example.org/", + "type": "Text", + "label": { "en": [ "Example Organization Homepage" ] }, + "format": "text/html" + } + ], + "logo": [ + { + "id": "https://example.org/images/logo.png", + "type": "Image", + "format": "image/png", + "height": 100, + "width": 120 + } + ], + "seeAlso": [ + { + "id": "https://data.example.org/about/us.jsonld", + "type": "Dataset", + "format": "application/ld+json", + "profile": "https://schema.org/" + } + ] + } + ] +} +``` + +##### thumbnail + +A content resource, such as a small image or short audio clip, that represents the resource that has the `thumbnail` property. A resource _MAY_ have multiple thumbnail resources that have the same or different `type` and `format`. + +The value _MUST_ be an array of JSON objects, each of which _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `format` property. Images and videos _SHOULD_ have the `width` and `height` properties, and time-based media _SHOULD_ have the `duration` property. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for images to enable manipulations such as resizing. + + * A Collection _SHOULD_ have the `thumbnail` property with at least one item.
+ Clients _SHOULD_ render `thumbnail` on a Collection. + * A Manifest _SHOULD_ have the `thumbnail` property with at least one item.
+ Clients _SHOULD_ render `thumbnail` on a Manifest. + * A Canvas _MAY_ have the `thumbnail` property with at least one item. A Canvas _SHOULD_ have the `thumbnail` property if there are multiple resources that make up the view.
+ Clients _SHOULD_ render `thumbnail` on a Canvas. + * A content resource _MAY_ have the `thumbnail` property with at least one item. Content resources _SHOULD_ have the `thumbnail` property with at least one item if it is an option in a Choice of resources.
+ Clients _SHOULD_ render `thumbnail` on a content resource. + * Other types of resource _MAY_ have the `thumbnail` property with at least one item.
+ Clients _MAY_ render `thumbnail` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "thumbnail": [ + { + "id": "https://example.org/img/thumb.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 300, + "height": 200 + } + ] +} +``` + +##### navDate + +A date that clients may use for navigation purposes when presenting the resource to the user in a date-based user interface, such as a calendar or timeline. More descriptive date ranges, intended for display directly to the user, _SHOULD_ be included in the `metadata` property for human consumption. If the resource contains Canvases that have the `duration` property, the datetime given corresponds to the navigation datetime of the start of the resource. For example, a Range that includes a Canvas that represents a set of video content recording a historical event, the `navDate` is the datetime of the first moment of the recorded event. + +The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _MUST_ have a timezone, and _SHOULD_ be given in UTC with the `Z` timezone indicator, but _MAY_ instead be given as an offset of the form `+hh:mm`. + + * A Collection _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on a Collection. + * A Manifest _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on a Manifest. + * A Range _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on a Range. + * A Canvas _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on a Canvas. + * Other types of resource _MUST NOT_ have the `navDate` property.
+ Clients _SHOULD_ ignore `navDate` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "navDate": "2010-01-01T00:00:00Z" } +``` + +##### placeholderCanvas + +A single Canvas that provides additional content for use before the main content of the resource that has the `placeholderCanvas` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderCanvas` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderCanvas` as part of the initial presentation of a single resource. A placeholder Canvas is likely to have different dimensions to those of the Canvas(es) of the resource that has the `placeholderCanvas` property. + +Clients _MAY_ display the content of a linked placeholder Canvas when presenting the resource. When more than one such Canvas is available, for example if `placeholderCanvas` is provided for the currently selected Range and the current Manifest, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the placeholder Canvas will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the rendered placeholder Canvas and the content of the resource that has the `placeholderCanvas` property. + +The value _MUST_ be a JSON object with the `id` and `type` properties, and _MAY_ have other properties of Canvases. The value of `type` _MUST_ be the string `Canvas`. The object _MUST NOT_ have the `placeholderCanvas` property, nor the `accompanyingCanvas` property. + + * A Collection _MAY_ have the `placeholderCanvas` property.
+ Clients _MAY_ render `placeholderCanvas` on a Collection. + * A Manifest _MAY_ have the `placeholderCanvas` property.
+ Clients _MAY_ render `placeholderCanvas` on a Manifest. + * A Canvas _MAY_ have the `placeholderCanvas` property.
+ Clients _MAY_ render `placeholderCanvas` on a Canvas. + * A Range _MAY_ have the `placeholderCanvas` property.
+ Clients _MAY_ render `placeholderCanvas` on a Range. + * Other types of resource _MUST NOT_ have the `placeholderCanvas` property.
+ Clients _SHOULD_ ignore `placeholderCanvas` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "placeholderCanvas": { + "id": "https://example.org/iiif/1/canvas/placeholder", + "type": "Canvas", + "height": 1400, + "width": 1200 + } +} +``` + +##### accompanyingCanvas + +A single Canvas that provides additional content for use while rendering the resource that has the `accompanyingCanvas` property. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. + +Clients _MAY_ display the content of an accompanying Canvas when presenting the resource. As with `placeholderCanvas` above, when more than one accompanying Canvas is available, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the accompanying Canvas will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the accompanying Canvas and the content of the resource that has the `accompanyingCanvas` property. + +The value _MUST_ be a JSON object with the `id` and `type` properties, and _MAY_ have other properties of Canvases. The value of `type` _MUST_ be the string `Canvas`. The object _MUST NOT_ have the `placeholderCanvas` property, nor the `accompanyingCanvas` property. + + * A Collection _MAY_ have the `accompanyingCanvas` property.
+ Clients _MAY_ render `accompanyingCanvas` on a Collection. + * A Manifest _MAY_ have the `accompanyingCanvas` property.
+ Clients _MAY_ render `accompanyingCanvas` on a Manifest. + * A Canvas _MAY_ have the `accompanyingCanvas` property.
+ Clients _MAY_ render `accompanyingCanvas` on a Canvas. + * A Range _MAY_ have the `accompanyingCanvas` property.
+ Clients _MAY_ render `accompanyingCanvas` on a Range. + * Other types of resource _MUST NOT_ have the `accompanyingCanvas` property.
+ Clients _SHOULD_ ignore `accompanyingCanvas` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "accompanyingCanvas": { + "id": "https://example.org/iiif/1/canvas/accompany", + "type": "Canvas", + "duration": 180.0 + } +} +``` -### Linking Properties ### Technical Properties +##### id + +The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Canvases, which _MUST_ have their own URI without a fragment. + +The value _MUST_ be a string, and the value _MUST_ be an HTTP(S) URI for resources defined in this specification. If the resource is retrievable via HTTP(S), then the URI _MUST_ be the URI at which it is published. External resources, such as profiles, _MAY_ have non-HTTP(S) URIs defined by other communities. + +The existence of an HTTP(S) URI in the `id` property does not mean that the URI will always be dereferencable. If the resource with the `id` property is [embedded][prezi30-terminology], it _MAY_ also be dereferenceable. If the resource is referenced (again, see the [terminology section][prezi30-terminology] for an explanation of "referenced"), it _MUST_ be dereferenceable. The [definitions of the Resources][prezi30-resource-structure] give further guidance. + + * All resource types _MUST_ have the `id` property.
+ Clients _MAY_ render `id` on any resource type, and _SHOULD_ render `id` on Collections, Manifests and Canvases. + +{% include api/code_header.html %} +``` json-doc +{ "id": "https://example.org/iiif/1/manifest" } +``` + +##### type + +The type or class of the resource. For classes defined for this specification, the value of `type` will be described in the sections below describing each individual class. + +For content resources, the value of `type` is drawn from other specifications. Recommendations for common content types such as image, text or audio are given in the table below. + +The JSON objects that appear in the value of the `service` property will have many different classes, and can be used to distinguish the sort of service, with specific properties defined in a [registered context document][prezi30-ldce]. + +The value _MUST_ be a string. + + * All resource types _MUST_ have the `type` property.
+ Clients _MUST_ process, and _MAY_ render, `type` on any resource type. + +| Class | Description | +| ------------- | -------------------------------- | +| `Dataset` | Data not intended to be rendered to humans directly | +| `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | +| `Model` | A three (or more) dimensional model intended to be interacted with by humans | +| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | +| `Text` | Resources primarily intended to be read | +| `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | +{: .api-table #table-type} + +{% include api/code_header.html %} +``` json-doc +{ "type": "Image" } +``` + +##### format + +The specific media type (often called a MIME type) for a content resource, for example `image/jpeg`. This is important for distinguishing different formats of the same overall type of resource, such as distinguishing text in XML from plain text. + +Note that this is different to the `formats` property in the [Image API][image-api], which gives the extension to use within that API. It would be inappropriate to use in this case, as `format` can be used with any content resource, not just images. + +The value _MUST_ be a string, and it _SHOULD_ be the value of the `Content-Type` header returned when the resource is dereferenced. + + * A content resource _SHOULD_ have the `format` property.
+ Clients _MAY_ render the `format` of any content resource. + * Other types of resource _MUST NOT_ have the `format` property.
+ Clients _SHOULD_ ignore `format` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "format": "application/xml" } +``` + +##### language + +The language or languages used in the content of this external resource. This property is already available from the Web Annotation model for content resources that are the body or target of an Annotation, however it _MAY_ also be used for resources [referenced][prezi30-terminology] from `homepage`, `rendering`, and `partOf`. + +The value _MUST_ be an array of strings. Each item in the array _MUST_ be a valid language code, as described in the [languages section][prezi30-languages]. + + * An external resource _SHOULD_ have the `language` property with at least one item.
+ Clients _SHOULD_ process the `language` of external resources. + * Other types of resource _MUST NOT_ have the `language` property.
+ Clients _SHOULD_ ignore `language` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "language": [ "en" ] } +``` + +##### profile + +A schema or named set of functionality available from the resource. The profile can further clarify the `type` and/or `format` of an external resource or service, allowing clients to customize their handling of the resource that has the `profile` property. + +The value _MUST_ be a string, either taken from the [profiles registry][registry-profiles] or a URI. + +* Resources [referenced][prezi30-terminology] by the `seeAlso` or `service` properties _SHOULD_ have the `profile` property.
+ Clients _SHOULD_ process the `profile` of a service or external resource. +* Other types of resource _MAY_ have the `profile` property.
+ Clients _MAY_ process the `profile` of other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "profile": "https://example.org/profile/statuary" } +``` + +##### height + +The height of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the width, it conveys an aspect ratio for the space in which content resources are located. + +The value _MUST_ be a positive integer. + + * A Canvas _MAY_ have the `height` property. If it has a `height`, it _MUST_ also have a `width`.
+ Clients _MUST_ process `height` on a Canvas. + * Content resources _SHOULD_ have the `height` property, with the value given in pixels, if appropriate to the resource type.
+ Clients _SHOULD_ process `height` on content resources. + * Other types of resource _MUST NOT_ have the `height` property.
+ Clients _SHOULD_ ignore `height` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "height": 1800 } +``` + +##### width + +The width of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the height, it conveys an aspect ratio for the space in which content resources are located. + +The value _MUST_ be a positive integer. + + * A Canvas _MAY_ have the `width` property. If it has a `width`, it _MUST_ also have a `height`.
+ Clients _MUST_ process `width` on a Canvas. + * Content resources _SHOULD_ have the `width` property, with the value given in pixels, if appropriate to the resource type.
+ Clients _SHOULD_ process `width` on content resources. + * Other types of resource _MUST NOT_ have the `width` property.
+ Clients _SHOULD_ ignore `width` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "width": 1200 } +``` + +##### duration + +The duration of the Canvas or external content resource, given in seconds. + +The value _MUST_ be a positive floating point number. + + * A Canvas _MAY_ have the `duration` property.
+ Clients _MUST_ process `duration` on a Canvas. + * Content resources _SHOULD_ have the `duration` property, if appropriate to the resource type.
+ Clients _SHOULD_ process `duration` on content resources. + * Other types of resource _MUST NOT_ have a `duration`.
+ Clients _SHOULD_ ignore `duration` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "duration": 125.0 } +``` + +##### viewingDirection + +The direction in which a set of Canvases _SHOULD_ be displayed to the user. This specification defines four direction values in the table below. Others may be defined externally [as an extension][prezi30-ldce]. + +The value _MUST_ be a string. + + * A Collection _MAY_ have the `viewingDirection` property.
+ Clients _SHOULD_ process `viewingDirection` on a Collection. + * A Manifest _MAY_ have the `viewingDirection` property.
+ Clients _SHOULD_ process `viewingDirection` on a Manifest. + * A Range _MAY_ have the `viewingDirection` property.
+ Clients _MAY_ process `viewingDirection` on a Range. + * Other types of resource _MUST NOT_ have the `viewingDirection` property.
+ Clients _SHOULD_ ignore `viewingDirection` on other types of resource. + +| Value | Description | +| ----- | ----------- | +| `left-to-right` | The object is displayed from left to right. The default if not specified. | +| `right-to-left` | The object is displayed from right to left. | +| `top-to-bottom` | The object is displayed from the top to the bottom. | +| `bottom-to-top` | The object is displayed from the bottom to the top. | +{: .api-table #table-direction} + +{% include api/code_header.html %} +``` json-doc +{ "viewingDirection": "left-to-right" } +``` + +##### behavior + +A set of user experience features that the publisher of the content would prefer the client to use when presenting the resource. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. + +In order to determine the behaviors that are governing a particular resource, there are four inheritance rules from resources that reference the current resource: +* Collections inherit behaviors from their referencing Collection. +* Manifests **DO NOT** inherit behaviors from any referencing Collections. +* Canvases inherit behaviors from their referencing Manifest, but **DO NOT** inherit behaviors from any referencing Ranges, as there might be several with different behaviors. +* Ranges inherit behaviors from any referencing Range and referencing Manifest. + +Clients should interpret behaviors on a Range only when that Range is selected or is in some other way the context for the user's current interaction with the resources. A Range with the `behavior` value `continuous`, in a Manifest with the `behavior` value `paged`, would mean that the Manifest's Canvases should be rendered in a paged fashion, unless the range is selected to be viewed, and its included Canvases would be rendered in that context only as being virtually stitched together. This might occur, for example, when a physical scroll is cut into pages and bound into a codex with other pages, and the publisher would like to provide the user the experience of the scroll in its original form. + +The descriptions of the behavior values have a set of which other values they are disjoint with, meaning that the same resource _MUST NOT_ have both of two or more from that set. In order to determine which is in effect, the client _SHOULD_ follow the inheritance rules above, taking the value from the closest resource. The user interface effects of the possible permutations of non-disjoint behavior values are client dependent, and implementers are advised to look for relevant recipes in the [IIIF cookbook][annex-cookbook]. + +__Future Clarification Anticipated__
+Further clarifications about the implications of interactions between behavior values should be expected in subsequent minor releases. +{: .warning} + +The value _MUST_ be an array of strings. + + * Any resource type _MAY_ have the `behavior` property with at least one item.
+ Clients _SHOULD_ process `behavior` on any resource type. + +| Value | Description | +| ----- | ----------- | +|| **Temporal Behaviors** | +| `auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Canvases, and Ranges that include or are Canvases with at least the `duration` dimension. When the client reaches the end of a Canvas, or segment thereof as specified in a Range, with a duration dimension that has this behavior, it _SHOULD_ immediately proceed to the next Canvas or segment and render it. If there is no subsequent Canvas in the current context, then this behavior should be ignored. When applied to a Collection, the client should treat the first Canvas of the next Manifest as following the last Canvas of the previous Manifest, respecting any `start` property specified. Disjoint with `no-auto-advance`. | +| `no-auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Canvases, and Ranges that include or are Canvases with at least the `duration` dimension. When the client reaches the end of a Canvas or segment with a duration dimension that has this behavior, it _MUST NOT_ proceed to the next Canvas, if any. This is a default temporal behavior if not specified. Disjoint with `auto-advance`.| +| `repeat` | Valid on Collections and Manifests, that include Canvases that have at least the `duration` dimension. When the client reaches the end of the duration of the final Canvas in the resource, and the `behavior` value `auto-advance`{: style="white-space:nowrap;"} is also in effect, then the client _SHOULD_ return to the first Canvas, or segment of Canvas, in the resource that has the `behavior` value `repeat` and start playing again. If the `behavior` value `auto-advance` is not in effect, then the client _SHOULD_ render a navigation control for the user to manually return to the first Canvas or segment. Disjoint with `no-repeat`.| +| `no-repeat` | Valid on Collections and Manifests, that include Canvases that have at least the `duration` dimension. When the client reaches the end of the duration of the final Canvas in the resource, the client _MUST NOT_ return to the first Canvas, or segment of Canvas. This is a default temporal behavior if not specified. Disjoint with `repeat`.| +| | **Layout Behaviors** | +| `unordered` | Valid on Collections, Manifests and Ranges. The Canvases included in resources that have this behavior have no inherent order, and user interfaces _SHOULD_ avoid implying an order to the user. Disjoint with `individuals`, `continuous`, and `paged`.| +| `individuals` | Valid on Collections, Manifests, and Ranges. For Collections that have this behavior, each of the included Manifests are distinct objects in the given order. For Manifests and Ranges, the included Canvases are distinct views, and _SHOULD NOT_ be presented in a page-turning interface. This is the default layout behavior if not specified. Disjoint with `unordered`, `continuous`, and `paged`. | +| `continuous` | Valid on Collections, Manifests and Ranges, which include Canvases that have at least `height` and `width` dimensions. Canvases included in resources that have this behavior are partial views and an appropriate rendering might display all of the Canvases virtually stitched together, such as a long scroll split into sections. This behavior has no implication for audio resources. The `viewingDirection` of the Manifest will determine the appropriate arrangement of the Canvases. Disjoint with `unordered`, `individuals` and `paged`. | +| `paged` | Valid on Collections, Manifests and Ranges, which include Canvases that have at least `height` and `width` dimensions. Canvases included in resources that have this behavior represent views that _SHOULD_ be presented in a page-turning interface if one is available. The first canvas is a single view (the first recto) and thus the second canvas likely represents the back of the object in the first canvas. If this is not the case, see the `behavior` value `non-paged`. Disjoint with `unordered`, `individuals`, `continuous`, `facing-pages` and `non-paged`. | +| `facing-pages`{: style="white-space:nowrap;"} | Valid only on Canvases, where the Canvas has at least `height` and `width` dimensions. Canvases that have this behavior, in a Manifest that has the `behavior` value `paged`, _MUST_ be displayed by themselves, as they depict both parts of the opening. If all of the Canvases are like this, then page turning is not possible, so simply use `individuals` instead. Disjoint with `paged` and `non-paged`.| +| `non-paged` | Valid only on Canvases, where the Canvas has at least `height` and `width` dimensions. Canvases that have this behavior _MUST NOT_ be presented in a page turning interface, and _MUST_ be skipped over when determining the page order. This behavior _MUST_ be ignored if the current Manifest does not have the `behavior` value `paged`. Disjoint with `paged` and `facing-pages`. | +| | **Collection Behaviors** | +| `multi-part` | Valid only on Collections. Collections that have this behavior consist of multiple Manifests or Collections which together form part of a logical whole or a contiguous set, such as multi-volume books or a set of journal issues. Clients might render these Collections as a table of contents rather than with thumbnails, or provide viewing interfaces that can easily advance from one member to the next. Disjoint with `together`.| +| `together` | Valid only on Collections. A client _SHOULD_ present all of the child Manifests to the user at once in a separate viewing area with its own controls. Clients _SHOULD_ catch attempts to create too many viewing areas. This behavior _SHOULD NOT_ be interpreted as applying to the members of any child resources. Disjoint with `multi-part`.| +| | **Range Behaviors** | +| `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Canvases listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| +| `thumbnail-nav`{: style="white-space:nowrap;"} | Valid only on Ranges. Ranges that have this behavior _MAY_ be used by the client to present an alternative navigation or overview based on thumbnails, such as regular keyframes along a timeline for a video, or sections of a long scroll. Clients _SHOULD NOT_ use them to generate a conventional table of contents. Child Ranges of a Range with this behavior _MUST_ have a suitable `thumbnail` property. Disjoint with `sequence` and `no-nav`.| +| `no-nav` | Valid only on Ranges. Ranges that have this behavior _MUST NOT_ be displayed to the user in a navigation hierarchy. This allows for Ranges to be present that capture unnamed regions with no interesting content, such as the set of blank pages at the beginning of a book, or dead air between parts of a performance, that are still part of the Manifest but do not need to be navigated to directly. Disjoint with `sequence` and `thumbnail-nav`.| +| | **Miscellaneous Behaviors** | +| `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | +{: .api-table #table-behavior} + +{% include api/code_header.html %} +``` json-doc +{ "behavior": [ "auto-advance", "individuals" ] } +``` + +##### timeMode + +A mode associated with an Annotation that is to be applied to the rendering of any time-based media, or otherwise could be considered to have a duration, used as a body resource of that Annotation. Note that the association of `timeMode` with the Annotation means that different resources in the body cannot have different values. This specification defines the values specified in the table below. Others may be defined externally as an [extension][prezi30-ldce]. + +The value _MUST_ be a string. + + * An Annotation _MAY_ have the `timeMode` property.
+ Clients _SHOULD_ process `timeMode` on an Annotation. + +| Value | Description | +| ----- | ----------- | +| `trim` | (default, if not supplied) If the content resource has a longer duration than the duration of portion of the Canvas it is associated with, then at the end of the Canvas's duration, the playback of the content resource _MUST_ also end. If the content resource has a shorter duration than the duration of the portion of the Canvas it is associated with, then, for video resources, the last frame _SHOULD_ persist on-screen until the end of the Canvas portion's duration. For example, a video of 120 seconds annotated to a Canvas with a duration of 100 seconds would play only the first 100 seconds and drop the last 20 second. | +| `scale` | Fit the duration of content resource to the duration of the portion of the Canvas it is associated with by scaling. For example, a video of 120 seconds annotated to a Canvas with a duration of 60 seconds would be played at double-speed. | +| `loop` | If the content resource is shorter than the `duration` of the Canvas, it _MUST_ be repeated to fill the entire duration. Resources longer than the `duration` _MUST_ be trimmed as described above. For example, if a 20 second duration audio stream is annotated onto a Canvas with duration 30 seconds, it will be played one and a half times. | +{: .api-table #table-timemode} + +{% include api/code_header.html %} +``` json-doc +{ "timeMode": "trim" } +``` + #### backgroundColor This property sets the background color behind any painted resources on a spatial resource, such as a Canvas or Scene. @@ -163,27 +698,424 @@ The value of this property is an array of JSON objects, each of which is a Trans ##### z +### Linking Properties + + +##### homepage + +A web page that is about the object represented by the resource that has the `homepage` property. The web page is usually published by the organization responsible for the object, and might be generated by a content management system or other cataloging system. The resource _MUST_ be able to be displayed directly to the user. Resources that are related, but not home pages, _MUST_ instead be added into the `metadata` property, with an appropriate `label` or `value` to describe the relationship. + +The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have the `id`, `type`, and `label` properties, _SHOULD_ have a `format` property, and _MAY_ have the `language` property. + + * Any resource type _MAY_ have the `homepage` property.
+ Clients _SHOULD_ render `homepage` on a Collection, Manifest or Canvas, and _MAY_ render `homepage` on other types of resource. + +__Model Alignment__
+Please note that this specification has stricter requirements about the JSON pattern used for the `homepage` property than the [Web Annotation Data Model][org-w3c-webanno]. The IIIF requirements are compatible, but the home page of an Agent found might have only a URI, or might be a JSON object with other properties. See the section on [collisions between contexts][prezi30-context-collisions] for more information. +{: .note} + +{% include api/code_header.html %} +``` json-doc +{ + "homepage": [ + { + "id": "https://example.com/info/", + "type": "Text", + "label": { "en": [ "Homepage for Example Object" ] }, + "format": "text/html", + "language": [ "en" ] + } + ] +} +``` + + +##### logo + +A small image resource that represents the Agent resource it is associated with. The logo _MUST_ be clearly rendered when the resource is displayed or used, without cropping, rotating or otherwise distorting the image. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for this image for other manipulations such as resizing. + +When more than one logo is present, the client _SHOULD_ pick only one of them, based on the information in the logo properties. For example, the client could select a logo of appropriate aspect ratio based on the `height` and `width` properties of the available logos. The client _MAY_ decide on the logo by inspecting properties defined as [extensions][prezi30-ldce]. + +The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have `id` and `type` properties, and _SHOULD_ have `format`. The value of `type` _MUST_ be "Image". + + * Agent resources _SHOULD_ have the `logo` property.
+ Clients _MUST_ render `logo` on Agent resources. + + +{% include api/code_header.html %} +``` json-doc +{ + "logo": [ + { + "id": "https://example.org/img/logo.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 100, + "width": 120 + } + ] +} +``` + +##### rendering + +A resource that is an alternative, non-IIIF representation of the resource that has the `rendering` property. Such representations typically cannot be painted onto a single Canvas, as they either include too many views, have incompatible dimensions, or are compound resources requiring additional rendering functionality. The `rendering` resource _MUST_ be able to be displayed directly to a human user, although the presentation may be outside of the IIIF client. The resource _MUST NOT_ have a splash page or other interstitial resource that mediates access to it. If access control is required, then the [IIIF Authentication API][iiif-auth] is _RECOMMENDED_. Examples include a rendering of a book as a PDF or EPUB, a slide deck with images of a building, or a 3D model of a statue. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id`, `type` and `label` properties, and _SHOULD_ have a `format` property. + + * Any resource type _MAY_ have the `rendering` property with at least one item.
+ Clients _SHOULD_ render `rendering` on a Collection, Manifest or Canvas, and _MAY_ render `rendering` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "rendering": [ + { + "id": "https://example.org/1.pdf", + "type": "Text", + "label": { "en": [ "PDF Rendering of Book" ] }, + "format": "application/pdf" + } + ] +} +``` + +##### service + +A service that the client might interact with directly and gain additional information or functionality for using the resource that has the `service` property, such as from an Image to the base URI of an associated [IIIF Image API][image-api] service. The service resource _SHOULD_ have additional information associated with it in order to allow the client to determine how to make appropriate use of it. Please see the [Service Registry][registry-services] document for the details of currently known service types. + +The value _MUST_ be an array of JSON objects. Each object will have properties depending on the service's definition, but _MUST_ have either the `id` or `@id` and `type` or `@type` properties. Each object _SHOULD_ have a `profile` property. + + * Any resource type _MAY_ have the `service` property with at least one item.
+ Clients _MAY_ process `service` on any resource type, and _SHOULD_ process the IIIF Image API service. + +{% include api/code_header.html %} +``` json-doc +{ + "service": [ + { + "id": "https://example.org/service", + "type": "ExampleExtensionService", + "profile": "https://example.org/docs/service" + } + ] +} +``` + +For cross-version consistency, this specification defines the following values for the `type` or `@type` property for backwards compatibility with other IIIF APIs. Future versions of these APIs will define their own types. These `type` values are necessary extensions for compatibility of the older versions. + +| Value | Specification | +| -------------------- | ------------- | +| ImageService1 | [Image API version 1][image11] | +| ImageService2 | [Image API version 2][image21] | +| SearchService1 | [Search API version 1][search1] | +| AutoCompleteService1 | [Search API version 1][search1-autocomplete] | +| AuthCookieService1 | [Authentication API version 1][auth1-cookie-service] | +| AuthTokenService1 | [Authentication API version 1][auth1-token-service] | +| AuthLogoutService1 | [Authentication API version 1][auth1-logout-service] | +{: .api-table #table-service-types} + +Implementations _SHOULD_ be prepared to recognize the `@id` and `@type` property names used by older specifications, as well as `id` and `type`. Note that the `@context` key _SHOULD NOT_ be present within the `service`, but instead included at the beginning of the document. The example below includes both version 2 and version 3 IIIF Image API services. + +{% include api/code_header.html %} +``` json-doc +{ + "service": [ + { + "@id": "https://example.org/iiif2/image1/identifier", + "@type": "ImageService2", + "profile": "http://iiif.io/api/image/2/level2.json" + }, + { + "id": "https://example.org/iiif3/image1/identifier", + "type": "ImageService3", + "profile": "level2" + } + ] +} +``` + + +##### services + +A list of one or more service definitions on the top-most resource of the document, that are typically shared by more than one subsequent resource. This allows for these shared services to be collected together in a single place, rather than either having their information duplicated potentially many times throughout the document, or requiring a consuming client to traverse the entire document structure to find the information. The resource that the service applies to _MUST_ still have the `service` property, as described above, where the service resources have at least the `id` and `type` or `@id` and `@type` properties. This allows the client to know that the service applies to that resource. Usage of the `services` property is at the discretion of the publishing system. + +A client encountering a `service` property where the definition consists only of an `id` and `type` _SHOULD_ then check the `services` property on the top-most resource for an expanded definition. If the service is not present in the `services` list, and the client requires more information in order to use the service, then it _SHOULD_ dereference the `id` (or `@id`) of the service in order to retrieve a service description. + +The value _MUST_ be an array of JSON objects. Each object _MUST_ a service resource, as described above. + +* A Collection _MAY_ have the `services` property, if it is the topmost Collection in a response document.
+ Clients _SHOULD_ process `services` on a Collection. +* A Manifest _MAY_ have the `services` property.
+ Clients _SHOULD_ process `services` on a Manifest. + +{% include api/code_header.html %} +``` json-doc +{ + "services": [ + { + "@id": "https://example.org/iiif/auth/login", + "@type": "AuthCookieService1", + "profile": "http://iiif.io/api/auth/1/login", + "label": "Login to Example Institution", + "service": [ + { + "@id": "https://example.org/iiif/auth/token", + "@type": "AuthTokenService1", + "profile": "http://iiif.io/api/auth/1/token" + } + ] + } + ] +} +``` + + +##### seeAlso + +A machine-readable resource such as an XML or RDF description that is related to the current resource that has the `seeAlso` property. Properties of the resource should be given to help the client select between multiple descriptions (if provided), and to make appropriate use of the document. If the relationship between the resource and the document needs to be more specific, then the document should include that relationship rather than the IIIF resource. Other IIIF resources are also valid targets for `seeAlso`, for example to link to a Manifest that describes a related object. The URI of the document _MUST_ identify a single representation of the data in a particular format. For example, if the same data exists in JSON and XML, then separate resources should be added for each representation, with distinct `id` and `format` properties. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `label`, `format` and `profile` properties. + + * Any resource type _MAY_ have the `seeAlso` property with at least one item.
+ Clients _MAY_ process `seeAlso` on any resource type. + +{% include api/code_header.html %} +``` json-doc +{ + "seeAlso": [ + { + "id": "https://example.org/library/catalog/book1.xml", + "type": "Dataset", + "label": { "en": [ "Bibliographic Description in XML" ] }, + "format": "text/xml", + "profile": "https://example.org/profiles/bibliographic" + } + ] +} +``` + +#### 3.3.2. Internal Links + +##### partOf + +A containing resource that includes the resource that has the `partOf` property. When a client encounters the `partOf` property, it might retrieve the [referenced][prezi30-terminology] containing resource, if it is not [embedded][prezi30-terminology] in the current representation, in order to contribute to the processing of the contained resource. For example, the `partOf` property on a Canvas can be used to reference an external Manifest in order to enable the discovery of further relevant information. Similarly, a Manifest can reference a containing Collection using `partOf` to aid in navigation. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `label` property. + + * Any resource type _MAY_ have the `partOf` property with at least one item
+ Clients _MAY_ render `partOf` on any resource type. + +{% include api/code_header.html %} +``` json-doc +{ "partOf": [ { "id": "https://example.org/iiif/1", "type": "Manifest" } ] } +``` + +##### start + +A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. + +The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` properties. The object _MUST_ be either a Canvas (as in the first example below), or a Specific Resource with a Selector and a `source` property where the value is a Canvas (as in the second example below). + + * A Manifest _MAY_ have the `start` property.
+ Clients _SHOULD_ process `start` on a Manifest. + * A Range _MAY_ have the `start` property.
+ Clients _SHOULD_ process `start` on a Range. + * Other types of resource _MUST NOT_ have the `start` property.
+ Clients _SHOULD_ ignore `start` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "start": { "id": "https://example.org/iiif/1/canvas/1", "type": "Canvas" } } +``` + +{% include api/code_header.html %} +``` json-doc +{ + "start": { + "id": "https://example.org/iiif/1/canvas-segment/1", + "type": "SpecificResource", + "source": "https://example.org/iiif/1/canvas/1", + "selector": { + "type": "PointSelector", + "t": 14.5 + } + } +} +``` + +##### supplementary + +A link from this Range to an Annotation Collection that includes the `supplementing` Annotations of content resources for the Range. Clients might use this to present additional content to the user from a different Canvas when interacting with the Range, or to jump to the next part of the Range within the same Canvas. For example, the Range might represent a newspaper article that spans non-sequential pages, and then uses the `supplementary` property to reference an Annotation Collection that consists of the Annotations that record the text, split into Annotation Pages per newspaper page. Alternatively, the Range might represent the parts of a manuscript that have been transcribed or translated, when there are other parts that have yet to be worked on. The Annotation Collection would be the Annotations that transcribe or translate, respectively. + +The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` properties, and the `type` _MUST_ be `AnnotationCollection`. + + * A Range _MAY_ have the `supplementary` property.
+ Clients _MAY_ process `supplementary` on a Range. + * Other types of resource _MUST NOT_ have the `supplementary` property.
+ Clients _SHOULD_ ignore `supplementary` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "supplementary": { "id": "https://example.org/iiif/1/annos/1", "type": "AnnotationCollection" } } +``` ### Structural Properties -### Values +##### items + +Much of the functionality of the IIIF Presentation API is simply recording the order in which child resources occur within a parent resource, such as Collections or Manifests within a parent Collection, or Canvases within a Manifest. All of these situations are covered with a single property, `items`. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties. The items will be resources of different types, as described below. + + * A Collection _MUST_ have the `items` property. Each item _MUST_ be either a Collection or a Manifest.
+ Clients _MUST_ process `items` on a Collection. + * A Manifest _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Canvas.
+ Clients _MUST_ process `items` on a Manifest. + * A Canvas _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation Page.
+ Clients _MUST_ process `items` on a Canvas. + * An Annotation Page _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation.
+ Clients _MUST_ process `items` on an Annotation Page. + * A Range _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Range, a Canvas or a Specific Resource where the source is a Canvas.
+ Clients _SHOULD_ process `items` on a Range. + * Other types of resource _MUST NOT_ have the `items` property.
+ Clients _SHOULD_ ignore `items` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "items": [ + { + "id": "https://example.org/iiif/manifest1", + "type": "Manifest" + }, + { + "id": "https://example.org/iiif/collection1", + "type": "Collection" + } + // ... + ] +} +``` + +##### structures + +The structure of an object represented as a Manifest can be described using a hierarchy of Ranges. Ranges can be used to describe the "table of contents" of the object or other structures that the user can interact with beyond the order given by the `items` property of the Manifest. The hierarchy is built by nesting the child Range resources in the `items` array of the higher level Range. The top level Ranges of these hierarchies are given in the `structures` property. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and the `type` _MUST_ be `Range`. + + * A Manifest _MAY_ have the `structures` property.
+ Clients _SHOULD_ process `structures` on a Manifest. The first hierarchy _SHOULD_ be presented to the user by default, and further hierarchies _SHOULD_ be able to be selected as alternative structures by the user. + * Other types of resource _MUST NOT_ have the `structures` property.
+ Clients _SHOULD_ ignore `structures` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "structures": [ + { + "id": "https://example.org/iiif/range/1", + "type": "Range", + "items": [ { ... } ] + } + ] +} +``` + +##### annotations + +An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Canvas. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource or part of it. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have at least the `id` and `type` properties. + + * A Collection _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Collection. + * A Manifest _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Manifest,. + * A Canvas _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Canvas. + * A Range _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Range. + * A content resource _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a content resource. + * Other types of resource _MUST NOT_ have the `annotations` property.
+ Clients _SHOULD_ ignore `annotations` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "annotations": [ + { + "id": "https://example.org/iiif/annotationPage/1", + "type": "AnnotationPage", + "items": [ { ... } ] + } + ] +} +``` + +### 3.5. Values + +##### Values for motivation + +This specification defines two values for the Web Annotation property of `motivation`, or `purpose` when used on a Specific Resource or Textual Body. + +While any resource _MAY_ be the `target` of an Annotation, this specification defines only motivations for Annotations that target Canvases. These motivations allow clients to determine how the Annotation should be rendered, by distinguishing between Annotations that provide the content of the Canvas, from ones with externally defined motivations which are typically comments about the Canvas. + +Additional motivations may be added to the Annotation to further clarify the intent, drawn from [extensions][prezi30-ldce] or other sources. Clients _MUST_ ignore motivation values that they do not understand. Other motivation values given in the Web Annotation specification _SHOULD_ be used where appropriate, and examples are given in the [Presentation API Cookbook][annex-cookbook]. + +| Value | Description | +| ----- | ----------- | +| `painting` | Resources associated with a Canvas by an Annotation that has the `motivation` value `painting` _MUST_ be presented to the user as the representation of the Canvas. The content can be thought of as being _of_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `painting`, a body of an Image and the target of the Canvas is an instruction to present that Image as (part of) the visual representation of the Canvas. Similarly, a textual body is to be presented as (part of) the visual representation of the Canvas and not positioned in some other part of the user interface.| +| `supplementing` | Resources associated with a Canvas by an Annotation that has the `motivation` value `supplementing` _MAY_ be presented to the user as part of the representation of the Canvas, or _MAY_ be presented in a different part of the user interface. The content can be thought of as being _from_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `supplementing`, a body of an Image and the target of part of the Canvas is an instruction to present that Image to the user either in the Canvas's rendering area or somewhere associated with it, and could be used to present an easier to read representation of a diagram. Similarly, a textual body is to be presented either in the targeted region of the Canvas or otherwise associated with it, and might be OCR, a manual transcription or a translation of handwritten text, or captions for what is being said in a Canvas with audio content. | +{: .api-table #table-motivations} + + + + +The top level resource in the response _MUST_ have the `@context` property, and it _SHOULD_ appear as the very first key/value pair of the JSON representation. This tells Linked Data processors how to interpret the document. The IIIF Presentation API context, below, _MUST_ occur once per response in the top-most resource, and thus _MUST NOT_ appear within [embedded][prezi30-terminology] resources. For example, when embedding a Canvas within a Manifest, the Canvas will not have the `@context` property. + +The value of the `@context` property _MUST_ be either the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` or a JSON array with the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` as the last item. Further contexts, such as those for local or [registered extensions][registry], _MUST_ be added at the beginning of the array. + +{% include api/code_header.html %} +``` json-doc +{ + "@context": "http://iiif.io/api/presentation/{{ page.major }}/context.json" +} +``` + +Any additional properties beyond those defined in this specification or the Web Annotation Data Model _SHOULD_ be mapped to RDF predicates using further context documents. These extensions _SHOULD_ be added to the top level `@context` property, and _MUST_ be added before the above context. The JSON-LD 1.1 functionality of predicate specific context definitions, known as [scoped contexts][org-w3c-json-ld-scoped-contexts], _MUST_ be used to minimize cross-extension collisions. Extensions intended for community use _SHOULD_ be [registered in the extensions registry][registry], but registration is not mandatory. + +{% include api/code_header.html %} +``` json-doc +{ + "@context": [ + "http://example.org/extension/context.json", + "http://iiif.io/api/presentation/{{ page.major }}/context.json" + ] +} +``` +The JSON representation _MUST NOT_ include the `@graph` key at the top level. This key might be created when serializing directly from RDF data using the JSON-LD 1.0 compaction algorithm. Instead, JSON-LD framing and/or custom code should be used to ensure the structure of the document is as defined by this specification. -## JSON-LD Considerations +### 4.7. Term Collisions between Contexts -### Case Sensitivity +There are some common terms used in more than one JSON-LD context document. Every attempt has been made to minimize these collisions, but some are inevitable. In order to know which specification is in effect at any given point, the class of the resource that has the property is the primary governing factor. Thus properties on Annotation based resources use the context from the [Web Annotation Data Model][org-w3c-webanno], whereas properties on classes defined by this specification use the IIIF Presentation API context's definition. -### Resource Representations +There is one property that is in direct conflict - the `label` property is defined by both and is available for every resource. The use of `label` in IIIF follows modern best practices for internationalization by allowing the language to be associated with the value using the language map construction [described above][prezi30-languages]. The Web Annotation Data Model uses it only for [Annotation Collections][prezi30-annocoll], and mandates the format is a string. For this property, the API overrides the definition from the Annotation model to ensure that labels can consistently be represented in multiple languages. -### Properties with Multiple Values +The following properties are defined by both, and the IIIF representation is more specific than the Web Annotation Data Model but are not in conflict, or are never used on the same resource: -### Language of Property Values +* `homepage`: In IIIF the home page of a resource is represented as a JSON object, whereas in the Web Annotation Data Model it can also be a string. +* `type`: In IIIF the type is singular, whereas in the Web Annotation Data Model there can be more than one type. +* `format`: In IIIF the format of a resource is also singular, whereas in the Web Annotation Data Model there can be more than one format. +* `language`: In IIIF the `language` property always takes an array, whereas in the Web Annotation Data Model it can be a single string. +* `start`: The `start` property is used on a Manifest to refer to the start Canvas or part of a Canvas and thus is a JSON object, whereas in the Web Annotation Data Model it is used on a TextPositionSelector to give the start offset into the textual content and is thus an integer. -### HTML Markup in Property Values +The `rights`, `partOf`, and `items` properties are defined by both in the same way. -### Linked Data Context and Extensions +### 4.8. Keyword Mappings -### Term Collisions between Contexts +The JSON-LD keywords `@id`, `@type` and `@none` are mapped to `id`, `type` and `none` by the Presentation API [linked data context][prezi30-ldce]. Thus in content conforming to this version of the Presentation API, the only JSON key beginning with `@` will be `@context`. However, the content may include data conforming to older specifications or external specifications that use keywords beginning with `@`. Clients should expect to encounter both syntaxes. -### Keyword Mappings \ No newline at end of file From 2ab23a2d8d4ce3151b9cb570eaccc95813e8219c Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:16:17 +0000 Subject: [PATCH 006/192] last changed at Oct 24, 2024 3:18 PM, pushed by Julie Winchester --- source/presentation/4.0/index.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index fd8a73db0..aa7b92b89 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -5,12 +5,22 @@ Manifests, Containers, Annotations oh my! Manifest as unit of distribution - - ## Content Resources There is stuff that we want to show - images, video, audio, 3D models etc +### type value of Content Resources + +| Class | Description | +| ------------- | -------------------------------- | +| `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | +| `Model` | A three (or more) dimensional model intended to be interacted with by humans | +| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | +| `Text` | Resources primarily intended to be read | +| `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | +{: .api-table #table-type} + ## Containers This is where we put content resources @@ -22,6 +32,8 @@ And we can also put other things: And we can nest them "Nesting" (see 3d draft) +The defined Container types are `Timeline`, `Canvas` and `Scene`. Extensions may define additional Container types. + As multiple models, lights, cameras, and other resources can be associated with and placed within a Scene container, Scenes provide a straightforward way of grouping content resources together within a space. Scenes, as well as other IIIF containers such as Canvases, can also be embedded within a Scene, allowing for the nesting of content resources. A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. @@ -285,6 +297,12 @@ content state intended to: - modify the Container in a particular context (`scope`, storytelling) - contribute additional information permanently (rerum **inbox** - move to protocol doc) +### reset + +"diff", "original state" etc + +behavior for "force-order"? +behavior: sequence ## Selectors From 93b99dee022519b66dc38665ecdd7644c139c92f Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:30:29 +0000 Subject: [PATCH 007/192] last changed at Oct 24, 2024 4:30 PM, pushed by Julie Winchester --- source/presentation/4.0/properties.md | 199 ++++++++++++++++++++------ 1 file changed, 153 insertions(+), 46 deletions(-) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index b41dcdfc9..41391fa6e 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -1,5 +1,52 @@ # Vocabulary? +## Resource Classes + +* Collection +* CollectionPage +* Manifest +* Containers + * Timeline + * Canvas + * Scene +* Content Resources +* Range +* Cameras + * PerspectiveCamera + * OrthographicCamera +* Lights + * AmbientLight + * DirectionalLight + * PointLight + * SpotLight +* Transforms + * TranslateTransform + * RotateTransform + * ScaleTransform +* Selectors + * PointSelector + * WktSelector (need both LineString Z and Polygon Z) + * AudioContentSelector + * VisualContentSelector + * AnimationSelector + * ImageApiSelector +* Other Classes + * Agent + * Service + * Value (used for `intensity`) + +* Annotation Classes imported from WADM: + * Annotation + * AnnotationCollection + * AnnotationPage + * SpecificResource + * FragmentSelector + * SvgSelector + * CssStyle + * TextualBody + * Choice + + ## Resource Properties ### Descriptive Properties @@ -14,10 +61,10 @@ The value of the property _MUST_ be a JSON object, as described in the [language Clients _MUST_ render `label` on a Collection. * A Manifest _MUST_ have the `label` property with at least one entry.
Clients _MUST_ render `label` on a Manifest. - * A Canvas _SHOULD_ have the `label` property with at least one entry.
- Clients _MUST_ render `label` on a Canvas, and _SHOULD_ generate a `label` for Canvases that do not have them. - * A content resource _MAY_ have the `label` property with at least one entry. If there is a Choice of content resource for the same Canvas, then they _SHOULD_ each have at least the `label` property with at least one entry.
- Clients _MAY_ render `label` on content resources, and _SHOULD_ render them when part of a Choice. + * All Container types _SHOULD_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on Container types, and _SHOULD_ generate a `label` for Containers that do not have them. + * All Content Resource types _MAY_ have the `label` property with at least one entry. If there is a Choice of Content Resource for the same Container, then they _SHOULD_ each have the `label` property with at least one entry.
+ Clients _MAY_ render `label` on Content Resources, and _SHOULD_ render them when part of a Choice. * A Range _SHOULD_ have the `label` property with at least one entry.
Clients _MUST_ render `label` on a Range. * An Annotation Collection _SHOULD_ have the `label` property with at least one entry.
@@ -40,8 +87,8 @@ The value of the `metadata` property _MUST_ be an array of JSON objects, where e Clients _MUST_ render `metadata` on a Collection. * A Manifest _SHOULD_ have the `metadata` property with at least one item.
Clients _MUST_ render `metadata` on a Manifest. - * A Canvas _MAY_ have the `metadata` property with at least one item.
- Clients _SHOULD_ render `metadata` on a Canvas. + * All Container types _MAY_ have the `metadata` property with at least one item.
+ Clients _SHOULD_ render `metadata` on Containers. * Other types of resource _MAY_ have the `metadata` property with at least one item.
Clients _MAY_ render `metadata` on other types of resource. @@ -69,8 +116,8 @@ The value of the property _MUST_ be a JSON object, as described in the [language Clients _SHOULD_ render `summary` on a Collection. * A Manifest _SHOULD_ have the `summary` property with at least one entry.
Clients _SHOULD_ render `summary` on a Manifest. - * A Canvas _MAY_ have the `summary` property with at least one entry.
- Clients _SHOULD_ render `summary` on a Canvas. + * All Container types _MAY_ have the `summary` property with at least one entry.
+ Clients _SHOULD_ render `summary` on Containers. * Other types of resource _MAY_ have the `summary` property with at least one entry.
Clients _MAY_ render `summary` on other types of resource. @@ -125,7 +172,7 @@ An organization or person that contributed to providing the content of the resou The organization or person is represented as an `Agent` resource. * Agents _MUST_ have the `id` property, and its value _MUST_ be a string. The string _MUST_ be a URI that identifies the agent. -* Agents _MUST_ have the `type` property, and its value _MUST_ be the string "Agent". +* Agents _MUST_ have the `type` property, and its value _MUST_ be the string `Agent`. * Agents _MUST_ have the `label` property, and its value _MUST_ be a JSON object as described in the [languages][prezi30-languages] section. * Agents _SHOULD_ have the `homepage` property, and its value _MUST_ be an array of JSON objects as described in the [homepage][prezi30-homepage] section. * Agents _SHOULD_ have the `logo` property, and its value _MUST_ be an array of JSON objects as described in the [logo][prezi30-logo] section. @@ -188,9 +235,9 @@ The value _MUST_ be an array of JSON objects, each of which _MUST_ have the `id` Clients _SHOULD_ render `thumbnail` on a Collection. * A Manifest _SHOULD_ have the `thumbnail` property with at least one item.
Clients _SHOULD_ render `thumbnail` on a Manifest. - * A Canvas _MAY_ have the `thumbnail` property with at least one item. A Canvas _SHOULD_ have the `thumbnail` property if there are multiple resources that make up the view.
- Clients _SHOULD_ render `thumbnail` on a Canvas. - * A content resource _MAY_ have the `thumbnail` property with at least one item. Content resources _SHOULD_ have the `thumbnail` property with at least one item if it is an option in a Choice of resources.
+ * All Container types _SHOULD_ have the `thumbnail` property with at least one item.
+ Clients _SHOULD_ render `thumbnail` on Containers. + * Content Resource types _MAY_ have the `thumbnail` property with at least one item. Content Resources _SHOULD_ have the `thumbnail` property with at least one item if it is an option in a Choice of resources.
Clients _SHOULD_ render `thumbnail` on a content resource. * Other types of resource _MAY_ have the `thumbnail` property with at least one item.
Clients _MAY_ render `thumbnail` on other types of resource. @@ -222,8 +269,10 @@ The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _ Clients _MAY_ render `navDate` on a Manifest. * A Range _MAY_ have the `navDate` property.
Clients _MAY_ render `navDate` on a Range. - * A Canvas _MAY_ have the `navDate` property.
- Clients _MAY_ render `navDate` on a Canvas. + * All Container types _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on Containers. +* Annotations _MAY_ have the `navDate` property. + Clients _MAY_ render `navDate` on Annotations. * Other types of resource _MUST NOT_ have the `navDate` property.
Clients _SHOULD_ ignore `navDate` on other types of resource. @@ -232,29 +281,77 @@ The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _ { "navDate": "2010-01-01T00:00:00Z" } ``` -##### placeholderCanvas +##### navPlace + +A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. + +The value of the property _MUST_ be a [GeoJSON Feature Collection](link) containing one or more [Features](link). The value _SHOULD_ be embedded and _MAY_ be a reference. Feature Collections referenced in the `navPlace` property _MUST_ have the `id` and `type` properties and _MUST NOT_ have the `features` property. + +* A Collection _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on a Collection. +* A Manifest _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on a Manifest. +* A Range _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on a Range. +* All Container types _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on Containers. +* Annotations _MAY_ have the `navPlace` property. + Clients _MAY_ render `navPlace` on Annotations. +* Other types of resource _MUST NOT_ have the `navPlace` property.
+ Clients _SHOULD_ ignore `navPlace` on other types of resource. + + +{% include api/code_header.html %} +```json-doc +{ + "navPlace":{ + "id": "http://example.com/feature-collection/1", + "type": "FeatureCollection", + "features":[ + { + "id": "http://example.com/feature/1", + "type": "Feature", + "properties":{}, + "geometry":{ + "type": "Point", + "coordinates":[ + 9.938, + 51.533 + ] + } + } + ] + } +} +``` + + + -A single Canvas that provides additional content for use before the main content of the resource that has the `placeholderCanvas` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderCanvas` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderCanvas` as part of the initial presentation of a single resource. A placeholder Canvas is likely to have different dimensions to those of the Canvas(es) of the resource that has the `placeholderCanvas` property. -Clients _MAY_ display the content of a linked placeholder Canvas when presenting the resource. When more than one such Canvas is available, for example if `placeholderCanvas` is provided for the currently selected Range and the current Manifest, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the placeholder Canvas will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the rendered placeholder Canvas and the content of the resource that has the `placeholderCanvas` property. +##### placeholderContainer -The value _MUST_ be a JSON object with the `id` and `type` properties, and _MAY_ have other properties of Canvases. The value of `type` _MUST_ be the string `Canvas`. The object _MUST NOT_ have the `placeholderCanvas` property, nor the `accompanyingCanvas` property. +A single Container that provides additional content for use before the main content of the resource that has the `placeholderContainer` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderContainer` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderContainer` as part of the initial presentation of a single resource. A placeholder Container is likely to have different dimensions to those of the Container(s) of the resource that has the `placeholderContainer` property. A placeholder Container may be of a different type from the resource that has the `placeholderContainer` property. For example, a `Scene` may have a placeholder Container of type `Canvas`. - * A Collection _MAY_ have the `placeholderCanvas` property.
- Clients _MAY_ render `placeholderCanvas` on a Collection. - * A Manifest _MAY_ have the `placeholderCanvas` property.
- Clients _MAY_ render `placeholderCanvas` on a Manifest. - * A Canvas _MAY_ have the `placeholderCanvas` property.
- Clients _MAY_ render `placeholderCanvas` on a Canvas. - * A Range _MAY_ have the `placeholderCanvas` property.
- Clients _MAY_ render `placeholderCanvas` on a Range. - * Other types of resource _MUST NOT_ have the `placeholderCanvas` property.
- Clients _SHOULD_ ignore `placeholderCanvas` on other types of resource. +Clients _MAY_ display the content of a linked placeholder Container when presenting the resource. When more than one such Container is available, for example if `placeholderContainer` is provided for the currently selected Range and the current Manifest, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the placeholder Container will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the rendered placeholder Container and the content of the resource that has the `placeholderContainer` property. + +The value of `placeholderContainer` _MUST_ be a JSON object with the `id` and `type` properties. The value of `type` _MUST_ be a Container type. The JSON object _MAY_ have other properties valid for that Container type. + + * A Collection _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on a Collection. + * A Manifest _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on a Manifest. + * All Container types _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on Container types. + * A Range _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on a Range. + * Other types of resource _MUST NOT_ have the `placeholderContainer` property.
+ Clients _SHOULD_ ignore `placeholderContainer` on other types of resource. {% include api/code_header.html %} ``` json-doc { - "placeholderCanvas": { + "placeholderContainer": { "id": "https://example.org/iiif/1/canvas/placeholder", "type": "Canvas", "height": 1400, @@ -263,31 +360,31 @@ The value _MUST_ be a JSON object with the `id` and `type` properties, and _MAY_ } ``` -##### accompanyingCanvas +##### accompanyingContainer -A single Canvas that provides additional content for use while rendering the resource that has the `accompanyingCanvas` property. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. +A single Container that provides additional content for use while rendering the resource that has the `accompanyingContainer` property. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. -Clients _MAY_ display the content of an accompanying Canvas when presenting the resource. As with `placeholderCanvas` above, when more than one accompanying Canvas is available, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the accompanying Canvas will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the accompanying Canvas and the content of the resource that has the `accompanyingCanvas` property. +Clients _MAY_ display the content of an accompanying Container when presenting the resource. As with `placeholderContainer` above, when more than one accompanying Container is available, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the accompanying Container will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the accompanying Container and the content of the resource that has the `accompanyingContainer` property. -The value _MUST_ be a JSON object with the `id` and `type` properties, and _MAY_ have other properties of Canvases. The value of `type` _MUST_ be the string `Canvas`. The object _MUST NOT_ have the `placeholderCanvas` property, nor the `accompanyingCanvas` property. +The value of `accompanyingContainer` _MUST_ be a JSON object with the `id` and `type` properties. The value of `type` _MUST_ be a Container type. The JSON object _MAY_ have other properties valid for that Container type. - * A Collection _MAY_ have the `accompanyingCanvas` property.
- Clients _MAY_ render `accompanyingCanvas` on a Collection. - * A Manifest _MAY_ have the `accompanyingCanvas` property.
- Clients _MAY_ render `accompanyingCanvas` on a Manifest. - * A Canvas _MAY_ have the `accompanyingCanvas` property.
- Clients _MAY_ render `accompanyingCanvas` on a Canvas. - * A Range _MAY_ have the `accompanyingCanvas` property.
- Clients _MAY_ render `accompanyingCanvas` on a Range. - * Other types of resource _MUST NOT_ have the `accompanyingCanvas` property.
- Clients _SHOULD_ ignore `accompanyingCanvas` on other types of resource. + * A Collection _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on a Collection. + * A Manifest _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on a Manifest. + * All Container types _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on Container types. + * A Range _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on a Range. + * Other types of resource _MUST NOT_ have the `accompanyingContainer` property.
+ Clients _SHOULD_ ignore `accompanyingContainer` on other types of resource. {% include api/code_header.html %} ``` json-doc { - "accompanyingCanvas": { - "id": "https://example.org/iiif/1/canvas/accompany", - "type": "Canvas", + "accompanyingContainer": { + "id": "https://example.org/iiif/1/timeline/accompany", + "type": "Timeline", "duration": 180.0 } } @@ -329,6 +426,7 @@ The value _MUST_ be a string. | Class | Description | | ------------- | -------------------------------- | | `Dataset` | Data not intended to be rendered to humans directly | +| `Abouty-Metadata` | Machine-readable _thing_ such as a linked art metadata JSON doc or a MARC record. | | `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | | `Model` | A three (or more) dimensional model intended to be interacted with by humans | | `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | @@ -895,6 +993,12 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and } ``` +Common types of seeAlso: + +| `Dataset` | Data not intended to be rendered to humans directly | +| `Abouty-Metadata` | Machine-readable _thing_ such as a linked art metadata JSON doc or a MARC record. | + + #### 3.3.2. Internal Links ##### partOf @@ -911,6 +1015,9 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and { "partOf": [ { "id": "https://example.org/iiif/1", "type": "Manifest" } ] } ``` +The resources referred to by the `accompanyingContainer` and `placeholderContainer` properties are `partOf` that referring Container. + + ##### start A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. From 623a7fe90ed4463e77966212b2b940ab743d5641 Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:16:17 +0000 Subject: [PATCH 008/192] last changed at Oct 24, 2024 3:18 PM, pushed by Julie Winchester From bfe9ff876208d6575b465c9a2a8c22248dd616f8 Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 16:01:09 +0000 Subject: [PATCH 009/192] last changed at Oct 24, 2024 4:58 PM, pushed by Julie Winchester --- source/presentation/4.0/properties.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index 41391fa6e..9275b1f0e 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -326,9 +326,6 @@ The value of the property _MUST_ be a [GeoJSON Feature Collection](link) contain ``` - - - ##### placeholderContainer A single Container that provides additional content for use before the main content of the resource that has the `placeholderContainer` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderContainer` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderContainer` as part of the initial presentation of a single resource. A placeholder Container is likely to have different dimensions to those of the Container(s) of the resource that has the `placeholderContainer` property. A placeholder Container may be of a different type from the resource that has the `placeholderContainer` property. For example, a `Scene` may have a placeholder Container of type `Canvas`. @@ -342,7 +339,7 @@ The value of `placeholderContainer` _MUST_ be a JSON object with the `id` and `t * A Manifest _MAY_ have the `placeholderContainer` property.
Clients _MAY_ render `placeholderContainer` on a Manifest. * All Container types _MAY_ have the `placeholderContainer` property.
- Clients _MAY_ render `placeholderContainer` on Container types. + Clients _MAY_ render `placeholderContainer` on Containers. * A Range _MAY_ have the `placeholderContainer` property.
Clients _MAY_ render `placeholderContainer` on a Range. * Other types of resource _MUST NOT_ have the `placeholderContainer` property.
@@ -373,7 +370,7 @@ The value of `accompanyingContainer` _MUST_ be a JSON object with the `id` and ` * A Manifest _MAY_ have the `accompanyingContainer` property.
Clients _MAY_ render `accompanyingContainer` on a Manifest. * All Container types _MAY_ have the `accompanyingContainer` property.
- Clients _MAY_ render `accompanyingContainer` on Container types. + Clients _MAY_ render `accompanyingContainer` on Containers. * A Range _MAY_ have the `accompanyingContainer` property.
Clients _MAY_ render `accompanyingContainer` on a Range. * Other types of resource _MUST NOT_ have the `accompanyingContainer` property.
@@ -425,10 +422,9 @@ The value _MUST_ be a string. | Class | Description | | ------------- | -------------------------------- | -| `Dataset` | Data not intended to be rendered to humans directly | -| `Abouty-Metadata` | Machine-readable _thing_ such as a linked art metadata JSON doc or a MARC record. | +| `Dataset` | Data not intended to be rendered to humans directly, such as a CSV or RDF | | `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | -| `Model` | A three (or more) dimensional model intended to be interacted with by humans | +| `Model` | A three dimensional spatial model intended to be visualized, such as might be rendered with a 3d javascript library | | `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | | `Text` | Resources primarily intended to be read | | `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | @@ -993,10 +989,10 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and } ``` -Common types of seeAlso: -| `Dataset` | Data not intended to be rendered to humans directly | -| `Abouty-Metadata` | Machine-readable _thing_ such as a linked art metadata JSON doc or a MARC record. | +#### abouty-field-name-here + +Point to a `Dataset` with more semantics than just `seeAlso` #### 3.3.2. Internal Links From 48ceb1288038224218553713807c309c9041bf9a Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:46:04 +0000 Subject: [PATCH 010/192] last changed at Oct 25, 2024 3:42 AM, pushed by Dawn Childress --- source/presentation/4.0/properties.md | 171 +++++++++++++++++++++++--- 1 file changed, 154 insertions(+), 17 deletions(-) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index 9275b1f0e..8269ebd46 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -422,7 +422,7 @@ The value _MUST_ be a string. | Class | Description | | ------------- | -------------------------------- | -| `Dataset` | Data not intended to be rendered to humans directly, such as a CSV or RDF | +| `Dataset` | Data not intended to be rendered to humans directly, such as a CSV, an RDF serialization or a zip file | | `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | | `Model` | A three dimensional spatial model intended to be visualized, such as might be rendered with a 3d javascript library | | `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | @@ -598,12 +598,12 @@ The value _MUST_ be an array of strings. | `repeat` | Valid on Collections and Manifests, that include Canvases that have at least the `duration` dimension. When the client reaches the end of the duration of the final Canvas in the resource, and the `behavior` value `auto-advance`{: style="white-space:nowrap;"} is also in effect, then the client _SHOULD_ return to the first Canvas, or segment of Canvas, in the resource that has the `behavior` value `repeat` and start playing again. If the `behavior` value `auto-advance` is not in effect, then the client _SHOULD_ render a navigation control for the user to manually return to the first Canvas or segment. Disjoint with `no-repeat`.| | `no-repeat` | Valid on Collections and Manifests, that include Canvases that have at least the `duration` dimension. When the client reaches the end of the duration of the final Canvas in the resource, the client _MUST NOT_ return to the first Canvas, or segment of Canvas. This is a default temporal behavior if not specified. Disjoint with `repeat`.| | | **Layout Behaviors** | -| `unordered` | Valid on Collections, Manifests and Ranges. The Canvases included in resources that have this behavior have no inherent order, and user interfaces _SHOULD_ avoid implying an order to the user. Disjoint with `individuals`, `continuous`, and `paged`.| +| `unordered` | Valid on Collections, Manifests and Ranges. The resources included in resources that have this behavior have no inherent order, and user interfaces _SHOULD_ avoid implying an order to the user. Disjoint with `individuals`, `continuous`, and `paged`.| | `individuals` | Valid on Collections, Manifests, and Ranges. For Collections that have this behavior, each of the included Manifests are distinct objects in the given order. For Manifests and Ranges, the included Canvases are distinct views, and _SHOULD NOT_ be presented in a page-turning interface. This is the default layout behavior if not specified. Disjoint with `unordered`, `continuous`, and `paged`. | -| `continuous` | Valid on Collections, Manifests and Ranges, which include Canvases that have at least `height` and `width` dimensions. Canvases included in resources that have this behavior are partial views and an appropriate rendering might display all of the Canvases virtually stitched together, such as a long scroll split into sections. This behavior has no implication for audio resources. The `viewingDirection` of the Manifest will determine the appropriate arrangement of the Canvases. Disjoint with `unordered`, `individuals` and `paged`. | -| `paged` | Valid on Collections, Manifests and Ranges, which include Canvases that have at least `height` and `width` dimensions. Canvases included in resources that have this behavior represent views that _SHOULD_ be presented in a page-turning interface if one is available. The first canvas is a single view (the first recto) and thus the second canvas likely represents the back of the object in the first canvas. If this is not the case, see the `behavior` value `non-paged`. Disjoint with `unordered`, `individuals`, `continuous`, `facing-pages` and `non-paged`. | -| `facing-pages`{: style="white-space:nowrap;"} | Valid only on Canvases, where the Canvas has at least `height` and `width` dimensions. Canvases that have this behavior, in a Manifest that has the `behavior` value `paged`, _MUST_ be displayed by themselves, as they depict both parts of the opening. If all of the Canvases are like this, then page turning is not possible, so simply use `individuals` instead. Disjoint with `paged` and `non-paged`.| -| `non-paged` | Valid only on Canvases, where the Canvas has at least `height` and `width` dimensions. Canvases that have this behavior _MUST NOT_ be presented in a page turning interface, and _MUST_ be skipped over when determining the page order. This behavior _MUST_ be ignored if the current Manifest does not have the `behavior` value `paged`. Disjoint with `paged` and `facing-pages`. | +| `continuous` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior are partial views and an appropriate rendering might display all of the Canvases virtually stitched together, such as a long scroll split into sections. This behavior has no implication for audio resources. The `viewingDirection` of the Manifest will determine the appropriate arrangement of the Canvases. Disjoint with `unordered`, `individuals` and `paged`. | +| `paged` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior represent views that _SHOULD_ be presented in a page-turning interface if one is available. The first canvas is a single view (the first recto) and thus the second canvas likely represents the back of the object in the first canvas. If this is not the case, see the `behavior` value `non-paged`. Disjoint with `unordered`, `individuals`, and `continuous`. | +| `facing-pages`{: style="white-space:nowrap;"} | Valid only on Canvases. Canvases that have this behavior, in a Manifest that has the `behavior` value `paged`, _MUST_ be displayed by themselves, as they depict both parts of the opening. If all of the Canvases are like this, then page turning is not possible, so simply use `individuals` instead. Disjoint with `non-paged`.| +| `non-paged` | Valid only on Canvases. Canvases that have this behavior _MUST NOT_ be presented in a page-turning interface, and _MUST_ be skipped over when determining the page order. This behavior _MUST_ be ignored if the current Manifest does not have the `behavior` value `paged`. Disjoint with `facing-pages`. | | | **Collection Behaviors** | | `multi-part` | Valid only on Collections. Collections that have this behavior consist of multiple Manifests or Collections which together form part of a logical whole or a contiguous set, such as multi-volume books or a set of journal issues. Clients might render these Collections as a table of contents rather than with thumbnails, or provide viewing interfaces that can easily advance from one member to the next. Disjoint with `together`.| | `together` | Valid only on Collections. A client _SHOULD_ present all of the child Manifests to the user at once in a separate viewing area with its own controls. Clients _SHOULD_ catch attempts to create too many viewing areas. This behavior _SHOULD NOT_ be interpreted as applying to the members of any child resources. Disjoint with `multi-part`.| @@ -620,6 +620,42 @@ The value _MUST_ be an array of strings. { "behavior": [ "auto-advance", "individuals" ] } ``` +##### provides + +A set of features or additional functionality that a linked resource enables relative to the linking or including resource, which is not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). + +The value _MUST_ be an array of strings, each string identifies a particular feature and _MUST_ be taken from the table below or the [provides registry][link]. + +Note that the majority of the values have been selected from [accessibility feature spec][link] and thus use the original form rather than being consistent with the hyphen-based form of the values of `behavior` and `viewingDirection`. + + +* Annotations with the `painting` motivation _SHOULD NOT_ have the `provides` property.
+ Clients _SHOULD_ ignore the `provides` property on Annotations with the `painting` motivation. +* Any resource linked to or included in another resource _MAY_ have the `provides` property.
+ Clients _SHOULD_ process the `provides` property on these resources. + +| Value | Description | +| ----- | ----------- | +| `closedCaptions` | ... | +| `alternativeText` | ... | +| `audioDescription` | ... | +| `longDescription` | ... | +| `signLanguage` | ... | +| `highContrastAudio` | ... | +| `highContrastDisplay` | ... | +| `braille` | ... | +| `tactileGraphic` | ... | +| `transcript` | ... | +| `translation` | (IIIF Defined) ... | +| `subtitles` | (IIIF Defined) ... | +{: .api-table #table-behavior} + +{% include api/code_header.html %} +``` json-doc +{ "provides": [ "closedCaption" ] } +``` + + ##### timeMode A mode associated with an Annotation that is to be applied to the rendering of any time-based media, or otherwise could be considered to have a duration, used as a body resource of that Annotation. Note that the association of `timeMode` with the Annotation means that different resources in the body cannot have different values. This specification defines the values specified in the table below. Others may be defined externally as an [extension][prezi30-ldce]. @@ -631,9 +667,9 @@ The value _MUST_ be a string. | Value | Description | | ----- | ----------- | -| `trim` | (default, if not supplied) If the content resource has a longer duration than the duration of portion of the Canvas it is associated with, then at the end of the Canvas's duration, the playback of the content resource _MUST_ also end. If the content resource has a shorter duration than the duration of the portion of the Canvas it is associated with, then, for video resources, the last frame _SHOULD_ persist on-screen until the end of the Canvas portion's duration. For example, a video of 120 seconds annotated to a Canvas with a duration of 100 seconds would play only the first 100 seconds and drop the last 20 second. | +| `trim` | (default, if not supplied) If the content resource has a longer duration than the duration of the portion of the Canvas it is associated with, then at the end of the Canvas's duration, the playback of the content resource _MUST_ also end. If the content resource has a shorter duration than the duration of the portion of the Canvas it is associated with, then, for video resources, the last frame _SHOULD_ persist on-screen until the end of the Canvas portion's duration. For example, a video of 120 seconds annotated to a Canvas with a duration of 100 seconds would play only the first 100 seconds and drop the last 20 seconds. | | `scale` | Fit the duration of content resource to the duration of the portion of the Canvas it is associated with by scaling. For example, a video of 120 seconds annotated to a Canvas with a duration of 60 seconds would be played at double-speed. | -| `loop` | If the content resource is shorter than the `duration` of the Canvas, it _MUST_ be repeated to fill the entire duration. Resources longer than the `duration` _MUST_ be trimmed as described above. For example, if a 20 second duration audio stream is annotated onto a Canvas with duration 30 seconds, it will be played one and a half times. | +| `loop` | If the content resource is shorter than the `duration` of the Canvas, it _MUST_ be repeated to fill the entire duration. Resources longer than the `duration` _MUST_ be trimmed as described above. For example, if a 20 second duration audio stream is annotated onto a Canvas with a duration of 30 seconds, it will be played one and a half times. | {: .api-table #table-timemode} {% include api/code_header.html %} @@ -830,7 +866,7 @@ A small image resource that represents the Agent resource it is associated with. When more than one logo is present, the client _SHOULD_ pick only one of them, based on the information in the logo properties. For example, the client could select a logo of appropriate aspect ratio based on the `height` and `width` properties of the available logos. The client _MAY_ decide on the logo by inspecting properties defined as [extensions][prezi30-ldce]. -The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have `id` and `type` properties, and _SHOULD_ have `format`. The value of `type` _MUST_ be "Image". +The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have `id` and `type` properties, and _SHOULD_ have `format`. The value of `type` _MUST_ be `Image`. * Agent resources _SHOULD_ have the `logo` property.
Clients _MUST_ render `logo` on Agent resources. @@ -855,7 +891,7 @@ The value of this property _MUST_ be an array of JSON objects, each of which _MU A resource that is an alternative, non-IIIF representation of the resource that has the `rendering` property. Such representations typically cannot be painted onto a single Canvas, as they either include too many views, have incompatible dimensions, or are compound resources requiring additional rendering functionality. The `rendering` resource _MUST_ be able to be displayed directly to a human user, although the presentation may be outside of the IIIF client. The resource _MUST NOT_ have a splash page or other interstitial resource that mediates access to it. If access control is required, then the [IIIF Authentication API][iiif-auth] is _RECOMMENDED_. Examples include a rendering of a book as a PDF or EPUB, a slide deck with images of a building, or a 3D model of a statue. -The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id`, `type` and `label` properties, and _SHOULD_ have a `format` property. +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id`, `type` and `label` properties, and _SHOULD_ have the `format` and `language` properties. * Any resource type _MAY_ have the `rendering` property with at least one item.
Clients _SHOULD_ render `rendering` on a Collection, Manifest or Canvas, and _MAY_ render `rendering` on other types of resource. @@ -936,7 +972,7 @@ A list of one or more service definitions on the top-most resource of the docume A client encountering a `service` property where the definition consists only of an `id` and `type` _SHOULD_ then check the `services` property on the top-most resource for an expanded definition. If the service is not present in the `services` list, and the client requires more information in order to use the service, then it _SHOULD_ dereference the `id` (or `@id`) of the service in order to retrieve a service description. -The value _MUST_ be an array of JSON objects. Each object _MUST_ a service resource, as described above. +The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service resource, as described above. * A Collection _MAY_ have the `services` property, if it is the topmost Collection in a response document.
Clients _SHOULD_ process `services` on a Collection. @@ -990,11 +1026,6 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ``` -#### abouty-field-name-here - -Point to a `Dataset` with more semantics than just `seeAlso` - - #### 3.3.2. Internal Links ##### partOf @@ -1177,6 +1208,112 @@ Additional motivations may be added to the Annotation to further clarify the int + + + + +## 4. JSON-LD Considerations + +This section describes features applicable to all of the Presentation API content. For the most part, these are features of the JSON-LD specification that have particular uses within the API. + +### 4.1. Case Sensitivity + +Terms in JSON-LD are [case sensitive][org-w3c-json-ld-case]. The cases of properties and enumerated values in IIIF Presentation API responses _MUST_ match those used in this specification. For example to specify that a resource is a Manifest, the property _MUST_ be given as `type` and not `Type` or `tYpE`, and the value _MUST_ be given as `Manifest` and not `manifest` or `manIfEsT`. + +### 4.2. Resource Representations + +Resource descriptions _SHOULD_ be [embedded][prezi30-terminology] within the JSON description of parent resources, and _MAY_ also be available via separate requests from the HTTP(S) URI given in the resource's `id` property. Links to resources _MUST_ be given as a JSON object with the `id` and `type` properties and _SHOULD_ have `format` or `profile` to give a hint as to what sort of resource is being referred to. + +{% include api/code_header.html %} +``` json-doc +{ + "rendering": [ + { + "id": "https://example.org/content/book.pdf", + "type": "Text", + "label": { "en": [ "Example Book (pdf)" ] }, + "format": "application/pdf" + } + ] +} +``` + +### 4.3. Properties with Multiple Values + +Any of the properties in the API that can have multiple values _MUST_ always be given as an array of values, even if there is only a single item in that array. + +{% include api/code_header.html %} +``` json-doc +{ + "thumbnail": [ + { + "id": "https://example.org/images/thumb1.jpg", + "type": "Image", + "format": "image/jpeg" + } + ] +} +``` + +### 4.4. Language of Property Values +{: #language-of-property-values} + +Language _MAY_ be associated with strings that are intended to be displayed to the user for the `label` and `summary` properties, plus the `label` and `value` properties of the `metadata` and `requiredStatement` objects. + +The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. + +{% include api/code_header.html %} +``` json-doc +{ + "label": { + "en": [ + "Whistler's Mother", + "Arrangement in Grey and Black No. 1: The Artist's Mother" + ], + "fr": [ + "Arrangement en gris et noir no 1", + "Portrait de la mère de l'artiste", + "La Mère de Whistler" + ], + "none": [ "Whistler (1871)" ] + } +} +``` + +Note that [BCP 47][org-bcp-47] allows the script of the text to be included after a hyphen, such as `ar-latn`, and clients should be aware of this possibility. + +In the case where multiple values are supplied, clients _MUST_ use the following algorithm to determine which values to display to the user. + +* If all of the values are associated with the `none` key, the client _MUST_ display all of those values. +* Else, the client should try to determine the user's language preferences, or failing that use some default language preferences. Then: + * If any of the values have a language associated with them, the client _MUST_ display all of the values associated with the language that best matches the language preference. + * If all of the values have a language associated with them, and none match the language preference, the client _MUST_ select a language and display all of the values associated with that language. + * If some of the values have a language associated with them, but none match the language preference, the client _MUST_ display all of the values that do not have a language associated with them. + +Note that this does not apply to [embedded][prezi30-terminology] textual bodies in Annotations, which use the Web Annotation pattern of `value` and `language` as separate properties. + +### 4.5. HTML Markup in Property Values + +Minimal HTML markup _MAY_ be included for processing in the `summary` property and the `value` property in the `metadata` and `requiredStatement` objects. It _MUST NOT_ be used in `label` or other properties. This is included to allow content publishers to add links and simple formatting instructions to blocks of text. The content _MUST_ be well-formed XML and therefore _MUST_ be wrapped in an element such as `p` or `span`. There _MUST NOT_ be whitespace on either side of the HTML string, and thus the first character in the string _MUST_ be a '<' character and the last character _MUST_ be '>', allowing a consuming application to test whether the value is HTML or plain text using these. To avoid a non-HTML string matching this, it is _RECOMMENDED_ that an additional whitespace character be added to the end of the value in situations where plain text happens to start and end this way. + +In order to avoid HTML or script injection attacks, clients _MUST_ remove: + + * Tags such as `script`, `style`, `object`, `form`, `input` and similar. + * All attributes other than `href` on the `a` tag, `src` and `alt` on the `img` tag. + * All `href` attributes that start with the strings other than "http:", "https:", and "mailto:". + * CData sections. + * XML Comments. + * Processing instructions. + +Clients _SHOULD_ allow only `a`, `b`, `br`, `i`, `img`, `p`, `small`, `span`, `sub` and `sup` tags. Clients _MAY_ choose to remove any and all tags, therefore it _SHOULD NOT_ be assumed that the formatting will always be rendered. Note that publishers _MAY_ include arbitrary HTML content for processing using customized or experimental applications, and the requirements for clients assume an untrusted or unknown publisher. + +{% include api/code_header.html %} +``` json-doc +{ "summary": { "en": [ "

Short summary of the resource.

" ] } } +``` + +### 4.6. Linked Data Context and Extensions + The top level resource in the response _MUST_ have the `@context` property, and it _SHOULD_ appear as the very first key/value pair of the JSON representation. This tells Linked Data processors how to interpret the document. The IIIF Presentation API context, below, _MUST_ occur once per response in the top-most resource, and thus _MUST NOT_ appear within [embedded][prezi30-terminology] resources. For example, when embedding a Canvas within a Manifest, the Canvas will not have the `@context` property. The value of the `@context` property _MUST_ be either the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` or a JSON array with the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` as the last item. Further contexts, such as those for local or [registered extensions][registry], _MUST_ be added at the beginning of the array. @@ -1206,7 +1343,7 @@ The JSON representation _MUST NOT_ include the `@graph` key at the top level. Th There are some common terms used in more than one JSON-LD context document. Every attempt has been made to minimize these collisions, but some are inevitable. In order to know which specification is in effect at any given point, the class of the resource that has the property is the primary governing factor. Thus properties on Annotation based resources use the context from the [Web Annotation Data Model][org-w3c-webanno], whereas properties on classes defined by this specification use the IIIF Presentation API context's definition. -There is one property that is in direct conflict - the `label` property is defined by both and is available for every resource. The use of `label` in IIIF follows modern best practices for internationalization by allowing the language to be associated with the value using the language map construction [described above][prezi30-languages]. The Web Annotation Data Model uses it only for [Annotation Collections][prezi30-annocoll], and mandates the format is a string. For this property, the API overrides the definition from the Annotation model to ensure that labels can consistently be represented in multiple languages. +There is one property that is in direct conflict - the `label` property is defined by both and is available for every resource. The use of `label` in IIIF follows modern best practices for internationalization by allowing the language to be associated with the value using the language map construction [described above][prezi30-languages], also allowing multiple languages to be used. The Web Annotation Data Model uses it only for [Annotation Collections][prezi30-annocoll], and mandates the format is a string. For this property, the API overrides the definition from the Annotation model to ensure that labels can consistently be represented in multiple languages. The following properties are defined by both, and the IIIF representation is more specific than the Web Annotation Data Model but are not in conflict, or are never used on the same resource: From 71bbd341fa0f32f43cf4ab480cf6f9f2b68d89e8 Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:50:55 +0000 Subject: [PATCH 011/192] last changed at Oct 25, 2024 3:48 AM, pushed by Dawn Childress --- source/presentation/4.0/index.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index aa7b92b89..38b43e277 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -273,8 +273,16 @@ The annotation above could be expressed as its fragment-based equivalent: ### Annotation Page +"Overlapping elements with a larger z-index cover those with a smaller one." +link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index + + ### Annotation Collection +deal with this: +https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 + +use totalItems? https://iiif.io/api/discovery/1.0/#totalitems ### Manifest From 7398e18bf89d4a2569f23619007e9ed3b272368e Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 25 Oct 2024 12:43:45 +0100 Subject: [PATCH 012/192] placeholder sections in prezi4 incl. physical dimensions --- source/presentation/4.0/index.md | 84 +++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 38b43e277..247b3f7ba 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -245,6 +245,8 @@ Example Annotation that positions a model at a point within a Scene: #### URI Fragments +(move up, include xywh) + The point may instead be defined using a short-hand form of a URI Fragment at the end of the `id` of the Scene as the `target` of the Annotation. The name of the fragment parameter is `xyz` and its value is the x, y and z values separated by commas. Each value can be expressed as either an integer or a floating point number. The annotation above could be expressed as its fragment-based equivalent: @@ -305,6 +307,10 @@ content state intended to: - modify the Container in a particular context (`scope`, storytelling) - contribute additional information permanently (rerum **inbox** - move to protocol doc) +### Using Content State + +(not in section 6) + ### reset "diff", "original state" etc @@ -314,8 +320,17 @@ behavior: sequence ## Selectors +preamble - cover all the use cases + ### SpecificResource +(This heading should be more descriptive) + +fragments/segments/parts of resources +SvgSelector +xywh + + ### PointSelector @@ -493,6 +508,8 @@ Painting a Scene into another while excluding import of several types of resourc ## Advanced Association Features +(This needs to be sprinkled throughout above - especially as SpecificResource must be introduced early for 3D) + ### Nesting A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. @@ -520,33 +537,77 @@ Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at ``` -### Segments - ### Embedded Content +e.g., painting TextualBody on Canvas + + +### Comment Annotations + +(move to Annotation section) + + ### Choice of Alternative Resources +(move to Annotation section) + + ### Non Rectangular Segments +SvgSelector - move to SpecificResource too ^^ + + ### Style +Move to SpecificResource + + ### Rotation -### Comment Annotations -### Hotspot Linking +### Hotspot Linking and Activation -### Activation +Move to SpecificResource -### Using Content State - - modify the Container in a particular context (`scope`, storytelling) +## Conveying Physical Dimensions + +(why is this important!?) + +(move the props to vocab doc) + +### spatialScale + +### temporalScale + + +``` +{ + "spatialScale": { + "factor": 22.0, + "units": "m" + }, + + + // this would be rarely used + "temporalScale": { + "factor": 0.00001 + } + +} +``` +`factor` Required A floating point ratio. +`units` Required A real-world measuring unit. Always seconds for temporalScale. Possible values for spatialScale include: "m", "ft". (is that it?) -### Physical Dimension Service +For a Canvas, it's the physical "size" of each cartesian integer unit. +For a Scene, it's the physical size of the unit vector. +For a timeline it's the ratio of time in the recording to time in the real world. +(define props in the Vocabulary doc) + ## HTTP Requests and Responses @@ -559,6 +620,13 @@ Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at ### Authentication +## Accessibility + +(new section) + +`provides` + + ## Appendices ### Summary of Property Requirements From 07dec3a4a85502fd1da7fd83b4e54522f77fcef6 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Wed, 5 Feb 2025 09:27:38 -0800 Subject: [PATCH 013/192] add header to index.md --- source/presentation/4.0/index.md | 55 +++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 247b3f7ba..bc250ace9 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1,3 +1,56 @@ +--- +title: "Presentation API 4.0 - DRAFT" +title_override: "IIIF Presentation API 4.0" +id: presentation-api +layout: spec +cssversion: 3 +tags: [specifications, presentation-api] +major: 4 +minor: 0 +patch: 0 +pre: final +redirect_from: + - /presentation/index.html + - /presentation/4/index.html +editors: + - name: Michael Appleby + ORCID: https://orcid.org/0000-0002-1266-298X + institution: Yale University + - name: Tom Crane + ORCID: https://orcid.org/0000-0003-1881-243X + institution: Digirati + - name: Robert Sanderson + ORCID: https://orcid.org/0000-0003-4441-6852 + institution: J. Paul Getty Trust + - name: Dawn Childress + ORCID: + institution: UCLA + - name: Julie Winchester + ORCID: + institution: Duke University + - name: Jeff Mixter + ORCID: + institution: OCLC +hero: + image: '' +--- + +## Status of this Document +{:.no_toc} +__This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} + +__Latest Stable Version:__ [{{ site.data.apis.presentation.latest.major }}.{{ site.data.apis.presentation.latest.minor }}.{{ site.data.apis.presentation.latest.patch }}][prezi-stable-version] + +__Previous Version:__ [3.0][prezi3] + +**Editors:** + +{% include api/editors.md editors=page.editors %} + +{% include copyright.md %} + +---- + # Presentation 4 ## Introduction @@ -639,4 +692,4 @@ For a timeline it's the ratio of time in the recording to time in the real world ### Change Log -"Exclude Audio" \ No newline at end of file +"Exclude Audio" From 00d8e9068ad01c06cb313ab79870cbb776c56abb Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Wed, 5 Feb 2025 09:54:42 -0800 Subject: [PATCH 014/192] Update index.md header --- source/presentation/4.0/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index bc250ace9..6276819b5 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1,5 +1,5 @@ --- -title: "Presentation API 4.0 - DRAFT" +title: "Presentation API 4.0" title_override: "IIIF Presentation API 4.0" id: presentation-api layout: spec @@ -8,7 +8,7 @@ tags: [specifications, presentation-api] major: 4 minor: 0 patch: 0 -pre: final +pre: redirect_from: - /presentation/index.html - /presentation/4/index.html @@ -41,7 +41,7 @@ __This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.p __Latest Stable Version:__ [{{ site.data.apis.presentation.latest.major }}.{{ site.data.apis.presentation.latest.minor }}.{{ site.data.apis.presentation.latest.patch }}][prezi-stable-version] -__Previous Version:__ [3.0][prezi3] +__Previous Version:__ [3.0][prezi30] **Editors:** From 8810338128ce1c99acef68c2292fa6d54e1b8013 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Wed, 5 Feb 2025 11:13:55 -0800 Subject: [PATCH 015/192] fix internal link issues index.md --- source/presentation/4.0/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 6276819b5..f56f757f4 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -229,14 +229,14 @@ A Container that represents a boundless three-dimensional space and has content * has optional continuous duration in seconds A Scene in IIIF is a virtual container that represents a boundless three-dimensional space and has content resources, lights and cameras positioned at locations within it. It may also have a duration to allow the sequencing of events and timed media. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. -The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](link to wikipedia)). +The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). -The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the [physical dimensions pattern](fwd-ref-to-phys-dims). +The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). diagram of Right handed cartesian coordinate system -As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the [nesting section][fwd-ref-to-nesting]. +As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. ```json { From a3ce43d65a52ff2987ede76561437c63983e7385 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Wed, 5 Feb 2025 11:28:40 -0800 Subject: [PATCH 016/192] internal link fixes index.md --- source/presentation/4.0/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index f56f757f4..d2817da62 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -91,7 +91,7 @@ As multiple models, lights, cameras, and other resources can be associated with A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. -As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in [Transforms](transforms_section). +As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in Transforms(transforms_section). A simple example painting one Scene into another: From 602a853a463af14884e5f8fae5129ceadbe7280c Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Wed, 5 Feb 2025 11:52:12 -0800 Subject: [PATCH 017/192] add header to properties.md --- source/presentation/4.0/properties.md | 53 +++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index 8269ebd46..b6d952cce 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -1,3 +1,56 @@ +--- +title: "Presentation API 4.0 Properties" +title_override: "IIIF Presentation API 4.0 Properties" +id: presentation-api-properties +layout: spec-properties +cssversion: 3 +tags: [specifications, presentation-api] +major: 4 +minor: 0 +patch: 0 +pre: +redirect_from: + - /presentation/properties.html + - /presentation/4/properties.html +editors: + - name: Michael Appleby + ORCID: https://orcid.org/0000-0002-1266-298X + institution: Yale University + - name: Tom Crane + ORCID: https://orcid.org/0000-0003-1881-243X + institution: Digirati + - name: Robert Sanderson + ORCID: https://orcid.org/0000-0003-4441-6852 + institution: J. Paul Getty Trust + - name: Dawn Childress + ORCID: + institution: UCLA + - name: Julie Winchester + ORCID: + institution: Duke University + - name: Jeff Mixter + ORCID: + institution: OCLC +hero: + image: '' +--- + +## Status of this Document +{:.no_toc} +__This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} + +__Latest Stable Version:__ [{{ site.data.apis.presentation.latest.major }}.{{ site.data.apis.presentation.latest.minor }}.{{ site.data.apis.presentation.latest.patch }}][prezi-stable-version] + +__Previous Version:__ [3.0][prezi30] + +**Editors:** + +{% include api/editors.md editors=page.editors %} + +{% include copyright.md %} + +---- + # Vocabulary? ## Resource Classes From cb4338d127a432d28b0c8fa2f968bd2d89156c00 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 7 Feb 2025 14:26:24 -0500 Subject: [PATCH 018/192] updates --- source/presentation/4.0/properties.md | 135 ++++++++++++++++---------- 1 file changed, 86 insertions(+), 49 deletions(-) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index b6d952cce..fc207c1d2 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -106,9 +106,9 @@ __Previous Version:__ [3.0][prezi30] ##### label -A human readable label, name or title. The `label` property is intended to be displayed as a short, textual surrogate for the resource if a human needs to make a distinction between it and similar resources, for example between objects, pages, or options for a choice of images to display. The `label` property can be fully internationalized, and each language can have multiple values. This pattern is described in more detail in the [languages][prezi30-languages] section. +A human readable label, name or title. The `label` property is intended to be displayed as a short, textual surrogate for the resource if a human needs to make a distinction between it and similar resources, for example between objects, pages, or options for a choice of images to display. The `label` property can be fully internationalized, and each language can have multiple values. This pattern is described in more detail in the [languages][prezi40-languages] section. -The value of the property _MUST_ be a JSON object, as described in the [languages][prezi30-languages] section. +The value of the property _MUST_ be a JSON object, as described in the [languages][prezi40-languages] section. * A Collection _MUST_ have the `label` property with at least one entry.
Clients _MUST_ render `label` on a Collection. @@ -134,7 +134,7 @@ The value of the property _MUST_ be a JSON object, as described in the [language An ordered list of descriptions to be displayed to the user when they interact with the resource, given as pairs of human readable `label` and `value` entries. The content of these entries is intended for presentation only; descriptive semantics _SHOULD NOT_ be inferred. An entry might be used to convey information about the creation of the object, a physical description, ownership information, or other purposes. -The value of the `metadata` property _MUST_ be an array of JSON objects, where each item in the array has both `label` and `value` properties. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi30-languages] section. +The value of the `metadata` property _MUST_ be an array of JSON objects, where each item in the array has both `label` and `value` properties. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi40-languages] section. * A Collection _SHOULD_ have the `metadata` property with at least one item.
Clients _MUST_ render `metadata` on a Collection. @@ -163,7 +163,7 @@ Clients _SHOULD_ display the entries in the order provided. Clients _SHOULD_ exp A short textual summary intended to be conveyed to the user when the `metadata` entries for the resource are not being displayed. This could be used as a brief description for item level search results, for small-screen environments, or as an alternative user interface when the `metadata` property is not currently being rendered. The `summary` property follows the same pattern as the `label` property described above. -The value of the property _MUST_ be a JSON object, as described in the [languages][prezi30-languages] section. +The value of the property _MUST_ be a JSON object, as described in the [languages][prezi40-languages] section. * A Collection _SHOULD_ have the `summary` property with at least one entry.
Clients _SHOULD_ render `summary` on a Collection. @@ -183,7 +183,7 @@ The value of the property _MUST_ be a JSON object, as described in the [language Text that _MUST_ be displayed when the resource is displayed or used. For example, the `requiredStatement` property could be used to present copyright or ownership statements, an acknowledgement of the owning and/or publishing institution, or any other text that the publishing organization deems critical to display to the user. Given the wide variation of potential client user interfaces, it will not always be possible to display this statement to the user in the client's initial state. If initially hidden, clients _MUST_ make the method of revealing it as obvious as possible. -The value of the property _MUST_ be a JSON object, that has the `label` and `value` properties, in the same way as a `metadata` property entry. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi30-languages] section. +The value of the property _MUST_ be a JSON object, that has the `label` and `value` properties, in the same way as a `metadata` property entry. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi40-languages] section. * Any resource type _MAY_ have the `requiredStatement` property.
Clients _MUST_ render `requiredStatement` on every resource type. @@ -200,7 +200,9 @@ The value of the property _MUST_ be a JSON object, that has the `label` and `val ##### rights -A string that identifies a license or rights statement that applies to the content of the resource, such as the JSON of a Manifest or the pixels of an image. The value _MUST_ be drawn from the set of [Creative Commons][org-cc-licenses] license URIs, the [RightsStatements.org][org-rs-terms] rights statement URIs, or those added via the [extension][prezi30-ldce] mechanism. The inclusion of this property is informative, and for example could be used to display an icon representing the rights assertions. +A string that identifies a license or rights statement that applies to the content of the resource, such as the JSON of a Manifest or the pixels of an image. The value _MUST_ be drawn from the set of [Creative Commons][org-cc-licenses] license URIs, the [RightsStatements.org][org-rs-terms] rights statement URIs, or those added via the [extension][prezi40-ldce] mechanism. The inclusion of this property is informative, and for example could be used to display an icon representing the rights assertions. + +!!! registration not extension If displaying rights information directly to the user is the desired interaction, or a publisher-defined label is needed, then it is _RECOMMENDED_ to include the information using the `requiredStatement` property or in the `metadata` property. @@ -336,7 +338,7 @@ The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _ ##### navPlace -A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. +A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. The location is identified using structured data, described below, with latitude and longitude based points or polygons. If the location is only textual, then the information should instead be included in the `metadata` property. The value of the property _MUST_ be a [GeoJSON Feature Collection](link) containing one or more [Features](link). The value _SHOULD_ be embedded and _MAY_ be a reference. Feature Collections referenced in the `navPlace` property _MUST_ have the `id` and `type` properties and _MUST NOT_ have the `features` property. @@ -358,14 +360,14 @@ The value of the property _MUST_ be a [GeoJSON Feature Collection](link) contain ```json-doc { "navPlace":{ - "id": "http://example.com/feature-collection/1", + "id": "https://example.com/feature-collection/1", "type": "FeatureCollection", "features":[ { - "id": "http://example.com/feature/1", + "id": "https://example.com/feature/1", "type": "Feature", - "properties":{}, "geometry":{ + "id": "https://example.com/geometry/1", "type": "Point", "coordinates":[ 9.938, @@ -544,7 +546,7 @@ The height of the Canvas or external content resource. For content resources, th The value _MUST_ be a positive integer. - * A Canvas _MAY_ have the `height` property. If it has a `height`, it _MUST_ also have a `width`.
+ * A Canvas _MUST_ have the `height` property.
Clients _MUST_ process `height` on a Canvas. * Content resources _SHOULD_ have the `height` property, with the value given in pixels, if appropriate to the resource type.
Clients _SHOULD_ process `height` on content resources. @@ -562,7 +564,7 @@ The width of the Canvas or external content resource. For content resources, the The value _MUST_ be a positive integer. - * A Canvas _MAY_ have the `width` property. If it has a `width`, it _MUST_ also have a `height`.
+ * A Canvas _MUST_ have the `width` property.
Clients _MUST_ process `width` on a Canvas. * Content resources _SHOULD_ have the `width` property, with the value given in pixels, if appropriate to the resource type.
Clients _SHOULD_ process `width` on content resources. @@ -576,12 +578,14 @@ The value _MUST_ be a positive integer. ##### duration -The duration of the Canvas or external content resource, given in seconds. +The duration of a container or external content resource, given in seconds. The value _MUST_ be a positive floating point number. - * A Canvas _MAY_ have the `duration` property.
- Clients _MUST_ process `duration` on a Canvas. + * A Timeline _MUST_ have the `duration` property.
+ Clients _MUST_ process `duration` on a Timeline. + * A Canvas or Scene _MAY_ have the `duration` property.
+ Clients _MUST_ process `duration` on a Canvas or Scene, if present. * Content resources _SHOULD_ have the `duration` property, if appropriate to the resource type.
Clients _SHOULD_ process `duration` on content resources. * Other types of resource _MUST NOT_ have a `duration`.
@@ -594,7 +598,9 @@ The value _MUST_ be a positive floating point number. ##### viewingDirection -The direction in which a set of Canvases _SHOULD_ be displayed to the user. This specification defines four direction values in the table below. Others may be defined externally [as an extension][prezi30-ldce]. +The direction in which a list of Containers _SHOULD_ be displayed to the user. This specification defines four direction values in the table below. Others may be defined externally [as an extension][prezi30-ldce]. For example, +if the `viewingDirection` value is `left-to-right`, then backwards in the list is to the left, and forwards in the +list is to the right. The value _MUST_ be a string. @@ -627,17 +633,13 @@ A set of user experience features that the publisher of the content would prefer In order to determine the behaviors that are governing a particular resource, there are four inheritance rules from resources that reference the current resource: * Collections inherit behaviors from their referencing Collection. * Manifests **DO NOT** inherit behaviors from any referencing Collections. -* Canvases inherit behaviors from their referencing Manifest, but **DO NOT** inherit behaviors from any referencing Ranges, as there might be several with different behaviors. +* Containers inherit behaviors from their referencing Manifest, but **DO NOT** inherit behaviors from any referencing Ranges, as there might be several with different behaviors. * Ranges inherit behaviors from any referencing Range and referencing Manifest. -Clients should interpret behaviors on a Range only when that Range is selected or is in some other way the context for the user's current interaction with the resources. A Range with the `behavior` value `continuous`, in a Manifest with the `behavior` value `paged`, would mean that the Manifest's Canvases should be rendered in a paged fashion, unless the range is selected to be viewed, and its included Canvases would be rendered in that context only as being virtually stitched together. This might occur, for example, when a physical scroll is cut into pages and bound into a codex with other pages, and the publisher would like to provide the user the experience of the scroll in its original form. +Clients should interpret behaviors on a Range only when that Range is selected or is in some other way the context for the user's current interaction with the resources. A Range with the `behavior` value `continuous`, in a Manifest with the `behavior` value `paged`, would mean that the Manifest's Containers should be rendered in a paged fashion, unless the range is selected to be viewed, and its included Containers would be rendered in that context only as being virtually stitched together. This might occur, for example, when a physical scroll is cut into pages and bound into a codex with other pages, and the publisher would like to provide the user the experience of the scroll in its original form. The descriptions of the behavior values have a set of which other values they are disjoint with, meaning that the same resource _MUST NOT_ have both of two or more from that set. In order to determine which is in effect, the client _SHOULD_ follow the inheritance rules above, taking the value from the closest resource. The user interface effects of the possible permutations of non-disjoint behavior values are client dependent, and implementers are advised to look for relevant recipes in the [IIIF cookbook][annex-cookbook]. -__Future Clarification Anticipated__
-Further clarifications about the implications of interactions between behavior values should be expected in subsequent minor releases. -{: .warning} - The value _MUST_ be an array of strings. * Any resource type _MAY_ have the `behavior` property with at least one item.
@@ -646,13 +648,13 @@ The value _MUST_ be an array of strings. | Value | Description | | ----- | ----------- | || **Temporal Behaviors** | -| `auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Canvases, and Ranges that include or are Canvases with at least the `duration` dimension. When the client reaches the end of a Canvas, or segment thereof as specified in a Range, with a duration dimension that has this behavior, it _SHOULD_ immediately proceed to the next Canvas or segment and render it. If there is no subsequent Canvas in the current context, then this behavior should be ignored. When applied to a Collection, the client should treat the first Canvas of the next Manifest as following the last Canvas of the previous Manifest, respecting any `start` property specified. Disjoint with `no-auto-advance`. | -| `no-auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Canvases, and Ranges that include or are Canvases with at least the `duration` dimension. When the client reaches the end of a Canvas or segment with a duration dimension that has this behavior, it _MUST NOT_ proceed to the next Canvas, if any. This is a default temporal behavior if not specified. Disjoint with `auto-advance`.| -| `repeat` | Valid on Collections and Manifests, that include Canvases that have at least the `duration` dimension. When the client reaches the end of the duration of the final Canvas in the resource, and the `behavior` value `auto-advance`{: style="white-space:nowrap;"} is also in effect, then the client _SHOULD_ return to the first Canvas, or segment of Canvas, in the resource that has the `behavior` value `repeat` and start playing again. If the `behavior` value `auto-advance` is not in effect, then the client _SHOULD_ render a navigation control for the user to manually return to the first Canvas or segment. Disjoint with `no-repeat`.| -| `no-repeat` | Valid on Collections and Manifests, that include Canvases that have at least the `duration` dimension. When the client reaches the end of the duration of the final Canvas in the resource, the client _MUST NOT_ return to the first Canvas, or segment of Canvas. This is a default temporal behavior if not specified. Disjoint with `repeat`.| +| `auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Containers, and Ranges that include or are Containers with at least the `duration` dimension. When the client reaches the end of a Canvas, or segment thereof as specified in a Range, with a duration dimension that has this behavior, it _SHOULD_ immediately proceed to the next Container or segment and render it. If there is no subsequent Container in the current context, then this behavior should be ignored. When applied to a Collection, the client should treat the first Container of the next Manifest as following the last Container of the previous Manifest, respecting any `start` property specified. Disjoint with `no-auto-advance`. | +| `no-auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Containers, and Ranges that include or are Containers with at least the `duration` dimension. When the client reaches the end of a Container or segment with a duration dimension that has this behavior, it _MUST NOT_ proceed to the next Container, if any. This is a default temporal behavior if not specified. Disjoint with `auto-advance`.| +| `repeat` | Valid on Collections and Manifests, that include Containers that have at least the `duration` dimension. When the client reaches the end of the duration of the final Container in the resource, and the `behavior` value `auto-advance`{: style="white-space:nowrap;"} is also in effect, then the client _SHOULD_ return to the first Container, or segment of a Container, in the resource that has the `behavior` value `repeat` and start playing again. If the `behavior` value `auto-advance` is not in effect, then the client _SHOULD_ render a navigation control for the user to manually return to the first Container or segment. Disjoint with `no-repeat`.| +| `no-repeat` | Valid on Collections and Manifests, that include Containers that have at least the `duration` dimension. When the client reaches the end of the duration of the final Container in the resource, the client _MUST NOT_ return to the first Container, or segment of Container. This is a default temporal behavior if not specified. Disjoint with `repeat`.| | | **Layout Behaviors** | | `unordered` | Valid on Collections, Manifests and Ranges. The resources included in resources that have this behavior have no inherent order, and user interfaces _SHOULD_ avoid implying an order to the user. Disjoint with `individuals`, `continuous`, and `paged`.| -| `individuals` | Valid on Collections, Manifests, and Ranges. For Collections that have this behavior, each of the included Manifests are distinct objects in the given order. For Manifests and Ranges, the included Canvases are distinct views, and _SHOULD NOT_ be presented in a page-turning interface. This is the default layout behavior if not specified. Disjoint with `unordered`, `continuous`, and `paged`. | +| `individuals` | Valid on Collections, Manifests, and Ranges. For Collections that have this behavior, each of the included Manifests are distinct objects in the given order. For Manifests and Ranges, the included Containers are distinct views, and _SHOULD NOT_ be presented in a page-turning interface. This is the default layout behavior if not specified. Disjoint with `unordered`, `continuous`, and `paged`. | | `continuous` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior are partial views and an appropriate rendering might display all of the Canvases virtually stitched together, such as a long scroll split into sections. This behavior has no implication for audio resources. The `viewingDirection` of the Manifest will determine the appropriate arrangement of the Canvases. Disjoint with `unordered`, `individuals` and `paged`. | | `paged` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior represent views that _SHOULD_ be presented in a page-turning interface if one is available. The first canvas is a single view (the first recto) and thus the second canvas likely represents the back of the object in the first canvas. If this is not the case, see the `behavior` value `non-paged`. Disjoint with `unordered`, `individuals`, and `continuous`. | | `facing-pages`{: style="white-space:nowrap;"} | Valid only on Canvases. Canvases that have this behavior, in a Manifest that has the `behavior` value `paged`, _MUST_ be displayed by themselves, as they depict both parts of the opening. If all of the Canvases are like this, then page turning is not possible, so simply use `individuals` instead. Disjoint with `non-paged`.| @@ -661,11 +663,11 @@ The value _MUST_ be an array of strings. | `multi-part` | Valid only on Collections. Collections that have this behavior consist of multiple Manifests or Collections which together form part of a logical whole or a contiguous set, such as multi-volume books or a set of journal issues. Clients might render these Collections as a table of contents rather than with thumbnails, or provide viewing interfaces that can easily advance from one member to the next. Disjoint with `together`.| | `together` | Valid only on Collections. A client _SHOULD_ present all of the child Manifests to the user at once in a separate viewing area with its own controls. Clients _SHOULD_ catch attempts to create too many viewing areas. This behavior _SHOULD NOT_ be interpreted as applying to the members of any child resources. Disjoint with `multi-part`.| | | **Range Behaviors** | -| `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Canvases listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| +| `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Containers listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| | `thumbnail-nav`{: style="white-space:nowrap;"} | Valid only on Ranges. Ranges that have this behavior _MAY_ be used by the client to present an alternative navigation or overview based on thumbnails, such as regular keyframes along a timeline for a video, or sections of a long scroll. Clients _SHOULD NOT_ use them to generate a conventional table of contents. Child Ranges of a Range with this behavior _MUST_ have a suitable `thumbnail` property. Disjoint with `sequence` and `no-nav`.| | `no-nav` | Valid only on Ranges. Ranges that have this behavior _MUST NOT_ be displayed to the user in a navigation hierarchy. This allows for Ranges to be present that capture unnamed regions with no interesting content, such as the set of blank pages at the beginning of a book, or dead air between parts of a performance, that are still part of the Manifest but do not need to be navigated to directly. Disjoint with `sequence` and `thumbnail-nav`.| | | **Miscellaneous Behaviors** | -| `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | +| `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources, Lights, Cameras and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | {: .api-table #table-behavior} {% include api/code_header.html %} @@ -708,6 +710,8 @@ Note that the majority of the values have been selected from [accessibility feat { "provides": [ "closedCaption" ] } ``` +!!! warning "This breaks the graph as the file doesn't provide X in all contexts" + ##### timeMode @@ -732,7 +736,7 @@ The value _MUST_ be a string. #### backgroundColor -This property sets the background color behind any painted resources on a spatial resource, such as a Canvas or Scene. +This property sets the background color behind any painted resources on a spatial Container, such as a Canvas or Scene. The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is client-dependent. @@ -742,60 +746,86 @@ The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value Clients _SHOULD_ render `backgroundColor` on any resource type. * Other resources _MUST NOT_ have the `backgroundColor` property. -```json -"backgroundColor": "#FFFFFF" +```json-doc +{ "backgroundColor": "#FFFFFF" } ``` -
-❓Can you set bgColor on a transparent image? An area? Conflict with `style` on a SpecificResource? -
+##### position + +It is important to be able to position the (textual) body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. + +The value of this property _MUST_ be a JSON object conforming to the `SpecificResource` pattern of the Web Annotation Model. The Specific Resource _MUST_ have a `source` property that refers to a Container, and a `selector` that describes a point or region within the Container. +* A TextualBody _MAY_ have the `position` property.
+ Clients _SHOULD_ process the `position` property on TextualBody instances. +* Other classes _MUST NOT_ have the `position` property.
+ Clients _MUST_ ignore the `position` property on all other classes. + +```json-doc +{ "position": { + "type": "SpecificResource", + "source": [{ + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }], + "selector": [{ + "type": "PointSelector", + "x": 1.0, + "y": 19.2, + "z": 2.7 + }] + } +} + +``` ##### near This property gives the distance from the camera from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. -The value is a non-negative floating point number. If this property is not specified, then the default value is client-dependent. +The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be less than the value for `far` for the same Camera. If this property is not specified, then the default value is client-dependent. * A Camera _MAY_ have the `near` property
Clients _SHOULD_ process the `near` property on Cameras. -```json -"near": 1.5 +```json-doc +{ "near": 1.5 } ``` ##### far This property gives the distance from the camera after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. -The value is a non-negative floating point number, and _MUST_ be greater than the value for `near` on the same camera. If this property is not specified, then the default value is client-dependent. +The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be greater than the value for `near` of the same Camera. If this property is not specified, then the default value is client-dependent. * A Camera _MAY_ have the `far` property
Clients _SHOULD_ process the `far` property on Cameras. -```json -"far": 200.0 +```json-doc +{ "far": 200.0 } ``` ##### fieldOfView -_Summary here_ +The angle which a PerspectiveCamera can "see". + +!!! warning "Need more info" -The value _MUST_ be a floating point number greater than 0 and less than 180. If this property is not specified, then the default value is client-dependent. +The value _MUST_ be a floating point number greater than 0 and less than 180, and is measured in degrees. If this property is not specified, then the default value is client-dependent. * A PerspectiveCamera _SHOULD_ have the `fieldOfView` property.
Clients _SHOULD_ process the `fieldOfView` property on Cameras. -```json - "fieldOfView": 50.0 +```json-doc +{ "fieldOfView": 50.0 } ``` ##### angle -_Summary here_ +!!! warning "Need more info" -The value _MUST_ be a floating point number greater than 0 and less than 90. If this property is not specified, then the default value is client-dependent. +The value _MUST_ be a floating point number greater than 0 and less than 90, and is measure in degrees. If this property is not specified, then the default value is client-dependent. * A SpotLight _SHOULD_ have the `angle` property.
Clients _SHOULD_ process the `angle` property on SpotLights. @@ -808,7 +838,11 @@ The value _MUST_ be a floating point number greater than 0 and less than 90. If _Summary here_ -The value _MUST_ be a JSON object, conforming to either a reference to an Annotation with an `id` and a `type` of "Anntoation", or a PointSelector. If this property is not specified, then the default value is null -- the camera or light is not looking at anything. +The value _MUST_ be a JSON object, conforming to either a reference to an Annotation, or an embedded PointSelector. If this property is not specified, then the default value for cameras is to look straight backwards (-Z) and for lights to point straight down (-Y). + +* A Camera _MAY_ have the `lookAt` property.
+ Clients _SHOULD_ process the `lookAt` property on Cameras. +* A SpotLight or a DirectionalLight _SHOULD_ have the `lookAt` property.
```json "lookAt": { @@ -850,7 +884,7 @@ This specification defines the unit value of "relative" which constrains the val } ``` -##### Exclude +##### exclude _Summary here_ @@ -868,6 +902,9 @@ _On Annotation, a list of strings drawn from table_ ``` + + + ##### transform _Summary here_ From 86cd0a9eab17fa99aadf7fdc5387ecf3053d4288 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Tue, 11 Feb 2025 16:11:01 -0800 Subject: [PATCH 019/192] fix internal links --- source/presentation/4.0/properties.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index fc207c1d2..d86fdc864 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -340,7 +340,7 @@ The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _ A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. The location is identified using structured data, described below, with latitude and longitude based points or polygons. If the location is only textual, then the information should instead be included in the `metadata` property. -The value of the property _MUST_ be a [GeoJSON Feature Collection](link) containing one or more [Features](link). The value _SHOULD_ be embedded and _MAY_ be a reference. Feature Collections referenced in the `navPlace` property _MUST_ have the `id` and `type` properties and _MUST NOT_ have the `features` property. +The value of the property _MUST_ be a [GeoJSON Feature Collection] [link] containing one or more [Features] [link]. The value _SHOULD_ be embedded and _MAY_ be a reference. Feature Collections referenced in the `navPlace` property _MUST_ have the `id` and `type` properties and _MUST NOT_ have the `features` property. * A Collection _MAY_ have the `navPlace` property.
Clients _MAY_ render `navPlace` on a Collection. From 88b8d69682fb9319426e0132faee6c5542ce2fff Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Tue, 11 Feb 2025 16:33:42 -0800 Subject: [PATCH 020/192] fix layout in header --- source/presentation/4.0/properties.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/properties.md index fc207c1d2..355c1767c 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/properties.md @@ -2,7 +2,7 @@ title: "Presentation API 4.0 Properties" title_override: "IIIF Presentation API 4.0 Properties" id: presentation-api-properties -layout: spec-properties +layout: spec cssversion: 3 tags: [specifications, presentation-api] major: 4 From c2030dd2b87d05dd863b19339050966ae8e47003 Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Wed, 12 Feb 2025 11:42:52 -0600 Subject: [PATCH 021/192] Update index.md to include determinations from Oct 24 London working meeting --- source/presentation/4.0/index.md | 37 +++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index d2817da62..90031b658 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -296,6 +296,18 @@ Example Annotation that positions a model at a point within a Scene: } ``` +Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. + +
+❓Does WKTSelector have a duration/instant property? +
+ +Example Annotation that comments on a 3D polygon within a Scene: + +``` +Todo add example +``` + #### URI Fragments (move up, include xywh) @@ -398,10 +410,6 @@ xywh A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. -
-❓Does this prevent extension cameras from requiring a fixed aspect ratio? -
- This specification defines two types of Camera: | Class | Description | @@ -409,7 +417,7 @@ This specification defines two types of Camera: | `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | | `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | -Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If either the position or direction is not specified, then the position defaults to the origin, and direction defaults to facing along the z axis towards negative infinity. +Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. The camera's up direction by default points along the y axis towards positive infinity, but this may be modified by transforms. The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. @@ -422,7 +430,7 @@ If any of these properties are not specified explicitly, they default to the cho drawing of a geometrical frustrum truncated by near and far distances -If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. +The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. ```json { @@ -518,15 +526,11 @@ Transforms are only used in the Presentation API when the SpecificResource is th #### Relative Rotation -It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector or the URI of an Annotation which paints something into the current Scene. +It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. -If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the direction the resource is facing that point. - -
-❓What happens if the Annotation targets a Polygon or other non-Point? Calculate centroid? Error? First point given in the Poly / center of a sphere? -
+If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. -This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. As the z axis is not affected by the rotation, any RotateTransform that changes z will be retained, but any change to x or y will be lost. +This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. ```json "lookAt": { @@ -577,23 +581,26 @@ A Canvas in a Scene has a specific forward face and a backward face. By default, A `PointSelector` can be used to modify the point at which the Canvas will be painted, by establishing a new point to align with the top-left corner of the Canvas instead of the Scene coordinate origin. Transforms can also be used to modify Canvas rotation, scale, or translation. -It may be desirable to exercise greater control over how the Canvas is painted into the Scene by selecting the coordinate points in the Scene that should correspond to each corner of the Canvas. This provides fine-grained manipulation of Canvas placement and/or scale, and for optionally introducing Canvas distortion or skew. Annotations may use a type of Selector called a `PolygonZSelector` to select different points in the Scene to align with the top-left, bottom-left, bottom-right, and top-right corners of the Canvas. PolygonZSelectors have a single property, `value`, which is a string listing a WKT `POLYGONZ` expression containing four coordinate points, with each coordinate separated by commas, and axes within a coordinate separated by spaces. The four Scene coordinates should be listed beginning with the coordinate corresponding to the top-left corner of the Canvas, and should proceed in a counter-clockwise winding order around the Canvas, with coordinates corresponding to bottom-left, bottom-right, and top-right corners in order respectively. The use of PolygonZSelector overrides any use of Transforms on the Canvas Annotation. +It may be desirable to exercise greater control over how the Canvas is painted into the Scene by selecting the coordinate points in the Scene that should correspond to each corner of the Canvas. This provides fine-grained manipulation of Canvas placement and/or scale, and for optionally introducing Canvas distortion or skew. Annotations may use a WktSelector to select different points in the Scene to align with the top-left, bottom-left, bottom-right, and top-right corners of the Canvas. In this case, the four Scene coordinates should be listed beginning with the coordinate corresponding to the top-left corner of the Canvas, and should proceed in a counter-clockwise winding order around the Canvas, with coordinates corresponding to bottom-left, bottom-right, and top-right corners in order respectively. The use of WktSelector for this purpose overrides any use of Transforms on the Canvas Annotation. Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at (1, 0, 0); and top-right at (1, 1, 0): ```json "selector": [ { - "type": "PolygonZSelector", + "type": "WktSelector", "value": "POLYGONZ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" } ] ``` +When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. ### Embedded Content e.g., painting TextualBody on Canvas +Todo: This is mostly copy-pasted from properties, is it needed here? +It is important to be able to position the textual body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. The positioning of the textual body in a container is accomplished through the `position` property, which has as a value a Specific Resource identifying the targeted container as the source and a selector defining how the textual body should be positioned in the targeted container. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. ### Comment Annotations From 849a5c2c83a34c82966a8ddb65c3182924041690 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 26 Feb 2025 12:22:33 -0500 Subject: [PATCH 022/192] updates --- .../4.0/{properties.md => model.md} | 259 ++++++++++++++---- 1 file changed, 206 insertions(+), 53 deletions(-) rename source/presentation/4.0/{properties.md => model.md} (82%) diff --git a/source/presentation/4.0/properties.md b/source/presentation/4.0/model.md similarity index 82% rename from source/presentation/4.0/properties.md rename to source/presentation/4.0/model.md index c51ceda39..48d778ee8 100644 --- a/source/presentation/4.0/properties.md +++ b/source/presentation/4.0/model.md @@ -21,7 +21,7 @@ editors: institution: Digirati - name: Robert Sanderson ORCID: https://orcid.org/0000-0003-4441-6852 - institution: J. Paul Getty Trust + institution: Yale University - name: Dawn Childress ORCID: institution: UCLA @@ -51,56 +51,202 @@ __Previous Version:__ [3.0][prezi30] ---- -# Vocabulary? - -## Resource Classes - -* Collection -* CollectionPage -* Manifest -* Containers - * Timeline - * Canvas - * Scene -* Content Resources -* Range -* Cameras - * PerspectiveCamera - * OrthographicCamera -* Lights - * AmbientLight - * DirectionalLight - * PointLight - * SpotLight -* Transforms - * TranslateTransform - * RotateTransform - * ScaleTransform -* Selectors - * PointSelector - * WktSelector (need both LineString Z and Polygon Z) - * AudioContentSelector - * VisualContentSelector - * AnimationSelector - * ImageApiSelector -* Other Classes - * Agent - * Service - * Value (used for `intensity`) - -* Annotation Classes imported from WADM: - * Annotation - * AnnotationCollection - * AnnotationPage - * SpecificResource - * FragmentSelector - * SvgSelector - * CssStyle - * TextualBody - * Choice - - -## Resource Properties +# IIIF Presentation API Data Model + +## Introduction + + +### 1.2. Terminology + +This specification uses the following terms: + +* __embedded__: When a resource (A) is embedded within an embedding resource (B), the complete JSON representation of resource A is present within the JSON representation of resource B, and dereferencing the URI of resource A will not result in additional information. Example: Canvas A is embedded in Manifest B. +* __referenced__: When a resource (A) is referenced from a referencing resource (B), an incomplete JSON representation of resource A is present within the JSON representation of resource B, and dereferencing the URI of resource A will result in additional information. Example: Manifest A is referenced from Collection B. +* __HTTP(S)__: The HTTP or HTTPS URI scheme and internet protocol. + +The terms _array_, _JSON object_, _number_, _string_, and _boolean_ in this document are to be interpreted as defined by the [Javascript Object Notation (JSON)][org-rfc-8259] specification. + +The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _SHOULD NOT_, _RECOMMENDED_, _MAY_, and _OPTIONAL_ in this document are to be interpreted as described in [RFC 2119][org-rfc-2119]. + + + +## Classes + +### Collection + +A Collection is an ordered list of Manifests, and/or Collections. Collections allow Manifests and child Collections to be grouped in a hierarchical structure for presentation, which can be for generating navigation, showing dynamic results from a search, or providing fixed sets of related resources for any other purpose. IIIF Collections might align with the curated management of cultural heritage resources in sets, also called "collections", but can also be used for many other purposes. + +The intended usage of Collections is to allow clients to: + + * Load a pre-defined set of Manifests at initialization time. + * Receive a set of Manifests, such as search results, for rendering. + * Visualize lists or hierarchies of related Manifests. + * Provide navigation through a list or hierarchy of available Manifests. + +The identifier in `id` _MUST_ be able to be dereferenced to retrieve the JSON description of the Collection, and thus _MUST_ use the HTTP(S) URI scheme. + +The members of a Collection are listed in the `items` property. The members _MAY_ include both other Collections and Manifests, in order, to form a tree-structured hierarchy. + +Member Collections _MAY_ be [embedded][prezi30-terminology] inline within other Collections, such as when the Collection is used primarily to subdivide a larger one into more manageable pieces, however Manifests _MUST NOT_ be [embedded][prezi30-terminology] within Collections. An [embedded][prezi30-terminology] Collection _SHOULD_ also have its own URI from which the JSON description is available. + +Manifests or Collections _MAY_ be [referenced][prezi30-terminology] from more than one Collection. For example, an institution might define four Collections: one for modern works, one for historical works, one for newspapers and one for books. The Manifest for a modern newspaper would then appear in both the modern Collection and the newspaper Collection. Alternatively, the institution may choose to have two separate newspaper Collections, and reference each as a sub-Collection of modern and historical. + +Collections with an empty `items` property are allowed but discouraged. For example, if the user performs a search that matches no Manifests, then the server _MAY_ return a Collection response with no Manifests. + +Collections or Manifests [referenced][prezi30-terminology] in the `items` property _MUST_ have the `id`, `type` and `label` properties. They _SHOULD_ have the `thumbnail` property. + + +#### CollectionPage + + + +### Manifest + +A Manifest is a description of the structure and properties of a single item to be presented to the user, such as a title and other descriptive and linking information about the object and/or the intellectual work that it conveys. The scope of what constitutes an item, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. + +The identifier in `id` _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest, and thus _MUST_ use the HTTP(S) URI scheme. + +The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. + +The Manifest _MAY_ also have a `structures` property listing one or more [Ranges][prezi30-range] which describe additional structure of the content, such as might be rendered as a table of contents. + +The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These will typically be comment style Annotations, and _MUST NOT_ have `painting` as their `motivation`. + + +### Container Classes + +A Container is a frame of reference that allows the relative positioning of content, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). + +All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. The URI of the Container _MUST NOT_ contain a fragment (a `#` followed by further characters), as this would make it impossible to refer to a segment of the Container's area using the [media fragment syntax][org-w3c-media-frags] of `#xywh=` for spatial regions, and/or `#t=` for temporal segments. Containers _MAY_ be able to be dereferenced separately from the Manifest via their URIs as well as being [embedded][prezi30-terminology]. + +Containers have an `items` property which is a list of Annotation Pages. Each Annotation Page, defined below, maintains a list of Annotations, which associate Content Resources to be rendered as part of the Container. + +Annotations that do not associate content to be rendered, but instead are about the Container such as a comment or tag, are recorded using Annotation Pages in the `annotations` property of the Container. + +#### Timeline + +A Timeline is a Container that represents only a temporal duration, measured in seconds. Timelines allow audio content to be presented, but do not allow anything with a height or width like an image or video. The duration of the Timeline is given in the `duration` property. + +#### Canvas + +A Canvas is a Container that represents a particular rectangular 2 dimensional view of the object and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as the 2 dimensional space. + +#### Scene + +A Scene is a Container that represents an infinitely large three-dimensional space, with an optional duration. As the Scene is infinite, it does not have `height`, `width` or `depth` properties. + +### Annotation Classes + +#### Annotation + +Annotations are primarily used to associate content resources with Containers. The same mechanism is used for the visible and/or audible resources as is used for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. As Annotations can be added later, it promotes a distributed system in which publishers can align their content with the descriptions created by others. + +The IIIF Specifications adopt the W3C's [Web Annotation Data Model][org-w3c-webanno] and Vocabulary. Any necessary deviations from those specifications are explicitly noted and explained, such as the need for internationalization of labels. + +Annotations _MUST_ have their own HTTP(S) URIs, conveyed in the `id` property. The JSON-LD description of the Annotation _SHOULD_ be returned if the URI is dereferenced, according to the [Web Annotation Protocol][org-w3c-webanno-protocol]. + +When Annotations are used to associate content resources with a Canvas, the content resource is linked in the `body` of the Annotation. The URI of the Canvas _MUST_ be repeated in the `target` property of the Annotation, or the `source` property of a Specific Resource used in the `target` property. + +Content that is to be rendered as part of the Container _MUST_ be associated by an Annotation that has the `motivation` value `painting`. + + +Note that the Web Annotation data model defines different patterns for the `value` property compared to IIIF, when used within an Annotation. The `value` of a Textual Body or a Fragment Selector, for example, are strings rather than JSON objects with languages and values. Care must be taken to use the correct string form in these cases. + + +#### AnnotationCollection + +Annotation Collections allow groups of Annotations to be recorded. For example, all of the English translation Annotations of a medieval French document could be kept separate from the transcription or an edition in modern French, or the director's commentary on a film can be separated from the script. + +Annotation Collections _MUST_ have a URI, and it _SHOULD_ be an HTTP(S) URI. They _SHOULD_ have a `label` and _MAY_ have any of the other descriptive, linking or rights properties. + +Annotation Collections are paged rather than enumerated. The first page of items is linked using the `first` property, and the last page with the `last` property. The pages link to the next and previous pages in a chain, using the `next` and `prev` properties respectively. + + +#### AnnotationPage + +An ordered list of Annotations, typically associated with a Container, but may be referenced from other types of resource as well. Annotation Pages collect and order lists of Annotations. + +An Annotation Page _MUST_ have an HTTP(S) URI given in `id`, and _MAY_ have any of the other properties defined in this specification or the Web Annotation specification. The Annotations are listed in the `items` property of the Annotation Page. + +Annotations are embedded within an Annotation Page in the `items` property. + +__Incompatibility Warning__
+The definition of `label` in the Web Annotation specification does not produce JSON conformant with the structure defined in this specification for languages. Given the absolute requirement for internationalized labels and the strong desire for consistently handling properties, the `label` property on Annotation model classes does not conform to the string requirement of the Web Annotation Data Model. This [issue has been filed with the W3C][github-webanno-437] and will hopefully be addressed in a future version of the standard. +{: .warning} + + +#### SpecificResource +#### TextualBody +#### Choice +#### CssStyle + +### Content Resources + +Content resources are resources on the Web such as images, audio, video, or text which can be associated with a Container via an Annotation, or provide a representation of any resource. + +Content resources _MUST_ have an `id` property, with the value being the URI at which the resource can be obtained. + +The type of the content resource _MUST_ be included, and _SHOULD_ be taken from the table listed under the definition of `type`. The `format` of the resource _SHOULD_ be included and, if so, _SHOULD_ be the media type that is returned when the resource is dereferenced. The `profile` of the resource, if it has one, _SHOULD_ also be included. + +If the content resource is an Image, and a IIIF Image service is available for it, then the `id` property of the content resource _MAY_ be a complete URI to any particular representation supported by the Image Service, such as `https://example.org/image1/full/1000,/0/default.jpg`, but _MUST NOT_ be just the URI of the IIIF Image service. Its `type` value _MUST_ be the string `Image`. Its media type _MAY_ be listed in `format`, and its height and width _MAY_ be given as integer values for `height` and `width` respectively. The Image _SHOULD_ have the service [referenced][prezi30-terminology] from it using the `service` property. + +If there is a need to distinguish between content resources, then the resource _SHOULD_ have the `label` property. + +Containers _MAY_ be treated as content resources for the purposes of annotating on to other Containers. In this situation, the Container _MAY_ be [embedded][prezi30-terminology] within the Annotation, be a reference within the same Manifest, or require dereferencing to obtain its description. + + + +### Selectors +#### PointSelector +#### WktSelector +(need both LineString Z and Polygon Z) +#### AudioContentSelector +#### VisualContentSelector +#### AnimationSelector +#### ImageApiSelector +#### FragmentSelector +#### SvgSelector + +### Range + +Ranges are used to represent structure within an object beyond the default order of the Canvases in the `items` property of the Manifest, such as newspaper sections or articles, chapters within a book, or movements within a piece of music. Ranges can include Canvases, parts of Canvases, or other Ranges, creating a tree structure like a table of contents. + +The intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. Clients _SHOULD_ present only Ranges that have the `label` property and do not have a `behavior` value `no-nav` to the user. Clients _SHOULD NOT_ render Canvas labels as part of the navigation, and a Range that wraps the Canvas _MUST_ be created if this is the desired presentation. + +If there is no Range that has the `behavior` value `sequence`, and the Manifest does not have the `behavior` value `unordered`, then the client _SHOULD_ treat the order of the Canvases in the Manifest's `items` array as the default order. If there is one Range that has the `behavior` value `sequence`, then the client _MUST_ instead use this Range for the ordering. If there is more than one Range that has the `behavior` value `sequence`, for example a second Range to represent an alternative ordering of the pages of a manuscript, the first Range _SHOULD_ be used as the default and the others _SHOULD_ be able to be selected. Ranges that have the `behavior` value `sequence` _MUST_ be directly within the `structures` property of the Manifest, and _MUST NOT_ be [embedded][prezi30-terminology] or [referenced][prezi30-terminology] within other Ranges. These Ranges may have limited hierarchical nesting, but clients are not expected to traverse very deep structures in determining the default order. If this Range includes parts of Canvases, then these parts are the content to render by default and would generate separate entries in a navigation display. This allows for the Canvas to include content outside of the default view, such as a color bar or ruler. + +Ranges _MUST_ have URIs and they _SHOULD_ be HTTP(S) URIs. Top level Ranges are [embedded][prezi30-terminology] or externally [referenced][prezi30-terminology] within the Manifest in a `structures` property. These top level Ranges then embed or reference other Ranges, Canvases or parts of Canvases in the `items` property. Each entry in the `items` property _MUST_ be a JSON object, and it _MUST_ have the `id` and `type` properties. If a top level Range needs to be dereferenced by the client, then it _MUST NOT_ have the `items` property, such that clients are able to recognize that it should be retrieved in order to be processed. + +All of the Canvases or parts that should be considered as being part of a Range _MUST_ be included within the Range's `items` property, or a descendant Range's `items`. + +The Canvases and parts of Canvases need not be contiguous or in the same order as in the Manifest's `items` property or any other Range. Examples include newspaper articles that are continued in different sections, a chapter that starts half way through a page, or time segments of a single canvas that represent different sections of a piece of music. + +Ranges _MAY_ link to an Annotation Collection that has the content of the Range using the `supplementary` property. The [referenced][prezi30-terminology] Annotation Collection will contain Annotations that target areas of Canvases within the Range and link content resources to those Canvases. + + + +### Scene Components +#### Cameras +##### PerspectiveCamera +##### OrthographicCamera +#### Lights +##### AmbientLight +##### DirectionalLight +##### PointLight +##### SpotLight +#### Transforms +##### TranslateTransform +##### RotateTransform +##### ScaleTransform + +### Other Classes +#### Agent +#### Service +#### Value + + + +## Properties ### Descriptive Properties @@ -598,6 +744,9 @@ The value _MUST_ be a positive floating point number. ##### viewingDirection +!!! Rewrite to be where is the navigation control to step to the next/ previous in the items of hte manifest + + The direction in which a list of Containers _SHOULD_ be displayed to the user. This specification defines four direction values in the table below. Others may be defined externally [as an extension][prezi30-ldce]. For example, if the `viewingDirection` value is `left-to-right`, then backwards in the list is to the left, and forwards in the list is to the right. @@ -645,6 +794,10 @@ The value _MUST_ be an array of strings. * Any resource type _MAY_ have the `behavior` property with at least one item.
Clients _SHOULD_ process `behavior` on any resource type. + +!!! Could continuous stitch together Timelines? + + | Value | Description | | ----- | ----------- | || **Temporal Behaviors** | @@ -871,7 +1024,7 @@ The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value This property sets the strength or brightness of a Light. -The value _MUST_ be a JSON object, that has the `type`, `value` and `unit` properties. All three properties are required. The value of `type` _MUST_ be the string "Value". The value of `value` is a floating point number. The value of `unit` is a string, drawn from a controlled vocabulary of units. If this property is not specified, then the default intensity value is client-dependent. +The value _MUST_ be a JSON object, that has the `type`, `value` and `unit` properties. All three properties are required. The value of `type` _MUST_ be the string "UnitValue". The value of `value` is a floating point number. The value of `unit` is a string, drawn from a controlled vocabulary of units. If this property is not specified, then the default intensity value is client-dependent. This specification defines the unit value of "relative" which constrains the value to be a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). @@ -880,7 +1033,7 @@ This specification defines the unit value of "relative" which constrains the val ```json { - "intensity": {"type": "Value", "value": 0.5, "unit": "relative"} + "intensity": {"id": "", "type": "UnitValue", "value": 0.5, "unit": "relative"} } ``` From d4b638105a44dcac4ef1e83de140ca0829f07f23 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 26 Feb 2025 16:29:27 -0500 Subject: [PATCH 023/192] updates for classes --- source/presentation/4.0/model.md | 170 +++++++++++++++++++++++++++++-- 1 file changed, 159 insertions(+), 11 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 48d778ee8..3b2e6b677 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -72,6 +72,10 @@ The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _S ## Classes +The following sub-sections define the classes used in the IIIF Presentation Data Model. The properties and relationships of the classes are defined in the following section, including which classes they are able to be used with. Only the semantics and core structural requirements are defined within this section, along with any deviations from other specifications that the classes might be drawn from. + +The descriptions also do not define how the classes are used, which is done in the Presentation API Processing Model. + ### Collection A Collection is an ordered list of Manifests, and/or Collections. Collections allow Manifests and child Collections to be grouped in a hierarchical structure for presentation, which can be for generating navigation, showing dynamic results from a search, or providing fixed sets of related resources for any other purpose. IIIF Collections might align with the curated management of cultural heritage resources in sets, also called "collections", but can also be used for many other purposes. @@ -85,7 +89,9 @@ The intended usage of Collections is to allow clients to: The identifier in `id` _MUST_ be able to be dereferenced to retrieve the JSON description of the Collection, and thus _MUST_ use the HTTP(S) URI scheme. -The members of a Collection are listed in the `items` property. The members _MAY_ include both other Collections and Manifests, in order, to form a tree-structured hierarchy. +The members of a Collection are typically listed in the `items` property. The members _MAY_ include both other Collections and Manifests, in order, to form a tree-structured hierarchy. + +If there are too many members in the collection to fit within a single document, then the members _MAY_ be listed in Collection Pages. A reference to the first page of members is given in the `first` property, and the last page in the `last` property. In this case, the Collection _MUST NOT_ use the `items` property. Member Collections _MAY_ be [embedded][prezi30-terminology] inline within other Collections, such as when the Collection is used primarily to subdivide a larger one into more manageable pieces, however Manifests _MUST NOT_ be [embedded][prezi30-terminology] within Collections. An [embedded][prezi30-terminology] Collection _SHOULD_ also have its own URI from which the JSON description is available. @@ -98,13 +104,18 @@ Collections or Manifests [referenced][prezi30-terminology] in the `items` proper #### CollectionPage +A Collection Page is an arbitrary division of members within the Collection to make it easier to consume. + +A Collection Page _MUST_ have an HTTP(S) URI given in `id`. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Collection Page. + +Collection Pages follow the ActivityStreams model, as also used in Annotation Collections, the IIIF Change Discovery API, and the IIIF Search API. ### Manifest A Manifest is a description of the structure and properties of a single item to be presented to the user, such as a title and other descriptive and linking information about the object and/or the intellectual work that it conveys. The scope of what constitutes an item, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. -The identifier in `id` _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest, and thus _MUST_ use the HTTP(S) URI scheme. +Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. @@ -137,19 +148,18 @@ A Scene is a Container that represents an infinitely large three-dimensional spa ### Annotation Classes +The following set of classes are defined by the W3C's [Web Annotation Data Model][org-w3c-webanno] and Vocabulary, and are heavily used within the IIIF Data Model. Any necessary deviations from those specifications are explicitly noted and explained, such as the need for internationalization of labels. + #### Annotation Annotations are primarily used to associate content resources with Containers. The same mechanism is used for the visible and/or audible resources as is used for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. As Annotations can be added later, it promotes a distributed system in which publishers can align their content with the descriptions created by others. -The IIIF Specifications adopt the W3C's [Web Annotation Data Model][org-w3c-webanno] and Vocabulary. Any necessary deviations from those specifications are explicitly noted and explained, such as the need for internationalization of labels. - Annotations _MUST_ have their own HTTP(S) URIs, conveyed in the `id` property. The JSON-LD description of the Annotation _SHOULD_ be returned if the URI is dereferenced, according to the [Web Annotation Protocol][org-w3c-webanno-protocol]. When Annotations are used to associate content resources with a Canvas, the content resource is linked in the `body` of the Annotation. The URI of the Canvas _MUST_ be repeated in the `target` property of the Annotation, or the `source` property of a Specific Resource used in the `target` property. Content that is to be rendered as part of the Container _MUST_ be associated by an Annotation that has the `motivation` value `painting`. - Note that the Web Annotation data model defines different patterns for the `value` property compared to IIIF, when used within an Annotation. The `value` of a Textual Body or a Fragment Selector, for example, are strings rather than JSON objects with languages and values. Care must be taken to use the correct string form in these cases. @@ -164,7 +174,7 @@ Annotation Collections are paged rather than enumerated. The first page of items #### AnnotationPage -An ordered list of Annotations, typically associated with a Container, but may be referenced from other types of resource as well. Annotation Pages collect and order lists of Annotations. +An ordered list of Annotations, typically associated with a Container, but may be referenced from other types of resource as well. Annotation Pages enumerate and order lists of Annotations, in the same way that Collection Pages order lists of Manifests and Collections within the containing Collection. An Annotation Page _MUST_ have an HTTP(S) URI given in `id`, and _MAY_ have any of the other properties defined in this specification or the Web Annotation specification. The Annotations are listed in the `items` property of the Annotation Page. @@ -176,9 +186,16 @@ The definition of `label` in the Web Annotation specification does not produce J #### SpecificResource + +A Specific Resource is a resource in the context of an Annotation. They are used to record further properties or relationships needed to understand the particular contextual use, such as which part of the resource is used or how it should be rendered. In IIIF, the Specific Resource model from the Web Annotation Data Model has some additional properties beyond those defined by the W3C, such as `transform`. + #### TextualBody + +A Textual Body is an embedded resource within an Annotation that carries, as the name suggests, a text as the body of the Annotation. It is defined by the Web Annotation Data Model, and this specification defines a new property for it `position` that allows it to be positioned within a Container. + #### Choice -#### CssStyle + +A Choice is a Web Annotation construction that allows one entry from a list to be selected for processing or display. This specification allows `behavior` to be added to a Choice to influence how it is processed. ### Content Resources @@ -194,18 +211,125 @@ If there is a need to distinguish between content resources, then the resource _ Containers _MAY_ be treated as content resources for the purposes of annotating on to other Containers. In this situation, the Container _MAY_ be [embedded][prezi30-terminology] within the Annotation, be a reference within the same Manifest, or require dereferencing to obtain its description. +### Selectors +The Web Annotation Data Model defines several Selectors, which describe how to find a specific segment of that resource to be used. As noted, the nature of Selectors are dependent on the type of resources that they select out of, and the methods needed for those descriptions will vary. The Selectors from the Web Annotation Data Model and other sources can be used within the IIIF Data Model. This specification defines additional Selector classes for use. -### Selectors #### PointSelector + +There are common use cases in which a point, rather than a range or area, is the target of the Annotation. For example, putting a pin in a map should result in an exact point, not a very small rectangle. Points in time are not very short durations, and user interfaces should also treat these differently. This is particularly important when zooming in (either spatially or temporally) beyond the scale of the frame of reference. + +Point Selectors have the following properties: + +| Name | Description | +|------|-------------| +| id | The HTTP(S) URI of the selector | +| type | The class of the selector, which must be "PointSelector" | +| x | A number (floating point or integer) giving the x coordinate of the point, relative to the dimensions of the source resource | +| y | A number (floating point or integer) giving the y coordinate of the point, relative to the dimensions of the source resource | +| z | A number (floating point or integer) giving the z coordinate of the point, relative to the dimensions of the source resource | +| t | A number (floating point or integer) giving the time of the point in seconds, relative to the duration of the source resource | + + +```json +{ + "id": "https://example.org/selectors/1", + "type": "PointSelector", + "x": 0.001, + "y": 12.3, + "z": 0, + "t": 180.0 +} +``` + + #### WktSelector -(need both LineString Z and Polygon Z) + +Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MultiPolygon. Additional types, such as CIRCULARSTRING may also be supported. + +WKT Selectors have the following properties: + +| Name | Description | +|-------|-------------| +| id | The HTTP(S) URI of the selector | +| type | The class of the selector, which must be "VisualContentSelector" | +| value | The WKT string that defines the geometry to be selected | + +```json +{ + "id": "https://example.org/selectors/2", + "type": "WktSelector", + "value": "POLYGON Z (0 0 0, 10 0.5 3.2 10 5.0 0, 0 0 0)" +} +``` + + + + #### AudioContentSelector + +Video content resources consist of both visual and audio content within the same bit-level representation. There are situations when it is useful to refer to only one aspect of the content – either the visual or the audio, but not both. For example, an Annotation might associate only the visual content of a video that has spoken English in the audio, and an audio file that has the translation of that content in Spanish. The Audio Content Selector selects all of the audio content from an A/V content resource, and may be further refined with subsequent selectors to select a segment of it. + +Audio Content Selectors have the following properties: + +| Name | Description | +|------|-------------| +| id | The HTTP(S) URI of the selector | +| type | The class of the selector, which must be "AudioContentSelector" | + + +```json +{ + "id": "https://example.org/selectors/3", + "type": "AudioContentSelector" +} +``` + + #### VisualContentSelector + +Similar to Audio Content Selectors, Visual Content Selectors select the visual aspects of the content of an A/V content resource. They may be further refined by subsequent selectors that select an area or temporal segment of it. + +Visual Content Selectors have the following properties: + +| Name | Description | +|------|-------------| +| id | The HTTP(S) URI of the selector | +| type | The class of the selector, which must be "VisualContentSelector" | + +```json +{ + "id": "https://example.org/selectors/4", + "type": "VisualContentSelector" +} +``` + + #### AnimationSelector + +More interactive content resources, such as 3d models, may have activatable animations or similar features. For example, a model of a box might have an animation that opens the lid and a second animation that closes the lid. In order to activate those animations, they need to be selectable, and thus the specification defines an Animation Selector. + +Animation Selectors have the following properties: + +| Name | Description | +|-------|-------------| +| id | The HTTP(S) URI of the selector | +| type | The class of the selector, which must be "AnimationSelector" | +| value | The identity of the animation in whichever form is used by the source resource | + + +```json +{ + "id": "https://example.org/selectors/5", + "type": "AnimationSelector", + "value": "opening-1" +} +``` + #### ImageApiSelector -#### FragmentSelector -#### SvgSelector + + + ### Range @@ -828,6 +952,24 @@ The value _MUST_ be an array of strings. { "behavior": [ "auto-advance", "individuals" ] } ``` +##### interactionMode + +*within* the Scene, whereas viewingDirection and behavior are across containers. + +* Containers _MAY_ have the `interactionMode` + +Table here with values + + +locked +orbit +hemisphere-orbit +free +free-direction + +other examples: no-zoom, no-scrub, rti-mode + + ##### provides A set of features or additional functionality that a linked resource enables relative to the linking or including resource, which is not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). @@ -1446,6 +1588,12 @@ Additional motivations may be added to the Annotation to further clarify the int | ----- | ----------- | | `painting` | Resources associated with a Canvas by an Annotation that has the `motivation` value `painting` _MUST_ be presented to the user as the representation of the Canvas. The content can be thought of as being _of_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `painting`, a body of an Image and the target of the Canvas is an instruction to present that Image as (part of) the visual representation of the Canvas. Similarly, a textual body is to be presented as (part of) the visual representation of the Canvas and not positioned in some other part of the user interface.| | `supplementing` | Resources associated with a Canvas by an Annotation that has the `motivation` value `supplementing` _MAY_ be presented to the user as part of the representation of the Canvas, or _MAY_ be presented in a different part of the user interface. The content can be thought of as being _from_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `supplementing`, a body of an Image and the target of part of the Canvas is an instruction to present that Image to the user either in the Canvas's rendering area or somewhere associated with it, and could be used to present an easier to read representation of a diagram. Similarly, a textual body is to be presented either in the targeted region of the Canvas or otherwise associated with it, and might be OCR, a manual transcription or a translation of handwritten text, or captions for what is being said in a Canvas with audio content. | + +| `contentState` | ... content state here ...| + +| `activating` | ... activating annotations here ... | + + {: .api-table #table-motivations} From 45660d0f3bd4c144ec41858982684dea4beee40b Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 26 Feb 2025 16:43:27 -0500 Subject: [PATCH 024/192] updates for classes --- source/presentation/4.0/model.md | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 3b2e6b677..03ca77df7 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -56,7 +56,7 @@ __Previous Version:__ [3.0][prezi30] ## Introduction -### 1.2. Terminology +### Terminology This specification uses the following terms: @@ -333,36 +333,32 @@ Animation Selectors have the following properties: ### Range -Ranges are used to represent structure within an object beyond the default order of the Canvases in the `items` property of the Manifest, such as newspaper sections or articles, chapters within a book, or movements within a piece of music. Ranges can include Canvases, parts of Canvases, or other Ranges, creating a tree structure like a table of contents. +Ranges are used to represent structure within a Manifest beyond the default order of the Containers in the `items` property of the Manifest, such as newspaper sections or articles, chapters within a book, or movements within a piece of music. Ranges can include Containers, parts of Containers via SpecificResources or fragment URIs, or other Ranges, creating a tree structure like a table of contents. The typical intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. -The intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. Clients _SHOULD_ present only Ranges that have the `label` property and do not have a `behavior` value `no-nav` to the user. Clients _SHOULD NOT_ render Canvas labels as part of the navigation, and a Range that wraps the Canvas _MUST_ be created if this is the desired presentation. - -If there is no Range that has the `behavior` value `sequence`, and the Manifest does not have the `behavior` value `unordered`, then the client _SHOULD_ treat the order of the Canvases in the Manifest's `items` array as the default order. If there is one Range that has the `behavior` value `sequence`, then the client _MUST_ instead use this Range for the ordering. If there is more than one Range that has the `behavior` value `sequence`, for example a second Range to represent an alternative ordering of the pages of a manuscript, the first Range _SHOULD_ be used as the default and the others _SHOULD_ be able to be selected. Ranges that have the `behavior` value `sequence` _MUST_ be directly within the `structures` property of the Manifest, and _MUST NOT_ be [embedded][prezi30-terminology] or [referenced][prezi30-terminology] within other Ranges. These Ranges may have limited hierarchical nesting, but clients are not expected to traverse very deep structures in determining the default order. If this Range includes parts of Canvases, then these parts are the content to render by default and would generate separate entries in a navigation display. This allows for the Canvas to include content outside of the default view, such as a color bar or ruler. - -Ranges _MUST_ have URIs and they _SHOULD_ be HTTP(S) URIs. Top level Ranges are [embedded][prezi30-terminology] or externally [referenced][prezi30-terminology] within the Manifest in a `structures` property. These top level Ranges then embed or reference other Ranges, Canvases or parts of Canvases in the `items` property. Each entry in the `items` property _MUST_ be a JSON object, and it _MUST_ have the `id` and `type` properties. If a top level Range needs to be dereferenced by the client, then it _MUST NOT_ have the `items` property, such that clients are able to recognize that it should be retrieved in order to be processed. - -All of the Canvases or parts that should be considered as being part of a Range _MUST_ be included within the Range's `items` property, or a descendant Range's `items`. - -The Canvases and parts of Canvases need not be contiguous or in the same order as in the Manifest's `items` property or any other Range. Examples include newspaper articles that are continued in different sections, a chapter that starts half way through a page, or time segments of a single canvas that represent different sections of a piece of music. - -Ranges _MAY_ link to an Annotation Collection that has the content of the Range using the `supplementary` property. The [referenced][prezi30-terminology] Annotation Collection will contain Annotations that target areas of Canvases within the Range and link content resources to those Canvases. +Ranges _MUST_ have URIs and they _SHOULD_ be HTTP(S) URIs. Top level Ranges are [embedded][prezi30-terminology] or externally [referenced][prezi30-terminology] within the Manifest in a `structures` property. These top level Ranges then embed or reference other Ranges, Containers or parts of Containers in the `items` property. Each entry in the `items` property _MUST_ be a JSON object, and it _MUST_ have the `id` and `type` properties. If a top level Range needs to be dereferenced by the client, then it _MUST NOT_ have the `items` property, such that clients are able to recognize that it should be retrieved in order to be processed. +The included Containers and parts of Containers need not be contiguous or in the same order as in the Manifest's `items` property or any other Range. Examples include newspaper articles that are continued in different sections, a chapter that starts half way through a page, or time segments of a single canvas that represent different sections of a piece of music. +Ranges _MAY_ link to an Annotation Collection that has the content of the Range using the `supplementary` property. The [referenced][prezi30-terminology] Annotation Collection will contain Annotations that target the Containers within the Range and link content resources to those Containers. ### Scene Components + #### Cameras ##### PerspectiveCamera ##### OrthographicCamera + #### Lights ##### AmbientLight ##### DirectionalLight ##### PointLight ##### SpotLight + #### Transforms ##### TranslateTransform ##### RotateTransform ##### ScaleTransform + ### Other Classes #### Agent #### Service From 323e8f58a5427c1db034632fa9434e2d9f6f36ae Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Fri, 14 Mar 2025 11:36:31 -0400 Subject: [PATCH 025/192] Fix type of WktSelector, fix small typo in TextualBody --- source/presentation/4.0/model.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 03ca77df7..bdb567b40 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -191,7 +191,7 @@ A Specific Resource is a resource in the context of an Annotation. They are used #### TextualBody -A Textual Body is an embedded resource within an Annotation that carries, as the name suggests, a text as the body of the Annotation. It is defined by the Web Annotation Data Model, and this specification defines a new property for it `position` that allows it to be positioned within a Container. +A Textual Body is an embedded resource within an Annotation that carries, as the name suggests, a text as the body of the Annotation. It is defined by the Web Annotation Data Model, and this specification defines a new property for `position` that allows it to be positioned within a Container. #### Choice @@ -252,7 +252,7 @@ WKT Selectors have the following properties: | Name | Description | |-------|-------------| | id | The HTTP(S) URI of the selector | -| type | The class of the selector, which must be "VisualContentSelector" | +| type | The class of the selector, which must be "WktSelector" | | value | The WKT string that defines the geometry to be selected | ```json From 923d8404c509fd88d3e0d7d261cbd251278ae8c6 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Sat, 15 Mar 2025 11:42:51 +0000 Subject: [PATCH 026/192] start content state 2 --- source/content-state/2.0/index.md | 840 ++++++++++++++++++++++++++++++ 1 file changed, 840 insertions(+) create mode 100644 source/content-state/2.0/index.md diff --git a/source/content-state/2.0/index.md b/source/content-state/2.0/index.md new file mode 100644 index 000000000..83cc641d2 --- /dev/null +++ b/source/content-state/2.0/index.md @@ -0,0 +1,840 @@ +--- +title: "IIIF Content State Protocols API 2.0" +title_override: "IIIF Content State Protocols API 2.0" +id: discovery-api-content-state +layout: spec +cssversion: 3 +tags: [specifications, presentation-api] +major: 2 +minor: 0 +patch: 0 +pre: draft +redirect_from: + - /content-state/index.html + - /content-state/2/index.html +pre: draft +editors: + - name: Michael Appleby + ORCID: https://orcid.org/0000-0002-1266-298X + institution: Yale University + - name: Dawn Childress + orcid: https://orcid.org/0000-0003-2602-2788 + institution: UCLA + - name: Tom Crane + ORCID: https://orcid.org/0000-0003-1881-243X + institution: Digirati + - name: Jeff Mixter + orcid: https://orcid.org/0000-0002-8411-2952 + institution: OCLC + - name: Robert Sanderson + ORCID: https://orcid.org/0000-0003-4441-6852 + institution: Yale University + - name: Julie Winchester + ORCID: + institution: Duke University +hero: + image: '' + +--- + + +## Status of this Document +{:.no_toc} +__This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} + +__Latest Stable Version:__ [{{ site.data.apis.content-state.stable.major }}.{{ site.data.apis.content-state.stable.minor }}.{{ site.data.apis.content-state.stable.patch }}][contenstate-stable-version] + +__Previous Version:__ [1.0][contentstate09] + +**Editors** + +{% include api/editors.md editors=page.editors %} + +{% include copyright.md %} + + +---- + +## 1. Introduction +{: #introduction} + +The [IIIF Presentation API][prezi-api] defines a Content State as any IIIF Presentation API resource, or a part of a IIIF Presentation API resource, or group of resources. The Content State is a compact format that can be used to initialize a view of another (typically larger) IIIF Presentation resource in a client It might be generated by a client to transfer a particular view of a resource into another client. The [IIIF Presentation API][prezi-api] provides the format of the _content state_, and this specification T provides mechanisms for passing it between applications regardless of their different user interfaces and capabilities. + + +### 1.1. Objectives and Scope +{: #objectives-and-scope} + +The objective of the IIIF Content State API is to provide a standardized format for sharing of a particular view of one or more [IIIF Presentation API][prezi-api] resources, such as a Collection, a Manifest, or a particular part of a Manifest. + +Example use cases for sharing a resource, or a particular view of a resource, include: + +* A user follows a link from a search result, which opens a IIIF viewer. The viewer focuses on the relevant part of the object, such as a particular line of text that contains the searched-for term. +* A user opens several IIIF Manifests to compare paintings, then wishes to share this set of views with a colleague. + +Other examples include bookmarks, citations, playlists and deep linking into digital objects. + +This specification also describes how a content state is passed from one application to another, such as from a discovery platform to a viewer, so that the viewer can show the intended part of the resource (or resources) to the user. A simple example would be passing a content state description embedded within a query parameter of a URI that tells the viewer to load a IIIF Manifest. + +A viewer can also _export_ a content state, for example to enable a user to share a particular view with another user, or publish it as a reference or citation. Different IIIF clients will have different user interfaces and audiences, and may choose which of these mechanisms to support. Further detailed examples may be found in the [IIIF Cookbook][annex-cookbook]. + +The _content state_ is distinct from the state of any particular viewer's user interface. A viewer state is likely to be client-specific and would concern which panels are open, which options are selected and similar user interface details. Viewers with very different user interfaces can all implement support for the Content State API. + +This specification provides mechanisms that IIIF compatible software can use to expose, share and transfer content state descriptions, but does not specify what form IIIF compatible software itself should take. A web page, a JavaScript web application, a native mobile application, a desktop application, or display kiosk hardware are all capable of sending and receiving content states. + +The intended audience of this document is developers of applications that implement the Presentation API, although other communities may benefit as well. + + +### 1.2. Terminology +{: #terminology} + +The specification uses the following terms: + +* __HTTP(S)__: The HTTP or HTTPS URI scheme and internet protocol. + +* __array__, __JSON object__, __number__, and __string__ in this document are to be interpreted as defined by the [JavaScript Object Notation (JSON)][org-rfc-8259] specification. + +* __Annotation__ is to be interpreted as defined in the [W3C Web Annotation Data Model][org-w3c-webanno] specification. + +The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _SHOULD NOT_, _RECOMMENDED_, _MAY_, and _OPTIONAL_ in this document are to be interpreted as described in [RFC 2119][org-rfc-2119]. + +## 2. Content State +{: #content-state} + +A content state is a JSON-LD data structure that uses the models described by the [IIIF Presentation API][prezi-api] and [W3C Web Annotation Data Model][org-w3c-webanno] specifications. The data structure is a description of a resource, or part of a resource. This data structure can be used by clients to load the resource required, and present a particular part of the resource to the user. The state might be very simple: for example, a link to a Manifest. A more complex content state would provide more detail about the intended target. The following are all behaviors a passed-in content state might produce in a compatible client: + +* _load Manifest M_ +* _load Manifest M, navigate to Canvas C, and zoom in to the region defined by xywh=X,Y,W,H_ +* _load Manifest M, navigate such that Range R is selected, and start playing the time-based canvas C within Range R at time t=T_ + +These intentions can be expressed formally as an Annotation that targets the intended resource, or part of the resource. This content state Annotation can be easily passed into web applications, for example, as a query string parameter, or an HTML `data-` attribute, as defined in the following section on protocol and initialization mechanisms. + +### 2.1. Annotation Model for Content State + +The target of the Annotation is the described IIIF resource, using exactly the same patterns as any other IIIF-targeting Annotation that a IIIF viewer might encounter. + +The target could be any resource described by the Presentation API, for example, a: + +* Manifest +* Range +* Canvas +* spatial or temporal fragment of a Canvas +* spatial or temporal point on a Canvas + +The Annotation _MUST_ contain enough information about de-referenceable resources to show the content in context. For example, a Canvas is often not enough information for a viewer to show the intended view; the Manifest that the Canvas is part of needs to be declared so that the client can load that Manifest first, and then find the Canvas within it. + +### 2.2. Form of Annotation + +Annotations _MAY_ have one or more [motivations][org-w3c-webanno-motivation], that provide the reason(s) why it was created. For example, the `bookmarking` motivation is for annotations intended to convey a bookmark to a resource. + +A content state Annotation _MUST_ have the motivation `contentState`. This motivation is not defined by either the [W3C Web Annotation Data Model][org-w3c-webanno] or the IIIF Presentation API, and is chosen to avoid potential ambiguity when the target of the content state Annotation is itself an Annotation. The content state annotation _MAY_ also have additional motivations such as `bookmarking`, `identifying` and so on, but it is its particular `contentState` motivation that would trigger the required behavior in compatible software. + +A content state annotation can be provided in several forms, described in the following sections. + +Publishers _SHOULD_ provide the content state Annotation in one of the following forms. +A client _SHOULD_ be able to accept and process the content state in all of these forms. + +#### 2.2.1. Full Annotation + +The content state _MAY_ be supplied in JSON-LD as a fully formed Annotation compliant with the [W3C Web Annotation Data Model][org-w3c-webanno] with the motivation `contentState`, as in this example: + +```json +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/Annotation-server/bookmarks/b1", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://example.org/iiif/item1/manifest", + "type": "Manifest" + } +} +``` + +The target of the annotation is, in this case, a complete IIIF resource (here, a Manifest) but in more complex cases, the target could be a part of a IIIF resource. + +#### 2.2.2. Annotation URI + +The content state _MAY_ be supplied as a string whose value is the URI of an Annotation with the motivation `contentState`, that the client must dereference and process. For the example in 2.2.1 above, this would be the URI `https://example.org/Annotation-server/bookmarks/b1`. The response from that URI would be the JSON above. + +#### 2.2.3. Target Body + +The content state _MAY_ be supplied as JSON-LD, as the value of the `target` property of an implied Annotation with the motivation `contentState`. For the example in 2.2.1, this would be: + +```json +{ + "id": "https://example.org/iiif/item1/manifest", + "type": "Manifest" +} +``` + +This form is better suited to scenarios where compactness is important. + +#### 2.2.4. Target URI + +The content state _MAY_ be supplied as a string whose value is the `id` (the dereferenceable URI) of the `target` property only. This is the simplest form and is just the URI of a resource. For the example in 2.2.1, this would be the URI `https://example.org/iiif/item1/manifest`. The client would simply load this Manifest and display it. + +Examples 2.2.2 and 2.2.4 are both URIs. It is up to the client to recognise that 2.2.4 is a Manifest, whereas 2.2.2 is a content state Annotation that points to a Manifest. The client _MUST_ inspect the `type` property to determine what the dereferenced resource is. If the `type` is Annotation, the client _MUST_ also look at the `motivation` property to determine if the Annotation is a content state. If the `motivation` is not `contentState`, but the Annotation has been encountered where a content state is expected, the client _MUST_ assume that the Annotation itself is the intended IIIF content. + +If the `type` property of the target resource, once dereferenced, is `Canvas` or `Range`, then the resource _MUST_ include the Manifest URI that the Canvas or Range is to be found in, using the `partOf` property, as in example 2.2.5 below. + +#### 2.2.5. Limitations of Simple URIs + +While supporting many requirements for sharing resources and initializing a client application, the 2.2.4 form is not capable of expressing content states that are part of a IIIF resource, such as a region of a Canvas, or a Canvas URI that is not itself de-referenceable. One of the other forms must be used for these purposes. + +```json +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/import/1", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://example.org/object1/canvas7#xywh=1000,2000,1000,2000", + "type": "Canvas", + "partOf": [{ + "id": "https://example.org/object1/manifest", + "type": "Manifest" + }] + } +} +``` + +This description cannot be conveyed by just a Canvas URI or a Manifest URI; it needs the structure provided by a content state Annotation. It can be reduced to the target body form, but no further: + +```json +{ + "id": "https://example.org/object1/canvas7#xywh=1000,2000,1000,2000", + "type": "Canvas", + "partOf": [{ + "id": "https://example.org/object1/manifest", + "type": "Manifest" + }] +} +``` + +The requirement to dereference the URI before being able to process the content state might also have usability or performance implications around network latency. For example, if a client is processing a lot of content state Annotations, or the environment is untrusted and dereferencing unrecognized URIs to determine what they are might introduce the possibility of malicious URIs being constructed to adversely affect either the client or the publisher of the URI, then the other forms are likely to be preferred. + + +## 3. Protocols +{: #initialization} + +This section defines _Protocols_ for the transfer of this data, so that implementing software can send or receive a content state without specific knowledge of other participating software. These protocols make use of widely supported features of modern web browsers: + +* Passing a content state as a query string parameter in an HTTP GET request (3.1) +* Passing a content state as a parameter in an HTTP POST request (3.2) +* Reacting to the [Paste][org-mozilla-paste] event, where the pasted data is the URI of a content state or the full content state Annotation (3.3) +* Using the [Drag and Drop API][org-mozilla-drag-drop] to expose and accept content states (3.4) +* Uploading content state from the client machine via the [FileReader][org-mozilla-filereader] interface (3.5) +* Initialising a client via an HTML5 `data-*` attribute (3.6) + +The data structure _MAY_ be made available to the client using these protocols. Other mechanisms are possible, but outside the scope of the specification. + + +### 3.1. Linking: HTTP GET (Query String) Parameter +{: #initialization-mechanisms-link} + +If a client is capable of reading the content state from the value of an HTTP GET request parameter, it _MUST_ look for the content state in a request parameter called `iiif-content`. + +If the intention is that the linked-to client loads an entire IIIF resource without focusing on any particular part, the simplest form of the content state _SHOULD_ be used: + +```html +{% raw %} +Link to Viewer +{% endraw %} +``` + +In this case the client at `https://example.org/viewer` would load the resource at `https://damsssl.llgc.org.uk/iiif/2.0/4389767/manifest.json`, determine that it is a Manifest (rather than, say, a Collection), and process accordingly. + +When the intention is to initialize the viewer at a particular part of the resource, the client provides more than just a URI; it must provide either the full annotation as in 2.2.1., or, preferably (for brevity) the body of the annotation, as in 2.2.3. + +In both of these scenarios, the GET request parameter _MUST_ be content-state-encoded as described in [Section 6][contentstate-encoding] below. This is required to avoid potential corruption of the content state, as explained in [Section 6][contentstate-encoding]. + +In the following examples, the same Annotation is used each time. As the full JSON-LD annotation, this is: + +```json +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/content-states/1", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://damsssl.llgc.org.uk/iiif/2.0/4389767/canvas/4389772.json", + "type": "Canvas", + "partOf": [ + { + "id": "https://damsssl.llgc.org.uk/iiif/2.0/4389767/manifest.json", + "type": "Manifest" + } + ] + } +} +``` + +An example of this usage would be a link from search results to a particular page of a digitized book, or a stored bookmark of a particular page (i.e., Canvas). + +Without the required content-state-encoding, the (invalid) link to the viewer would look like this: + +```html +{% raw %} + +INVALID, unencoded link to Viewer +{% endraw %} +``` + +However, this JSON-LD content MUST be content-state-encoded as in [Section 6][contentstate-encoding] below: + +```html +{% raw %} +Link to Viewer +{% endraw %} +``` + +To reduce the size of the encoded content state, it _SHOULD_ be passed as just the `target` property of an implied Annotation with motivation `contentState`, that is, the fragment: + +```json +{ + "id": "https://damsssl.llgc.org.uk/iiif/2.0/4389767/canvas/4389772.json", + "type": "Canvas", + "partOf": [ + { + "id": "https://damsssl.llgc.org.uk/iiif/2.0/4389767/manifest.json", + "type": "Manifest" + } + ] +} +``` + +This results in a more compact form, unencoded (and invalid), this would be: + +```html +{% raw %} + +Link to Viewer +{% endraw %} +``` + +However, this fragment MUST be content-state-encoded as in [Section 6][contentstate-encoding] below: + +```html +{% raw %} +Link to Viewer +{% endraw %} +``` + +#### 3.1.1. Load by Reference + +This is a variant of the above, with the parameter value being a URI rather than the content itself. + +```html +Link to Viewer +``` + +If the Content State is a URI, it _MUST NOT_ be content-state-encoded. + +### 3.2. HTTP POST (Form) Parameter +{: #initialization-mechanisms-post} + + +The same data structure, in the same formats, may instead be passed to a server in an HTTP POST, for example by a JavaScript client. This is also suited to server-side web applications, such as a web page rendering citations or a view initialized on the server. It is not suitable for initialising a standalone JavaScript application, as the POST data is typically unavailable. + +The data _SHOULD_ be sent with the `Content-Type` header value `application/json`, and the body _MUST NOT_ be content-state-encoded. + +```javascript + +async function postContentState(url, contentState) { + // Default options are marked with * + const response = await fetch(url, { + method: 'POST', + mode: 'cors', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(contentState) // body data type must match "Content-Type" header + }); + return response.json(); // parses JSON response into native JavaScript objects +} + +let target = 'https://example.com/bookmarking-service'; +let myBookmark = captureContentState(); // implementation not specified! + +postContentState(target, myBookmark) + .then(reply => { + console.log(reply); + }); +``` +In this example, the server at `https://example.com/bookmarking-service` should expect to process the _unencoded_ content state in the same forms and variants as above. + + +### 3.3. Accepting the Content State as a Paste Operation +{: #initialization-mechanisms-paste} + +The client allows the content state URI or data to be pasted into part of its UI (e.g., from a "Load..." option exposing a `textarea` element for the user to manually paste into). A client can also accept a paste operation transparently, by reading from the clipboard: + +```html + +``` + +The first parameter to `getData` is the content type, and for maximum interoperability within the scope of this specification this _MUST_ be `"text/plain"`. + +In that scenario the user can paste the content state directly into the application. If this scenario is supported, the client _SHOULD_ accept resource URIs directly, such as the URI of a Manifest. The content state _MUST NOT_ be content-state-encoded. + +Refer to [Section 3.7][contentstate-export] below for methods of exporting data, including the _Copy to Clipboard_ pattern, a natural pairing with a paste operation, from one viewer to another. + + +### 3.4. Drag and Drop +{: #initialization-mechanisms-dragdrop} + +In this scenario, one system provides a _draggable_ element: + +```html + + + +``` + +And another system provides an element capable of receiving a `drop` event: + +```html +
+ +
+ + +``` + +This technique can also be used within the same client, to drag a content state from one part to another. + +The first parameter to `setData` and `getData` is the content type, and for maximum interoperability within the scope of this specification this _MUST_ be `"text/plain"`. Applications can assert multiple additional content types for their own custom behavior, such as dragging from the application to the desktop and saving as a file, but this is outside the scope of the specification. In the above example, the content of the drag and drop operation could be a plain URI, or unencoded JSON-LD. It _MUST NOT_ be content-state-encoded. + + +### 3.5. Upload File + +A JavaScript client can accept content state from the local machine via the `FileReader` interface: + +```html +
+
+ +
+ + +``` + +The same rules apply; the viewer _MUST_ dereference and process the Annotation at that URI. The uploaded content _MUST NOT_ be content-state-encoded. + +### 3.6. Common Initialization Parameter + +If a IIIF client can accept a content state via a custom HTML attribute, then it _SHOULD_ use the attribute `data-iiif-content` for this purpose, to assist page developers using that client in understanding what the attribute is for. A viewer that accepts a content state _SHOULD_ process an Annotation in any of the forms described in the GET parameter section, but _MUST NOT_ be content-state-encoded. + +```html + +

Loading a whole manifest

+
+
+ +

Loading a manifest to show a particular Canvas

+
+
+``` + +### 3.7. Exporting Current Content State from Viewer +{: #export} + +There are further ways in which a client can _export_ its current content state, beyond populating a drag and drop operation as in example 3.4. While interoperability concerns require this specification to describe the ways in which a client can _accept_ state, the ways in which a content state might have arrived on a user's clipboard are out of scope here, and are covered in the [IIIF Cookbook][annex-cookbook]. These include: + +* Copy to Clipboard +* Download File +* Display for Copying +* Send to External Service + + +## 4. Processing Received Content States + +Once the content state has been created (following the patterns in section 2) and transferred to the receiving client (using a protocol described in section 3), the client must then process the received content state. + +If the content state is a simple URI, the client _MUST_ load the resource at that URI and process it. The resource at that URI _MUST_ be the full content state Annotation as in 2.2.2 or a IIIF Resource as in 2.2.4. That is, the dereferenced response _MUST_ be JSON-LD, and _SHOULD_ have a value of `type` taken from `Annotation`, `Collection`, `Manifest`, `Canvas` and `Range`. The response _MUST_ use UTF-8 encoding. + +If the content state is JSON-LD the client _MUST_ inspect the `type` property to decide whether the value is the full content state Annotation (indicated by the additional presence of the `contentState` motivation, as in example 2.2.1), or the value of the `target` property of an implied content state Annotation (as in example 2.2.3). + + +## 5. Examples of Content States + +The following examples demonstrate the use of the existing IIIF Presentation API and W3C Web Annotation Data Model to describe parts of resources. Any IIIF resource that can be expressed in the Presentation model can be used in a content state. The full form of the Annotation (as if it were available at the URI given in the `id` property) has been used in each case. Further examples can be found in the [IIIF Cookbook][annex-cookbook]. + +Publishers _SHOULD_ provide the simplest JSON-LD representation, and not assume that any client can handle arbitrarily complex content states. + +### 5.1. A Region of a Canvas in a Manifest + +```json +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/import/1", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://example.org/object1/canvas7#xywh=1000,2000,1000,2000", + "type": "Canvas", + "partOf": [{ + "id": "https://example.org/object1/manifest", + "type": "Manifest" + }] + } +} +``` + +When processed by a viewer, the user should see the rectangle `1000,2000,1000,2000` highlighted on the Canvas given in the `id` parameter; the viewer loads the manifest linked to in the `partOf` property and navigates to that canvas, and then fills the viewport with that rectangle or otherwise draws attention to it. + + +### 5.2. Start Playing at a Point in a Recording + +```json +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/import/2", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/id1/canvas1", + "type": "Canvas", + "partOf": [{ + "id": "https://example.org/iiif/id1/manifest", + "type": "Manifest" + }] + }, + "selector": { + "type": "PointSelector", + "t": 14.5 + } + } +} +``` + +This example should cause a viewer to open Manifest `https://example.org/iiif/id1/manifest`, navigate to Canvas `https://example.org/iiif/id1/canvas1`, and start playing at 14.5 seconds into that canvas. + + +### 5.3. Multiple Targets for a Comparison View + +```json +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/import/3", + "type": "Annotation", + "motivation": "contentState", + "target": [ + { + "id": "https://example.org/iiif/item1/canvas37", + "type": "Canvas", + "partOf": [ + { + "id": "https://example.org/iiif/item1/manifest", + "type": "Manifest" + } + ] + }, + { + "id": "https://example.org/iiif/item2/canvas99", + "type": "Canvas", + "partOf": [ + { + "id": "https://example.org/iiif/item2/manifest", + "type": "Manifest" + } + ] + } + ] +} +``` + +Here the viewer should open two manifests at once (if it is capable of such a view). + + +### 5.4. Search Results + +The following example uses the compact, query string form of the content state to demonstrate what HTML search results linking to a particular viewer might look like. + +Firstly, in non-valid, unencoded form to show the annotation: + +```html +

Results for "cats"

+
    +
  1. + +

    Alice in Wonderland

    +

    ...she has often seen a cat without a grin but never a grin without a cat

    +
  2. + +
+``` + +...and then in valid, content-state-encoded form: + +```html +

Results for "cats"

+
    +
  1. +

    Alice in Wonderland

    +

    ...she has often seen a cat without a grin but never a grin without a cat

    +
  2. + +
+``` + +## 6. Content State Encoding + +When a Content State is sent in an HTTP GET operation such as a query string parameter on a link in a search result or even an email, it is vulnerable to corruption - it might get encoded and re-encoded before it arrives at a viewer or other IIIF-compatible software. This section defines the requirements for safely encoding content states, to provide the string representation seen in the above examples. + +### 6.1. Choice of encoding mechanism + +A content state will contain characters from JSON syntax, and may contain strings from any language. The identifiers of annotations and other resources within the content state _MAY_ be Internationalized Resource Identifiers (IRIs), as defined in [RFC 3987][org-rfc-3987]. For these reasons the content state _MUST_ be _encoded_ using an encoding that: + +* Is simple to implement, for both decoding and encoding, in a web browser and on the server +* Will safely encode any UTF-16 string from JavaScript, avoiding known browser issues such as the ["Unicode Problem"][btoa-unicode-problem] +* Is impervious to _double encoding_ - that is, once encoded, any further likely encodings of any request or response parts will not change the already-encoded content state. + +This specification defines a two-step encoding that uses both the [encodeURIComponent][org-ecma-encodeuricomponent] function available in web browsers, followed by [Base 64 Encoding with URL and Filename Safe Alphabet][org-rfc-4648-5] ("base64url") encoding, with padding characters removed. The initial encodeURIComponent step allows any UTF-16 string in JavaScript to then be safely encoded to base64url in a web browser. The final step of removing padding removes the "=" character which might be subject to further percent-encoding as part of a URL. + +This process is described by the term _content-state-encoding_ throughout this specification. + +**Note that "base64url" is not the same encoding as "base64".** + +The process to encode a content state is: + +* encode to a UTF-8 string described by [encodeURIComponent][org-ecma-encodeuricomponent] +* encode the resulting UTF-8 string as [base64url][org-rfc-4648-5] +* remove any "=" padding characters from the end + +Conversely to decode a content state: + +* restore any removed "=" padding characters to the end of the string to make it a multiple of 4 characters long. +* decode the resulting string from base64url to a UTF-8 string +* decode the resulting UTF-8 string as described by [decodeURIComponent][org-ecma-decodeuricomponent] + +Code samples for these operations are given in the next section. + +### 6.2. Content State encoding and URI requirements + +* Any content state that is in JSON-LD form, rather than a simple URI string, _MUST_ be _content-state-encoded_ when passed as a GET parameter on a query string, and a client _MUST_ accept it in this form. + +* Content state resource identifiers must be URIs, for consistency with the IIIF Presentation API. They _MUST NOT_ contain characters that would make them [IRIs][org-rfc-3987] but not URIs, even though the [W3C Web Annotation Data Model][org-w3c-webanno] permits IRIs. + +* When the content state is a plain URI, rather than a JSON object, it _MUST NOT_ be content-state-encoded. + +* Any content state passed by mechanisms other than a HTTP GET request parameter _MUST NOT_ be content-state-encoded. + +* When published as inline, encoded JSON-LD in the full form given in section 2.2. above, the content state Annotation _MAY_ omit the `id` and `@context` properties. + +* When published on a server for clients to fetch over HTTP, in the same way a client would fetch a Manifest or Collection, content states _MUST_ be valid JSON-LD documents conforming to the [IIIF Presentation API][prezi-api] and served as described in [Section 7][contentstate-http] below. They _MUST NOT_ be content-state-encoded, but _MAY_ have other encodings appropriate for JSON content, such as `Content-Encoding: gzip` to reduce the response size. + + +### 6.3. Examples of Content State Encoding + +JavaScript and Python examples are given below. Examples for other languages and frameworks can be found in the [IIIF Cookbook][annex-cookbook]. + +#### 6.3.1. JavaScript + +```javascript +function encodeContentState(plainContentState) { + let uriEncoded = encodeURIComponent(plainContentState); // using built in function + let base64 = btoa(uriEncoded); // using built in function + let base64url = base64.replace(/\+/g, "-").replace(/\//g, "_"); + let base64urlNoPadding = base64url.replace(/=/g, ""); + return base64urlNoPadding; +} + + +function decodeContentState(encodedContentState) { + let base64url = restorePadding(encodedContentState); + let base64 = base64url.replace(/-/g, '+').replace(/_/g, '/'); + let base64Decoded = atob(base64); // using built in function + let uriDecoded = decodeURIComponent(base64Decoded); // using built in function + return uriDecoded; +} + + +function restorePadding(s) { + // The length of the restored string must be a multiple of 4 + let pad = s.length % 4; + let padding = ""; + if (pad) { + if (pad === 1) { + throw new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding'); + } + s += '===='.slice(0, 4 - pad); + } + return s + padding; +} +``` + +#### 6.3.2. Python + +```python +import base64 +import urllib + +def encode_content_state(plain_content_state): + # The safe='' is required below, as the default is '/' + # We want to match the behavour of encodeURIComponent and encode '/' as '%2F' + uri_encoded = urllib.parse.quote(plain_content_state, safe='') # equivalent of encodeURIComponent + utf8_encoded = uri_encoded.encode("UTF-8") + base64url = base64.urlsafe_b64encode(utf8_encoded) + utf8_decoded = base64url.decode("UTF-8") + base64url_no_padding = utf8_decoded.replace("=", "") + return base64url_no_padding + + +def decode_content_state(encoded_content_state): + padded_content_state = restore_padding(encoded_content_state) + base64url_decoded = base64.urlsafe_b64decode(padded_content_state) + utf8_decoded = base64url_decoded.decode("UTF-8") + uri_decoded = urllib.parse.unquote(utf8_decoded) + return uri_decoded + + +def restore_padding(s): + # string length must be a multiple of 4 + pad = len(s) % 4 + padding = "" + if pad: + if pad == 1: + raise Exception("InvalidLengthError: Input base64url string is the wrong length to determine padding") + padding = "=" * (4 - pad) + return s + padding + +``` + +Given the following content state annotation: + +```json +{ + "id": "https://example.org/object1/canvas7#xywh=1000,2000,1000,2000", + "type": "Canvas", + "partOf": [{ + "id": "https://example.org/object1/manifest", + "type": "Manifest" + }] +} +``` + +The JSON can be optionally condensed to remove unnecessary whitespace: + +``` +{"id":"https://example.org/object1/canvas7#xywh=1000,2000,1000,2000","type":"Canvas","partOf":[{"id":"https://example.org/object1/manifest","type":"Manifest"}]} +``` + +The condensed form is then encoded (this example in Python): + +```python +>>> encode_content_state(condensed) + +'JTdCJTIyaWQlMjIlM0ElMjJodHRwcyUzQSUyRiUyRmV4YW1wbGUub3JnJTJGb2JqZWN0MSUyRmNhbnZhczclMjN4eXdoJTNEMTAwMCUyQzIwMDAlMkMxMDAwJTJDMjAwMCUyMiUyQyUyMnR5cGUlMjIlM0ElMjJDYW52YXMlMjIlMkMlMjJwYXJ0T2YlMjIlM0ElNUIlN0IlMjJpZCUyMiUzQSUyMmh0dHBzJTNBJTJGJTJGZXhhbXBsZS5vcmclMkZvYmplY3QxJTJGbWFuaWZlc3QlMjIlMkMlMjJ0eXBlJTIyJTNBJTIyTWFuaWZlc3QlMjIlN0QlNUQlN0Q' +``` + +The string "JTdC..." is the now URI-safe, encoded form of the content state, suitable for passing to and from web applications. + + + +## 7. HTTP Requests and Responses + +This section describes the _RECOMMENDED_ request and response interactions for the API, when served as JSON-LD bodies of HTTP responses. It does not apply to _inline_ content states, which are encoded as described in section 2.3, and transfered by the other mechanisms described above. This section follows the specification given in [Section 6][prezi30-http] of the Presentation API. + +### 7.1. Requests + +An HTTP request for a content state is the same as an HTTP request for a Presentation API resource. Unlike [IIIF Image API][image-api] requests, or other parameterized services, the URIs for Presentation API resources cannot be assumed to follow any particular pattern. A client that fetches URIs for content states and URIs for Presentation API resources (such as Manifests and Collections) by the same mechanism _MUST_ inspect the response to determine whether it is a Presentation API resource, or a content state that references part of a Presentation API resource. + +### 7.2. Responses + +The format for content states as HTTP responses is JSON, as described above. It is good practice for all resources with an HTTP(S) URI to provide their description when the URI is dereferenced. If a resource is [referenced][prezi30-terminology] within a response, rather than being [embedded][prezi30-terminology], then it _MUST_ be able to be dereferenced. + +If the server receives a request with an `Accept` header, it _SHOULD_ respond following the rules of [content negotiation][org-rfc-7231-conneg]. Note that content types provided in the `Accept` header of the request _MAY_ include parameters, for example `profile` or `charset`. + +If the request does not include an `Accept` header, the HTTP `Content-Type` header of the response _SHOULD_ have the value `application/ld+json` (JSON-LD) with the `profile` parameter given as the context document: `http://iiif.io/api/presentation/3/context.json`. + +``` none +Content-Type: application/ld+json;profile="http://iiif.io/api/presentation/3/context.json" +``` +{: .urltemplate} + +If the `Content-Type` header `application/ld+json` cannot be generated due to server configuration details, then the `Content-Type` header _SHOULD_ instead be `application/json` (regular JSON), without a `profile` parameter. + +``` none +Content-Type: application/json +``` +{: .urltemplate} + +The HTTP server _MUST_ follow the [CORS requirements][org-w3c-cors] to enable browser-based clients to retrieve the descriptions. Recipes for enabling CORS and conditional Content-Type headers are provided in the [Apache HTTP Server Implementation Notes][notes-apache]. + + +## Appendices + +### A. Acknowledgements +{: #acknowledgements} + +Many thanks to the members of the [IIIF community][iiif-community] for their continuous engagement, innovative ideas, and feedback. + +This version is due to the work of the [IIIF Discovery Technical Specification Group][groups-discovery], chaired by Antoine Isaac (Europeana), Matthew McGrattan (Digirati) and Rob Sanderson (Yale University). The IIIF Community thanks them for their leadership, and the members of the group for their tireless work. + +### B. Change Log +{: #change-log} + +| Date | Description | +| ---------- | ----------------------- | +| 2022-02-09 | Version 1.0 (Drop Dragon) | +| 2022-01-31 | Version 0.9.1 (unnamed) | +| 2021-06-21 | Version 0.9 (unnamed) | +| 2020-11-22 | Version 0.3 (unnamed) | +| 2019-02-04 | Version 0.2 (unnamed) | +| 2018-10-31 | Version 0.1 (unnamed) | + +{% include links.md %} From bf008fa19bfa5f7b444ec2c3b448653b2a73a7ec Mon Sep 17 00:00:00 2001 From: tomcrane Date: Sun, 16 Mar 2025 07:20:19 -0400 Subject: [PATCH 027/192] expansion of content state desc in P4 index.md --- source/presentation/4.0/index.md | 378 ++++++++++++++++++++++++++++++- source/presentation/4.0/model.md | 3 +- 2 files changed, 369 insertions(+), 12 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 90031b658..0bf3c6cb9 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -361,25 +361,383 @@ use totalItems? https://iiif.io/api/discovery/1.0/#totalitems ## Content State -(introduce motivation and reasons) +A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: -Separate Content State Sharing spec (protocols for sharing annotations) +A "bare" Manifest URI: -content state intended to: +``` +https://example.org/manifests/1 +``` - - load a view of some resource (existing spec) - - load a view of some resource AND modify the Container (show you my new anno, add camera) - - modify the Container in a particular context (`scope`, storytelling) - - contribute additional information permanently (rerum **inbox** - move to protocol doc) +A reference to a Manifest: -### Using Content State +```json +{ + "id": "https://example.org/manifests/1", + "type": "Manifest" +} +``` + +A region of a Canvas within a Manifest: + +```json +{ + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/1", + "type": "Manifest" + } +} +``` + +Two versions of a painting from different publishers: + +```json +[ + { + "id": "https://gallery-1.org/iiif/sunflowers/canvas1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-1.org/iiif/sunflowers", + "type": "Manifest" + } + ] + }, + { + "id": "https://gallery-2.org/collection/sunflowers/c1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-2.org/collection/sunflowers", + "type": "Manifest" + } + ] + } +] +``` + +A Scene with a Camera at a particular point: + + +```json +{ + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "items": [ + { + "id": "https://example.org/iiif/3d/anno8", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": { + "en": [ + "Perspective Camera Pointed At Front of Cranium and Mandible" + ] + }, + "fieldOfView": 50.0, + "near": 0.1, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + } + ] +} +``` + +The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). + +Content States are used for the following applications: + +### Load a particular view of a resource or group of resources + +In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. + +The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the [Content State Protocol API 2.0](content-state-2) specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. + + +### Load a particular view of some resource and modify it + +In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: + +```json +{ + "id": "https://example.org/import/3", + "type": "Annotation", + "motivation": "contentState", + "target": { + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/nook12", + "type": "Manifest" + }, + "annotations": [ + { + "id": "https://my-annotation-store.org/user4532/notes-on-book12/p1", + "type": "AnnotationPage" + } + ] + } +} +``` + +As well as adding resources not present in the referred-to resource, the Content State can also remove parts of the referred-to resource from the user's view by applying the behavior `hidden` to them: + +```jsonc +{ + // What does this actually look like? I want to load bnf_chateauroux example but HIDE the illumination + // ... + "id": "https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/annotation/p0001-image", + "type": "Annotation", + "motivation": "painting", + "behavior": ["hidden"] +} +``` + +TODO: what is the processing algorithm for applying incoming `hidden` ? + +When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. + + +### Modify the Container in a particular context + +The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. + + +Consider a Scene with two models, and two `commenting` annotations: + +```jsonc +{ + "id": "https://example.org/iiif/3d/whale_comment_scope_content_state.json", + "type": "Manifest", + "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ] + } + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/p1/annotations/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno7", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Mandibular tooth", + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno5", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Right pterygoid hamulus", + "target": { + // SpecificResource with PointSelector + } + } + ] + } + ] +} +``` + +In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. + +In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. It may be useful to light the Scene differently in different contexts. + +In the same way an incoming Content State can modify a Scene as it initializes the client, so can a Content State attached to each (non-`painting`) annotation target modify the Scene as the user moves between different annotations. + +The `scope` property of an annotation `target` provides _contextual_ Content State - the viewer should modify the Scene by applying the Content State carried by the `scope` property _only when the user is in the context of that annotation_. + +Taking the first commenting annotation from the above example and adding a `scope` property, whose value is an annotation with the motivation `contentState`, we can introduce a new Camera specifically for this particular annotation, so that when the user selects this comment, the client will switch the view to this camera. This example also changes the background color of the Scene: + +```jsonc +{ + "id": "https://example.org/iiif/3d/anno7", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Mandibular tooth", + "target": { + + // SpecificResource with PointSelector + // "type": "SpecificResource", + // "source": ... the Scene... + // "selector": ... a point ... + + "scope": { // a modification to the Scene, only in the context of this annotation + + "id": "https://example.org/iiif/3d/anno4", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "backgroundColor": "yellow", + "items": [ + { + "id": "https://example.org/iiif/3d/anno8", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, + "fieldOfView": 50.0, + "near": 0.10, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + } + ] + } + } + } +} +``` + +In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of `scope` allows a precise storytelling experience to be specified, including: + + - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) + - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest + - hiding parts of the Scene for a step + - introducing additional models at a particular step + - (and many more!) + +Use of `scope` is permitted in annotations on any Container type, not just Scenes. For example, a 2D narrative around a Canvas might show or hide different `painting` annotations at each step. + +#### The `sequence` behavior + +// Is this right? Language... + +While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. + +### Content States on Manifests + +When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. + +// Is there some overlap here with Range? + +### Processing Content States in Scopes: reset + +// This may not be what we have discussed... + +When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. + +The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `sequence`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. If this behavior is not wanted, the `reset` property of the content state annotation should be set to `true`: + +```json +{ + "type": "Annotation", + "motivation": ["contentState"], + "reset": true +} +``` + +Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. + +// I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... + +### Contribute additional information permanently + +Rerum inbox scenario - should be covered in CS2 protocol + +### activating + +Extension of hotspot linking + +An annotation with the motivation `activating` can also carry a Content State in its body. + +There are two uses of the `activating` annotation: + +- triggering a content state +- triggering a named animation -(not in section 6) ### reset -"diff", "original state" etc +See above... +"diff", "original state" etc behavior for "force-order"? behavior: sequence diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 03ca77df7..4860f7bd6 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1584,8 +1584,7 @@ Additional motivations may be added to the Annotation to further clarify the int | ----- | ----------- | | `painting` | Resources associated with a Canvas by an Annotation that has the `motivation` value `painting` _MUST_ be presented to the user as the representation of the Canvas. The content can be thought of as being _of_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `painting`, a body of an Image and the target of the Canvas is an instruction to present that Image as (part of) the visual representation of the Canvas. Similarly, a textual body is to be presented as (part of) the visual representation of the Canvas and not positioned in some other part of the user interface.| | `supplementing` | Resources associated with a Canvas by an Annotation that has the `motivation` value `supplementing` _MAY_ be presented to the user as part of the representation of the Canvas, or _MAY_ be presented in a different part of the user interface. The content can be thought of as being _from_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `supplementing`, a body of an Image and the target of part of the Canvas is an instruction to present that Image to the user either in the Canvas's rendering area or somewhere associated with it, and could be used to present an easier to read representation of a diagram. Similarly, a textual body is to be presented either in the targeted region of the Canvas or otherwise associated with it, and might be OCR, a manual transcription or a translation of handwritten text, or captions for what is being said in a Canvas with audio content. | - -| `contentState` | ... content state here ...| +| `contentState` | An annotation with the motivation `contentState` | | `activating` | ... activating annotations here ... | From adfcc6d08e45a49eb86d34500e21bd0a43d32c27 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 17 Mar 2025 05:41:55 -0400 Subject: [PATCH 028/192] describe activating motivation --- source/presentation/4.0/index.md | 161 +++++++++++++++++++++++++++++-- 1 file changed, 155 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 0bf3c6cb9..a23df8799 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -469,6 +469,8 @@ A Scene with a Camera at a particular point: The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). +Annotations with the motivation `contentState` are referred to as _content state_ annotations. + Content States are used for the following applications: ### Load a particular view of a resource or group of resources @@ -721,16 +723,163 @@ Before applying the content state to the Scene, the client should reset the Scen Rerum inbox scenario - should be covered in CS2 protocol -### activating +### activating - animation and interactions + +Annotations with the motivation `activating` are referred to as _activating_ annotations. + +There are two uses of `activating` annotations: -Extension of hotspot linking +#### Triggering a content state -An annotation with the motivation `activating` can also carry a Content State in its body. +An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. + +The activating annotation is provided in a Container's `annotations` property. In this (contrived for brevity) example, if the user clicks the mandible model, the Scene background changes color: + +```jsonc +{ + "id": "https://example.org/iiif/3d/activating.json", + "type": "Manifest", + "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene", + "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "A label for the activation may be provided as a TextualBody" + }, + { + // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene", + "backgroundColor": "#FF99AA" + } + ], + "target": { + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", + "type": "Annotation" + } + } + ] + } + ] + } + ] + } + ] +} +``` -There are two uses of the `activating` annotation: +// Can you put activating annotations in `manifest.annotations`? They would work there too, you have all the information. -- triggering a content state -- triggering a named animation + + +#### Triggering a named animation in a model + +Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. + +This pattern is similar to the above, except that: + + - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) + - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. + + The format of the `value` string is implementation=specific, and will depend on how different 3D formats support addressing of animations within models. + + +```jsonc +{ + "id": "https://example.org/iiif/3d/activating-animation.json", + "type": "Manifest", + "label": { "en": ["Music Box with lid that opens as an internal animation"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/scene-with-activation-animation", + "type": "Scene", + "label": { "en": ["A Scene Containing a Music Box"] }, + "items": [ + { + "id": "https://example.org/iiif/scene-with-activation-animation/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-music-box", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "Click the box to open the lid" + } + ], + "target": [ + { + "type": "SpecificResource", + "source": "https://example.org/iiif/3d/painting-anno-for-music-box", + "selector": [ + { + "type": "AnimationSelector", + "value": "open-the-lid" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +``` ### reset From 3a422f81cd91130836ed0b6129c3249b9cfc24c6 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 17 Mar 2025 06:18:53 -0400 Subject: [PATCH 029/192] contentState and activating motivations, WIP --- source/presentation/4.0/index.md | 11 ++++++++++- source/presentation/4.0/model.md | 10 +++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index a23df8799..822e068f7 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -812,7 +812,8 @@ This pattern is similar to the above, except that: - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. - The format of the `value` string is implementation=specific, and will depend on how different 3D formats support addressing of animations within models. + The format of the `value` string is implementation=specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. + ```jsonc @@ -881,6 +882,14 @@ This pattern is similar to the above, except that: } ``` +// TODO + +activating to apply a content state and activating to trigger a named animation - use of body and target... what if we want to click a painting anno to trigger the animation? +Can we ADD that to the target, alongside the SpecificResource with the AnimationSelector? + +if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody (or list of TextualBody)? + +There is a more general rule here! ### reset diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 4860f7bd6..49d2cf69d 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1582,12 +1582,12 @@ Additional motivations may be added to the Annotation to further clarify the int | Value | Description | | ----- | ----------- | -| `painting` | Resources associated with a Canvas by an Annotation that has the `motivation` value `painting` _MUST_ be presented to the user as the representation of the Canvas. The content can be thought of as being _of_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `painting`, a body of an Image and the target of the Canvas is an instruction to present that Image as (part of) the visual representation of the Canvas. Similarly, a textual body is to be presented as (part of) the visual representation of the Canvas and not positioned in some other part of the user interface.| -| `supplementing` | Resources associated with a Canvas by an Annotation that has the `motivation` value `supplementing` _MAY_ be presented to the user as part of the representation of the Canvas, or _MAY_ be presented in a different part of the user interface. The content can be thought of as being _from_ the Canvas. The use of this motivation with target resources other than Canvases is undefined. For example, an Annotation that has the `motivation` value `supplementing`, a body of an Image and the target of part of the Canvas is an instruction to present that Image to the user either in the Canvas's rendering area or somewhere associated with it, and could be used to present an easier to read representation of a diagram. Similarly, a textual body is to be presented either in the targeted region of the Canvas or otherwise associated with it, and might be OCR, a manual transcription or a translation of handwritten text, or captions for what is being said in a Canvas with audio content. | -| `contentState` | An annotation with the motivation `contentState` | - -| `activating` | ... activating annotations here ... | +| `painting` | Resources associated with a Container by an Annotation that has the `motivation` value `painting` _MUST_ be presented to the user as the representation of the Container. The content can be thought of as being _of_ the Container. The use of this motivation with target resources other than Containers is undefined. For example, an Annotation that has the `motivation` value `painting`, a body of an Image and the target of a Canvas is an instruction to present that Image as (part of) the visual representation of the Canvas. Similarly, a textual body is to be presented as (part of) the visual representation of the Container and not positioned in some other part of the user interface.| +| `supplementing` | Resources associated with a Container by an Annotation that has the `motivation` value `supplementing` _MAY_ be presented to the user as part of the representation of the Container, or _MAY_ be presented in a different part of the user interface. The content can be thought of as being _from_ the Container. The use of this motivation with target resources other than Containers is undefined. For example, an Annotation that has the `motivation` value `supplementing`, a body of an Image and the target of part of a Canvas is an instruction to present that Image to the user either in the Canvas's rendering area or somewhere associated with it, and could be used to present an easier to read representation of a diagram. Similarly, a textual body is to be presented either in the targeted region of the Container or otherwise associated with it, and might be OCR, a manual transcription or a translation of handwritten text, or captions for what is being said in a Timeline with audio content. | +| `contentState` | An annotation with the motivation `contentState` has any valid IIIF Resource, or list of IIIF resources, or references to IIIF resources as its `target` property. The client either loads the resource(s) indicated by the Content State annotation `target`, or modifies the view of a currently loaded resource by applying the changes implied by the annotation target - for example, adding a new Light to a Scene where the Light is first introduced in the annotation `target`. The expected interaction depends on how the annotation is linked to the resource the client is currently rendering, or how the annotation is introduced to the client. The [Content State Protocol API 2.0](link) describes the ways in which a Content State may be conveyed into a Client or exported from a Client, e.g., as an initialization parameter, or as an exported "Share..." state. Other parts (...) of this specification describe how a Content State in the context of a `commenting` or other annotation modifies the Container when the user selects that annotation, such as changing the camera, lighting or even the models in a Scene as the user progresses though the steps of a narrative conveyed by `describing` annotations. | +| `activating` | An annotation with the motivation `activating` has any valid IIIF Resource, or list of IIIF resources, or references to IIIF resources as its `target` property. It indicates that a user interaction will trigger a change in either the Container itself, or play a named animation in a Model. If the `body` of the Annotation is of type `TextualBody` and the `target` is of type `SpecificResource` with a `selector` property of type `AnimationSelector`, then the client offers a UI such that when the user selects an interactive element labelled by the TextualBody, the named animation in the model painted by the `source` is played. If the `body` contains IIIF resources, then the body is interpreted as a Content State, and when the user interacts with the IIIF resource provided by the `target`, the content state is applied to modify the Container. | +// See notes on activating in index {: .api-table #table-motivations} From f7c088ef4f97da9e85f716f9d8f6f388695a5341 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 17 Mar 2025 16:42:41 -0400 Subject: [PATCH 030/192] new index --- source/content-state/2.0/index.md | 10 +- source/presentation/4.0/index-draft.md | 1218 ++++++++++++++++++++++++ source/presentation/4.0/index.md | 1158 ++-------------------- 3 files changed, 1306 insertions(+), 1080 deletions(-) create mode 100644 source/presentation/4.0/index-draft.md diff --git a/source/content-state/2.0/index.md b/source/content-state/2.0/index.md index 83cc641d2..9afb4e15f 100644 --- a/source/content-state/2.0/index.md +++ b/source/content-state/2.0/index.md @@ -156,7 +156,7 @@ The target of the annotation is, in this case, a complete IIIF resource (here, a The content state _MAY_ be supplied as a string whose value is the URI of an Annotation with the motivation `contentState`, that the client must dereference and process. For the example in 2.2.1 above, this would be the URI `https://example.org/Annotation-server/bookmarks/b1`. The response from that URI would be the JSON above. -#### 2.2.3. Target Body +#### 2.2.3. Target Body // see #2294 The content state _MAY_ be supplied as JSON-LD, as the value of the `target` property of an implied Annotation with the motivation `contentState`. For the example in 2.2.1, this would be: @@ -236,6 +236,8 @@ If a client is capable of reading the content state from the value of an HTTP GE If the intention is that the linked-to client loads an entire IIIF resource without focusing on any particular part, the simplest form of the content state _SHOULD_ be used: +// Talk about URI encoding here, as per #2292 + ```html {% raw %} Link to Viewer @@ -276,7 +278,7 @@ Without the required content-state-encoding, the (invalid) link to the viewer wo ```html {% raw %} -INVALID, unencoded link to Viewer +INVALID, unencoded link to Viewer {% endraw %} ``` @@ -571,7 +573,7 @@ This example should cause a viewer to open Manifest `https://example.org/iiif/id "@context": "http://iiif.io/api/presentation/3/context.json", "id": "https://example.org/import/3", "type": "Annotation", - "motivation": "contentState", + "motivation": ["contentState"], "target": [ { "id": "https://example.org/iiif/item1/canvas37", @@ -719,6 +721,8 @@ function restorePadding(s) { #### 6.3.2. Python +// Add in one for query string as #2292 + ```python import base64 import urllib diff --git a/source/presentation/4.0/index-draft.md b/source/presentation/4.0/index-draft.md new file mode 100644 index 000000000..822e068f7 --- /dev/null +++ b/source/presentation/4.0/index-draft.md @@ -0,0 +1,1218 @@ +--- +title: "Presentation API 4.0" +title_override: "IIIF Presentation API 4.0" +id: presentation-api +layout: spec +cssversion: 3 +tags: [specifications, presentation-api] +major: 4 +minor: 0 +patch: 0 +pre: +redirect_from: + - /presentation/index.html + - /presentation/4/index.html +editors: + - name: Michael Appleby + ORCID: https://orcid.org/0000-0002-1266-298X + institution: Yale University + - name: Tom Crane + ORCID: https://orcid.org/0000-0003-1881-243X + institution: Digirati + - name: Robert Sanderson + ORCID: https://orcid.org/0000-0003-4441-6852 + institution: J. Paul Getty Trust + - name: Dawn Childress + ORCID: + institution: UCLA + - name: Julie Winchester + ORCID: + institution: Duke University + - name: Jeff Mixter + ORCID: + institution: OCLC +hero: + image: '' +--- + +## Status of this Document +{:.no_toc} +__This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} + +__Latest Stable Version:__ [{{ site.data.apis.presentation.latest.major }}.{{ site.data.apis.presentation.latest.minor }}.{{ site.data.apis.presentation.latest.patch }}][prezi-stable-version] + +__Previous Version:__ [3.0][prezi30] + +**Editors:** + +{% include api/editors.md editors=page.editors %} + +{% include copyright.md %} + +---- + +# Presentation 4 + +## Introduction + +Manifests, Containers, Annotations oh my! +Manifest as unit of distribution + + +## Content Resources + +There is stuff that we want to show - images, video, audio, 3D models etc + +### type value of Content Resources + +| Class | Description | +| ------------- | -------------------------------- | +| `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | +| `Model` | A three (or more) dimensional model intended to be interacted with by humans | +| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | +| `Text` | Resources primarily intended to be read | +| `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | +{: .api-table #table-type} + +## Containers + +This is where we put content resources +"painting" + +And we can also put other things: +"supplementing" + +And we can nest them +"Nesting" (see 3d draft) + +The defined Container types are `Timeline`, `Canvas` and `Scene`. Extensions may define additional Container types. + +As multiple models, lights, cameras, and other resources can be associated with and placed within a Scene container, Scenes provide a straightforward way of grouping content resources together within a space. Scenes, as well as other IIIF containers such as Canvases, can also be embedded within a Scene, allowing for the nesting of content resources. + +A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. + +As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in Transforms(transforms_section). + +A simple example painting one Scene into another: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }, + "target": "https://example.org/iiif/scene2" +} +``` + + +Content resources of the appropriate dimension(s) may be annotated into a Container that has those dimensions. + + +### Timeline + +A Container that represents a bounded temporal range, without any spatial coordinates. + +* has continuous duration in seconds + for all or part of its duration. + + +A Timeline _MUST_ have a `duration` property that defines its length in seconds. The `duration` value must be a positive floating point number. + +An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. + +A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": -1.0, + "z": 3.0, + "refinedBy": { + "type": "FragmentSelector", + "value": "t=45,95" + } + } + ] + } +} +``` + +When using a URL fragment in place of a SpecificResource, the parameter `t` can be used to select the temporal region: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": "https://example.org/iiif/scene1#xyz=-1,-1,3&t=45,95" +} +``` + +An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": -1.0, + "z": 3.0, + "instant": 45.0 + } + ] + } +} +``` + +The Annotation's [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) can be used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. + +It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. + + + + + +### Canvas + +A Container that represents a bounded, two-dimensional space and has content resources associated with all or parts of it. It may also have a bounded temporal range in the same manner as a Timeline. + +* has integer, unitless width and height +* has optional continuous duration in seconds + +### Scene + +A Container that represents a boundless three-dimensional space and has content resources positioned at locations within it. Rendering a Scene requires the use of Cameras and Lights. It may also have a bounded temporal range in the same manner as a Timeline. + +* has continuous, unitless x,y,z cartesian coordinate space +* has optional continuous duration in seconds + +A Scene in IIIF is a virtual container that represents a boundless three-dimensional space and has content resources, lights and cameras positioned at locations within it. It may also have a duration to allow the sequencing of events and timed media. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. +The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). + +The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). + +diagram of Right handed cartesian coordinate system + + +As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. + +```json +{ + "id": "https://example.org/iiif/scenes/1", + "type": "Scene", + "label": {"en": ["Chessboard"]}, + "backgroundColor": "#000000", + "items": [ + "Note: Annotations Live Here" + ] +} +``` + + + +## Putting stuff into Containers (composition) + +### Annotation + + +Annotations follow the [Web Annotation][org-w3c-webanno] data model and are used to associate models, lights, cameras, and IIIF containers such as Canvases, with Scenes. They have a `type` of "Annotation", a `body` (being the resource to be added to the scene) and a `target` (being the scene or a position within the scene). They must have a `motivation` property with the value of "painting" to assert that the resource is being painted into the Scene, rather than the Annotation being a comment about the Scene. + +A construct called a Selector is used to select a part of a resource, such as a point within a Scene. The use of a Selector necessitates the creation of a `SpecificResource` that groups together the resource being selected (the `source`) and the instance of the Selector. This SpecificResource can then be used as either the `body` or the `target` of the Annotation. + +All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. + +Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). + +Example Annotation that positions a model at a point within a Scene: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": 0.0, + "z": 1.0 + } + ] + } +} +``` + +Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. + +
+❓Does WKTSelector have a duration/instant property? +
+ +Example Annotation that comments on a 3D polygon within a Scene: + +``` +Todo add example +``` + +#### URI Fragments + +(move up, include xywh) + +The point may instead be defined using a short-hand form of a URI Fragment at the end of the `id` of the Scene as the `target` of the Annotation. The name of the fragment parameter is `xyz` and its value is the x, y and z values separated by commas. Each value can be expressed as either an integer or a floating point number. + +The annotation above could be expressed as its fragment-based equivalent: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": "https://example.org/iiif/scene1#xyz=-1,0,1" +} +``` + + + + + +"non-painting" + +"target" and "body" + + +### Annotation Page + +"Overlapping elements with a larger z-index cover those with a smaller one." +link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index + + +### Annotation Collection + +deal with this: +https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 + +use totalItems? https://iiif.io/api/discovery/1.0/#totalitems + +### Manifest + +### Collection + +#### Paging + +### Range + +## Content State + +A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: + +A "bare" Manifest URI: + +``` +https://example.org/manifests/1 +``` + +A reference to a Manifest: + +```json +{ + "id": "https://example.org/manifests/1", + "type": "Manifest" +} +``` + +A region of a Canvas within a Manifest: + +```json +{ + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/1", + "type": "Manifest" + } +} +``` + +Two versions of a painting from different publishers: + +```json +[ + { + "id": "https://gallery-1.org/iiif/sunflowers/canvas1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-1.org/iiif/sunflowers", + "type": "Manifest" + } + ] + }, + { + "id": "https://gallery-2.org/collection/sunflowers/c1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-2.org/collection/sunflowers", + "type": "Manifest" + } + ] + } +] +``` + +A Scene with a Camera at a particular point: + + +```json +{ + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "items": [ + { + "id": "https://example.org/iiif/3d/anno8", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": { + "en": [ + "Perspective Camera Pointed At Front of Cranium and Mandible" + ] + }, + "fieldOfView": 50.0, + "near": 0.1, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + } + ] +} +``` + +The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). + +Annotations with the motivation `contentState` are referred to as _content state_ annotations. + +Content States are used for the following applications: + +### Load a particular view of a resource or group of resources + +In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. + +The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the [Content State Protocol API 2.0](content-state-2) specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. + + +### Load a particular view of some resource and modify it + +In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: + +```json +{ + "id": "https://example.org/import/3", + "type": "Annotation", + "motivation": "contentState", + "target": { + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/nook12", + "type": "Manifest" + }, + "annotations": [ + { + "id": "https://my-annotation-store.org/user4532/notes-on-book12/p1", + "type": "AnnotationPage" + } + ] + } +} +``` + +As well as adding resources not present in the referred-to resource, the Content State can also remove parts of the referred-to resource from the user's view by applying the behavior `hidden` to them: + +```jsonc +{ + // What does this actually look like? I want to load bnf_chateauroux example but HIDE the illumination + // ... + "id": "https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/annotation/p0001-image", + "type": "Annotation", + "motivation": "painting", + "behavior": ["hidden"] +} +``` + +TODO: what is the processing algorithm for applying incoming `hidden` ? + +When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. + + +### Modify the Container in a particular context + +The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. + + +Consider a Scene with two models, and two `commenting` annotations: + +```jsonc +{ + "id": "https://example.org/iiif/3d/whale_comment_scope_content_state.json", + "type": "Manifest", + "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ] + } + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/p1/annotations/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno7", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Mandibular tooth", + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno5", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Right pterygoid hamulus", + "target": { + // SpecificResource with PointSelector + } + } + ] + } + ] +} +``` + +In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. + +In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. It may be useful to light the Scene differently in different contexts. + +In the same way an incoming Content State can modify a Scene as it initializes the client, so can a Content State attached to each (non-`painting`) annotation target modify the Scene as the user moves between different annotations. + +The `scope` property of an annotation `target` provides _contextual_ Content State - the viewer should modify the Scene by applying the Content State carried by the `scope` property _only when the user is in the context of that annotation_. + +Taking the first commenting annotation from the above example and adding a `scope` property, whose value is an annotation with the motivation `contentState`, we can introduce a new Camera specifically for this particular annotation, so that when the user selects this comment, the client will switch the view to this camera. This example also changes the background color of the Scene: + +```jsonc +{ + "id": "https://example.org/iiif/3d/anno7", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Mandibular tooth", + "target": { + + // SpecificResource with PointSelector + // "type": "SpecificResource", + // "source": ... the Scene... + // "selector": ... a point ... + + "scope": { // a modification to the Scene, only in the context of this annotation + + "id": "https://example.org/iiif/3d/anno4", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "backgroundColor": "yellow", + "items": [ + { + "id": "https://example.org/iiif/3d/anno8", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, + "fieldOfView": 50.0, + "near": 0.10, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + } + ] + } + } + } +} +``` + +In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of `scope` allows a precise storytelling experience to be specified, including: + + - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) + - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest + - hiding parts of the Scene for a step + - introducing additional models at a particular step + - (and many more!) + +Use of `scope` is permitted in annotations on any Container type, not just Scenes. For example, a 2D narrative around a Canvas might show or hide different `painting` annotations at each step. + +#### The `sequence` behavior + +// Is this right? Language... + +While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. + +### Content States on Manifests + +When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. + +// Is there some overlap here with Range? + +### Processing Content States in Scopes: reset + +// This may not be what we have discussed... + +When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. + +The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `sequence`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. If this behavior is not wanted, the `reset` property of the content state annotation should be set to `true`: + +```json +{ + "type": "Annotation", + "motivation": ["contentState"], + "reset": true +} +``` + +Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. + +// I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... + +### Contribute additional information permanently + +Rerum inbox scenario - should be covered in CS2 protocol + +### activating - animation and interactions + +Annotations with the motivation `activating` are referred to as _activating_ annotations. + +There are two uses of `activating` annotations: + +#### Triggering a content state + +An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. + +The activating annotation is provided in a Container's `annotations` property. In this (contrived for brevity) example, if the user clicks the mandible model, the Scene background changes color: + +```jsonc +{ + "id": "https://example.org/iiif/3d/activating.json", + "type": "Manifest", + "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene", + "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "A label for the activation may be provided as a TextualBody" + }, + { + // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene", + "backgroundColor": "#FF99AA" + } + ], + "target": { + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", + "type": "Annotation" + } + } + ] + } + ] + } + ] + } + ] +} +``` + +// Can you put activating annotations in `manifest.annotations`? They would work there too, you have all the information. + + + +#### Triggering a named animation in a model + +Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. + +This pattern is similar to the above, except that: + + - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) + - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. + + The format of the `value` string is implementation=specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. + + + +```jsonc +{ + "id": "https://example.org/iiif/3d/activating-animation.json", + "type": "Manifest", + "label": { "en": ["Music Box with lid that opens as an internal animation"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/scene-with-activation-animation", + "type": "Scene", + "label": { "en": ["A Scene Containing a Music Box"] }, + "items": [ + { + "id": "https://example.org/iiif/scene-with-activation-animation/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-music-box", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "Click the box to open the lid" + } + ], + "target": [ + { + "type": "SpecificResource", + "source": "https://example.org/iiif/3d/painting-anno-for-music-box", + "selector": [ + { + "type": "AnimationSelector", + "value": "open-the-lid" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +``` + +// TODO + +activating to apply a content state and activating to trigger a named animation - use of body and target... what if we want to click a painting anno to trigger the animation? +Can we ADD that to the target, alongside the SpecificResource with the AnimationSelector? + +if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody (or list of TextualBody)? + +There is a more general rule here! + +### reset + +See above... + +"diff", "original state" etc +behavior for "force-order"? +behavior: sequence + +## Selectors + +preamble - cover all the use cases + +### SpecificResource + +(This heading should be more descriptive) + +fragments/segments/parts of resources +SvgSelector +xywh + + +### PointSelector + + +## Scene-Specific Resources + +### 3D considerations / principles + +"models" (content resources in 3D) +"local coordinate spaces" + +### Camera + +A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. + +This specification defines two types of Camera: + +| Class | Description | +| ------------------- | ------------ | +| `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | +| `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | + +Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. The camera's up direction by default points along the y axis towards positive infinity, but this may be modified by transforms. + +The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. + +The `near` property defines the minimum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything nearer to the camera than this distance will not be viewed. Conversely, the `far` property defines a maximum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything further away will not be viewed. + +For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. + +If any of these properties are not specified explicitly, they default to the choice of the client implementation. + +drawing of a geometrical frustrum truncated by near and far distances + + +The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. + +```json +{ + "id": "https://example.org/iiif/camera/1", + "type": "PerspectiveCamera", + "near": 1.0, + "far": 100.0, + "fieldOfView": 45.0 +} +``` + + + +### Light + +One or more Lights MUST be present within the Scene in order to have objects within it be visible to the Cameras. + +This specification defines four types of Light: + +| Class | Description | +| ----- | ------------ | +| `AmbientLight` | AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. | +| `DirectionalLight` | DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. | +| `PointLight` | PointLight emits from a single point within the scene in all directions. | +| `SpotLight` | SpotLight emits a cone of light from a single point in a given direction. | + +Lights defined in this specification have a `color` and an `intensity`. The color is given as an RGB value, such as "#FFFFFF" for white. The intensity is the strength or brightness of the light, and described using a `Value` construct. + +SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. + +diagram of cone geometry showing how the angle of the cone is defined + +Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). If a Light does not have an explicit position in the coordinate space, then the default is at the origin. + +This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. + +If there are no Lights present within the Scene, then the viewer MUST add at least one Light. The types and properties of Lights added in this way are client-dependent. + +```json +{ + "id": "https://example.org/iiif/light/1", + "type": "AmbientLight", + "color": "#FFFFFF", + "intensity": {"type": "Value", "value": 0.6, "unit": "relativeUnit"} +} +``` + + + +### Transforms + +The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. + +This specification defines a new class of manipulations for SpecificResources called a `Transform`, with three specific sub-classes. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. + + +| Class | Description | +| --------------- | ------------ | +| ScaleTransform | A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 | +| RotateTransform | A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 | +| TranslateTransform | A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 | + +Transforms are added to a SpecificResource using the `transform` property. The value of the property is an array, which determines the order in which the transforms are to be applied. The resulting state of the first transform is the input state for the second transform, and so on. Different orders of the same set of transforms can have different results, so attention must be paid when creating the array and when processing it. + +The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. + +Transforms are only used in the Presentation API when the SpecificResource is the `body` of the Annotation, and are applied before the resource is painted into the scene at the point given in the `target`. + +```json +{ + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "transform": [ + { + "type": "RotateTransform", + "x": 0.0, + "y": 180.0, + "z": 0.0 + }, + { + "type": "TranslateTransform", + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + ] +} +``` + + +#### Relative Rotation + +It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. + +If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. + +This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. + +```json +"lookAt": { + "type": "PointSelector", + "x": 3, + "y": 0, + "z": -10 +} +``` + + +#### Excluding + +Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. + +Painting a Scene into another while excluding import of several types of resources: +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "exclude": ["Audio", "Lights", "Cameras", "Animations"], + "body": { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }, + "target": "https://example.org/iiif/scene2" +} +``` + + + +## Advanced Association Features + +(This needs to be sprinkled throughout above - especially as SpecificResource must be introduced early for 3D) + +### Nesting + +A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. + +When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the pixel origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (e.g., is colinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (e.g., is colinear to) the negative y axis extending from the coordinate origin. The Canvas is scaled to the Scene such that the pixel dimensions correspond to 3D coordinate units - a Canvas 200 pixels wide and 400 pixels high will extend 200 coordinate units across the x axis and 400 coordinate units across the y axis. Please note: direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted. + +A Canvas in a Scene has a specific forward face and a backward face. By default, the forward face of a Canvas should point in the direction of the positive z axis. If the property `backgroundColor` is used, this color should be used for the backward face of the Canvas. Otherwise, a reverse view of the forward face of the Canvas should be visible on the backward face. + +
+ To Do: Add an image demonstrating default Canvas placement in Scene +
+ +A `PointSelector` can be used to modify the point at which the Canvas will be painted, by establishing a new point to align with the top-left corner of the Canvas instead of the Scene coordinate origin. Transforms can also be used to modify Canvas rotation, scale, or translation. + +It may be desirable to exercise greater control over how the Canvas is painted into the Scene by selecting the coordinate points in the Scene that should correspond to each corner of the Canvas. This provides fine-grained manipulation of Canvas placement and/or scale, and for optionally introducing Canvas distortion or skew. Annotations may use a WktSelector to select different points in the Scene to align with the top-left, bottom-left, bottom-right, and top-right corners of the Canvas. In this case, the four Scene coordinates should be listed beginning with the coordinate corresponding to the top-left corner of the Canvas, and should proceed in a counter-clockwise winding order around the Canvas, with coordinates corresponding to bottom-left, bottom-right, and top-right corners in order respectively. The use of WktSelector for this purpose overrides any use of Transforms on the Canvas Annotation. + +Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at (1, 0, 0); and top-right at (1, 1, 0): +```json +"selector": [ + { + "type": "WktSelector", + "value": "POLYGONZ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" + } +] +``` + +When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. + +### Embedded Content + +e.g., painting TextualBody on Canvas + +Todo: This is mostly copy-pasted from properties, is it needed here? +It is important to be able to position the textual body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. The positioning of the textual body in a container is accomplished through the `position` property, which has as a value a Specific Resource identifying the targeted container as the source and a selector defining how the textual body should be positioned in the targeted container. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. + +### Comment Annotations + +(move to Annotation section) + + +### Choice of Alternative Resources + +(move to Annotation section) + + +### Non Rectangular Segments + +SvgSelector - move to SpecificResource too ^^ + + +### Style + +Move to SpecificResource + + +### Rotation + + +### Hotspot Linking and Activation + +Move to SpecificResource + + + +## Conveying Physical Dimensions + +(why is this important!?) + +(move the props to vocab doc) + +### spatialScale + +### temporalScale + + +``` +{ + "spatialScale": { + "factor": 22.0, + "units": "m" + }, + + + // this would be rarely used + "temporalScale": { + "factor": 0.00001 + } + +} +``` + +`factor` Required A floating point ratio. +`units` Required A real-world measuring unit. Always seconds for temporalScale. Possible values for spatialScale include: "m", "ft". (is that it?) + +For a Canvas, it's the physical "size" of each cartesian integer unit. +For a Scene, it's the physical size of the unit vector. +For a timeline it's the ratio of time in the recording to time in the real world. + + +(define props in the Vocabulary doc) + + +## HTTP Requests and Responses + +### URI Recommendations + +### Requests + +### Responses + +### Authentication + + +## Accessibility + +(new section) + +`provides` + + +## Appendices + +### Summary of Property Requirements + +### Example Manifest Response + +### Versioning + +### Acknowledgements + +### Change Log + +"Exclude Audio" diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 822e068f7..906a57969 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -51,1168 +51,172 @@ __Previous Version:__ [3.0][prezi30] ---- -# Presentation 4 - ## Introduction -Manifests, Containers, Annotations oh my! -Manifest as unit of distribution - - -## Content Resources - -There is stuff that we want to show - images, video, audio, 3D models etc - -### type value of Content Resources +Presentation, the clue is in the name -| Class | Description | -| ------------- | -------------------------------- | -| `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | -| `Model` | A three (or more) dimensional model intended to be interacted with by humans | -| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | -| `Text` | Resources primarily intended to be read | -| `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | -{: .api-table #table-type} -## Containers +(non-exhaustive) List of use cases -This is where we put content resources -"painting" +1. Digitized books and manuscripts (images, paged things, transcripts, translations) +2. Artworks and Maps (navPlace, maybe commenting annos) +3. Audio and Video recordings (time-based, transcriptions) +4. 3D scans of objects (3D) +5. Periodicals (Collections, Ranges, navDate) +6. Archival collections (Collections, Ranges, navDate) +7. Storytelling and exhibitions (State, annotations) -And we can also put other things: -"supplementing" +see Terminology at the end -And we can nest them -"Nesting" (see 3d draft) +Mention model.md -The defined Container types are `Timeline`, `Canvas` and `Scene`. Extensions may define additional Container types. +Mention cookbook -As multiple models, lights, cameras, and other resources can be associated with and placed within a Scene container, Scenes provide a straightforward way of grouping content resources together within a space. Scenes, as well as other IIIF containers such as Canvases, can also be embedded within a Scene, allowing for the nesting of content resources. -A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. -As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in Transforms(transforms_section). - -A simple example painting one Scene into another: - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - }, - "target": "https://example.org/iiif/scene2" -} -``` +## Foundations +Simple model diagram -Content resources of the appropriate dimension(s) may be annotated into a Container that has those dimensions. +Manifests and Containers briefly -### Timeline - -A Container that represents a bounded temporal range, without any spatial coordinates. - -* has continuous duration in seconds - for all or part of its duration. - - -A Timeline _MUST_ have a `duration` property that defines its length in seconds. The `duration` value must be a positive floating point number. - -An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. - -A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": -1.0, - "z": 3.0, - "refinedBy": { - "type": "FragmentSelector", - "value": "t=45,95" - } - } - ] - } -} -``` - -When using a URL fragment in place of a SpecificResource, the parameter `t` can be used to select the temporal region: +### Manifests -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": "https://example.org/iiif/scene1#xyz=-1,-1,3&t=45,95" -} -``` +The document, the unit of distribution of IIIF -An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. +A sequence of Containers that carry the content. -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": -1.0, - "z": 3.0, - "instant": 45.0 - } - ] - } -} -``` -The Annotation's [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) can be used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. +### Containers -It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. +Timeline, Canvas, Scene +### Painting Annotations +Everything is an anno but these are special and core +### Content Resources -### Canvas +Image, Sound, Video, Model, Text +(see model) -A Container that represents a bounded, two-dimensional space and has content resources associated with all or parts of it. It may also have a bounded temporal range in the same manner as a Timeline. +SpecificResource -* has integer, unitless width and height -* has optional continuous duration in seconds -### Scene -A Container that represents a boundless three-dimensional space and has content resources positioned at locations within it. Rendering a Scene requires the use of Cameras and Lights. It may also have a bounded temporal range in the same manner as a Timeline. +## Presenting Content Resources - what you came here for -* has continuous, unitless x,y,z cartesian coordinate space -* has optional continuous duration in seconds +### Images -A Scene in IIIF is a virtual container that represents a boundless three-dimensional space and has content resources, lights and cameras positioned at locations within it. It may also have a duration to allow the sequencing of events and timed media. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. -The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). +A painting -The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). +A paged thing -diagram of Right handed cartesian coordinate system +### Audio and Video -As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. +A timeline - audio only -```json -{ - "id": "https://example.org/iiif/scenes/1", - "type": "Scene", - "label": {"en": ["Chessboard"]}, - "backgroundColor": "#000000", - "items": [ - "Note: Annotations Live Here" - ] -} -``` +A video on a Canvas with duration +### 3D -## Putting stuff into Containers (composition) +Whale bone with a camera and a light -### Annotation +## Annotations and State -Annotations follow the [Web Annotation][org-w3c-webanno] data model and are used to associate models, lights, cameras, and IIIF containers such as Canvases, with Scenes. They have a `type` of "Annotation", a `body` (being the resource to be added to the scene) and a `target` (being the scene or a position within the scene). They must have a `motivation` property with the value of "painting" to assert that the resource is being painted into the Scene, rather than the Annotation being a comment about the Scene. +### Annotations -A construct called a Selector is used to select a part of a resource, such as a point within a Scene. The use of a Selector necessitates the creation of a `SpecificResource` that groups together the resource being selected (the `source`) and the instance of the Selector. This SpecificResource can then be used as either the `body` or the `target` of the Annotation. +non-painting -All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. +Comments, tags, etc -Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). +transcripts (and back ref to OCR on images etc) -Example Annotation that positions a model at a point within a Scene: -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": 0.0, - "z": 1.0 - } - ] - } -} -``` +### State -Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. +Content State -
-❓Does WKTSelector have a duration/instant property? -
+Activating annos -Example Annotation that comments on a 3D polygon within a Scene: -``` -Todo add example -``` +## Navigation -#### URI Fragments +### navXXXX -(move up, include xywh) - -The point may instead be defined using a short-hand form of a URI Fragment at the end of the `id` of the Scene as the `target` of the Annotation. The name of the fragment parameter is `xyz` and its value is the x, y and z values separated by commas. Each value can be expressed as either an integer or a floating point number. - -The annotation above could be expressed as its fragment-based equivalent: - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": "https://example.org/iiif/scene1#xyz=-1,0,1" -} -``` - - - - - -"non-painting" - -"target" and "body" - - -### Annotation Page - -"Overlapping elements with a larger z-index cover those with a smaller one." -link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index - - -### Annotation Collection - -deal with this: -https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 - -use totalItems? https://iiif.io/api/discovery/1.0/#totalitems - -### Manifest - -### Collection - -#### Paging - -### Range - -## Content State - -A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: - -A "bare" Manifest URI: - -``` -https://example.org/manifests/1 -``` - -A reference to a Manifest: +These are just extracts as examples ```json -{ - "id": "https://example.org/manifests/1", - "type": "Manifest" -} +"navDate": "1776-01-01T00:00:00+00:00", ``` -A region of a Canvas within a Manifest: +See this in Periodicals -```json -{ - "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", - "type": "Canvas", - "partOf": { - "id": "https://example.org/manifests/1", - "type": "Manifest" - } -} -``` -Two versions of a painting from different publishers: ```json -[ - { - "id": "https://gallery-1.org/iiif/sunflowers/canvas1", - "type": "Canvas", - "partOf": [ - { - "id": "https://gallery-1.org/iiif/sunflowers", - "type": "Manifest" - } - ] - }, - { - "id": "https://gallery-2.org/collection/sunflowers/c1", - "type": "Canvas", - "partOf": [ - { - "id": "https://gallery-2.org/collection/sunflowers", - "type": "Manifest" - } - ] - } -] -``` - -A Scene with a Camera at a particular point: - - -```json -{ - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "items": [ +"navPlace": { + "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature-collection/1", + "type": "FeatureCollection", + "features": [ { - "id": "https://example.org/iiif/3d/anno8", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/3d/cameras/1", - "type": "PerspectiveCamera", - "label": { - "en": [ - "Perspective Camera Pointed At Front of Cranium and Mandible" - ] - }, - "fieldOfView": 50.0, - "near": 0.1, - "far": 2000.0 - } - ] + "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature/1", + "type": "Feature", + "properties": { + "label": { "en": ["Castel Sant'Angelo, Rome"] } }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.0, "y": 0.15, "z": 0.75 - } - ] - } - } - ] -} -``` - -The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). - -Annotations with the motivation `contentState` are referred to as _content state_ annotations. - -Content States are used for the following applications: - -### Load a particular view of a resource or group of resources - -In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. - -The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the [Content State Protocol API 2.0](content-state-2) specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. - - -### Load a particular view of some resource and modify it - -In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: - -```json -{ - "id": "https://example.org/import/3", - "type": "Annotation", - "motivation": "contentState", - "target": { - "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", - "type": "Canvas", - "partOf": { - "id": "https://example.org/manifests/nook12", - "type": "Manifest" - }, - "annotations": [ - { - "id": "https://my-annotation-store.org/user4532/notes-on-book12/p1", - "type": "AnnotationPage" - } - ] - } -} -``` - -As well as adding resources not present in the referred-to resource, the Content State can also remove parts of the referred-to resource from the user's view by applying the behavior `hidden` to them: - -```jsonc -{ - // What does this actually look like? I want to load bnf_chateauroux example but HIDE the illumination - // ... - "id": "https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/annotation/p0001-image", - "type": "Annotation", - "motivation": "painting", - "behavior": ["hidden"] -} -``` - -TODO: what is the processing algorithm for applying incoming `hidden` ? - -When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. - - -### Modify the Container in a particular context - -The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. - - -Consider a Scene with two models, and two `commenting` annotations: - -```jsonc -{ - "id": "https://example.org/iiif/3d/whale_comment_scope_content_state.json", - "type": "Manifest", - "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - }, - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ] - } - ] - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/p1/annotations/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno7", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Mandibular tooth", - "target": { - // SpecificResource with PointSelector - } - }, - { - "id": "https://example.org/iiif/3d/anno5", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Right pterygoid hamulus", - "target": { - // SpecificResource with PointSelector - } - } - ] - } - ] -} -``` - -In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. - -In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. It may be useful to light the Scene differently in different contexts. - -In the same way an incoming Content State can modify a Scene as it initializes the client, so can a Content State attached to each (non-`painting`) annotation target modify the Scene as the user moves between different annotations. - -The `scope` property of an annotation `target` provides _contextual_ Content State - the viewer should modify the Scene by applying the Content State carried by the `scope` property _only when the user is in the context of that annotation_. - -Taking the first commenting annotation from the above example and adding a `scope` property, whose value is an annotation with the motivation `contentState`, we can introduce a new Camera specifically for this particular annotation, so that when the user selects this comment, the client will switch the view to this camera. This example also changes the background color of the Scene: - -```jsonc -{ - "id": "https://example.org/iiif/3d/anno7", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Mandibular tooth", - "target": { - - // SpecificResource with PointSelector - // "type": "SpecificResource", - // "source": ... the Scene... - // "selector": ... a point ... - - "scope": { // a modification to the Scene, only in the context of this annotation - - "id": "https://example.org/iiif/3d/anno4", - "type": "Annotation", - "motivation": ["contentState"], - "target": { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "backgroundColor": "yellow", - "items": [ - { - "id": "https://example.org/iiif/3d/anno8", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/3d/cameras/1", - "type": "PerspectiveCamera", - "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, - "fieldOfView": 50.0, - "near": 0.10, - "far": 2000.0 - } - ] - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.0, "y": 0.15, "z": 0.75 - } - ] - } - } - ] + "geometry": { + "type": "Point", + "coordinates": [12.4663, 41.9031] } } - } -} -``` - -In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of `scope` allows a precise storytelling experience to be specified, including: - - - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) - - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest - - hiding parts of the Scene for a step - - introducing additional models at a particular step - - (and many more!) - -Use of `scope` is permitted in annotations on any Container type, not just Scenes. For example, a 2D narrative around a Canvas might show or hide different `painting` annotations at each step. - -#### The `sequence` behavior - -// Is this right? Language... - -While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. - -### Content States on Manifests - -When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. - -// Is there some overlap here with Range? - -### Processing Content States in Scopes: reset - -// This may not be what we have discussed... - -When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. - -The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `sequence`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. If this behavior is not wanted, the `reset` property of the content state annotation should be set to `true`: - -```json -{ - "type": "Annotation", - "motivation": ["contentState"], - "reset": true -} -``` - -Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. - -// I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... - -### Contribute additional information permanently - -Rerum inbox scenario - should be covered in CS2 protocol - -### activating - animation and interactions - -Annotations with the motivation `activating` are referred to as _activating_ annotations. - -There are two uses of `activating` annotations: - -#### Triggering a content state - -An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. - -The activating annotation is provided in a Container's `annotations` property. In this (contrived for brevity) example, if the user clicks the mandible model, the Scene background changes color: - -```jsonc -{ - "id": "https://example.org/iiif/3d/activating.json", - "type": "Manifest", - "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/scene-with-activation", - "type": "Scene", - "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/painting-anno-for-mandible", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/activators", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["activating"], - "body": [ - { - "type": "TextualBody", - "value": "A label for the activation may be provided as a TextualBody" - }, - { - // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply - "id": "https://example.org/iiif/scene1/scene-with-activation", - "type": "Scene", - "backgroundColor": "#FF99AA" - } - ], - "target": { - "id": "https://example.org/iiif/3d/painting-anno-for-mandible", - "type": "Annotation" - } - } - ] - } - ] - } - ] - } ] } ``` +Map example -// Can you put activating annotations in `manifest.annotations`? They would work there too, you have all the information. - - - -#### Triggering a named animation in a model - -Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. - -This pattern is similar to the above, except that: - - - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) - - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. - - The format of the `value` string is implementation=specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. - - - -```jsonc -{ - "id": "https://example.org/iiif/3d/activating-animation.json", - "type": "Manifest", - "label": { "en": ["Music Box with lid that opens as an internal animation"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/scene-with-activation-animation", - "type": "Scene", - "label": { "en": ["A Scene Containing a Music Box"] }, - "items": [ - { - "id": "https://example.org/iiif/scene-with-activation-animation/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/painting-anno-for-music-box", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/activators", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["activating"], - "body": [ - { - "type": "TextualBody", - "value": "Click the box to open the lid" - } - ], - "target": [ - { - "type": "SpecificResource", - "source": "https://example.org/iiif/3d/painting-anno-for-music-box", - "selector": [ - { - "type": "AnimationSelector", - "value": "open-the-lid" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] -} -``` - -// TODO - -activating to apply a content state and activating to trigger a named animation - use of body and target... what if we want to click a painting anno to trigger the animation? -Can we ADD that to the target, alongside the SpecificResource with the AnimationSelector? - -if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody (or list of TextualBody)? - -There is a more general rule here! - -### reset - -See above... - -"diff", "original state" etc -behavior for "force-order"? -behavior: sequence - -## Selectors - -preamble - cover all the use cases - -### SpecificResource - -(This heading should be more descriptive) - -fragments/segments/parts of resources -SvgSelector -xywh - - -### PointSelector - - -## Scene-Specific Resources - -### 3D considerations / principles - -"models" (content resources in 3D) -"local coordinate spaces" - -### Camera - -A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. - -This specification defines two types of Camera: - -| Class | Description | -| ------------------- | ------------ | -| `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | -| `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | - -Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. The camera's up direction by default points along the y axis towards positive infinity, but this may be modified by transforms. - -The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. - -The `near` property defines the minimum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything nearer to the camera than this distance will not be viewed. Conversely, the `far` property defines a maximum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything further away will not be viewed. - -For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. - -If any of these properties are not specified explicitly, they default to the choice of the client implementation. - -drawing of a geometrical frustrum truncated by near and far distances - - -The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. - -```json -{ - "id": "https://example.org/iiif/camera/1", - "type": "PerspectiveCamera", - "near": 1.0, - "far": 100.0, - "fieldOfView": 45.0 -} -``` - - - -### Light - -One or more Lights MUST be present within the Scene in order to have objects within it be visible to the Cameras. - -This specification defines four types of Light: - -| Class | Description | -| ----- | ------------ | -| `AmbientLight` | AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. | -| `DirectionalLight` | DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. | -| `PointLight` | PointLight emits from a single point within the scene in all directions. | -| `SpotLight` | SpotLight emits a cone of light from a single point in a given direction. | - -Lights defined in this specification have a `color` and an `intensity`. The color is given as an RGB value, such as "#FFFFFF" for white. The intensity is the strength or brightness of the light, and described using a `Value` construct. - -SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. - -diagram of cone geometry showing how the angle of the cone is defined - -Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). If a Light does not have an explicit position in the coordinate space, then the default is at the origin. - -This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. - -If there are no Lights present within the Scene, then the viewer MUST add at least one Light. The types and properties of Lights added in this way are client-dependent. - -```json -{ - "id": "https://example.org/iiif/light/1", - "type": "AmbientLight", - "color": "#FFFFFF", - "intensity": {"type": "Value", "value": 0.6, "unit": "relativeUnit"} -} -``` - - - -### Transforms - -The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. - -This specification defines a new class of manipulations for SpecificResources called a `Transform`, with three specific sub-classes. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. - - -| Class | Description | -| --------------- | ------------ | -| ScaleTransform | A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 | -| RotateTransform | A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 | -| TranslateTransform | A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 | - -Transforms are added to a SpecificResource using the `transform` property. The value of the property is an array, which determines the order in which the transforms are to be applied. The resulting state of the first transform is the input state for the second transform, and so on. Different orders of the same set of transforms can have different results, so attention must be paid when creating the array and when processing it. - -The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. - -Transforms are only used in the Presentation API when the SpecificResource is the `body` of the Annotation, and are applied before the resource is painted into the scene at the point given in the `target`. - -```json -{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "transform": [ - { - "type": "RotateTransform", - "x": 0.0, - "y": 180.0, - "z": 0.0 - }, - { - "type": "TranslateTransform", - "x": 1.0, - "y": 0.0, - "z": 0.0 - } - ] -} -``` - - -#### Relative Rotation - -It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. - -If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. - -This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. - -```json -"lookAt": { - "type": "PointSelector", - "x": 3, - "y": 0, - "z": -10 -} -``` - - -#### Excluding - -Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. - -Painting a Scene into another while excluding import of several types of resources: -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "exclude": ["Audio", "Lights", "Cameras", "Animations"], - "body": { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - }, - "target": "https://example.org/iiif/scene2" -} -``` - - - -## Advanced Association Features - -(This needs to be sprinkled throughout above - especially as SpecificResource must be introduced early for 3D) - -### Nesting - -A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. - -When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the pixel origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (e.g., is colinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (e.g., is colinear to) the negative y axis extending from the coordinate origin. The Canvas is scaled to the Scene such that the pixel dimensions correspond to 3D coordinate units - a Canvas 200 pixels wide and 400 pixels high will extend 200 coordinate units across the x axis and 400 coordinate units across the y axis. Please note: direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted. - -A Canvas in a Scene has a specific forward face and a backward face. By default, the forward face of a Canvas should point in the direction of the positive z axis. If the property `backgroundColor` is used, this color should be used for the backward face of the Canvas. Otherwise, a reverse view of the forward face of the Canvas should be visible on the backward face. - -
- To Do: Add an image demonstrating default Canvas placement in Scene -
- -A `PointSelector` can be used to modify the point at which the Canvas will be painted, by establishing a new point to align with the top-left corner of the Canvas instead of the Scene coordinate origin. Transforms can also be used to modify Canvas rotation, scale, or translation. - -It may be desirable to exercise greater control over how the Canvas is painted into the Scene by selecting the coordinate points in the Scene that should correspond to each corner of the Canvas. This provides fine-grained manipulation of Canvas placement and/or scale, and for optionally introducing Canvas distortion or skew. Annotations may use a WktSelector to select different points in the Scene to align with the top-left, bottom-left, bottom-right, and top-right corners of the Canvas. In this case, the four Scene coordinates should be listed beginning with the coordinate corresponding to the top-left corner of the Canvas, and should proceed in a counter-clockwise winding order around the Canvas, with coordinates corresponding to bottom-left, bottom-right, and top-right corners in order respectively. The use of WktSelector for this purpose overrides any use of Transforms on the Canvas Annotation. - -Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at (1, 0, 0); and top-right at (1, 1, 0): -```json -"selector": [ - { - "type": "WktSelector", - "value": "POLYGONZ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" - } -] -``` - -When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. - -### Embedded Content - -e.g., painting TextualBody on Canvas - -Todo: This is mostly copy-pasted from properties, is it needed here? -It is important to be able to position the textual body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. The positioning of the textual body in a container is accomplished through the `position` property, which has as a value a Specific Resource identifying the targeted container as the source and a selector defining how the textual body should be positioned in the targeted container. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. - -### Comment Annotations - -(move to Annotation section) - - -### Choice of Alternative Resources - -(move to Annotation section) - - -### Non Rectangular Segments - -SvgSelector - move to SpecificResource too ^^ - - -### Style - -Move to SpecificResource - - -### Rotation - - -### Hotspot Linking and Activation - -Move to SpecificResource - - - -## Conveying Physical Dimensions - -(why is this important!?) - -(move the props to vocab doc) - -### spatialScale - -### temporalScale - - -``` -{ - "spatialScale": { - "factor": 22.0, - "units": "m" - }, - - - // this would be rarely used - "temporalScale": { - "factor": 0.00001 - } - -} -``` - -`factor` Required A floating point ratio. -`units` Required A real-world measuring unit. Always seconds for temporalScale. Possible values for spatialScale include: "m", "ft". (is that it?) - -For a Canvas, it's the physical "size" of each cartesian integer unit. -For a Scene, it's the physical size of the unit vector. -For a timeline it's the ratio of time in the recording to time in the real world. - +navDate +??? example -(define props in the Vocabulary doc) +### Ranges -## HTTP Requests and Responses +Periodical example - with navDate again +Table of Contents as simple example +thumbnail-nav +sequence -### URI Recommendations -### Requests +### Collections -### Responses +Multi-vol work +Archive example +back ref to periodical? -### Authentication +Paged collections and conceptual collections -## Accessibility -(new section) -`provides` +## Protocol -## Appendices -### Summary of Property Requirements +## Terminology -### Example Manifest Response +The principles of [Linked Data][org-linked-data] and the [Architecture of the Web][org-w3c-webarch] are adopted in order to provide a distributed and interoperable framework. The [Shared Canvas data model][shared-canvas] and [JSON-LD][org-w3c-json-ld] are leveraged to create an easy-to-implement, JSON-based format. -### Versioning +This specification uses the following terms: -### Acknowledgements +* __embedded__: When a resource (A) is embedded within an embedding resource (B), the complete JSON representation of resource A is present within the JSON representation of resource B, and dereferencing the URI of resource A will not result in additional information. Example: Canvas A is embedded in Manifest B. +* __referenced__: When a resource (A) is referenced from a referencing resource (B), an incomplete JSON representation of resource A is present within the JSON representation of resource B, and dereferencing the URI of resource A will result in additional information. Example: Manifest A is referenced from Collection B. +* __HTTP(S)__: The HTTP or HTTPS URI scheme and internet protocol. -### Change Log +The terms _array_, _JSON object_, _number_, _string_, and _boolean_ in this document are to be interpreted as defined by the [Javascript Object Notation (JSON)][org-rfc-8259] specification. -"Exclude Audio" +The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _SHOULD NOT_, _RECOMMENDED_, _MAY_, and _OPTIONAL_ in this document are to be interpreted as described in [RFC 2119][org-rfc-2119]. From e9b917debb9dee92c09b1930070dbe3307a7371c Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 17 Mar 2025 17:56:06 -0400 Subject: [PATCH 031/192] WIP prezi 4 --- source/presentation/4.0/index-draft.md | 108 +---------------------- source/presentation/4.0/index.md | 116 ++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 111 deletions(-) diff --git a/source/presentation/4.0/index-draft.md b/source/presentation/4.0/index-draft.md index 822e068f7..bc498dde7 100644 --- a/source/presentation/4.0/index-draft.md +++ b/source/presentation/4.0/index-draft.md @@ -51,75 +51,10 @@ __Previous Version:__ [3.0][prezi30] ---- -# Presentation 4 - -## Introduction - -Manifests, Containers, Annotations oh my! -Manifest as unit of distribution - - -## Content Resources - -There is stuff that we want to show - images, video, audio, 3D models etc - -### type value of Content Resources - -| Class | Description | -| ------------- | -------------------------------- | -| `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | -| `Model` | A three (or more) dimensional model intended to be interacted with by humans | -| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | -| `Text` | Resources primarily intended to be read | -| `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | -{: .api-table #table-type} - -## Containers - -This is where we put content resources -"painting" - -And we can also put other things: -"supplementing" - -And we can nest them -"Nesting" (see 3d draft) - -The defined Container types are `Timeline`, `Canvas` and `Scene`. Extensions may define additional Container types. - -As multiple models, lights, cameras, and other resources can be associated with and placed within a Scene container, Scenes provide a straightforward way of grouping content resources together within a space. Scenes, as well as other IIIF containers such as Canvases, can also be embedded within a Scene, allowing for the nesting of content resources. - -A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. - -As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in Transforms(transforms_section). - -A simple example painting one Scene into another: - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - }, - "target": "https://example.org/iiif/scene2" -} -``` - - -Content resources of the appropriate dimension(s) may be annotated into a Container that has those dimensions. ### Timeline -A Container that represents a bounded temporal range, without any spatial coordinates. - -* has continuous duration in seconds - for all or part of its duration. - - A Timeline _MUST_ have a `duration` property that defines its length in seconds. The `duration` value must be a positive floating point number. An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. @@ -213,47 +148,6 @@ It is an error to select a temporal region of a Scene that does not have a `dura - -### Canvas - -A Container that represents a bounded, two-dimensional space and has content resources associated with all or parts of it. It may also have a bounded temporal range in the same manner as a Timeline. - -* has integer, unitless width and height -* has optional continuous duration in seconds - -### Scene - -A Container that represents a boundless three-dimensional space and has content resources positioned at locations within it. Rendering a Scene requires the use of Cameras and Lights. It may also have a bounded temporal range in the same manner as a Timeline. - -* has continuous, unitless x,y,z cartesian coordinate space -* has optional continuous duration in seconds - -A Scene in IIIF is a virtual container that represents a boundless three-dimensional space and has content resources, lights and cameras positioned at locations within it. It may also have a duration to allow the sequencing of events and timed media. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. -The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). - -The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). - -diagram of Right handed cartesian coordinate system - - -As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. - -```json -{ - "id": "https://example.org/iiif/scenes/1", - "type": "Scene", - "label": {"en": ["Chessboard"]}, - "backgroundColor": "#000000", - "items": [ - "Note: Annotations Live Here" - ] -} -``` - - - -## Putting stuff into Containers (composition) - ### Annotation @@ -812,7 +706,7 @@ This pattern is similar to the above, except that: - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. - The format of the `value` string is implementation=specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. + The format of the `value` string is implementation-specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 906a57969..8289b42e6 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -81,27 +81,89 @@ Simple model diagram Manifests and Containers briefly + ### Manifests -The document, the unit of distribution of IIIF +A Manifest is the primary unit of distribution of IIIF. It is a JSON document that provides a description of the structure and properties of a single item to be presented to the user, such as a title and other descriptive and linking information about the object and/or the intellectual work that it conveys. The scope of what constitutes an item, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. + +The Manifest's `items` property is a list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents the Content Resources to the user. The `items` property provides an order to the content. -A sequence of Containers that carry the content. +Manifests have descriptive, technical and linking properties. The required properties of Manifests are `id`, `type`, `items` and `label`. Additional descriptive properties include `summary`, `metadata`, `rights`, `thumbnail`, `homepage` and `provider`. + +[See Model Docs](manifest) + +``` +Manifest JSON +``` ### Containers -Timeline, Canvas, Scene +A Container is a frame of reference that allows the relative positioning of Content Resources, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). + +And we can also put other things: +"supplementing" + + + +The defined Container types are: + +#### Timeline + +A Container that represents a bounded temporal range, without any spatial coordinates. + +* has continuous duration in seconds for all or part of its duration. +* Typically used for audio-only content + +#### Canvas +A Container that represents a bounded, two-dimensional space and has content resources associated with all or parts of it. It may also have a bounded temporal range in the same manner as a Timeline. -### Painting Annotations +* has integer, unitless width and height +* has optional continuous duration in seconds +* Typically used for Image content, and with duration, for Video content. +#### Scene + +A Container that represents a boundless three-dimensional space and has content resources positioned at locations within it. Rendering a Scene requires the use of Cameras and Lights. It may also have a bounded temporal range in the same manner as a Timeline. + +* has continuous, unitless x,y,z cartesian coordinate space +* has optional continuous duration in seconds +* Typically used for 3D models, and can include audio, video and image content + + +### Annotations + +IIIF uses the concept of _Annotation_ to link resources together. Why is this a different sense from what I am used to? Because this: W3C go read that then come back. + +BUT it can be used for notes in the margin, commentary and all those more usual senses of the word, too. It's just that we borrow that linking mechanism for the Content Resources, too. + +Annotations are primarily used to associate content resources with Containers. The same mechanism is used for the visible and/or audible resources as is used for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. As Annotations can be added later, it promotes a distributed system in which publishers can align their content with the descriptions created by others. + +Now that we have this linking mechanism... PAINTING + +Painting Annotations are used to associate models, lights, cameras, and IIIF containers such as Canvases, with Scenes. They have a `type` of "Annotation", a `body` (being the resource to be added to the scene) and a `target` (being the scene or a position within the scene). They must have a `motivation` property with the value of "painting" to assert that the resource is being painted into the Scene, rather than the Annotation being a comment about the Scene. Everything is an anno but these are special and core +There are other important uses of annotation, they are not all painting annos - see later... + +``` +JSON of painting anno +``` + +By the time you get here you are comfortable dropping the phrase "painting annotation" into casual conversation. + + ### Content Resources + +There is stuff that we want to show - images, video, audio, 3D models etc + Image, Sound, Video, Model, Text (see model) +And we can nest Containers so they are Content Resources too + SpecificResource @@ -124,6 +186,52 @@ A video on a Canvas with duration ### 3D +A Scene in IIIF is a virtual container that represents a boundless three-dimensional space and has content resources, lights and cameras positioned at locations within it. It may also have a duration to allow the sequencing of events and timed media. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. +The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). + +The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). + +diagram of Right handed cartesian coordinate system + + + +As multiple models, lights, cameras, and other resources can be associated with and placed within a Scene container, Scenes provide a straightforward way of grouping content resources together within a space. Scenes, as well as other IIIF containers such as Canvases, can also be embedded within a Scene, allowing for the nesting of content resources. + +A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. + + +As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. + +```json +{ + "id": "https://example.org/iiif/scenes/1", + "type": "Scene", + "label": {"en": ["Chessboard"]}, + "backgroundColor": "#000000", + "items": [ + "Note: Annotations Live Here" + ] +} +``` +As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in Transforms(transforms_section). + +A simple example painting one Scene into another: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }, + "target": "https://example.org/iiif/scene2" +} +``` + + + Whale bone with a camera and a light From debe57ca0dc64d716060f7b5ea3c8ab960456359 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 17 Mar 2025 17:55:53 -0400 Subject: [PATCH 032/192] updates --- source/presentation/4.0/model.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 7b5859de4..55b5dad0c 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -113,7 +113,14 @@ Collection Pages follow the ActivityStreams model, as also used in Annotation Co ### Manifest -A Manifest is a description of the structure and properties of a single item to be presented to the user, such as a title and other descriptive and linking information about the object and/or the intellectual work that it conveys. The scope of what constitutes an item, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. +A Manifest is the primary unit of distribution of IIIF and provides a description of the structure and properties of a single item to be presented to the user. + +A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items) + +A Manfiest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail) + +A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), rights, navDate, navPlace, placeholder, accompanying, viewingDirection, behavior, seeAlso, service, services, homepage, rendering, partOf, start, structures, and annotations. + Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. @@ -126,7 +133,7 @@ The Manifest _MAY_ have an `annotations` property, which includes Annotation Pag ### Container Classes -A Container is a frame of reference that allows the relative positioning of content, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). +A Container is a frame of reference that allows the relative positioning of content. All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. The URI of the Container _MUST NOT_ contain a fragment (a `#` followed by further characters), as this would make it impossible to refer to a segment of the Container's area using the [media fragment syntax][org-w3c-media-frags] of `#xywh=` for spatial regions, and/or `#t=` for temporal segments. Containers _MAY_ be able to be dereferenced separately from the Manifest via their URIs as well as being [embedded][prezi30-terminology]. @@ -152,7 +159,7 @@ The following set of classes are defined by the W3C's [Web Annotation Data Model #### Annotation -Annotations are primarily used to associate content resources with Containers. The same mechanism is used for the visible and/or audible resources as is used for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. As Annotations can be added later, it promotes a distributed system in which publishers can align their content with the descriptions created by others. +Annotations are used to associate content resources with Containers, as well as for transcriptions, commentary, tags and the association of other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. Annotations _MUST_ have their own HTTP(S) URIs, conveyed in the `id` property. The JSON-LD description of the Annotation _SHOULD_ be returned if the URI is dereferenced, according to the [Web Annotation Protocol][org-w3c-webanno-protocol]. From ad03ad31ee3f7893854c2a25c4ffc61b5a7f1b6f Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 18 Mar 2025 09:01:06 -0400 Subject: [PATCH 033/192] alphasort --- source/presentation/4.0/model.md | 1521 ++++++++++++++---------------- 1 file changed, 731 insertions(+), 790 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 55b5dad0c..2e63386b1 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -115,20 +115,17 @@ Collection Pages follow the ActivityStreams model, as also used in Annotation Co A Manifest is the primary unit of distribution of IIIF and provides a description of the structure and properties of a single item to be presented to the user. + A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items) A Manfiest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail) -A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), rights, navDate, navPlace, placeholder, accompanying, viewingDirection, behavior, seeAlso, service, services, homepage, rendering, partOf, start, structures, and annotations. +A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholder](#placeholder), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. -The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. - -The Manifest _MAY_ also have a `structures` property listing one or more [Ranges][prezi30-range] which describe additional structure of the content, such as might be rendered as a table of contents. - -The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These will typically be comment style Annotations, and _MUST NOT_ have `painting` as their `motivation`. +The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. ### Container Classes @@ -137,9 +134,7 @@ A Container is a frame of reference that allows the relative positioning of cont All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. The URI of the Container _MUST NOT_ contain a fragment (a `#` followed by further characters), as this would make it impossible to refer to a segment of the Container's area using the [media fragment syntax][org-w3c-media-frags] of `#xywh=` for spatial regions, and/or `#t=` for temporal segments. Containers _MAY_ be able to be dereferenced separately from the Manifest via their URIs as well as being [embedded][prezi30-terminology]. -Containers have an `items` property which is a list of Annotation Pages. Each Annotation Page, defined below, maintains a list of Annotations, which associate Content Resources to be rendered as part of the Container. - -Annotations that do not associate content to be rendered, but instead are about the Container such as a comment or tag, are recorded using Annotation Pages in the `annotations` property of the Container. +Containers _MUST_ have an `items` property which is a list of Annotation Pages. Each Annotation Page, defined below, maintains a list of Annotations, which associate Content Resources to be rendered as part of the Container. Annotations that do not associate content to be rendered, but instead are about the Container such as a comment or tag, are recorded using Annotation Pages in the `annotations` property of the Container. #### Timeline @@ -375,350 +370,284 @@ Ranges _MAY_ link to an Annotation Collection that has the content of the Range ## Properties -### Descriptive Properties -##### label +##### accompanyingContainer -A human readable label, name or title. The `label` property is intended to be displayed as a short, textual surrogate for the resource if a human needs to make a distinction between it and similar resources, for example between objects, pages, or options for a choice of images to display. The `label` property can be fully internationalized, and each language can have multiple values. This pattern is described in more detail in the [languages][prezi40-languages] section. +A single Container that provides additional content for use while rendering the resource that has the `accompanyingContainer` property. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. -The value of the property _MUST_ be a JSON object, as described in the [languages][prezi40-languages] section. +Clients _MAY_ display the content of an accompanying Container when presenting the resource. As with `placeholderContainer` above, when more than one accompanying Container is available, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the accompanying Container will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the accompanying Container and the content of the resource that has the `accompanyingContainer` property. - * A Collection _MUST_ have the `label` property with at least one entry.
- Clients _MUST_ render `label` on a Collection. - * A Manifest _MUST_ have the `label` property with at least one entry.
- Clients _MUST_ render `label` on a Manifest. - * All Container types _SHOULD_ have the `label` property with at least one entry.
- Clients _MUST_ render `label` on Container types, and _SHOULD_ generate a `label` for Containers that do not have them. - * All Content Resource types _MAY_ have the `label` property with at least one entry. If there is a Choice of Content Resource for the same Container, then they _SHOULD_ each have the `label` property with at least one entry.
- Clients _MAY_ render `label` on Content Resources, and _SHOULD_ render them when part of a Choice. - * A Range _SHOULD_ have the `label` property with at least one entry.
- Clients _MUST_ render `label` on a Range. - * An Annotation Collection _SHOULD_ have the `label` property with at least one entry.
- Clients _SHOULD_ render `label` on an Annotation Collection. - * Other types of resource _MAY_ have the `label` property with at least one entry.
- Clients _MAY_ render `label` on other types of resource. +The value of `accompanyingContainer` _MUST_ be a JSON object with the `id` and `type` properties. The value of `type` _MUST_ be a Container type. The JSON object _MAY_ have other properties valid for that Container type. + + * A Collection _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on a Collection. + * A Manifest _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on a Manifest. + * All Container types _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on Containers. + * A Range _MAY_ have the `accompanyingContainer` property.
+ Clients _MAY_ render `accompanyingContainer` on a Range. + * Other types of resource _MUST NOT_ have the `accompanyingContainer` property.
+ Clients _SHOULD_ ignore `accompanyingContainer` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ "label": { "en": [ "Example Object Title" ] } } +{ + "accompanyingContainer": { + "id": "https://example.org/iiif/1/timeline/accompany", + "type": "Timeline", + "duration": 180.0 + } +} ``` -##### metadata +##### angle -An ordered list of descriptions to be displayed to the user when they interact with the resource, given as pairs of human readable `label` and `value` entries. The content of these entries is intended for presentation only; descriptive semantics _SHOULD NOT_ be inferred. An entry might be used to convey information about the creation of the object, a physical description, ownership information, or other purposes. +!!! warning "Need more info" -The value of the `metadata` property _MUST_ be an array of JSON objects, where each item in the array has both `label` and `value` properties. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi40-languages] section. +The value _MUST_ be a floating point number greater than 0 and less than 90, and is measure in degrees. If this property is not specified, then the default value is client-dependent. - * A Collection _SHOULD_ have the `metadata` property with at least one item.
- Clients _MUST_ render `metadata` on a Collection. - * A Manifest _SHOULD_ have the `metadata` property with at least one item.
- Clients _MUST_ render `metadata` on a Manifest. - * All Container types _MAY_ have the `metadata` property with at least one item.
- Clients _SHOULD_ render `metadata` on Containers. - * Other types of resource _MAY_ have the `metadata` property with at least one item.
- Clients _MAY_ render `metadata` on other types of resource. +* A SpotLight _SHOULD_ have the `angle` property.
+ Clients _SHOULD_ process the `angle` property on SpotLights. -Clients _SHOULD_ display the entries in the order provided. Clients _SHOULD_ expect to encounter long texts in the `value` property, and render them appropriately, such as with an expand button, or in a tabbed interface. +```json + "angle": 15.0 +``` +##### annotations + +An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Canvas. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource or part of it. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have at least the `id` and `type` properties. + + * A Collection _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Collection. + * A Manifest _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Manifest,. + * A Canvas _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Canvas. + * A Range _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a Range. + * A content resource _MAY_ have the `annotations` property with at least one item.
+ Clients _SHOULD_ process `annotations` on a content resource. + * Other types of resource _MUST NOT_ have the `annotations` property.
+ Clients _SHOULD_ ignore `annotations` on other types of resource. {% include api/code_header.html %} ``` json-doc { - "metadata": [ + "annotations": [ { - "label": { "en": [ "Creator" ] }, - "value": { "en": [ "Anne Artist (1776-1824)" ] } + "id": "https://example.org/iiif/annotationPage/1", + "type": "AnnotationPage", + "items": [ { ... } ] } ] } ``` -##### summary +##### backgroundColor -A short textual summary intended to be conveyed to the user when the `metadata` entries for the resource are not being displayed. This could be used as a brief description for item level search results, for small-screen environments, or as an alternative user interface when the `metadata` property is not currently being rendered. The `summary` property follows the same pattern as the `label` property described above. +This property sets the background color behind any painted resources on a spatial Container, such as a Canvas or Scene. -The value of the property _MUST_ be a JSON object, as described in the [languages][prezi40-languages] section. +The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is client-dependent. - * A Collection _SHOULD_ have the `summary` property with at least one entry.
- Clients _SHOULD_ render `summary` on a Collection. - * A Manifest _SHOULD_ have the `summary` property with at least one entry.
- Clients _SHOULD_ render `summary` on a Manifest. - * All Container types _MAY_ have the `summary` property with at least one entry.
- Clients _SHOULD_ render `summary` on Containers. - * Other types of resource _MAY_ have the `summary` property with at least one entry.
- Clients _MAY_ render `summary` on other types of resource. + * A Canvas _MAY_ have the `backgroundColor` property
+ Clients _SHOULD_ render `backgroundColor` on any resource type. + * A Scene _MAY_ have the `backgroundColor` property
+ Clients _SHOULD_ render `backgroundColor` on any resource type. + * Other resources _MUST NOT_ have the `backgroundColor` property. -{% include api/code_header.html %} -``` json-doc -{ "summary": { "en": [ "This is a summary of the object." ] } } +```json-doc +{ "backgroundColor": "#FFFFFF" } ``` -##### requiredStatement +##### behavior -Text that _MUST_ be displayed when the resource is displayed or used. For example, the `requiredStatement` property could be used to present copyright or ownership statements, an acknowledgement of the owning and/or publishing institution, or any other text that the publishing organization deems critical to display to the user. Given the wide variation of potential client user interfaces, it will not always be possible to display this statement to the user in the client's initial state. If initially hidden, clients _MUST_ make the method of revealing it as obvious as possible. +A set of user experience features that the publisher of the content would prefer the client to use when presenting the resource. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. -The value of the property _MUST_ be a JSON object, that has the `label` and `value` properties, in the same way as a `metadata` property entry. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi40-languages] section. +In order to determine the behaviors that are governing a particular resource, there are four inheritance rules from resources that reference the current resource: +* Collections inherit behaviors from their referencing Collection. +* Manifests **DO NOT** inherit behaviors from any referencing Collections. +* Containers inherit behaviors from their referencing Manifest, but **DO NOT** inherit behaviors from any referencing Ranges, as there might be several with different behaviors. +* Ranges inherit behaviors from any referencing Range and referencing Manifest. - * Any resource type _MAY_ have the `requiredStatement` property.
- Clients _MUST_ render `requiredStatement` on every resource type. +Clients should interpret behaviors on a Range only when that Range is selected or is in some other way the context for the user's current interaction with the resources. A Range with the `behavior` value `continuous`, in a Manifest with the `behavior` value `paged`, would mean that the Manifest's Containers should be rendered in a paged fashion, unless the range is selected to be viewed, and its included Containers would be rendered in that context only as being virtually stitched together. This might occur, for example, when a physical scroll is cut into pages and bound into a codex with other pages, and the publisher would like to provide the user the experience of the scroll in its original form. -{% include api/code_header.html %} -``` json-doc -{ - "requiredStatement": { - "label": { "en": [ "Attribution" ] }, - "value": { "en": [ "Provided courtesy of Example Institution" ] } - } -} -``` +The descriptions of the behavior values have a set of which other values they are disjoint with, meaning that the same resource _MUST NOT_ have both of two or more from that set. In order to determine which is in effect, the client _SHOULD_ follow the inheritance rules above, taking the value from the closest resource. The user interface effects of the possible permutations of non-disjoint behavior values are client dependent, and implementers are advised to look for relevant recipes in the [IIIF cookbook][annex-cookbook]. -##### rights +The value _MUST_ be an array of strings. -A string that identifies a license or rights statement that applies to the content of the resource, such as the JSON of a Manifest or the pixels of an image. The value _MUST_ be drawn from the set of [Creative Commons][org-cc-licenses] license URIs, the [RightsStatements.org][org-rs-terms] rights statement URIs, or those added via the [extension][prezi40-ldce] mechanism. The inclusion of this property is informative, and for example could be used to display an icon representing the rights assertions. + * Any resource type _MAY_ have the `behavior` property with at least one item.
+ Clients _SHOULD_ process `behavior` on any resource type. -!!! registration not extension -If displaying rights information directly to the user is the desired interaction, or a publisher-defined label is needed, then it is _RECOMMENDED_ to include the information using the `requiredStatement` property or in the `metadata` property. +!!! Could continuous stitch together Timelines? -The value _MUST_ be a string. If the value is drawn from Creative Commons or RightsStatements.org, then the string _MUST_ be a URI defined by that specification. - * Any resource type _MAY_ have the `rights` property.
- Clients _MAY_ render `rights` on any resource type. +| Value | Description | +| ----- | ----------- | +|| **Temporal Behaviors** | +| `auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Containers, and Ranges that include or are Containers with at least the `duration` dimension. When the client reaches the end of a Canvas, or segment thereof as specified in a Range, with a duration dimension that has this behavior, it _SHOULD_ immediately proceed to the next Container or segment and render it. If there is no subsequent Container in the current context, then this behavior should be ignored. When applied to a Collection, the client should treat the first Container of the next Manifest as following the last Container of the previous Manifest, respecting any `start` property specified. Disjoint with `no-auto-advance`. | +| `no-auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Containers, and Ranges that include or are Containers with at least the `duration` dimension. When the client reaches the end of a Container or segment with a duration dimension that has this behavior, it _MUST NOT_ proceed to the next Container, if any. This is a default temporal behavior if not specified. Disjoint with `auto-advance`.| +| `repeat` | Valid on Collections and Manifests, that include Containers that have at least the `duration` dimension. When the client reaches the end of the duration of the final Container in the resource, and the `behavior` value `auto-advance`{: style="white-space:nowrap;"} is also in effect, then the client _SHOULD_ return to the first Container, or segment of a Container, in the resource that has the `behavior` value `repeat` and start playing again. If the `behavior` value `auto-advance` is not in effect, then the client _SHOULD_ render a navigation control for the user to manually return to the first Container or segment. Disjoint with `no-repeat`.| +| `no-repeat` | Valid on Collections and Manifests, that include Containers that have at least the `duration` dimension. When the client reaches the end of the duration of the final Container in the resource, the client _MUST NOT_ return to the first Container, or segment of Container. This is a default temporal behavior if not specified. Disjoint with `repeat`.| +| | **Layout Behaviors** | +| `unordered` | Valid on Collections, Manifests and Ranges. The resources included in resources that have this behavior have no inherent order, and user interfaces _SHOULD_ avoid implying an order to the user. Disjoint with `individuals`, `continuous`, and `paged`.| +| `individuals` | Valid on Collections, Manifests, and Ranges. For Collections that have this behavior, each of the included Manifests are distinct objects in the given order. For Manifests and Ranges, the included Containers are distinct views, and _SHOULD NOT_ be presented in a page-turning interface. This is the default layout behavior if not specified. Disjoint with `unordered`, `continuous`, and `paged`. | +| `continuous` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior are partial views and an appropriate rendering might display all of the Canvases virtually stitched together, such as a long scroll split into sections. This behavior has no implication for audio resources. The `viewingDirection` of the Manifest will determine the appropriate arrangement of the Canvases. Disjoint with `unordered`, `individuals` and `paged`. | +| `paged` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior represent views that _SHOULD_ be presented in a page-turning interface if one is available. The first canvas is a single view (the first recto) and thus the second canvas likely represents the back of the object in the first canvas. If this is not the case, see the `behavior` value `non-paged`. Disjoint with `unordered`, `individuals`, and `continuous`. | +| `facing-pages`{: style="white-space:nowrap;"} | Valid only on Canvases. Canvases that have this behavior, in a Manifest that has the `behavior` value `paged`, _MUST_ be displayed by themselves, as they depict both parts of the opening. If all of the Canvases are like this, then page turning is not possible, so simply use `individuals` instead. Disjoint with `non-paged`.| +| `non-paged` | Valid only on Canvases. Canvases that have this behavior _MUST NOT_ be presented in a page-turning interface, and _MUST_ be skipped over when determining the page order. This behavior _MUST_ be ignored if the current Manifest does not have the `behavior` value `paged`. Disjoint with `facing-pages`. | +| | **Collection Behaviors** | +| `multi-part` | Valid only on Collections. Collections that have this behavior consist of multiple Manifests or Collections which together form part of a logical whole or a contiguous set, such as multi-volume books or a set of journal issues. Clients might render these Collections as a table of contents rather than with thumbnails, or provide viewing interfaces that can easily advance from one member to the next. Disjoint with `together`.| +| `together` | Valid only on Collections. A client _SHOULD_ present all of the child Manifests to the user at once in a separate viewing area with its own controls. Clients _SHOULD_ catch attempts to create too many viewing areas. This behavior _SHOULD NOT_ be interpreted as applying to the members of any child resources. Disjoint with `multi-part`.| +| | **Range Behaviors** | +| `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Containers listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| +| `thumbnail-nav`{: style="white-space:nowrap;"} | Valid only on Ranges. Ranges that have this behavior _MAY_ be used by the client to present an alternative navigation or overview based on thumbnails, such as regular keyframes along a timeline for a video, or sections of a long scroll. Clients _SHOULD NOT_ use them to generate a conventional table of contents. Child Ranges of a Range with this behavior _MUST_ have a suitable `thumbnail` property. Disjoint with `sequence` and `no-nav`.| +| `no-nav` | Valid only on Ranges. Ranges that have this behavior _MUST NOT_ be displayed to the user in a navigation hierarchy. This allows for Ranges to be present that capture unnamed regions with no interesting content, such as the set of blank pages at the beginning of a book, or dead air between parts of a performance, that are still part of the Manifest but do not need to be navigated to directly. Disjoint with `sequence` and `thumbnail-nav`.| +| | **Miscellaneous Behaviors** | +| `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources, Lights, Cameras and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | +{: .api-table #table-behavior} {% include api/code_header.html %} ``` json-doc -{ "rights": "http://creativecommons.org/licenses/by/4.0/" } +{ "behavior": [ "auto-advance", "individuals" ] } ``` +##### color -__Machine actionable URIs and links for users__
-The machine actionable URIs for both Creative Commons licenses and RightsStatements.org right statements are `http` URIs. In both cases, human readable descriptions are available from equivalent `https` URIs. Clients may wish to rewrite links presented to users to use these equivalent `https` URIs. -{: .note} +This property sets the color of a Light. -##### provider +The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is "#FFFFFF". -An organization or person that contributed to providing the content of the resource. Clients can then display this information to the user to acknowledge the provider's contributions. This differs from the `requiredStatement` property, in that the data is structured, allowing the client to do more than just present text but instead have richer information about the people and organizations to use in different interfaces. + * A Light _SHOULD_ have the `color` property
+ Clients _SHOULD_ render `color` on any resource type. + * Other resources _MUST NOT_ have the `color` property. -The organization or person is represented as an `Agent` resource. +```json +"color": "#FFA0A0" +``` +##### duration -* Agents _MUST_ have the `id` property, and its value _MUST_ be a string. The string _MUST_ be a URI that identifies the agent. -* Agents _MUST_ have the `type` property, and its value _MUST_ be the string `Agent`. -* Agents _MUST_ have the `label` property, and its value _MUST_ be a JSON object as described in the [languages][prezi30-languages] section. -* Agents _SHOULD_ have the `homepage` property, and its value _MUST_ be an array of JSON objects as described in the [homepage][prezi30-homepage] section. -* Agents _SHOULD_ have the `logo` property, and its value _MUST_ be an array of JSON objects as described in the [logo][prezi30-logo] section. -* Agents _MAY_ have the `seeAlso` property, and its value _MUST_ be an array of JSON object as described in the [seeAlso][prezi30-seealso] section. +The duration of a container or external content resource, given in seconds. -The value _MUST_ be an array of JSON objects, where each item in the array conforms to the structure of an Agent, as described above. +The value _MUST_ be a positive floating point number. - * A Collection _SHOULD_ have the `provider` property with at least one item.
- Clients _MUST_ render `provider` on a Collection. - * A Manifest _SHOULD_ have the `provider` property with at least one item.
- Clients _MUST_ render `provider` on a Manifest. - * Other types of resource _MAY_ have the `provider` property with at least one item.
- Clients _SHOULD_ render `provider` on other types of resource. + * A Timeline _MUST_ have the `duration` property.
+ Clients _MUST_ process `duration` on a Timeline. + * A Canvas or Scene _MAY_ have the `duration` property.
+ Clients _MUST_ process `duration` on a Canvas or Scene, if present. + * Content resources _SHOULD_ have the `duration` property, if appropriate to the resource type.
+ Clients _SHOULD_ process `duration` on content resources. + * Other types of resource _MUST NOT_ have a `duration`.
+ Clients _SHOULD_ ignore `duration` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ - "provider": [ - { - "id": "https://example.org/about", - "type": "Agent", - "label": { "en": [ "Example Organization" ] }, - "homepage": [ - { - "id": "https://example.org/", - "type": "Text", - "label": { "en": [ "Example Organization Homepage" ] }, - "format": "text/html" - } - ], - "logo": [ - { - "id": "https://example.org/images/logo.png", - "type": "Image", - "format": "image/png", - "height": 100, - "width": 120 - } - ], - "seeAlso": [ - { - "id": "https://data.example.org/about/us.jsonld", - "type": "Dataset", - "format": "application/ld+json", - "profile": "https://schema.org/" - } - ] - } - ] -} +{ "duration": 125.0 } ``` +##### exclude -##### thumbnail - -A content resource, such as a small image or short audio clip, that represents the resource that has the `thumbnail` property. A resource _MAY_ have multiple thumbnail resources that have the same or different `type` and `format`. +_Summary here_ -The value _MUST_ be an array of JSON objects, each of which _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `format` property. Images and videos _SHOULD_ have the `width` and `height` properties, and time-based media _SHOULD_ have the `duration` property. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for images to enable manipulations such as resizing. +_On Annotation, a list of strings drawn from table_ - * A Collection _SHOULD_ have the `thumbnail` property with at least one item.
- Clients _SHOULD_ render `thumbnail` on a Collection. - * A Manifest _SHOULD_ have the `thumbnail` property with at least one item.
- Clients _SHOULD_ render `thumbnail` on a Manifest. - * All Container types _SHOULD_ have the `thumbnail` property with at least one item.
- Clients _SHOULD_ render `thumbnail` on Containers. - * Content Resource types _MAY_ have the `thumbnail` property with at least one item. Content Resources _SHOULD_ have the `thumbnail` property with at least one item if it is an option in a Choice of resources.
- Clients _SHOULD_ render `thumbnail` on a content resource. - * Other types of resource _MAY_ have the `thumbnail` property with at least one item.
- Clients _MAY_ render `thumbnail` on other types of resource. +| Value | Description | +|------------|-------------| +| Audio | | +| Animations | | +| Cameras | | +| Lights | | -{% include api/code_header.html %} -``` json-doc -{ - "thumbnail": [ - { - "id": "https://example.org/img/thumb.jpg", - "type": "Image", - "format": "image/jpeg", - "width": 300, - "height": 200 - } - ] -} +```json +"exclude": [ "Audio", "Lights", "Cameras", "Animations" ] ``` +##### far -##### navDate - -A date that clients may use for navigation purposes when presenting the resource to the user in a date-based user interface, such as a calendar or timeline. More descriptive date ranges, intended for display directly to the user, _SHOULD_ be included in the `metadata` property for human consumption. If the resource contains Canvases that have the `duration` property, the datetime given corresponds to the navigation datetime of the start of the resource. For example, a Range that includes a Canvas that represents a set of video content recording a historical event, the `navDate` is the datetime of the first moment of the recorded event. +This property gives the distance from the camera after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. -The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _MUST_ have a timezone, and _SHOULD_ be given in UTC with the `Z` timezone indicator, but _MAY_ instead be given as an offset of the form `+hh:mm`. +The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be greater than the value for `near` of the same Camera. If this property is not specified, then the default value is client-dependent. - * A Collection _MAY_ have the `navDate` property.
- Clients _MAY_ render `navDate` on a Collection. - * A Manifest _MAY_ have the `navDate` property.
- Clients _MAY_ render `navDate` on a Manifest. - * A Range _MAY_ have the `navDate` property.
- Clients _MAY_ render `navDate` on a Range. - * All Container types _MAY_ have the `navDate` property.
- Clients _MAY_ render `navDate` on Containers. -* Annotations _MAY_ have the `navDate` property. - Clients _MAY_ render `navDate` on Annotations. - * Other types of resource _MUST NOT_ have the `navDate` property.
- Clients _SHOULD_ ignore `navDate` on other types of resource. +* A Camera _MAY_ have the `far` property
+ Clients _SHOULD_ process the `far` property on Cameras. -{% include api/code_header.html %} -``` json-doc -{ "navDate": "2010-01-01T00:00:00Z" } +```json-doc +{ "far": 200.0 } ``` +##### fieldOfView -##### navPlace - -A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. The location is identified using structured data, described below, with latitude and longitude based points or polygons. If the location is only textual, then the information should instead be included in the `metadata` property. +The angle which a PerspectiveCamera can "see". -The value of the property _MUST_ be a [GeoJSON Feature Collection] [link] containing one or more [Features] [link]. The value _SHOULD_ be embedded and _MAY_ be a reference. Feature Collections referenced in the `navPlace` property _MUST_ have the `id` and `type` properties and _MUST NOT_ have the `features` property. +!!! warning "Need more info" -* A Collection _MAY_ have the `navPlace` property.
- Clients _MAY_ render `navPlace` on a Collection. -* A Manifest _MAY_ have the `navPlace` property.
- Clients _MAY_ render `navPlace` on a Manifest. -* A Range _MAY_ have the `navPlace` property.
- Clients _MAY_ render `navPlace` on a Range. -* All Container types _MAY_ have the `navPlace` property.
- Clients _MAY_ render `navPlace` on Containers. -* Annotations _MAY_ have the `navPlace` property. - Clients _MAY_ render `navPlace` on Annotations. -* Other types of resource _MUST NOT_ have the `navPlace` property.
- Clients _SHOULD_ ignore `navPlace` on other types of resource. +The value _MUST_ be a floating point number greater than 0 and less than 180, and is measured in degrees. If this property is not specified, then the default value is client-dependent. +* A PerspectiveCamera _SHOULD_ have the `fieldOfView` property.
+ Clients _SHOULD_ process the `fieldOfView` property on Cameras. -{% include api/code_header.html %} ```json-doc -{ - "navPlace":{ - "id": "https://example.com/feature-collection/1", - "type": "FeatureCollection", - "features":[ - { - "id": "https://example.com/feature/1", - "type": "Feature", - "geometry":{ - "id": "https://example.com/geometry/1", - "type": "Point", - "coordinates":[ - 9.938, - 51.533 - ] - } - } - ] - } -} +{ "fieldOfView": 50.0 } ``` +##### format +The specific media type (often called a MIME type) for a content resource, for example `image/jpeg`. This is important for distinguishing different formats of the same overall type of resource, such as distinguishing text in XML from plain text. -##### placeholderContainer +Note that this is different to the `formats` property in the [Image API][image-api], which gives the extension to use within that API. It would be inappropriate to use in this case, as `format` can be used with any content resource, not just images. -A single Container that provides additional content for use before the main content of the resource that has the `placeholderContainer` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderContainer` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderContainer` as part of the initial presentation of a single resource. A placeholder Container is likely to have different dimensions to those of the Container(s) of the resource that has the `placeholderContainer` property. A placeholder Container may be of a different type from the resource that has the `placeholderContainer` property. For example, a `Scene` may have a placeholder Container of type `Canvas`. +The value _MUST_ be a string, and it _SHOULD_ be the value of the `Content-Type` header returned when the resource is dereferenced. -Clients _MAY_ display the content of a linked placeholder Container when presenting the resource. When more than one such Container is available, for example if `placeholderContainer` is provided for the currently selected Range and the current Manifest, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the placeholder Container will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the rendered placeholder Container and the content of the resource that has the `placeholderContainer` property. + * A content resource _SHOULD_ have the `format` property.
+ Clients _MAY_ render the `format` of any content resource. + * Other types of resource _MUST NOT_ have the `format` property.
+ Clients _SHOULD_ ignore `format` on other types of resource. -The value of `placeholderContainer` _MUST_ be a JSON object with the `id` and `type` properties. The value of `type` _MUST_ be a Container type. The JSON object _MAY_ have other properties valid for that Container type. +{% include api/code_header.html %} +``` json-doc +{ "format": "application/xml" } +``` +##### height - * A Collection _MAY_ have the `placeholderContainer` property.
- Clients _MAY_ render `placeholderContainer` on a Collection. - * A Manifest _MAY_ have the `placeholderContainer` property.
- Clients _MAY_ render `placeholderContainer` on a Manifest. - * All Container types _MAY_ have the `placeholderContainer` property.
- Clients _MAY_ render `placeholderContainer` on Containers. - * A Range _MAY_ have the `placeholderContainer` property.
- Clients _MAY_ render `placeholderContainer` on a Range. - * Other types of resource _MUST NOT_ have the `placeholderContainer` property.
- Clients _SHOULD_ ignore `placeholderContainer` on other types of resource. +The height of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the width, it conveys an aspect ratio for the space in which content resources are located. + +The value _MUST_ be a positive integer. + + * A Canvas _MUST_ have the `height` property.
+ Clients _MUST_ process `height` on a Canvas. + * Content resources _SHOULD_ have the `height` property, with the value given in pixels, if appropriate to the resource type.
+ Clients _SHOULD_ process `height` on content resources. + * Other types of resource _MUST NOT_ have the `height` property.
+ Clients _SHOULD_ ignore `height` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ - "placeholderContainer": { - "id": "https://example.org/iiif/1/canvas/placeholder", - "type": "Canvas", - "height": 1400, - "width": 1200 - } -} +{ "height": 1800 } ``` +##### homepage -##### accompanyingContainer - -A single Container that provides additional content for use while rendering the resource that has the `accompanyingContainer` property. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. +A web page that is about the object represented by the resource that has the `homepage` property. The web page is usually published by the organization responsible for the object, and might be generated by a content management system or other cataloging system. The resource _MUST_ be able to be displayed directly to the user. Resources that are related, but not home pages, _MUST_ instead be added into the `metadata` property, with an appropriate `label` or `value` to describe the relationship. -Clients _MAY_ display the content of an accompanying Container when presenting the resource. As with `placeholderContainer` above, when more than one accompanying Container is available, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the accompanying Container will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the accompanying Container and the content of the resource that has the `accompanyingContainer` property. +The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have the `id`, `type`, and `label` properties, _SHOULD_ have a `format` property, and _MAY_ have the `language` property. -The value of `accompanyingContainer` _MUST_ be a JSON object with the `id` and `type` properties. The value of `type` _MUST_ be a Container type. The JSON object _MAY_ have other properties valid for that Container type. + * Any resource type _MAY_ have the `homepage` property.
+ Clients _SHOULD_ render `homepage` on a Collection, Manifest or Canvas, and _MAY_ render `homepage` on other types of resource. - * A Collection _MAY_ have the `accompanyingContainer` property.
- Clients _MAY_ render `accompanyingContainer` on a Collection. - * A Manifest _MAY_ have the `accompanyingContainer` property.
- Clients _MAY_ render `accompanyingContainer` on a Manifest. - * All Container types _MAY_ have the `accompanyingContainer` property.
- Clients _MAY_ render `accompanyingContainer` on Containers. - * A Range _MAY_ have the `accompanyingContainer` property.
- Clients _MAY_ render `accompanyingContainer` on a Range. - * Other types of resource _MUST NOT_ have the `accompanyingContainer` property.
- Clients _SHOULD_ ignore `accompanyingContainer` on other types of resource. +__Model Alignment__
+Please note that this specification has stricter requirements about the JSON pattern used for the `homepage` property than the [Web Annotation Data Model][org-w3c-webanno]. The IIIF requirements are compatible, but the home page of an Agent found might have only a URI, or might be a JSON object with other properties. See the section on [collisions between contexts][prezi30-context-collisions] for more information. +{: .note} {% include api/code_header.html %} ``` json-doc { - "accompanyingContainer": { - "id": "https://example.org/iiif/1/timeline/accompany", - "type": "Timeline", - "duration": 180.0 - } + "homepage": [ + { + "id": "https://example.com/info/", + "type": "Text", + "label": { "en": [ "Homepage for Example Object" ] }, + "format": "text/html", + "language": [ "en" ] + } + ] } ``` - - - -### Technical Properties - ##### id The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Canvases, which _MUST_ have their own URI without a fragment. @@ -734,320 +663,310 @@ The existence of an HTTP(S) URI in the `id` property does not mean that the URI ``` json-doc { "id": "https://example.org/iiif/1/manifest" } ``` +##### intensity -##### type - -The type or class of the resource. For classes defined for this specification, the value of `type` will be described in the sections below describing each individual class. - -For content resources, the value of `type` is drawn from other specifications. Recommendations for common content types such as image, text or audio are given in the table below. - -The JSON objects that appear in the value of the `service` property will have many different classes, and can be used to distinguish the sort of service, with specific properties defined in a [registered context document][prezi30-ldce]. +This property sets the strength or brightness of a Light. -The value _MUST_ be a string. +The value _MUST_ be a JSON object, that has the `type`, `value` and `unit` properties. All three properties are required. The value of `type` _MUST_ be the string "UnitValue". The value of `value` is a floating point number. The value of `unit` is a string, drawn from a controlled vocabulary of units. If this property is not specified, then the default intensity value is client-dependent. - * All resource types _MUST_ have the `type` property.
- Clients _MUST_ process, and _MAY_ render, `type` on any resource type. +This specification defines the unit value of "relative" which constrains the value to be a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). -| Class | Description | -| ------------- | -------------------------------- | -| `Dataset` | Data not intended to be rendered to humans directly, such as a CSV, an RDF serialization or a zip file | -| `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | -| `Model` | A three dimensional spatial model intended to be visualized, such as might be rendered with a 3d javascript library | -| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | -| `Text` | Resources primarily intended to be read | -| `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | -{: .api-table #table-type} +* A Light _SHOULD_ have the `intensity` property.
+ Clients _SHOULD_ process the `intensity` property on Lights. -{% include api/code_header.html %} -``` json-doc -{ "type": "Image" } +```json +{ + "intensity": {"id": "", "type": "UnitValue", "value": 0.5, "unit": "relative"} +} ``` +##### interactionMode -##### format +*within* the Scene, whereas viewingDirection and behavior are across containers. -The specific media type (often called a MIME type) for a content resource, for example `image/jpeg`. This is important for distinguishing different formats of the same overall type of resource, such as distinguishing text in XML from plain text. +* Containers _MAY_ have the `interactionMode` -Note that this is different to the `formats` property in the [Image API][image-api], which gives the extension to use within that API. It would be inappropriate to use in this case, as `format` can be used with any content resource, not just images. +Table here with values -The value _MUST_ be a string, and it _SHOULD_ be the value of the `Content-Type` header returned when the resource is dereferenced. - * A content resource _SHOULD_ have the `format` property.
- Clients _MAY_ render the `format` of any content resource. - * Other types of resource _MUST NOT_ have the `format` property.
- Clients _SHOULD_ ignore `format` on other types of resource. +locked +orbit +hemisphere-orbit +free +free-direction -{% include api/code_header.html %} -``` json-doc -{ "format": "application/xml" } -``` +other examples: no-zoom, no-scrub, rti-mode +##### items -##### language +Much of the functionality of the IIIF Presentation API is simply recording the order in which child resources occur within a parent resource, such as Collections or Manifests within a parent Collection, or Canvases within a Manifest. All of these situations are covered with a single property, `items`. -The language or languages used in the content of this external resource. This property is already available from the Web Annotation model for content resources that are the body or target of an Annotation, however it _MAY_ also be used for resources [referenced][prezi30-terminology] from `homepage`, `rendering`, and `partOf`. +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties. The items will be resources of different types, as described below. -The value _MUST_ be an array of strings. Each item in the array _MUST_ be a valid language code, as described in the [languages section][prezi30-languages]. - - * An external resource _SHOULD_ have the `language` property with at least one item.
- Clients _SHOULD_ process the `language` of external resources. - * Other types of resource _MUST NOT_ have the `language` property.
- Clients _SHOULD_ ignore `language` on other types of resource. + * A Collection _MUST_ have the `items` property. Each item _MUST_ be either a Collection or a Manifest.
+ Clients _MUST_ process `items` on a Collection. + * A Manifest _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Canvas.
+ Clients _MUST_ process `items` on a Manifest. + * A Canvas _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation Page.
+ Clients _MUST_ process `items` on a Canvas. + * An Annotation Page _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation.
+ Clients _MUST_ process `items` on an Annotation Page. + * A Range _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Range, a Canvas or a Specific Resource where the source is a Canvas.
+ Clients _SHOULD_ process `items` on a Range. + * Other types of resource _MUST NOT_ have the `items` property.
+ Clients _SHOULD_ ignore `items` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ "language": [ "en" ] } +{ + "items": [ + { + "id": "https://example.org/iiif/manifest1", + "type": "Manifest" + }, + { + "id": "https://example.org/iiif/collection1", + "type": "Collection" + } + // ... + ] +} ``` +##### label -##### profile - -A schema or named set of functionality available from the resource. The profile can further clarify the `type` and/or `format` of an external resource or service, allowing clients to customize their handling of the resource that has the `profile` property. +A human readable label, name or title. The `label` property is intended to be displayed as a short, textual surrogate for the resource if a human needs to make a distinction between it and similar resources, for example between objects, pages, or options for a choice of images to display. The `label` property can be fully internationalized, and each language can have multiple values. This pattern is described in more detail in the [languages][prezi40-languages] section. -The value _MUST_ be a string, either taken from the [profiles registry][registry-profiles] or a URI. +The value of the property _MUST_ be a JSON object, as described in the [languages][prezi40-languages] section. -* Resources [referenced][prezi30-terminology] by the `seeAlso` or `service` properties _SHOULD_ have the `profile` property.
- Clients _SHOULD_ process the `profile` of a service or external resource. -* Other types of resource _MAY_ have the `profile` property.
- Clients _MAY_ process the `profile` of other types of resource. + * A Collection _MUST_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on a Collection. + * A Manifest _MUST_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on a Manifest. + * All Container types _SHOULD_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on Container types, and _SHOULD_ generate a `label` for Containers that do not have them. + * All Content Resource types _MAY_ have the `label` property with at least one entry. If there is a Choice of Content Resource for the same Container, then they _SHOULD_ each have the `label` property with at least one entry.
+ Clients _MAY_ render `label` on Content Resources, and _SHOULD_ render them when part of a Choice. + * A Range _SHOULD_ have the `label` property with at least one entry.
+ Clients _MUST_ render `label` on a Range. + * An Annotation Collection _SHOULD_ have the `label` property with at least one entry.
+ Clients _SHOULD_ render `label` on an Annotation Collection. + * Other types of resource _MAY_ have the `label` property with at least one entry.
+ Clients _MAY_ render `label` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ "profile": "https://example.org/profile/statuary" } +{ "label": { "en": [ "Example Object Title" ] } } ``` +##### language -##### height - -The height of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the width, it conveys an aspect ratio for the space in which content resources are located. +The language or languages used in the content of this external resource. This property is already available from the Web Annotation model for content resources that are the body or target of an Annotation, however it _MAY_ also be used for resources [referenced][prezi30-terminology] from `homepage`, `rendering`, and `partOf`. -The value _MUST_ be a positive integer. +The value _MUST_ be an array of strings. Each item in the array _MUST_ be a valid language code, as described in the [languages section][prezi30-languages]. - * A Canvas _MUST_ have the `height` property.
- Clients _MUST_ process `height` on a Canvas. - * Content resources _SHOULD_ have the `height` property, with the value given in pixels, if appropriate to the resource type.
- Clients _SHOULD_ process `height` on content resources. - * Other types of resource _MUST NOT_ have the `height` property.
- Clients _SHOULD_ ignore `height` on other types of resource. + * An external resource _SHOULD_ have the `language` property with at least one item.
+ Clients _SHOULD_ process the `language` of external resources. + * Other types of resource _MUST NOT_ have the `language` property.
+ Clients _SHOULD_ ignore `language` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ "height": 1800 } +{ "language": [ "en" ] } ``` +##### logo -##### width +A small image resource that represents the Agent resource it is associated with. The logo _MUST_ be clearly rendered when the resource is displayed or used, without cropping, rotating or otherwise distorting the image. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for this image for other manipulations such as resizing. -The width of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the height, it conveys an aspect ratio for the space in which content resources are located. +When more than one logo is present, the client _SHOULD_ pick only one of them, based on the information in the logo properties. For example, the client could select a logo of appropriate aspect ratio based on the `height` and `width` properties of the available logos. The client _MAY_ decide on the logo by inspecting properties defined as [extensions][prezi30-ldce]. -The value _MUST_ be a positive integer. +The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have `id` and `type` properties, and _SHOULD_ have `format`. The value of `type` _MUST_ be `Image`. + + * Agent resources _SHOULD_ have the `logo` property.
+ Clients _MUST_ render `logo` on Agent resources. - * A Canvas _MUST_ have the `width` property.
- Clients _MUST_ process `width` on a Canvas. - * Content resources _SHOULD_ have the `width` property, with the value given in pixels, if appropriate to the resource type.
- Clients _SHOULD_ process `width` on content resources. - * Other types of resource _MUST NOT_ have the `width` property.
- Clients _SHOULD_ ignore `width` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ "width": 1200 } +{ + "logo": [ + { + "id": "https://example.org/img/logo.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 100, + "width": 120 + } + ] +} ``` +##### lookAt -##### duration - -The duration of a container or external content resource, given in seconds. +_Summary here_ -The value _MUST_ be a positive floating point number. +The value _MUST_ be a JSON object, conforming to either a reference to an Annotation, or an embedded PointSelector. If this property is not specified, then the default value for cameras is to look straight backwards (-Z) and for lights to point straight down (-Y). - * A Timeline _MUST_ have the `duration` property.
- Clients _MUST_ process `duration` on a Timeline. - * A Canvas or Scene _MAY_ have the `duration` property.
- Clients _MUST_ process `duration` on a Canvas or Scene, if present. - * Content resources _SHOULD_ have the `duration` property, if appropriate to the resource type.
- Clients _SHOULD_ process `duration` on content resources. - * Other types of resource _MUST NOT_ have a `duration`.
- Clients _SHOULD_ ignore `duration` on other types of resource. +* A Camera _MAY_ have the `lookAt` property.
+ Clients _SHOULD_ process the `lookAt` property on Cameras. +* A SpotLight or a DirectionalLight _SHOULD_ have the `lookAt` property.
-{% include api/code_header.html %} -``` json-doc -{ "duration": 125.0 } +```json +"lookAt": { + "type": "PointSelector", + "x": 3, + "y": 0, + "z": -10 +} ``` +##### metadata -##### viewingDirection - -!!! Rewrite to be where is the navigation control to step to the next/ previous in the items of hte manifest - - -The direction in which a list of Containers _SHOULD_ be displayed to the user. This specification defines four direction values in the table below. Others may be defined externally [as an extension][prezi30-ldce]. For example, -if the `viewingDirection` value is `left-to-right`, then backwards in the list is to the left, and forwards in the -list is to the right. +An ordered list of descriptions to be displayed to the user when they interact with the resource, given as pairs of human readable `label` and `value` entries. The content of these entries is intended for presentation only; descriptive semantics _SHOULD NOT_ be inferred. An entry might be used to convey information about the creation of the object, a physical description, ownership information, or other purposes. -The value _MUST_ be a string. +The value of the `metadata` property _MUST_ be an array of JSON objects, where each item in the array has both `label` and `value` properties. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi40-languages] section. - * A Collection _MAY_ have the `viewingDirection` property.
- Clients _SHOULD_ process `viewingDirection` on a Collection. - * A Manifest _MAY_ have the `viewingDirection` property.
- Clients _SHOULD_ process `viewingDirection` on a Manifest. - * A Range _MAY_ have the `viewingDirection` property.
- Clients _MAY_ process `viewingDirection` on a Range. - * Other types of resource _MUST NOT_ have the `viewingDirection` property.
- Clients _SHOULD_ ignore `viewingDirection` on other types of resource. + * A Collection _SHOULD_ have the `metadata` property with at least one item.
+ Clients _MUST_ render `metadata` on a Collection. + * A Manifest _SHOULD_ have the `metadata` property with at least one item.
+ Clients _MUST_ render `metadata` on a Manifest. + * All Container types _MAY_ have the `metadata` property with at least one item.
+ Clients _SHOULD_ render `metadata` on Containers. + * Other types of resource _MAY_ have the `metadata` property with at least one item.
+ Clients _MAY_ render `metadata` on other types of resource. -| Value | Description | -| ----- | ----------- | -| `left-to-right` | The object is displayed from left to right. The default if not specified. | -| `right-to-left` | The object is displayed from right to left. | -| `top-to-bottom` | The object is displayed from the top to the bottom. | -| `bottom-to-top` | The object is displayed from the bottom to the top. | -{: .api-table #table-direction} +Clients _SHOULD_ display the entries in the order provided. Clients _SHOULD_ expect to encounter long texts in the `value` property, and render them appropriately, such as with an expand button, or in a tabbed interface. {% include api/code_header.html %} ``` json-doc -{ "viewingDirection": "left-to-right" } +{ + "metadata": [ + { + "label": { "en": [ "Creator" ] }, + "value": { "en": [ "Anne Artist (1776-1824)" ] } + } + ] +} ``` +##### navDate -##### behavior - -A set of user experience features that the publisher of the content would prefer the client to use when presenting the resource. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. - -In order to determine the behaviors that are governing a particular resource, there are four inheritance rules from resources that reference the current resource: -* Collections inherit behaviors from their referencing Collection. -* Manifests **DO NOT** inherit behaviors from any referencing Collections. -* Containers inherit behaviors from their referencing Manifest, but **DO NOT** inherit behaviors from any referencing Ranges, as there might be several with different behaviors. -* Ranges inherit behaviors from any referencing Range and referencing Manifest. - -Clients should interpret behaviors on a Range only when that Range is selected or is in some other way the context for the user's current interaction with the resources. A Range with the `behavior` value `continuous`, in a Manifest with the `behavior` value `paged`, would mean that the Manifest's Containers should be rendered in a paged fashion, unless the range is selected to be viewed, and its included Containers would be rendered in that context only as being virtually stitched together. This might occur, for example, when a physical scroll is cut into pages and bound into a codex with other pages, and the publisher would like to provide the user the experience of the scroll in its original form. - -The descriptions of the behavior values have a set of which other values they are disjoint with, meaning that the same resource _MUST NOT_ have both of two or more from that set. In order to determine which is in effect, the client _SHOULD_ follow the inheritance rules above, taking the value from the closest resource. The user interface effects of the possible permutations of non-disjoint behavior values are client dependent, and implementers are advised to look for relevant recipes in the [IIIF cookbook][annex-cookbook]. - -The value _MUST_ be an array of strings. - - * Any resource type _MAY_ have the `behavior` property with at least one item.
- Clients _SHOULD_ process `behavior` on any resource type. - - -!!! Could continuous stitch together Timelines? +A date that clients may use for navigation purposes when presenting the resource to the user in a date-based user interface, such as a calendar or timeline. More descriptive date ranges, intended for display directly to the user, _SHOULD_ be included in the `metadata` property for human consumption. If the resource contains Canvases that have the `duration` property, the datetime given corresponds to the navigation datetime of the start of the resource. For example, a Range that includes a Canvas that represents a set of video content recording a historical event, the `navDate` is the datetime of the first moment of the recorded event. +The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _MUST_ have a timezone, and _SHOULD_ be given in UTC with the `Z` timezone indicator, but _MAY_ instead be given as an offset of the form `+hh:mm`. -| Value | Description | -| ----- | ----------- | -|| **Temporal Behaviors** | -| `auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Containers, and Ranges that include or are Containers with at least the `duration` dimension. When the client reaches the end of a Canvas, or segment thereof as specified in a Range, with a duration dimension that has this behavior, it _SHOULD_ immediately proceed to the next Container or segment and render it. If there is no subsequent Container in the current context, then this behavior should be ignored. When applied to a Collection, the client should treat the first Container of the next Manifest as following the last Container of the previous Manifest, respecting any `start` property specified. Disjoint with `no-auto-advance`. | -| `no-auto-advance`{: style="white-space:nowrap;"} | Valid on Collections, Manifests, Containers, and Ranges that include or are Containers with at least the `duration` dimension. When the client reaches the end of a Container or segment with a duration dimension that has this behavior, it _MUST NOT_ proceed to the next Container, if any. This is a default temporal behavior if not specified. Disjoint with `auto-advance`.| -| `repeat` | Valid on Collections and Manifests, that include Containers that have at least the `duration` dimension. When the client reaches the end of the duration of the final Container in the resource, and the `behavior` value `auto-advance`{: style="white-space:nowrap;"} is also in effect, then the client _SHOULD_ return to the first Container, or segment of a Container, in the resource that has the `behavior` value `repeat` and start playing again. If the `behavior` value `auto-advance` is not in effect, then the client _SHOULD_ render a navigation control for the user to manually return to the first Container or segment. Disjoint with `no-repeat`.| -| `no-repeat` | Valid on Collections and Manifests, that include Containers that have at least the `duration` dimension. When the client reaches the end of the duration of the final Container in the resource, the client _MUST NOT_ return to the first Container, or segment of Container. This is a default temporal behavior if not specified. Disjoint with `repeat`.| -| | **Layout Behaviors** | -| `unordered` | Valid on Collections, Manifests and Ranges. The resources included in resources that have this behavior have no inherent order, and user interfaces _SHOULD_ avoid implying an order to the user. Disjoint with `individuals`, `continuous`, and `paged`.| -| `individuals` | Valid on Collections, Manifests, and Ranges. For Collections that have this behavior, each of the included Manifests are distinct objects in the given order. For Manifests and Ranges, the included Containers are distinct views, and _SHOULD NOT_ be presented in a page-turning interface. This is the default layout behavior if not specified. Disjoint with `unordered`, `continuous`, and `paged`. | -| `continuous` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior are partial views and an appropriate rendering might display all of the Canvases virtually stitched together, such as a long scroll split into sections. This behavior has no implication for audio resources. The `viewingDirection` of the Manifest will determine the appropriate arrangement of the Canvases. Disjoint with `unordered`, `individuals` and `paged`. | -| `paged` | Valid on Collections, Manifests and Ranges, which include Canvases. Canvases included in resources that have this behavior represent views that _SHOULD_ be presented in a page-turning interface if one is available. The first canvas is a single view (the first recto) and thus the second canvas likely represents the back of the object in the first canvas. If this is not the case, see the `behavior` value `non-paged`. Disjoint with `unordered`, `individuals`, and `continuous`. | -| `facing-pages`{: style="white-space:nowrap;"} | Valid only on Canvases. Canvases that have this behavior, in a Manifest that has the `behavior` value `paged`, _MUST_ be displayed by themselves, as they depict both parts of the opening. If all of the Canvases are like this, then page turning is not possible, so simply use `individuals` instead. Disjoint with `non-paged`.| -| `non-paged` | Valid only on Canvases. Canvases that have this behavior _MUST NOT_ be presented in a page-turning interface, and _MUST_ be skipped over when determining the page order. This behavior _MUST_ be ignored if the current Manifest does not have the `behavior` value `paged`. Disjoint with `facing-pages`. | -| | **Collection Behaviors** | -| `multi-part` | Valid only on Collections. Collections that have this behavior consist of multiple Manifests or Collections which together form part of a logical whole or a contiguous set, such as multi-volume books or a set of journal issues. Clients might render these Collections as a table of contents rather than with thumbnails, or provide viewing interfaces that can easily advance from one member to the next. Disjoint with `together`.| -| `together` | Valid only on Collections. A client _SHOULD_ present all of the child Manifests to the user at once in a separate viewing area with its own controls. Clients _SHOULD_ catch attempts to create too many viewing areas. This behavior _SHOULD NOT_ be interpreted as applying to the members of any child resources. Disjoint with `multi-part`.| -| | **Range Behaviors** | -| `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Containers listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| -| `thumbnail-nav`{: style="white-space:nowrap;"} | Valid only on Ranges. Ranges that have this behavior _MAY_ be used by the client to present an alternative navigation or overview based on thumbnails, such as regular keyframes along a timeline for a video, or sections of a long scroll. Clients _SHOULD NOT_ use them to generate a conventional table of contents. Child Ranges of a Range with this behavior _MUST_ have a suitable `thumbnail` property. Disjoint with `sequence` and `no-nav`.| -| `no-nav` | Valid only on Ranges. Ranges that have this behavior _MUST NOT_ be displayed to the user in a navigation hierarchy. This allows for Ranges to be present that capture unnamed regions with no interesting content, such as the set of blank pages at the beginning of a book, or dead air between parts of a performance, that are still part of the Manifest but do not need to be navigated to directly. Disjoint with `sequence` and `thumbnail-nav`.| -| | **Miscellaneous Behaviors** | -| `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources, Lights, Cameras and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | -{: .api-table #table-behavior} + * A Collection _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on a Collection. + * A Manifest _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on a Manifest. + * A Range _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on a Range. + * All Container types _MAY_ have the `navDate` property.
+ Clients _MAY_ render `navDate` on Containers. +* Annotations _MAY_ have the `navDate` property. + Clients _MAY_ render `navDate` on Annotations. + * Other types of resource _MUST NOT_ have the `navDate` property.
+ Clients _SHOULD_ ignore `navDate` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ "behavior": [ "auto-advance", "individuals" ] } +{ "navDate": "2010-01-01T00:00:00Z" } ``` +##### navPlace -##### interactionMode - -*within* the Scene, whereas viewingDirection and behavior are across containers. - -* Containers _MAY_ have the `interactionMode` +A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. The location is identified using structured data, described below, with latitude and longitude based points or polygons. If the location is only textual, then the information should instead be included in the `metadata` property. -Table here with values +The value of the property _MUST_ be a [GeoJSON Feature Collection] [link] containing one or more [Features] [link]. The value _SHOULD_ be embedded and _MAY_ be a reference. Feature Collections referenced in the `navPlace` property _MUST_ have the `id` and `type` properties and _MUST NOT_ have the `features` property. +* A Collection _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on a Collection. +* A Manifest _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on a Manifest. +* A Range _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on a Range. +* All Container types _MAY_ have the `navPlace` property.
+ Clients _MAY_ render `navPlace` on Containers. +* Annotations _MAY_ have the `navPlace` property. + Clients _MAY_ render `navPlace` on Annotations. +* Other types of resource _MUST NOT_ have the `navPlace` property.
+ Clients _SHOULD_ ignore `navPlace` on other types of resource. -locked -orbit -hemisphere-orbit -free -free-direction -other examples: no-zoom, no-scrub, rti-mode +{% include api/code_header.html %} +```json-doc +{ + "navPlace":{ + "id": "https://example.com/feature-collection/1", + "type": "FeatureCollection", + "features":[ + { + "id": "https://example.com/feature/1", + "type": "Feature", + "geometry":{ + "id": "https://example.com/geometry/1", + "type": "Point", + "coordinates":[ + 9.938, + 51.533 + ] + } + } + ] + } +} +``` +##### near +This property gives the distance from the camera from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. -##### provides +The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be less than the value for `far` for the same Camera. If this property is not specified, then the default value is client-dependent. -A set of features or additional functionality that a linked resource enables relative to the linking or including resource, which is not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). +* A Camera _MAY_ have the `near` property
+ Clients _SHOULD_ process the `near` property on Cameras. -The value _MUST_ be an array of strings, each string identifies a particular feature and _MUST_ be taken from the table below or the [provides registry][link]. +```json-doc +{ "near": 1.5 } +``` -Note that the majority of the values have been selected from [accessibility feature spec][link] and thus use the original form rather than being consistent with the hyphen-based form of the values of `behavior` and `viewingDirection`. +##### partOf +A containing resource that includes the resource that has the `partOf` property. When a client encounters the `partOf` property, it might retrieve the [referenced][prezi30-terminology] containing resource, if it is not [embedded][prezi30-terminology] in the current representation, in order to contribute to the processing of the contained resource. For example, the `partOf` property on a Canvas can be used to reference an external Manifest in order to enable the discovery of further relevant information. Similarly, a Manifest can reference a containing Collection using `partOf` to aid in navigation. -* Annotations with the `painting` motivation _SHOULD NOT_ have the `provides` property.
- Clients _SHOULD_ ignore the `provides` property on Annotations with the `painting` motivation. -* Any resource linked to or included in another resource _MAY_ have the `provides` property.
- Clients _SHOULD_ process the `provides` property on these resources. +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `label` property. -| Value | Description | -| ----- | ----------- | -| `closedCaptions` | ... | -| `alternativeText` | ... | -| `audioDescription` | ... | -| `longDescription` | ... | -| `signLanguage` | ... | -| `highContrastAudio` | ... | -| `highContrastDisplay` | ... | -| `braille` | ... | -| `tactileGraphic` | ... | -| `transcript` | ... | -| `translation` | (IIIF Defined) ... | -| `subtitles` | (IIIF Defined) ... | -{: .api-table #table-behavior} + * Any resource type _MAY_ have the `partOf` property with at least one item
+ Clients _MAY_ render `partOf` on any resource type. {% include api/code_header.html %} ``` json-doc -{ "provides": [ "closedCaption" ] } +{ "partOf": [ { "id": "https://example.org/iiif/1", "type": "Manifest" } ] } ``` -!!! warning "This breaks the graph as the file doesn't provide X in all contexts" - +The resources referred to by the `accompanyingContainer` and `placeholderContainer` properties are `partOf` that referring Container. -##### timeMode +##### placeholderContainer -A mode associated with an Annotation that is to be applied to the rendering of any time-based media, or otherwise could be considered to have a duration, used as a body resource of that Annotation. Note that the association of `timeMode` with the Annotation means that different resources in the body cannot have different values. This specification defines the values specified in the table below. Others may be defined externally as an [extension][prezi30-ldce]. +A single Container that provides additional content for use before the main content of the resource that has the `placeholderContainer` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderContainer` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderContainer` as part of the initial presentation of a single resource. A placeholder Container is likely to have different dimensions to those of the Container(s) of the resource that has the `placeholderContainer` property. A placeholder Container may be of a different type from the resource that has the `placeholderContainer` property. For example, a `Scene` may have a placeholder Container of type `Canvas`. -The value _MUST_ be a string. +Clients _MAY_ display the content of a linked placeholder Container when presenting the resource. When more than one such Container is available, for example if `placeholderContainer` is provided for the currently selected Range and the current Manifest, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the placeholder Container will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the rendered placeholder Container and the content of the resource that has the `placeholderContainer` property. - * An Annotation _MAY_ have the `timeMode` property.
- Clients _SHOULD_ process `timeMode` on an Annotation. +The value of `placeholderContainer` _MUST_ be a JSON object with the `id` and `type` properties. The value of `type` _MUST_ be a Container type. The JSON object _MAY_ have other properties valid for that Container type. -| Value | Description | -| ----- | ----------- | -| `trim` | (default, if not supplied) If the content resource has a longer duration than the duration of the portion of the Canvas it is associated with, then at the end of the Canvas's duration, the playback of the content resource _MUST_ also end. If the content resource has a shorter duration than the duration of the portion of the Canvas it is associated with, then, for video resources, the last frame _SHOULD_ persist on-screen until the end of the Canvas portion's duration. For example, a video of 120 seconds annotated to a Canvas with a duration of 100 seconds would play only the first 100 seconds and drop the last 20 seconds. | -| `scale` | Fit the duration of content resource to the duration of the portion of the Canvas it is associated with by scaling. For example, a video of 120 seconds annotated to a Canvas with a duration of 60 seconds would be played at double-speed. | -| `loop` | If the content resource is shorter than the `duration` of the Canvas, it _MUST_ be repeated to fill the entire duration. Resources longer than the `duration` _MUST_ be trimmed as described above. For example, if a 20 second duration audio stream is annotated onto a Canvas with a duration of 30 seconds, it will be played one and a half times. | -{: .api-table #table-timemode} + * A Collection _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on a Collection. + * A Manifest _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on a Manifest. + * All Container types _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on Containers. + * A Range _MAY_ have the `placeholderContainer` property.
+ Clients _MAY_ render `placeholderContainer` on a Range. + * Other types of resource _MUST NOT_ have the `placeholderContainer` property.
+ Clients _SHOULD_ ignore `placeholderContainer` on other types of resource. {% include api/code_header.html %} ``` json-doc -{ "timeMode": "trim" } -``` - -#### backgroundColor - -This property sets the background color behind any painted resources on a spatial Container, such as a Canvas or Scene. - -The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is client-dependent. - - * A Canvas _MAY_ have the `backgroundColor` property
- Clients _SHOULD_ render `backgroundColor` on any resource type. - * A Scene _MAY_ have the `backgroundColor` property
- Clients _SHOULD_ render `backgroundColor` on any resource type. - * Other resources _MUST NOT_ have the `backgroundColor` property. - -```json-doc -{ "backgroundColor": "#FFFFFF" } +{ + "placeholderContainer": { + "id": "https://example.org/iiif/1/canvas/placeholder", + "type": "Canvas", + "height": 1400, + "width": 1200 + } +} ``` - ##### position It is important to be able to position the (textual) body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. @@ -1076,228 +995,203 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe } ``` +##### profile +A schema or named set of functionality available from the resource. The profile can further clarify the `type` and/or `format` of an external resource or service, allowing clients to customize their handling of the resource that has the `profile` property. -##### near - -This property gives the distance from the camera from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. - -The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be less than the value for `far` for the same Camera. If this property is not specified, then the default value is client-dependent. - -* A Camera _MAY_ have the `near` property
- Clients _SHOULD_ process the `near` property on Cameras. - -```json-doc -{ "near": 1.5 } -``` - -##### far - -This property gives the distance from the camera after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. - -The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be greater than the value for `near` of the same Camera. If this property is not specified, then the default value is client-dependent. - -* A Camera _MAY_ have the `far` property
- Clients _SHOULD_ process the `far` property on Cameras. - -```json-doc -{ "far": 200.0 } -``` - -##### fieldOfView - -The angle which a PerspectiveCamera can "see". - -!!! warning "Need more info" - -The value _MUST_ be a floating point number greater than 0 and less than 180, and is measured in degrees. If this property is not specified, then the default value is client-dependent. - -* A PerspectiveCamera _SHOULD_ have the `fieldOfView` property.
- Clients _SHOULD_ process the `fieldOfView` property on Cameras. - -```json-doc -{ "fieldOfView": 50.0 } -``` - -##### angle - -!!! warning "Need more info" - -The value _MUST_ be a floating point number greater than 0 and less than 90, and is measure in degrees. If this property is not specified, then the default value is client-dependent. - -* A SpotLight _SHOULD_ have the `angle` property.
- Clients _SHOULD_ process the `angle` property on SpotLights. - -```json - "angle": 15.0 -``` - -##### lookAt - -_Summary here_ - -The value _MUST_ be a JSON object, conforming to either a reference to an Annotation, or an embedded PointSelector. If this property is not specified, then the default value for cameras is to look straight backwards (-Z) and for lights to point straight down (-Y). - -* A Camera _MAY_ have the `lookAt` property.
- Clients _SHOULD_ process the `lookAt` property on Cameras. -* A SpotLight or a DirectionalLight _SHOULD_ have the `lookAt` property.
- -```json -"lookAt": { - "type": "PointSelector", - "x": 3, - "y": 0, - "z": -10 -} -``` - -##### color - -This property sets the color of a Light. - -The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is "#FFFFFF". - - * A Light _SHOULD_ have the `color` property
- Clients _SHOULD_ render `color` on any resource type. - * Other resources _MUST NOT_ have the `color` property. - -```json -"color": "#FFA0A0" -``` - -##### intensity - -This property sets the strength or brightness of a Light. - -The value _MUST_ be a JSON object, that has the `type`, `value` and `unit` properties. All three properties are required. The value of `type` _MUST_ be the string "UnitValue". The value of `value` is a floating point number. The value of `unit` is a string, drawn from a controlled vocabulary of units. If this property is not specified, then the default intensity value is client-dependent. - -This specification defines the unit value of "relative" which constrains the value to be a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). - -* A Light _SHOULD_ have the `intensity` property.
- Clients _SHOULD_ process the `intensity` property on Lights. - -```json -{ - "intensity": {"id": "", "type": "UnitValue", "value": 0.5, "unit": "relative"} -} -``` - -##### exclude - -_Summary here_ - -_On Annotation, a list of strings drawn from table_ +The value _MUST_ be a string, either taken from the [profiles registry][registry-profiles] or a URI. -| Value | Description | -|------------|-------------| -| Audio | | -| Animations | | -| Cameras | | -| Lights | | +* Resources [referenced][prezi30-terminology] by the `seeAlso` or `service` properties _SHOULD_ have the `profile` property.
+ Clients _SHOULD_ process the `profile` of a service or external resource. +* Other types of resource _MAY_ have the `profile` property.
+ Clients _MAY_ process the `profile` of other types of resource. -```json -"exclude": [ "Audio", "Lights", "Cameras", "Animations" ] +{% include api/code_header.html %} +``` json-doc +{ "profile": "https://example.org/profile/statuary" } ``` +##### provider +An organization or person that contributed to providing the content of the resource. Clients can then display this information to the user to acknowledge the provider's contributions. This differs from the `requiredStatement` property, in that the data is structured, allowing the client to do more than just present text but instead have richer information about the people and organizations to use in different interfaces. +The organization or person is represented as an `Agent` resource. +* Agents _MUST_ have the `id` property, and its value _MUST_ be a string. The string _MUST_ be a URI that identifies the agent. +* Agents _MUST_ have the `type` property, and its value _MUST_ be the string `Agent`. +* Agents _MUST_ have the `label` property, and its value _MUST_ be a JSON object as described in the [languages][prezi30-languages] section. +* Agents _SHOULD_ have the `homepage` property, and its value _MUST_ be an array of JSON objects as described in the [homepage][prezi30-homepage] section. +* Agents _SHOULD_ have the `logo` property, and its value _MUST_ be an array of JSON objects as described in the [logo][prezi30-logo] section. +* Agents _MAY_ have the `seeAlso` property, and its value _MUST_ be an array of JSON object as described in the [seeAlso][prezi30-seealso] section. +The value _MUST_ be an array of JSON objects, where each item in the array conforms to the structure of an Agent, as described above. -##### transform - -_Summary here_ + * A Collection _SHOULD_ have the `provider` property with at least one item.
+ Clients _MUST_ render `provider` on a Collection. + * A Manifest _SHOULD_ have the `provider` property with at least one item.
+ Clients _MUST_ render `provider` on a Manifest. + * Other types of resource _MAY_ have the `provider` property with at least one item.
+ Clients _SHOULD_ render `provider` on other types of resource. -The value of this property is an array of JSON objects, each of which is a Transform. +{% include api/code_header.html %} +``` json-doc +{ + "provider": [ + { + "id": "https://example.org/about", + "type": "Agent", + "label": { "en": [ "Example Organization" ] }, + "homepage": [ + { + "id": "https://example.org/", + "type": "Text", + "label": { "en": [ "Example Organization Homepage" ] }, + "format": "text/html" + } + ], + "logo": [ + { + "id": "https://example.org/images/logo.png", + "type": "Image", + "format": "image/png", + "height": 100, + "width": 120 + } + ], + "seeAlso": [ + { + "id": "https://data.example.org/about/us.jsonld", + "type": "Dataset", + "format": "application/ld+json", + "profile": "https://schema.org/" + } + ] + } + ] +} +``` +##### provides -##### x +A set of features or additional functionality that a linked resource enables relative to the linking or including resource, which is not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). -##### y +The value _MUST_ be an array of strings, each string identifies a particular feature and _MUST_ be taken from the table below or the [provides registry][link]. -##### z +Note that the majority of the values have been selected from [accessibility feature spec][link] and thus use the original form rather than being consistent with the hyphen-based form of the values of `behavior` and `viewingDirection`. -### Linking Properties +* Annotations with the `painting` motivation _SHOULD NOT_ have the `provides` property.
+ Clients _SHOULD_ ignore the `provides` property on Annotations with the `painting` motivation. +* Any resource linked to or included in another resource _MAY_ have the `provides` property.
+ Clients _SHOULD_ process the `provides` property on these resources. +| Value | Description | +| ----- | ----------- | +| `closedCaptions` | ... | +| `alternativeText` | ... | +| `audioDescription` | ... | +| `longDescription` | ... | +| `signLanguage` | ... | +| `highContrastAudio` | ... | +| `highContrastDisplay` | ... | +| `braille` | ... | +| `tactileGraphic` | ... | +| `transcript` | ... | +| `translation` | (IIIF Defined) ... | +| `subtitles` | (IIIF Defined) ... | +{: .api-table #table-behavior} -##### homepage +{% include api/code_header.html %} +``` json-doc +{ "provides": [ "closedCaption" ] } +``` -A web page that is about the object represented by the resource that has the `homepage` property. The web page is usually published by the organization responsible for the object, and might be generated by a content management system or other cataloging system. The resource _MUST_ be able to be displayed directly to the user. Resources that are related, but not home pages, _MUST_ instead be added into the `metadata` property, with an appropriate `label` or `value` to describe the relationship. +!!! warning "This breaks the graph as the file doesn't provide X in all contexts" +##### rendering -The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have the `id`, `type`, and `label` properties, _SHOULD_ have a `format` property, and _MAY_ have the `language` property. +A resource that is an alternative, non-IIIF representation of the resource that has the `rendering` property. Such representations typically cannot be painted onto a single Canvas, as they either include too many views, have incompatible dimensions, or are compound resources requiring additional rendering functionality. The `rendering` resource _MUST_ be able to be displayed directly to a human user, although the presentation may be outside of the IIIF client. The resource _MUST NOT_ have a splash page or other interstitial resource that mediates access to it. If access control is required, then the [IIIF Authentication API][iiif-auth] is _RECOMMENDED_. Examples include a rendering of a book as a PDF or EPUB, a slide deck with images of a building, or a 3D model of a statue. - * Any resource type _MAY_ have the `homepage` property.
- Clients _SHOULD_ render `homepage` on a Collection, Manifest or Canvas, and _MAY_ render `homepage` on other types of resource. +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id`, `type` and `label` properties, and _SHOULD_ have the `format` and `language` properties. -__Model Alignment__
-Please note that this specification has stricter requirements about the JSON pattern used for the `homepage` property than the [Web Annotation Data Model][org-w3c-webanno]. The IIIF requirements are compatible, but the home page of an Agent found might have only a URI, or might be a JSON object with other properties. See the section on [collisions between contexts][prezi30-context-collisions] for more information. -{: .note} + * Any resource type _MAY_ have the `rendering` property with at least one item.
+ Clients _SHOULD_ render `rendering` on a Collection, Manifest or Canvas, and _MAY_ render `rendering` on other types of resource. {% include api/code_header.html %} ``` json-doc { - "homepage": [ + "rendering": [ { - "id": "https://example.com/info/", + "id": "https://example.org/1.pdf", "type": "Text", - "label": { "en": [ "Homepage for Example Object" ] }, - "format": "text/html", - "language": [ "en" ] + "label": { "en": [ "PDF Rendering of Book" ] }, + "format": "application/pdf" } ] } ``` +##### requiredStatement +Text that _MUST_ be displayed when the resource is displayed or used. For example, the `requiredStatement` property could be used to present copyright or ownership statements, an acknowledgement of the owning and/or publishing institution, or any other text that the publishing organization deems critical to display to the user. Given the wide variation of potential client user interfaces, it will not always be possible to display this statement to the user in the client's initial state. If initially hidden, clients _MUST_ make the method of revealing it as obvious as possible. -##### logo +The value of the property _MUST_ be a JSON object, that has the `label` and `value` properties, in the same way as a `metadata` property entry. The values of both `label` and `value` _MUST_ be JSON objects, as described in the [languages][prezi40-languages] section. -A small image resource that represents the Agent resource it is associated with. The logo _MUST_ be clearly rendered when the resource is displayed or used, without cropping, rotating or otherwise distorting the image. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for this image for other manipulations such as resizing. + * Any resource type _MAY_ have the `requiredStatement` property.
+ Clients _MUST_ render `requiredStatement` on every resource type. -When more than one logo is present, the client _SHOULD_ pick only one of them, based on the information in the logo properties. For example, the client could select a logo of appropriate aspect ratio based on the `height` and `width` properties of the available logos. The client _MAY_ decide on the logo by inspecting properties defined as [extensions][prezi30-ldce]. +{% include api/code_header.html %} +``` json-doc +{ + "requiredStatement": { + "label": { "en": [ "Attribution" ] }, + "value": { "en": [ "Provided courtesy of Example Institution" ] } + } +} +``` +##### rights -The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have `id` and `type` properties, and _SHOULD_ have `format`. The value of `type` _MUST_ be `Image`. +A string that identifies a license or rights statement that applies to the content of the resource, such as the JSON of a Manifest or the pixels of an image. The value _MUST_ be drawn from the set of [Creative Commons][org-cc-licenses] license URIs, the [RightsStatements.org][org-rs-terms] rights statement URIs, or those added via the [extension][prezi40-ldce] mechanism. The inclusion of this property is informative, and for example could be used to display an icon representing the rights assertions. - * Agent resources _SHOULD_ have the `logo` property.
- Clients _MUST_ render `logo` on Agent resources. +!!! registration not extension + +If displaying rights information directly to the user is the desired interaction, or a publisher-defined label is needed, then it is _RECOMMENDED_ to include the information using the `requiredStatement` property or in the `metadata` property. + +The value _MUST_ be a string. If the value is drawn from Creative Commons or RightsStatements.org, then the string _MUST_ be a URI defined by that specification. + * Any resource type _MAY_ have the `rights` property.
+ Clients _MAY_ render `rights` on any resource type. {% include api/code_header.html %} ``` json-doc -{ - "logo": [ - { - "id": "https://example.org/img/logo.jpg", - "type": "Image", - "format": "image/jpeg", - "height": 100, - "width": 120 - } - ] -} +{ "rights": "http://creativecommons.org/licenses/by/4.0/" } ``` -##### rendering +__Machine actionable URIs and links for users__
+The machine actionable URIs for both Creative Commons licenses and RightsStatements.org right statements are `http` URIs. In both cases, human readable descriptions are available from equivalent `https` URIs. Clients may wish to rewrite links presented to users to use these equivalent `https` URIs. +{: .note} -A resource that is an alternative, non-IIIF representation of the resource that has the `rendering` property. Such representations typically cannot be painted onto a single Canvas, as they either include too many views, have incompatible dimensions, or are compound resources requiring additional rendering functionality. The `rendering` resource _MUST_ be able to be displayed directly to a human user, although the presentation may be outside of the IIIF client. The resource _MUST NOT_ have a splash page or other interstitial resource that mediates access to it. If access control is required, then the [IIIF Authentication API][iiif-auth] is _RECOMMENDED_. Examples include a rendering of a book as a PDF or EPUB, a slide deck with images of a building, or a 3D model of a statue. +##### seeAlso -The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id`, `type` and `label` properties, and _SHOULD_ have the `format` and `language` properties. +A machine-readable resource such as an XML or RDF description that is related to the current resource that has the `seeAlso` property. Properties of the resource should be given to help the client select between multiple descriptions (if provided), and to make appropriate use of the document. If the relationship between the resource and the document needs to be more specific, then the document should include that relationship rather than the IIIF resource. Other IIIF resources are also valid targets for `seeAlso`, for example to link to a Manifest that describes a related object. The URI of the document _MUST_ identify a single representation of the data in a particular format. For example, if the same data exists in JSON and XML, then separate resources should be added for each representation, with distinct `id` and `format` properties. - * Any resource type _MAY_ have the `rendering` property with at least one item.
- Clients _SHOULD_ render `rendering` on a Collection, Manifest or Canvas, and _MAY_ render `rendering` on other types of resource. +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `label`, `format` and `profile` properties. + + * Any resource type _MAY_ have the `seeAlso` property with at least one item.
+ Clients _MAY_ process `seeAlso` on any resource type. {% include api/code_header.html %} ``` json-doc { - "rendering": [ + "seeAlso": [ { - "id": "https://example.org/1.pdf", - "type": "Text", - "label": { "en": [ "PDF Rendering of Book" ] }, - "format": "application/pdf" + "id": "https://example.org/library/catalog/book1.xml", + "type": "Dataset", + "label": { "en": [ "Bibliographic Description in XML" ] }, + "format": "text/xml", + "profile": "https://example.org/profiles/bibliographic" } ] } ``` + ##### service A service that the client might interact with directly and gain additional information or functionality for using the resource that has the `service` property, such as from an Image to the base URI of an associated [IIIF Image API][image-api] service. The service resource _SHOULD_ have additional information associated with it in order to allow the client to determine how to make appropriate use of it. Please see the [Service Registry][registry-services] document for the details of currently known service types. @@ -1352,87 +1246,39 @@ Implementations _SHOULD_ be prepared to recognize the `@id` and `@type` property ] } ``` - - ##### services A list of one or more service definitions on the top-most resource of the document, that are typically shared by more than one subsequent resource. This allows for these shared services to be collected together in a single place, rather than either having their information duplicated potentially many times throughout the document, or requiring a consuming client to traverse the entire document structure to find the information. The resource that the service applies to _MUST_ still have the `service` property, as described above, where the service resources have at least the `id` and `type` or `@id` and `@type` properties. This allows the client to know that the service applies to that resource. Usage of the `services` property is at the discretion of the publishing system. -A client encountering a `service` property where the definition consists only of an `id` and `type` _SHOULD_ then check the `services` property on the top-most resource for an expanded definition. If the service is not present in the `services` list, and the client requires more information in order to use the service, then it _SHOULD_ dereference the `id` (or `@id`) of the service in order to retrieve a service description. - -The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service resource, as described above. - -* A Collection _MAY_ have the `services` property, if it is the topmost Collection in a response document.
- Clients _SHOULD_ process `services` on a Collection. -* A Manifest _MAY_ have the `services` property.
- Clients _SHOULD_ process `services` on a Manifest. - -{% include api/code_header.html %} -``` json-doc -{ - "services": [ - { - "@id": "https://example.org/iiif/auth/login", - "@type": "AuthCookieService1", - "profile": "http://iiif.io/api/auth/1/login", - "label": "Login to Example Institution", - "service": [ - { - "@id": "https://example.org/iiif/auth/token", - "@type": "AuthTokenService1", - "profile": "http://iiif.io/api/auth/1/token" - } - ] - } - ] -} -``` - - -##### seeAlso - -A machine-readable resource such as an XML or RDF description that is related to the current resource that has the `seeAlso` property. Properties of the resource should be given to help the client select between multiple descriptions (if provided), and to make appropriate use of the document. If the relationship between the resource and the document needs to be more specific, then the document should include that relationship rather than the IIIF resource. Other IIIF resources are also valid targets for `seeAlso`, for example to link to a Manifest that describes a related object. The URI of the document _MUST_ identify a single representation of the data in a particular format. For example, if the same data exists in JSON and XML, then separate resources should be added for each representation, with distinct `id` and `format` properties. - -The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `label`, `format` and `profile` properties. - - * Any resource type _MAY_ have the `seeAlso` property with at least one item.
- Clients _MAY_ process `seeAlso` on any resource type. - -{% include api/code_header.html %} -``` json-doc -{ - "seeAlso": [ - { - "id": "https://example.org/library/catalog/book1.xml", - "type": "Dataset", - "label": { "en": [ "Bibliographic Description in XML" ] }, - "format": "text/xml", - "profile": "https://example.org/profiles/bibliographic" - } - ] -} -``` - - -#### 3.3.2. Internal Links - -##### partOf - -A containing resource that includes the resource that has the `partOf` property. When a client encounters the `partOf` property, it might retrieve the [referenced][prezi30-terminology] containing resource, if it is not [embedded][prezi30-terminology] in the current representation, in order to contribute to the processing of the contained resource. For example, the `partOf` property on a Canvas can be used to reference an external Manifest in order to enable the discovery of further relevant information. Similarly, a Manifest can reference a containing Collection using `partOf` to aid in navigation. +A client encountering a `service` property where the definition consists only of an `id` and `type` _SHOULD_ then check the `services` property on the top-most resource for an expanded definition. If the service is not present in the `services` list, and the client requires more information in order to use the service, then it _SHOULD_ dereference the `id` (or `@id`) of the service in order to retrieve a service description. -The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `label` property. +The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service resource, as described above. - * Any resource type _MAY_ have the `partOf` property with at least one item
- Clients _MAY_ render `partOf` on any resource type. +* A Collection _MAY_ have the `services` property, if it is the topmost Collection in a response document.
+ Clients _SHOULD_ process `services` on a Collection. +* A Manifest _MAY_ have the `services` property.
+ Clients _SHOULD_ process `services` on a Manifest. {% include api/code_header.html %} ``` json-doc -{ "partOf": [ { "id": "https://example.org/iiif/1", "type": "Manifest" } ] } +{ + "services": [ + { + "@id": "https://example.org/iiif/auth/login", + "@type": "AuthCookieService1", + "profile": "http://iiif.io/api/auth/1/login", + "label": "Login to Example Institution", + "service": [ + { + "@id": "https://example.org/iiif/auth/token", + "@type": "AuthTokenService1", + "profile": "http://iiif.io/api/auth/1/token" + } + ] + } + ] +} ``` - -The resources referred to by the `accompanyingContainer` and `placeholderContainer` properties are `partOf` that referring Container. - - ##### start A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. @@ -1465,6 +1311,48 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert } } ``` +##### structures + +The structure of an object represented as a Manifest can be described using a hierarchy of Ranges. Ranges can be used to describe the "table of contents" of the object or other structures that the user can interact with beyond the order given by the `items` property of the Manifest. The hierarchy is built by nesting the child Range resources in the `items` array of the higher level Range. The top level Ranges of these hierarchies are given in the `structures` property. + +The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and the `type` _MUST_ be `Range`. + + * A Manifest _MAY_ have the `structures` property.
+ Clients _SHOULD_ process `structures` on a Manifest. The first hierarchy _SHOULD_ be presented to the user by default, and further hierarchies _SHOULD_ be able to be selected as alternative structures by the user. + * Other types of resource _MUST NOT_ have the `structures` property.
+ Clients _SHOULD_ ignore `structures` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ + "structures": [ + { + "id": "https://example.org/iiif/range/1", + "type": "Range", + "items": [ { ... } ] + } + ] +} +``` +##### summary + +A short textual summary intended to be conveyed to the user when the `metadata` entries for the resource are not being displayed. This could be used as a brief description for item level search results, for small-screen environments, or as an alternative user interface when the `metadata` property is not currently being rendered. The `summary` property follows the same pattern as the `label` property described above. + +The value of the property _MUST_ be a JSON object, as described in the [languages][prezi40-languages] section. + + * A Collection _SHOULD_ have the `summary` property with at least one entry.
+ Clients _SHOULD_ render `summary` on a Collection. + * A Manifest _SHOULD_ have the `summary` property with at least one entry.
+ Clients _SHOULD_ render `summary` on a Manifest. + * All Container types _MAY_ have the `summary` property with at least one entry.
+ Clients _SHOULD_ render `summary` on Containers. + * Other types of resource _MAY_ have the `summary` property with at least one entry.
+ Clients _MAY_ render `summary` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "summary": { "en": [ "This is a summary of the object." ] } } +``` ##### supplementary @@ -1482,100 +1370,153 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert { "supplementary": { "id": "https://example.org/iiif/1/annos/1", "type": "AnnotationCollection" } } ``` -### Structural Properties - - -##### items +##### thumbnail -Much of the functionality of the IIIF Presentation API is simply recording the order in which child resources occur within a parent resource, such as Collections or Manifests within a parent Collection, or Canvases within a Manifest. All of these situations are covered with a single property, `items`. +A content resource, such as a small image or short audio clip, that represents the resource that has the `thumbnail` property. A resource _MAY_ have multiple thumbnail resources that have the same or different `type` and `format`. -The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties. The items will be resources of different types, as described below. +The value _MUST_ be an array of JSON objects, each of which _MUST_ have the `id` and `type` properties, and _SHOULD_ have the `format` property. Images and videos _SHOULD_ have the `width` and `height` properties, and time-based media _SHOULD_ have the `duration` property. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for images to enable manipulations such as resizing. - * A Collection _MUST_ have the `items` property. Each item _MUST_ be either a Collection or a Manifest.
- Clients _MUST_ process `items` on a Collection. - * A Manifest _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Canvas.
- Clients _MUST_ process `items` on a Manifest. - * A Canvas _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation Page.
- Clients _MUST_ process `items` on a Canvas. - * An Annotation Page _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation.
- Clients _MUST_ process `items` on an Annotation Page. - * A Range _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Range, a Canvas or a Specific Resource where the source is a Canvas.
- Clients _SHOULD_ process `items` on a Range. - * Other types of resource _MUST NOT_ have the `items` property.
- Clients _SHOULD_ ignore `items` on other types of resource. + * A Collection _SHOULD_ have the `thumbnail` property with at least one item.
+ Clients _SHOULD_ render `thumbnail` on a Collection. + * A Manifest _SHOULD_ have the `thumbnail` property with at least one item.
+ Clients _SHOULD_ render `thumbnail` on a Manifest. + * All Container types _SHOULD_ have the `thumbnail` property with at least one item.
+ Clients _SHOULD_ render `thumbnail` on Containers. + * Content Resource types _MAY_ have the `thumbnail` property with at least one item. Content Resources _SHOULD_ have the `thumbnail` property with at least one item if it is an option in a Choice of resources.
+ Clients _SHOULD_ render `thumbnail` on a content resource. + * Other types of resource _MAY_ have the `thumbnail` property with at least one item.
+ Clients _MAY_ render `thumbnail` on other types of resource. {% include api/code_header.html %} ``` json-doc { - "items": [ - { - "id": "https://example.org/iiif/manifest1", - "type": "Manifest" - }, + "thumbnail": [ { - "id": "https://example.org/iiif/collection1", - "type": "Collection" + "id": "https://example.org/img/thumb.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 300, + "height": 200 } - // ... ] } ``` -##### structures +##### timeMode -The structure of an object represented as a Manifest can be described using a hierarchy of Ranges. Ranges can be used to describe the "table of contents" of the object or other structures that the user can interact with beyond the order given by the `items` property of the Manifest. The hierarchy is built by nesting the child Range resources in the `items` array of the higher level Range. The top level Ranges of these hierarchies are given in the `structures` property. +A mode associated with an Annotation that is to be applied to the rendering of any time-based media, or otherwise could be considered to have a duration, used as a body resource of that Annotation. Note that the association of `timeMode` with the Annotation means that different resources in the body cannot have different values. This specification defines the values specified in the table below. Others may be defined externally as an [extension][prezi30-ldce]. -The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and `type` properties, and the `type` _MUST_ be `Range`. +The value _MUST_ be a string. - * A Manifest _MAY_ have the `structures` property.
- Clients _SHOULD_ process `structures` on a Manifest. The first hierarchy _SHOULD_ be presented to the user by default, and further hierarchies _SHOULD_ be able to be selected as alternative structures by the user. - * Other types of resource _MUST NOT_ have the `structures` property.
- Clients _SHOULD_ ignore `structures` on other types of resource. + * An Annotation _MAY_ have the `timeMode` property.
+ Clients _SHOULD_ process `timeMode` on an Annotation. + +| Value | Description | +| ----- | ----------- | +| `trim` | (default, if not supplied) If the content resource has a longer duration than the duration of the portion of the Canvas it is associated with, then at the end of the Canvas's duration, the playback of the content resource _MUST_ also end. If the content resource has a shorter duration than the duration of the portion of the Canvas it is associated with, then, for video resources, the last frame _SHOULD_ persist on-screen until the end of the Canvas portion's duration. For example, a video of 120 seconds annotated to a Canvas with a duration of 100 seconds would play only the first 100 seconds and drop the last 20 seconds. | +| `scale` | Fit the duration of content resource to the duration of the portion of the Canvas it is associated with by scaling. For example, a video of 120 seconds annotated to a Canvas with a duration of 60 seconds would be played at double-speed. | +| `loop` | If the content resource is shorter than the `duration` of the Canvas, it _MUST_ be repeated to fill the entire duration. Resources longer than the `duration` _MUST_ be trimmed as described above. For example, if a 20 second duration audio stream is annotated onto a Canvas with a duration of 30 seconds, it will be played one and a half times. | +{: .api-table #table-timemode} {% include api/code_header.html %} ``` json-doc -{ - "structures": [ - { - "id": "https://example.org/iiif/range/1", - "type": "Range", - "items": [ { ... } ] - } - ] -} +{ "timeMode": "trim" } ``` -##### annotations -An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Canvas. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource or part of it. +##### transform -The value _MUST_ be an array of JSON objects. Each item _MUST_ have at least the `id` and `type` properties. +_Summary here_ - * A Collection _MAY_ have the `annotations` property with at least one item.
- Clients _SHOULD_ process `annotations` on a Collection. - * A Manifest _MAY_ have the `annotations` property with at least one item.
- Clients _SHOULD_ process `annotations` on a Manifest,. - * A Canvas _MAY_ have the `annotations` property with at least one item.
- Clients _SHOULD_ process `annotations` on a Canvas. - * A Range _MAY_ have the `annotations` property with at least one item.
- Clients _SHOULD_ process `annotations` on a Range. - * A content resource _MAY_ have the `annotations` property with at least one item.
- Clients _SHOULD_ process `annotations` on a content resource. - * Other types of resource _MUST NOT_ have the `annotations` property.
- Clients _SHOULD_ ignore `annotations` on other types of resource. +The value of this property is an array of JSON objects, each of which is a Transform. + +##### type + +The type or class of the resource. For classes defined for this specification, the value of `type` will be described in the sections below describing each individual class. + +For content resources, the value of `type` is drawn from other specifications. Recommendations for common content types such as image, text or audio are given in the table below. + +The JSON objects that appear in the value of the `service` property will have many different classes, and can be used to distinguish the sort of service, with specific properties defined in a [registered context document][prezi30-ldce]. + +The value _MUST_ be a string. + + * All resource types _MUST_ have the `type` property.
+ Clients _MUST_ process, and _MAY_ render, `type` on any resource type. + +| Class | Description | +| ------------- | -------------------------------- | +| `Dataset` | Data not intended to be rendered to humans directly, such as a CSV, an RDF serialization or a zip file | +| `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | +| `Model` | A three dimensional spatial model intended to be visualized, such as might be rendered with a 3d javascript library | +| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | +| `Text` | Resources primarily intended to be read | +| `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | +{: .api-table #table-type} {% include api/code_header.html %} ``` json-doc -{ - "annotations": [ - { - "id": "https://example.org/iiif/annotationPage/1", - "type": "AnnotationPage", - "items": [ { ... } ] - } - ] -} +{ "type": "Image" } +``` + +##### viewingDirection + +!!! Rewrite to be where is the navigation control to step to the next/ previous in the items of hte manifest + + +The direction in which a list of Containers _SHOULD_ be displayed to the user. This specification defines four direction values in the table below. Others may be defined externally [as an extension][prezi30-ldce]. For example, +if the `viewingDirection` value is `left-to-right`, then backwards in the list is to the left, and forwards in the +list is to the right. + +The value _MUST_ be a string. + + * A Collection _MAY_ have the `viewingDirection` property.
+ Clients _SHOULD_ process `viewingDirection` on a Collection. + * A Manifest _MAY_ have the `viewingDirection` property.
+ Clients _SHOULD_ process `viewingDirection` on a Manifest. + * A Range _MAY_ have the `viewingDirection` property.
+ Clients _MAY_ process `viewingDirection` on a Range. + * Other types of resource _MUST NOT_ have the `viewingDirection` property.
+ Clients _SHOULD_ ignore `viewingDirection` on other types of resource. + +| Value | Description | +| ----- | ----------- | +| `left-to-right` | The object is displayed from left to right. The default if not specified. | +| `right-to-left` | The object is displayed from right to left. | +| `top-to-bottom` | The object is displayed from the top to the bottom. | +| `bottom-to-top` | The object is displayed from the bottom to the top. | +{: .api-table #table-direction} + +{% include api/code_header.html %} +``` json-doc +{ "viewingDirection": "left-to-right" } +``` + +##### width + +The width of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the height, it conveys an aspect ratio for the space in which content resources are located. + +The value _MUST_ be a positive integer. + + * A Canvas _MUST_ have the `width` property.
+ Clients _MUST_ process `width` on a Canvas. + * Content resources _SHOULD_ have the `width` property, with the value given in pixels, if appropriate to the resource type.
+ Clients _SHOULD_ process `width` on content resources. + * Other types of resource _MUST NOT_ have the `width` property.
+ Clients _SHOULD_ ignore `width` on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "width": 1200 } ``` +##### x + +##### y + +##### z + + + + ### 3.5. Values From f14cb5df64feb011eb280f2a33ead6d72acecd78 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 18 Mar 2025 09:12:25 -0400 Subject: [PATCH 034/192] add anchors --- source/presentation/4.0/model.md | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 2e63386b1..2480432f3 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -372,6 +372,7 @@ Ranges _MAY_ link to an Annotation Collection that has the content of the Range ##### accompanyingContainer +{: #accompanyingContainer} A single Container that provides additional content for use while rendering the resource that has the `accompanyingContainer` property. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. @@ -402,6 +403,7 @@ The value of `accompanyingContainer` _MUST_ be a JSON object with the `id` and ` ``` ##### angle +{: #angle} !!! warning "Need more info" @@ -414,6 +416,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 90, and "angle": 15.0 ``` ##### annotations +{: #annotations} An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Canvas. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource or part of it. @@ -446,6 +449,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have at least the ``` ##### backgroundColor +{: #backgroundColor} This property sets the background color behind any painted resources on a spatial Container, such as a Canvas or Scene. @@ -462,6 +466,7 @@ The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value ``` ##### behavior +{: #behavior} A set of user experience features that the publisher of the content would prefer the client to use when presenting the resource. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. @@ -513,7 +518,9 @@ The value _MUST_ be an array of strings. ``` json-doc { "behavior": [ "auto-advance", "individuals" ] } ``` + ##### color +{: #color} This property sets the color of a Light. @@ -526,7 +533,9 @@ The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value ```json "color": "#FFA0A0" ``` + ##### duration +{: #duration} The duration of a container or external content resource, given in seconds. @@ -545,7 +554,9 @@ The value _MUST_ be a positive floating point number. ``` json-doc { "duration": 125.0 } ``` + ##### exclude +{: #exclude} _Summary here_ @@ -561,7 +572,9 @@ _On Annotation, a list of strings drawn from table_ ```json "exclude": [ "Audio", "Lights", "Cameras", "Animations" ] ``` + ##### far +{: #far} This property gives the distance from the camera after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. @@ -574,6 +587,7 @@ The value is a non-negative floating point number, in the coordinate space of th { "far": 200.0 } ``` ##### fieldOfView +{: #fieldOfView} The angle which a PerspectiveCamera can "see". @@ -588,6 +602,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 180, an { "fieldOfView": 50.0 } ``` ##### format +{: #format} The specific media type (often called a MIME type) for a content resource, for example `image/jpeg`. This is important for distinguishing different formats of the same overall type of resource, such as distinguishing text in XML from plain text. @@ -605,6 +620,7 @@ The value _MUST_ be a string, and it _SHOULD_ be the value of the `Content-Type` { "format": "application/xml" } ``` ##### height +{: #height} The height of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the width, it conveys an aspect ratio for the space in which content resources are located. @@ -622,6 +638,7 @@ The value _MUST_ be a positive integer. { "height": 1800 } ``` ##### homepage +{: #homepage} A web page that is about the object represented by the resource that has the `homepage` property. The web page is usually published by the organization responsible for the object, and might be generated by a content management system or other cataloging system. The resource _MUST_ be able to be displayed directly to the user. Resources that are related, but not home pages, _MUST_ instead be added into the `metadata` property, with an appropriate `label` or `value` to describe the relationship. @@ -649,6 +666,7 @@ Please note that this specification has stricter requirements about the JSON pat } ``` ##### id +{: #id} The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Canvases, which _MUST_ have their own URI without a fragment. @@ -664,6 +682,7 @@ The existence of an HTTP(S) URI in the `id` property does not mean that the URI { "id": "https://example.org/iiif/1/manifest" } ``` ##### intensity +{: #intensity} This property sets the strength or brightness of a Light. @@ -680,6 +699,7 @@ This specification defines the unit value of "relative" which constrains the val } ``` ##### interactionMode +{: #interactionMode} *within* the Scene, whereas viewingDirection and behavior are across containers. @@ -696,6 +716,7 @@ free-direction other examples: no-zoom, no-scrub, rti-mode ##### items +{: #items} Much of the functionality of the IIIF Presentation API is simply recording the order in which child resources occur within a parent resource, such as Collections or Manifests within a parent Collection, or Canvases within a Manifest. All of these situations are covered with a single property, `items`. @@ -731,6 +752,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and } ``` ##### label +{: #label} A human readable label, name or title. The `label` property is intended to be displayed as a short, textual surrogate for the resource if a human needs to make a distinction between it and similar resources, for example between objects, pages, or options for a choice of images to display. The `label` property can be fully internationalized, and each language can have multiple values. This pattern is described in more detail in the [languages][prezi40-languages] section. @@ -756,6 +778,7 @@ The value of the property _MUST_ be a JSON object, as described in the [language { "label": { "en": [ "Example Object Title" ] } } ``` ##### language +{: #language} The language or languages used in the content of this external resource. This property is already available from the Web Annotation model for content resources that are the body or target of an Annotation, however it _MAY_ also be used for resources [referenced][prezi30-terminology] from `homepage`, `rendering`, and `partOf`. @@ -771,6 +794,7 @@ The value _MUST_ be an array of strings. Each item in the array _MUST_ be a vali { "language": [ "en" ] } ``` ##### logo +{: #logo} A small image resource that represents the Agent resource it is associated with. The logo _MUST_ be clearly rendered when the resource is displayed or used, without cropping, rotating or otherwise distorting the image. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for this image for other manipulations such as resizing. @@ -797,6 +821,7 @@ The value of this property _MUST_ be an array of JSON objects, each of which _MU } ``` ##### lookAt +{: #lookAt} _Summary here_ @@ -815,6 +840,7 @@ The value _MUST_ be a JSON object, conforming to either a reference to an Annota } ``` ##### metadata +{: #metadata} An ordered list of descriptions to be displayed to the user when they interact with the resource, given as pairs of human readable `label` and `value` entries. The content of these entries is intended for presentation only; descriptive semantics _SHOULD NOT_ be inferred. An entry might be used to convey information about the creation of the object, a physical description, ownership information, or other purposes. @@ -843,6 +869,7 @@ Clients _SHOULD_ display the entries in the order provided. Clients _SHOULD_ exp } ``` ##### navDate +{: #navDate} A date that clients may use for navigation purposes when presenting the resource to the user in a date-based user interface, such as a calendar or timeline. More descriptive date ranges, intended for display directly to the user, _SHOULD_ be included in the `metadata` property for human consumption. If the resource contains Canvases that have the `duration` property, the datetime given corresponds to the navigation datetime of the start of the resource. For example, a Range that includes a Canvas that represents a set of video content recording a historical event, the `navDate` is the datetime of the first moment of the recorded event. @@ -866,6 +893,7 @@ The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _ { "navDate": "2010-01-01T00:00:00Z" } ``` ##### navPlace +{: #navPlace} A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. The location is identified using structured data, described below, with latitude and longitude based points or polygons. If the location is only textual, then the information should instead be included in the `metadata` property. @@ -909,6 +937,7 @@ The value of the property _MUST_ be a [GeoJSON Feature Collection] [link] contai } ``` ##### near +{: #near} This property gives the distance from the camera from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. @@ -922,6 +951,7 @@ The value is a non-negative floating point number, in the coordinate space of th ``` ##### partOf +{: #partOf} A containing resource that includes the resource that has the `partOf` property. When a client encounters the `partOf` property, it might retrieve the [referenced][prezi30-terminology] containing resource, if it is not [embedded][prezi30-terminology] in the current representation, in order to contribute to the processing of the contained resource. For example, the `partOf` property on a Canvas can be used to reference an external Manifest in order to enable the discovery of further relevant information. Similarly, a Manifest can reference a containing Collection using `partOf` to aid in navigation. @@ -938,6 +968,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and The resources referred to by the `accompanyingContainer` and `placeholderContainer` properties are `partOf` that referring Container. ##### placeholderContainer +{: #placeholderContainer} A single Container that provides additional content for use before the main content of the resource that has the `placeholderContainer` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderContainer` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderContainer` as part of the initial presentation of a single resource. A placeholder Container is likely to have different dimensions to those of the Container(s) of the resource that has the `placeholderContainer` property. A placeholder Container may be of a different type from the resource that has the `placeholderContainer` property. For example, a `Scene` may have a placeholder Container of type `Canvas`. @@ -968,6 +999,7 @@ The value of `placeholderContainer` _MUST_ be a JSON object with the `id` and `t } ``` ##### position +{: #position} It is important to be able to position the (textual) body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. @@ -996,6 +1028,7 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe ``` ##### profile +{: #profile} A schema or named set of functionality available from the resource. The profile can further clarify the `type` and/or `format` of an external resource or service, allowing clients to customize their handling of the resource that has the `profile` property. @@ -1011,6 +1044,7 @@ The value _MUST_ be a string, either taken from the [profiles registry][registry { "profile": "https://example.org/profile/statuary" } ``` ##### provider +{: #provider} An organization or person that contributed to providing the content of the resource. Clients can then display this information to the user to acknowledge the provider's contributions. This differs from the `requiredStatement` property, in that the data is structured, allowing the client to do more than just present text but instead have richer information about the people and organizations to use in different interfaces. @@ -1070,6 +1104,7 @@ The value _MUST_ be an array of JSON objects, where each item in the array confo } ``` ##### provides +{: #provides} A set of features or additional functionality that a linked resource enables relative to the linking or including resource, which is not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). @@ -1106,6 +1141,7 @@ Note that the majority of the values have been selected from [accessibility feat !!! warning "This breaks the graph as the file doesn't provide X in all contexts" ##### rendering +{: #rendering} A resource that is an alternative, non-IIIF representation of the resource that has the `rendering` property. Such representations typically cannot be painted onto a single Canvas, as they either include too many views, have incompatible dimensions, or are compound resources requiring additional rendering functionality. The `rendering` resource _MUST_ be able to be displayed directly to a human user, although the presentation may be outside of the IIIF client. The resource _MUST NOT_ have a splash page or other interstitial resource that mediates access to it. If access control is required, then the [IIIF Authentication API][iiif-auth] is _RECOMMENDED_. Examples include a rendering of a book as a PDF or EPUB, a slide deck with images of a building, or a 3D model of a statue. @@ -1128,6 +1164,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id`, `t } ``` ##### requiredStatement +{: #requiredStatement} Text that _MUST_ be displayed when the resource is displayed or used. For example, the `requiredStatement` property could be used to present copyright or ownership statements, an acknowledgement of the owning and/or publishing institution, or any other text that the publishing organization deems critical to display to the user. Given the wide variation of potential client user interfaces, it will not always be possible to display this statement to the user in the client's initial state. If initially hidden, clients _MUST_ make the method of revealing it as obvious as possible. @@ -1146,6 +1183,7 @@ The value of the property _MUST_ be a JSON object, that has the `label` and `val } ``` ##### rights +{: #rights} A string that identifies a license or rights statement that applies to the content of the resource, such as the JSON of a Manifest or the pixels of an image. The value _MUST_ be drawn from the set of [Creative Commons][org-cc-licenses] license URIs, the [RightsStatements.org][org-rs-terms] rights statement URIs, or those added via the [extension][prezi40-ldce] mechanism. The inclusion of this property is informative, and for example could be used to display an icon representing the rights assertions. @@ -1168,6 +1206,7 @@ The machine actionable URIs for both Creative Commons licenses and RightsStateme {: .note} ##### seeAlso +{: #seeAlso} A machine-readable resource such as an XML or RDF description that is related to the current resource that has the `seeAlso` property. Properties of the resource should be given to help the client select between multiple descriptions (if provided), and to make appropriate use of the document. If the relationship between the resource and the document needs to be more specific, then the document should include that relationship rather than the IIIF resource. Other IIIF resources are also valid targets for `seeAlso`, for example to link to a Manifest that describes a related object. The URI of the document _MUST_ identify a single representation of the data in a particular format. For example, if the same data exists in JSON and XML, then separate resources should be added for each representation, with distinct `id` and `format` properties. @@ -1193,6 +1232,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ##### service +{: #service} A service that the client might interact with directly and gain additional information or functionality for using the resource that has the `service` property, such as from an Image to the base URI of an associated [IIIF Image API][image-api] service. The service resource _SHOULD_ have additional information associated with it in order to allow the client to determine how to make appropriate use of it. Please see the [Service Registry][registry-services] document for the details of currently known service types. @@ -1247,6 +1287,7 @@ Implementations _SHOULD_ be prepared to recognize the `@id` and `@type` property } ``` ##### services +{: #services} A list of one or more service definitions on the top-most resource of the document, that are typically shared by more than one subsequent resource. This allows for these shared services to be collected together in a single place, rather than either having their information duplicated potentially many times throughout the document, or requiring a consuming client to traverse the entire document structure to find the information. The resource that the service applies to _MUST_ still have the `service` property, as described above, where the service resources have at least the `id` and `type` or `@id` and `@type` properties. This allows the client to know that the service applies to that resource. Usage of the `services` property is at the discretion of the publishing system. @@ -1280,6 +1321,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re } ``` ##### start +{: #start} A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. @@ -1312,6 +1354,7 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert } ``` ##### structures +{: #structures} The structure of an object represented as a Manifest can be described using a hierarchy of Ranges. Ranges can be used to describe the "table of contents" of the object or other structures that the user can interact with beyond the order given by the `items` property of the Manifest. The hierarchy is built by nesting the child Range resources in the `items` array of the higher level Range. The top level Ranges of these hierarchies are given in the `structures` property. @@ -1335,6 +1378,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and } ``` ##### summary +{: #summary} A short textual summary intended to be conveyed to the user when the `metadata` entries for the resource are not being displayed. This could be used as a brief description for item level search results, for small-screen environments, or as an alternative user interface when the `metadata` property is not currently being rendered. The `summary` property follows the same pattern as the `label` property described above. @@ -1355,6 +1399,7 @@ The value of the property _MUST_ be a JSON object, as described in the [language ``` ##### supplementary +{: #supplementary} A link from this Range to an Annotation Collection that includes the `supplementing` Annotations of content resources for the Range. Clients might use this to present additional content to the user from a different Canvas when interacting with the Range, or to jump to the next part of the Range within the same Canvas. For example, the Range might represent a newspaper article that spans non-sequential pages, and then uses the `supplementary` property to reference an Annotation Collection that consists of the Annotations that record the text, split into Annotation Pages per newspaper page. Alternatively, the Range might represent the parts of a manuscript that have been transcribed or translated, when there are other parts that have yet to be worked on. The Annotation Collection would be the Annotations that transcribe or translate, respectively. @@ -1371,6 +1416,7 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert ``` ##### thumbnail +{: #thumbnail} A content resource, such as a small image or short audio clip, that represents the resource that has the `thumbnail` property. A resource _MAY_ have multiple thumbnail resources that have the same or different `type` and `format`. @@ -1403,6 +1449,7 @@ The value _MUST_ be an array of JSON objects, each of which _MUST_ have the `id` ``` ##### timeMode +{: #timeMode} A mode associated with an Annotation that is to be applied to the rendering of any time-based media, or otherwise could be considered to have a duration, used as a body resource of that Annotation. Note that the association of `timeMode` with the Annotation means that different resources in the body cannot have different values. This specification defines the values specified in the table below. Others may be defined externally as an [extension][prezi30-ldce]. @@ -1425,12 +1472,14 @@ The value _MUST_ be a string. ##### transform +{: #transform} _Summary here_ The value of this property is an array of JSON objects, each of which is a Transform. ##### type +{: #type} The type or class of the resource. For classes defined for this specification, the value of `type` will be described in the sections below describing each individual class. @@ -1459,6 +1508,7 @@ The value _MUST_ be a string. ``` ##### viewingDirection +{: #viewingDirection} !!! Rewrite to be where is the navigation control to step to the next/ previous in the items of hte manifest @@ -1492,6 +1542,7 @@ The value _MUST_ be a string. ``` ##### width +{: #width} The width of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the height, it conveys an aspect ratio for the space in which content resources are located. @@ -1509,10 +1560,13 @@ The value _MUST_ be a positive integer. { "width": 1200 } ``` ##### x +{: #x} ##### y +{: #y} ##### z +{: #z} From d0deb0e4038ee9074042488cb714de5938913e4e Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 18 Mar 2025 09:37:03 -0400 Subject: [PATCH 035/192] please build --- source/_includes/links.md | 2 +- source/image/1.1/index.html | 4 ++-- source/model/shared-canvas/1.0/index.html | 2 +- source/presentation/4.0/index.md | 13 ++++++------- source/registry/profiles/index.md | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/source/_includes/links.md b/source/_includes/links.md index 4e9560006..6c0e773e8 100644 --- a/source/_includes/links.md +++ b/source/_includes/links.md @@ -189,7 +189,7 @@ [org-open-annotation-multi]: http://www.openannotation.org/spec/core/multiplicity.html#Choice "Open Annotation: Multiplicity" [org-open-annotation-types]: http://www.openannotation.org/spec/core/core.html#BodyTargetType "Open Annotation: Body Target" [org-open-annotation]: http://www.openannotation.org/spec/core/ "Open Annotation" -[org-openarchives-rsync]: http://openarchives.org/rs/toc +[org-openarchives-rsync]: https://openarchives.org/rs/toc [org-rfc-2119]: https://tools.ietf.org/html/rfc2119 "RFC Keywords" [org-rfc-2617]: https://tools.ietf.org/html/rfc2617 "HTTP Authentication: Basic and Digest Access Authentication" [org-rfc-2818]: https://tools.ietf.org/html/rfc2818 "HTTP Over TLS" diff --git a/source/image/1.1/index.html b/source/image/1.1/index.html index 95de05280..72398da23 100644 --- a/source/image/1.1/index.html +++ b/source/image/1.1/index.html @@ -944,7 +944,7 @@

This API does not specify whether the image server will support authentication or what mechanism it might use. In the case of "401 Unauthorized" HTTP error response, the content of the WWW-Authenticate header will depend on the authentication mechanism supported by the server. If the server supports HTTP Basic or Digest authentication then the - header should follow RFC2617, for example: + header should follow RFC2617, for example:

WWW-Authenticate: Basic realm="Images" @@ -1002,7 +1002,7 @@

The URL syntax of this API relies upon slash (/) separators which MUST NOT be encoded. Clients MUST percent-encode special characters (the to-encode set below: percent and gen-delims of - RFC3986 except the colon) within the components + RFC3986 except the colon) within the components of requests. For example, any slashes within the identifier part of the URL MUST be percent-encoded. Encoding is necessary only for the identifier because other components will not include special characters.

diff --git a/source/model/shared-canvas/1.0/index.html b/source/model/shared-canvas/1.0/index.html index 5d4f0233a..2a07e7c8d 100644 --- a/source/model/shared-canvas/1.0/index.html +++ b/source/model/shared-canvas/1.0/index.html @@ -58,7 +58,7 @@

Abstract

parts thereof, via Open Annotations and the Annotations are grouped and ordered -in OAI-ORE +in OAI-ORE Aggregations.

diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 8289b42e6..d5f1a0882 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -76,21 +76,20 @@ Mention cookbook ## Foundations -Simple model diagram - -Manifests and Containers briefly - +

+ Data Model
+

### Manifests -A Manifest is the primary unit of distribution of IIIF. It is a JSON document that provides a description of the structure and properties of a single item to be presented to the user, such as a title and other descriptive and linking information about the object and/or the intellectual work that it conveys. The scope of what constitutes an item, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. +A Manifest is the primary unit of distribution of IIIF. Each Manifest usually describes how to present an object, such as a book, statue, music album or 3 dimensional scene. It is a JSON document that carries information needed for the client to present content to the user, such as a title and other descriptive information. The scope of what constitutes an object, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. -The Manifest's `items` property is a list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents the Content Resources to the user. The `items` property provides an order to the content. +The Manifest's `items` property is an ordered list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents the Content Resources to the user in that order. Manifests have descriptive, technical and linking properties. The required properties of Manifests are `id`, `type`, `items` and `label`. Additional descriptive properties include `summary`, `metadata`, `rights`, `thumbnail`, `homepage` and `provider`. -[See Model Docs](manifest) +See the [Model Documentation](model/#manifest) for more information. ``` Manifest JSON diff --git a/source/registry/profiles/index.md b/source/registry/profiles/index.md index 8c38c1130..79c524561 100644 --- a/source/registry/profiles/index.md +++ b/source/registry/profiles/index.md @@ -68,7 +68,7 @@ This table summarizes the known profiles available, for use with the [Presentati | http://www.loc.gov/standards/alto | The URI for identifying [ALTO](https://www.loc.gov/standards/alto/) which is used for encoding OCR text. | | http://www.loc.gov/standards/marcxml | The URI for identifying [MarcXML](https://www.loc.gov/standards/marcxml/) metadata records. | | http://purl.org/dc/terms/ | The URI for identifying records that follow the [Dublin Core Metadata Initiative Metadata Terms](https://www.dublincore.org/specifications/dublin-core/dcmi-terms/) (NB: these are different from the legacy Dublin Core Metadata Element Set, Version 1.1, refered to as http://purl.org/dc/elements/1.1/). | -| http://www.europeana.eu/schemas/edm/ | The URI for identifying [EDM (Europeana Data Model)](https://pro.europeana.eu/page/edm-documentation) metadata records. | +| https://www.europeana.eu/schemas/edm/ | The URI for identifying [EDM (Europeana Data Model)](https://pro.europeana.eu/page/edm-documentation) metadata records. | {: .api-table} From 2dfc182183ca3fe49469e54f9ba023a775a6fdb7 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 18 Mar 2025 10:10:38 -0400 Subject: [PATCH 036/192] fix links --- source/presentation/4.0/index-draft.md | 2 +- source/presentation/4.0/index.md | 40 +++++++++----------------- source/presentation/4.0/model.md | 4 +-- 3 files changed, 17 insertions(+), 29 deletions(-) diff --git a/source/presentation/4.0/index-draft.md b/source/presentation/4.0/index-draft.md index bc498dde7..1e9aa7573 100644 --- a/source/presentation/4.0/index-draft.md +++ b/source/presentation/4.0/index-draft.md @@ -371,7 +371,7 @@ Content States are used for the following applications: In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. -The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the [Content State Protocol API 2.0](content-state-2) specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. +The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the _Content State Protocol API 2.0_ specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. ### Load a particular view of some resource and modify it diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index d5f1a0882..b8c9b1220 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -100,59 +100,47 @@ Manifest JSON A Container is a frame of reference that allows the relative positioning of Content Resources, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). -And we can also put other things: -"supplementing" - - - The defined Container types are: #### Timeline A Container that represents a bounded temporal range, without any spatial coordinates. -* has continuous duration in seconds for all or part of its duration. -* Typically used for audio-only content +* A Timeline has continuous duration in seconds for all or part of its duration. +* A Timeline is typically used for audio-only content #### Canvas A Container that represents a bounded, two-dimensional space and has content resources associated with all or parts of it. It may also have a bounded temporal range in the same manner as a Timeline. -* has integer, unitless width and height -* has optional continuous duration in seconds -* Typically used for Image content, and with duration, for Video content. +* A Canvas has a width and height, given as unitless integers +* A Canvas has an optional continuous duration in seconds +* A Canvas is typically used for Image content, and with duration, for Video content. #### Scene A Container that represents a boundless three-dimensional space and has content resources positioned at locations within it. Rendering a Scene requires the use of Cameras and Lights. It may also have a bounded temporal range in the same manner as a Timeline. -* has continuous, unitless x,y,z cartesian coordinate space -* has optional continuous duration in seconds -* Typically used for 3D models, and can include audio, video and image content +* A Scene has a continuous, unitless x,y,z cartesian coordinate space +* A Scene has an optional continuous duration in seconds +* A Scene is typically used for 3D models, and can include audio, video and image content +```json +Manifest JSON with a Timeline, a Canvas and a Scene +``` ### Annotations -IIIF uses the concept of _Annotation_ to link resources together. Why is this a different sense from what I am used to? Because this: W3C go read that then come back. +IIIF uses the concept of _Annotation_ to link resources together from around the web. This specification uses a World Wide Web Consortium (W3C) standard for this called the [Web Annotation Data Model][org-web-anno]. This is a structured linking mechanism useful for making comments about Content Resources, but IIIF's primary use of it is to associate the images, audio and other Content Resources with their Containers for presentation. -BUT it can be used for notes in the margin, commentary and all those more usual senses of the word, too. It's just that we borrow that linking mechanism for the Content Resources, too. +Different uses of Annotation are distinguished through their `motivation` property. This specification defines a value for `motivation` called `painting` for associating Content Resources with Containers, which this specification calls a Painting Annotation. This is from the notion of painting onto a canvas, a metaphor borrowed from art and used for image-based digital applications, and expanded by IIIF into "painting" any Content Resource into a Container of any number of dimensions. -Annotations are primarily used to associate content resources with Containers. The same mechanism is used for the visible and/or audible resources as is used for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. As Annotations can be added later, it promotes a distributed system in which publishers can align their content with the descriptions created by others. - -Now that we have this linking mechanism... PAINTING - -Painting Annotations are used to associate models, lights, cameras, and IIIF containers such as Canvases, with Scenes. They have a `type` of "Annotation", a `body` (being the resource to be added to the scene) and a `target` (being the scene or a position within the scene). They must have a `motivation` property with the value of "painting" to assert that the resource is being painted into the Scene, rather than the Annotation being a comment about the Scene. -Everything is an anno but these are special and core - -There are other important uses of annotation, they are not all painting annos - see later... +The same linking mechanism is also used in IIIF with other motivations for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning content, and provides a standards-based framework for referencing parts of resources. As Annotations can be added later, it promotes a distributed system in which further content such as commentary can be aligned with the objects published on the web. ``` JSON of painting anno ``` -By the time you get here you are comfortable dropping the phrase "painting annotation" into casual conversation. - - ### Content Resources diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 2480432f3..4bf507ee0 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -120,7 +120,7 @@ A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [labe A Manfiest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail) -A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholder](#placeholder), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). +A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. @@ -1586,7 +1586,7 @@ Additional motivations may be added to the Annotation to further clarify the int | ----- | ----------- | | `painting` | Resources associated with a Container by an Annotation that has the `motivation` value `painting` _MUST_ be presented to the user as the representation of the Container. The content can be thought of as being _of_ the Container. The use of this motivation with target resources other than Containers is undefined. For example, an Annotation that has the `motivation` value `painting`, a body of an Image and the target of a Canvas is an instruction to present that Image as (part of) the visual representation of the Canvas. Similarly, a textual body is to be presented as (part of) the visual representation of the Container and not positioned in some other part of the user interface.| | `supplementing` | Resources associated with a Container by an Annotation that has the `motivation` value `supplementing` _MAY_ be presented to the user as part of the representation of the Container, or _MAY_ be presented in a different part of the user interface. The content can be thought of as being _from_ the Container. The use of this motivation with target resources other than Containers is undefined. For example, an Annotation that has the `motivation` value `supplementing`, a body of an Image and the target of part of a Canvas is an instruction to present that Image to the user either in the Canvas's rendering area or somewhere associated with it, and could be used to present an easier to read representation of a diagram. Similarly, a textual body is to be presented either in the targeted region of the Container or otherwise associated with it, and might be OCR, a manual transcription or a translation of handwritten text, or captions for what is being said in a Timeline with audio content. | -| `contentState` | An annotation with the motivation `contentState` has any valid IIIF Resource, or list of IIIF resources, or references to IIIF resources as its `target` property. The client either loads the resource(s) indicated by the Content State annotation `target`, or modifies the view of a currently loaded resource by applying the changes implied by the annotation target - for example, adding a new Light to a Scene where the Light is first introduced in the annotation `target`. The expected interaction depends on how the annotation is linked to the resource the client is currently rendering, or how the annotation is introduced to the client. The [Content State Protocol API 2.0](link) describes the ways in which a Content State may be conveyed into a Client or exported from a Client, e.g., as an initialization parameter, or as an exported "Share..." state. Other parts (...) of this specification describe how a Content State in the context of a `commenting` or other annotation modifies the Container when the user selects that annotation, such as changing the camera, lighting or even the models in a Scene as the user progresses though the steps of a narrative conveyed by `describing` annotations. | +| `contentState` | An annotation with the motivation `contentState` has any valid IIIF Resource, or list of IIIF resources, or references to IIIF resources as its `target` property. The client either loads the resource(s) indicated by the Content State annotation `target`, or modifies the view of a currently loaded resource by applying the changes implied by the annotation target - for example, adding a new Light to a Scene where the Light is first introduced in the annotation `target`. The expected interaction depends on how the annotation is linked to the resource the client is currently rendering, or how the annotation is introduced to the client. The _Content State Protocol API 2.0_ describes the ways in which a Content State may be conveyed into a Client or exported from a Client, e.g., as an initialization parameter, or as an exported "Share..." state. Other parts (...) of this specification describe how a Content State in the context of a `commenting` or other annotation modifies the Container when the user selects that annotation, such as changing the camera, lighting or even the models in a Scene as the user progresses though the steps of a narrative conveyed by `describing` annotations. | | `activating` | An annotation with the motivation `activating` has any valid IIIF Resource, or list of IIIF resources, or references to IIIF resources as its `target` property. It indicates that a user interaction will trigger a change in either the Container itself, or play a named animation in a Model. If the `body` of the Annotation is of type `TextualBody` and the `target` is of type `SpecificResource` with a `selector` property of type `AnimationSelector`, then the client offers a UI such that when the user selects an interactive element labelled by the TextualBody, the named animation in the model painted by the `source` is played. If the `body` contains IIIF resources, then the body is interpreted as a Content State, and when the user interacts with the IIIF resource provided by the `target`, the content state is applied to modify the Container. | // See notes on activating in index From e44ca1e9907037c8b6224f994aa3828eaf9b3194 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 18 Mar 2025 11:53:26 -0400 Subject: [PATCH 037/192] updates --- source/presentation/4.0/index.md | 69 +++++++++++++++++++++++--------- source/presentation/4.0/model.md | 2 + 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index b8c9b1220..7cda8acc9 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -87,9 +87,9 @@ A Manifest is the primary unit of distribution of IIIF. Each Manifest usually de The Manifest's `items` property is an ordered list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents the Content Resources to the user in that order. -Manifests have descriptive, technical and linking properties. The required properties of Manifests are `id`, `type`, `items` and `label`. Additional descriptive properties include `summary`, `metadata`, `rights`, `thumbnail`, `homepage` and `provider`. +Manifests have descriptive, technical and linking properties. The required properties of Manifests are `id`, `type`, `items` and `label`. Other commonly used properties include `summary`, `metadata`, `rights`, `thumbnail`, `homepage` and `provider`. -See the [Model Documentation](model/#manifest) for more information. +(👀) [Model Documentation](model/#manifest) ``` Manifest JSON @@ -100,30 +100,30 @@ Manifest JSON A Container is a frame of reference that allows the relative positioning of Content Resources, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). +The required properties of all Containers are `id`, and `type`. Most Containers also have the `items` and `label` properties. Further properties are required for the different types of Container. + The defined Container types are: #### Timeline -A Container that represents a bounded temporal range, without any spatial coordinates. +A Container that represents a bounded temporal range, without any spatial coordinates. It is typically used for audio-only content. + +Timelines have an additional required property of `duration`, which gives the extent of the Timeline as a floating point number of seconds. -* A Timeline has continuous duration in seconds for all or part of its duration. -* A Timeline is typically used for audio-only content #### Canvas -A Container that represents a bounded, two-dimensional space and has content resources associated with all or parts of it. It may also have a bounded temporal range in the same manner as a Timeline. +A Container that represents a bounded, two-dimensional space, optionally with a bounded temporal range. Canvases are typically used for Image and Video content. -* A Canvas has a width and height, given as unitless integers -* A Canvas has an optional continuous duration in seconds -* A Canvas is typically used for Image content, and with duration, for Video content. +Canvases have two additional required properties: `height` and `width`, which give the spatial extent as unitless integers. Canvases may also have the `duration` property in the same manner as Timelines. #### Scene -A Container that represents a boundless three-dimensional space and has content resources positioned at locations within it. Rendering a Scene requires the use of Cameras and Lights. It may also have a bounded temporal range in the same manner as a Timeline. +A Container that represents a boundless three-dimensional space, optionally with a bounded temporal range. Scenes are typically used for rendering 3D models, and can additionally have Cameras and Lights. + +Scenes may also have the `duration` property in the same manner as Timelines. -* A Scene has a continuous, unitless x,y,z cartesian coordinate space -* A Scene has an optional continuous duration in seconds -* A Scene is typically used for 3D models, and can include audio, video and image content +(👀) [Model Documentation](model/#containers) ```json Manifest JSON with a Timeline, a Canvas and a Scene @@ -133,26 +133,55 @@ Manifest JSON with a Timeline, a Canvas and a Scene IIIF uses the concept of _Annotation_ to link resources together from around the web. This specification uses a World Wide Web Consortium (W3C) standard for this called the [Web Annotation Data Model][org-web-anno]. This is a structured linking mechanism useful for making comments about Content Resources, but IIIF's primary use of it is to associate the images, audio and other Content Resources with their Containers for presentation. -Different uses of Annotation are distinguished through their `motivation` property. This specification defines a value for `motivation` called `painting` for associating Content Resources with Containers, which this specification calls a Painting Annotation. This is from the notion of painting onto a canvas, a metaphor borrowed from art and used for image-based digital applications, and expanded by IIIF into "painting" any Content Resource into a Container of any number of dimensions. +Different uses of Annotation are distinguished through their `motivation` property. This specification defines a value for `motivation` called `painting` for associating Content Resources with Containers, which this specification calls a Painting Annotation. The verb "paint" is also used to refer to the associating of a Content Resource with a Container by a Painting Annotation. This is from the notion of painting onto a canvas, a metaphor borrowed from art and used for image-based digital applications, and expanded by IIIF into "painting" any Content Resource into a Container of any number of dimensions. The same linking mechanism is also used in IIIF with other motivations for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning content, and provides a standards-based framework for referencing parts of resources. As Annotations can be added later, it promotes a distributed system in which further content such as commentary can be aligned with the objects published on the web. +The required properties of Annotations are `id`, `type`, `motivation`, and `target`. Most Annotations also have the `body` property. + +(👀) [Model Documentation](model/#annotations) + ``` -JSON of painting anno +JSON of painting anno - image to canvas ``` ### Content Resources +Content Resources are external web resources, including images, video, audio, 3D models, data, web pages or any other format. Typically these are the resources that will be "painted" onto a Container using a Painting Annotation. + +The required properties of Content Resources are `id` and `type`. Other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. + + +#### Containers as Content Resources + +Containers may also be treated as Content Resources and painted into other Containers. This allows rich composition of content, such as painting a Canvas bearing a Video into a Scene, or painting a 3D model along with its associated Lights into an encompassing Scene. + +#### Referencing Parts of Resources -There is stuff that we want to show - images, video, audio, 3D models etc +A common requirement is to refer to only part of a resource, either a Container or a Content Resource. There are two primary methods for achieving this: adding a fragment to the end of the URI for the resource, or creating a Specific Resource that describes the method for selecting the desired part. -Image, Sound, Video, Model, Text -(see model) +##### Fragments -And we can nest Containers so they are Content Resources too +Parts of resources on the Web are identified using URIs with a fragment component that both describes how to select the part from the resource, and, as a URI, also identifies it. In HTML this is frequently used to refer to part of the web page, called an anchor. The URI with the fragment can be used in place of the URI without the fragment in order to refer to this part. -SpecificResource +There are different types of fragment based on the format of the resource. The most commonly used type in IIIF is the W3C's Media Fragments specification, as it can define a temporal and 2D spatial region. +``` +comment annotation about part of the previous example's Canvas using #Fragment +``` + + +##### Specific Resource + +URIs with fragments are insufficient for complex referencing, like circular regions or arbitrary text spans, and do not support other useful features such as describing styling or transformation. The Web Annotation Data Model introduces a class called `SpecificResource` that represents the resource in a specific context or role, which IIIF uses to describe these more complex requirements. The Specific Resource then identifies the part, and the description of how to extract it is given as an instance of a `Selector` class associated with it. + +Several different classes of Selector are used in IIIF, including an alternative implementation of the fragment pattern called `FragmentSelector`. The fragment is given in the `value` property of the `FragmentSelector`, and the resource it should be applied to is given in `source`. + +The required properties of Specific Resources are `id`, `type`, and `source`. Other commonly used properties include `selector`, `transform`, and `scope`. + +``` +comment annotation about part of the previous example's Canvas using FragmentSelector +``` ## Presenting Content Resources - what you came here for diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 4bf507ee0..d0b200ff2 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -129,6 +129,7 @@ The members of a Manifest are listed in the `items` property. The members of Man ### Container Classes +{: #containers} A Container is a frame of reference that allows the relative positioning of content. @@ -149,6 +150,7 @@ A Canvas is a Container that represents a particular rectangular 2 dimensional v A Scene is a Container that represents an infinitely large three-dimensional space, with an optional duration. As the Scene is infinite, it does not have `height`, `width` or `depth` properties. ### Annotation Classes +{: #annotations} The following set of classes are defined by the W3C's [Web Annotation Data Model][org-w3c-webanno] and Vocabulary, and are heavily used within the IIIF Data Model. Any necessary deviations from those specifications are explicitly noted and explained, such as the need for internationalization of labels. From 1b9645b8a56494391d64e1b0623516668a9efc36 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 18 Mar 2025 13:32:37 -0400 Subject: [PATCH 038/192] remove draft, move all to p4 index --- .gitignore | 2 + source/presentation/4.0/index-draft.md | 1112 ------------------------ source/presentation/4.0/index.md | 1036 +++++++++++++++++++++- 3 files changed, 1036 insertions(+), 1114 deletions(-) delete mode 100644 source/presentation/4.0/index-draft.md diff --git a/.gitignore b/.gitignore index 2a8d1df61..ca4b5a24c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ tmp/ iiifc-theme Gemfile.lock vendor + +.vscode diff --git a/source/presentation/4.0/index-draft.md b/source/presentation/4.0/index-draft.md deleted file mode 100644 index 1e9aa7573..000000000 --- a/source/presentation/4.0/index-draft.md +++ /dev/null @@ -1,1112 +0,0 @@ ---- -title: "Presentation API 4.0" -title_override: "IIIF Presentation API 4.0" -id: presentation-api -layout: spec -cssversion: 3 -tags: [specifications, presentation-api] -major: 4 -minor: 0 -patch: 0 -pre: -redirect_from: - - /presentation/index.html - - /presentation/4/index.html -editors: - - name: Michael Appleby - ORCID: https://orcid.org/0000-0002-1266-298X - institution: Yale University - - name: Tom Crane - ORCID: https://orcid.org/0000-0003-1881-243X - institution: Digirati - - name: Robert Sanderson - ORCID: https://orcid.org/0000-0003-4441-6852 - institution: J. Paul Getty Trust - - name: Dawn Childress - ORCID: - institution: UCLA - - name: Julie Winchester - ORCID: - institution: Duke University - - name: Jeff Mixter - ORCID: - institution: OCLC -hero: - image: '' ---- - -## Status of this Document -{:.no_toc} -__This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} - -__Latest Stable Version:__ [{{ site.data.apis.presentation.latest.major }}.{{ site.data.apis.presentation.latest.minor }}.{{ site.data.apis.presentation.latest.patch }}][prezi-stable-version] - -__Previous Version:__ [3.0][prezi30] - -**Editors:** - -{% include api/editors.md editors=page.editors %} - -{% include copyright.md %} - ----- - - - -### Timeline - -A Timeline _MUST_ have a `duration` property that defines its length in seconds. The `duration` value must be a positive floating point number. - -An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. - -A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": -1.0, - "z": 3.0, - "refinedBy": { - "type": "FragmentSelector", - "value": "t=45,95" - } - } - ] - } -} -``` - -When using a URL fragment in place of a SpecificResource, the parameter `t` can be used to select the temporal region: - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": "https://example.org/iiif/scene1#xyz=-1,-1,3&t=45,95" -} -``` - -An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": -1.0, - "z": 3.0, - "instant": 45.0 - } - ] - } -} -``` - -The Annotation's [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) can be used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. - -It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. - - - - -### Annotation - - -Annotations follow the [Web Annotation][org-w3c-webanno] data model and are used to associate models, lights, cameras, and IIIF containers such as Canvases, with Scenes. They have a `type` of "Annotation", a `body` (being the resource to be added to the scene) and a `target` (being the scene or a position within the scene). They must have a `motivation` property with the value of "painting" to assert that the resource is being painted into the Scene, rather than the Annotation being a comment about the Scene. - -A construct called a Selector is used to select a part of a resource, such as a point within a Scene. The use of a Selector necessitates the creation of a `SpecificResource` that groups together the resource being selected (the `source`) and the instance of the Selector. This SpecificResource can then be used as either the `body` or the `target` of the Annotation. - -All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. - -Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). - -Example Annotation that positions a model at a point within a Scene: - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": 0.0, - "z": 1.0 - } - ] - } -} -``` - -Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. - -
-❓Does WKTSelector have a duration/instant property? -
- -Example Annotation that comments on a 3D polygon within a Scene: - -``` -Todo add example -``` - -#### URI Fragments - -(move up, include xywh) - -The point may instead be defined using a short-hand form of a URI Fragment at the end of the `id` of the Scene as the `target` of the Annotation. The name of the fragment parameter is `xyz` and its value is the x, y and z values separated by commas. Each value can be expressed as either an integer or a floating point number. - -The annotation above could be expressed as its fragment-based equivalent: - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": "https://example.org/iiif/scene1#xyz=-1,0,1" -} -``` - - - - - -"non-painting" - -"target" and "body" - - -### Annotation Page - -"Overlapping elements with a larger z-index cover those with a smaller one." -link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index - - -### Annotation Collection - -deal with this: -https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 - -use totalItems? https://iiif.io/api/discovery/1.0/#totalitems - -### Manifest - -### Collection - -#### Paging - -### Range - -## Content State - -A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: - -A "bare" Manifest URI: - -``` -https://example.org/manifests/1 -``` - -A reference to a Manifest: - -```json -{ - "id": "https://example.org/manifests/1", - "type": "Manifest" -} -``` - -A region of a Canvas within a Manifest: - -```json -{ - "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", - "type": "Canvas", - "partOf": { - "id": "https://example.org/manifests/1", - "type": "Manifest" - } -} -``` - -Two versions of a painting from different publishers: - -```json -[ - { - "id": "https://gallery-1.org/iiif/sunflowers/canvas1", - "type": "Canvas", - "partOf": [ - { - "id": "https://gallery-1.org/iiif/sunflowers", - "type": "Manifest" - } - ] - }, - { - "id": "https://gallery-2.org/collection/sunflowers/c1", - "type": "Canvas", - "partOf": [ - { - "id": "https://gallery-2.org/collection/sunflowers", - "type": "Manifest" - } - ] - } -] -``` - -A Scene with a Camera at a particular point: - - -```json -{ - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "items": [ - { - "id": "https://example.org/iiif/3d/anno8", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/3d/cameras/1", - "type": "PerspectiveCamera", - "label": { - "en": [ - "Perspective Camera Pointed At Front of Cranium and Mandible" - ] - }, - "fieldOfView": 50.0, - "near": 0.1, - "far": 2000.0 - } - ] - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.0, "y": 0.15, "z": 0.75 - } - ] - } - } - ] -} -``` - -The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). - -Annotations with the motivation `contentState` are referred to as _content state_ annotations. - -Content States are used for the following applications: - -### Load a particular view of a resource or group of resources - -In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. - -The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the _Content State Protocol API 2.0_ specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. - - -### Load a particular view of some resource and modify it - -In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: - -```json -{ - "id": "https://example.org/import/3", - "type": "Annotation", - "motivation": "contentState", - "target": { - "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", - "type": "Canvas", - "partOf": { - "id": "https://example.org/manifests/nook12", - "type": "Manifest" - }, - "annotations": [ - { - "id": "https://my-annotation-store.org/user4532/notes-on-book12/p1", - "type": "AnnotationPage" - } - ] - } -} -``` - -As well as adding resources not present in the referred-to resource, the Content State can also remove parts of the referred-to resource from the user's view by applying the behavior `hidden` to them: - -```jsonc -{ - // What does this actually look like? I want to load bnf_chateauroux example but HIDE the illumination - // ... - "id": "https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/annotation/p0001-image", - "type": "Annotation", - "motivation": "painting", - "behavior": ["hidden"] -} -``` - -TODO: what is the processing algorithm for applying incoming `hidden` ? - -When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. - - -### Modify the Container in a particular context - -The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. - - -Consider a Scene with two models, and two `commenting` annotations: - -```jsonc -{ - "id": "https://example.org/iiif/3d/whale_comment_scope_content_state.json", - "type": "Manifest", - "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - }, - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ] - } - ] - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/p1/annotations/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno7", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Mandibular tooth", - "target": { - // SpecificResource with PointSelector - } - }, - { - "id": "https://example.org/iiif/3d/anno5", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Right pterygoid hamulus", - "target": { - // SpecificResource with PointSelector - } - } - ] - } - ] -} -``` - -In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. - -In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. It may be useful to light the Scene differently in different contexts. - -In the same way an incoming Content State can modify a Scene as it initializes the client, so can a Content State attached to each (non-`painting`) annotation target modify the Scene as the user moves between different annotations. - -The `scope` property of an annotation `target` provides _contextual_ Content State - the viewer should modify the Scene by applying the Content State carried by the `scope` property _only when the user is in the context of that annotation_. - -Taking the first commenting annotation from the above example and adding a `scope` property, whose value is an annotation with the motivation `contentState`, we can introduce a new Camera specifically for this particular annotation, so that when the user selects this comment, the client will switch the view to this camera. This example also changes the background color of the Scene: - -```jsonc -{ - "id": "https://example.org/iiif/3d/anno7", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Mandibular tooth", - "target": { - - // SpecificResource with PointSelector - // "type": "SpecificResource", - // "source": ... the Scene... - // "selector": ... a point ... - - "scope": { // a modification to the Scene, only in the context of this annotation - - "id": "https://example.org/iiif/3d/anno4", - "type": "Annotation", - "motivation": ["contentState"], - "target": { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "backgroundColor": "yellow", - "items": [ - { - "id": "https://example.org/iiif/3d/anno8", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/3d/cameras/1", - "type": "PerspectiveCamera", - "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, - "fieldOfView": 50.0, - "near": 0.10, - "far": 2000.0 - } - ] - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.0, "y": 0.15, "z": 0.75 - } - ] - } - } - ] - } - } - } -} -``` - -In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of `scope` allows a precise storytelling experience to be specified, including: - - - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) - - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest - - hiding parts of the Scene for a step - - introducing additional models at a particular step - - (and many more!) - -Use of `scope` is permitted in annotations on any Container type, not just Scenes. For example, a 2D narrative around a Canvas might show or hide different `painting` annotations at each step. - -#### The `sequence` behavior - -// Is this right? Language... - -While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. - -### Content States on Manifests - -When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. - -// Is there some overlap here with Range? - -### Processing Content States in Scopes: reset - -// This may not be what we have discussed... - -When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. - -The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `sequence`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. If this behavior is not wanted, the `reset` property of the content state annotation should be set to `true`: - -```json -{ - "type": "Annotation", - "motivation": ["contentState"], - "reset": true -} -``` - -Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. - -// I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... - -### Contribute additional information permanently - -Rerum inbox scenario - should be covered in CS2 protocol - -### activating - animation and interactions - -Annotations with the motivation `activating` are referred to as _activating_ annotations. - -There are two uses of `activating` annotations: - -#### Triggering a content state - -An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. - -The activating annotation is provided in a Container's `annotations` property. In this (contrived for brevity) example, if the user clicks the mandible model, the Scene background changes color: - -```jsonc -{ - "id": "https://example.org/iiif/3d/activating.json", - "type": "Manifest", - "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/scene-with-activation", - "type": "Scene", - "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/painting-anno-for-mandible", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/activators", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["activating"], - "body": [ - { - "type": "TextualBody", - "value": "A label for the activation may be provided as a TextualBody" - }, - { - // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply - "id": "https://example.org/iiif/scene1/scene-with-activation", - "type": "Scene", - "backgroundColor": "#FF99AA" - } - ], - "target": { - "id": "https://example.org/iiif/3d/painting-anno-for-mandible", - "type": "Annotation" - } - } - ] - } - ] - } - ] - } - ] -} -``` - -// Can you put activating annotations in `manifest.annotations`? They would work there too, you have all the information. - - - -#### Triggering a named animation in a model - -Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. - -This pattern is similar to the above, except that: - - - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) - - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. - - The format of the `value` string is implementation-specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. - - - -```jsonc -{ - "id": "https://example.org/iiif/3d/activating-animation.json", - "type": "Manifest", - "label": { "en": ["Music Box with lid that opens as an internal animation"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/scene-with-activation-animation", - "type": "Scene", - "label": { "en": ["A Scene Containing a Music Box"] }, - "items": [ - { - "id": "https://example.org/iiif/scene-with-activation-animation/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/painting-anno-for-music-box", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/activators", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["activating"], - "body": [ - { - "type": "TextualBody", - "value": "Click the box to open the lid" - } - ], - "target": [ - { - "type": "SpecificResource", - "source": "https://example.org/iiif/3d/painting-anno-for-music-box", - "selector": [ - { - "type": "AnimationSelector", - "value": "open-the-lid" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] -} -``` - -// TODO - -activating to apply a content state and activating to trigger a named animation - use of body and target... what if we want to click a painting anno to trigger the animation? -Can we ADD that to the target, alongside the SpecificResource with the AnimationSelector? - -if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody (or list of TextualBody)? - -There is a more general rule here! - -### reset - -See above... - -"diff", "original state" etc -behavior for "force-order"? -behavior: sequence - -## Selectors - -preamble - cover all the use cases - -### SpecificResource - -(This heading should be more descriptive) - -fragments/segments/parts of resources -SvgSelector -xywh - - -### PointSelector - - -## Scene-Specific Resources - -### 3D considerations / principles - -"models" (content resources in 3D) -"local coordinate spaces" - -### Camera - -A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. - -This specification defines two types of Camera: - -| Class | Description | -| ------------------- | ------------ | -| `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | -| `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | - -Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. The camera's up direction by default points along the y axis towards positive infinity, but this may be modified by transforms. - -The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. - -The `near` property defines the minimum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything nearer to the camera than this distance will not be viewed. Conversely, the `far` property defines a maximum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything further away will not be viewed. - -For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. - -If any of these properties are not specified explicitly, they default to the choice of the client implementation. - -drawing of a geometrical frustrum truncated by near and far distances - - -The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. - -```json -{ - "id": "https://example.org/iiif/camera/1", - "type": "PerspectiveCamera", - "near": 1.0, - "far": 100.0, - "fieldOfView": 45.0 -} -``` - - - -### Light - -One or more Lights MUST be present within the Scene in order to have objects within it be visible to the Cameras. - -This specification defines four types of Light: - -| Class | Description | -| ----- | ------------ | -| `AmbientLight` | AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. | -| `DirectionalLight` | DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. | -| `PointLight` | PointLight emits from a single point within the scene in all directions. | -| `SpotLight` | SpotLight emits a cone of light from a single point in a given direction. | - -Lights defined in this specification have a `color` and an `intensity`. The color is given as an RGB value, such as "#FFFFFF" for white. The intensity is the strength or brightness of the light, and described using a `Value` construct. - -SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. - -diagram of cone geometry showing how the angle of the cone is defined - -Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). If a Light does not have an explicit position in the coordinate space, then the default is at the origin. - -This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. - -If there are no Lights present within the Scene, then the viewer MUST add at least one Light. The types and properties of Lights added in this way are client-dependent. - -```json -{ - "id": "https://example.org/iiif/light/1", - "type": "AmbientLight", - "color": "#FFFFFF", - "intensity": {"type": "Value", "value": 0.6, "unit": "relativeUnit"} -} -``` - - - -### Transforms - -The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. - -This specification defines a new class of manipulations for SpecificResources called a `Transform`, with three specific sub-classes. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. - - -| Class | Description | -| --------------- | ------------ | -| ScaleTransform | A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 | -| RotateTransform | A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 | -| TranslateTransform | A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 | - -Transforms are added to a SpecificResource using the `transform` property. The value of the property is an array, which determines the order in which the transforms are to be applied. The resulting state of the first transform is the input state for the second transform, and so on. Different orders of the same set of transforms can have different results, so attention must be paid when creating the array and when processing it. - -The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. - -Transforms are only used in the Presentation API when the SpecificResource is the `body` of the Annotation, and are applied before the resource is painted into the scene at the point given in the `target`. - -```json -{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "transform": [ - { - "type": "RotateTransform", - "x": 0.0, - "y": 180.0, - "z": 0.0 - }, - { - "type": "TranslateTransform", - "x": 1.0, - "y": 0.0, - "z": 0.0 - } - ] -} -``` - - -#### Relative Rotation - -It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. - -If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. - -This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. - -```json -"lookAt": { - "type": "PointSelector", - "x": 3, - "y": 0, - "z": -10 -} -``` - - -#### Excluding - -Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. - -Painting a Scene into another while excluding import of several types of resources: -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "exclude": ["Audio", "Lights", "Cameras", "Animations"], - "body": { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - }, - "target": "https://example.org/iiif/scene2" -} -``` - - - -## Advanced Association Features - -(This needs to be sprinkled throughout above - especially as SpecificResource must be introduced early for 3D) - -### Nesting - -A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. - -When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the pixel origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (e.g., is colinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (e.g., is colinear to) the negative y axis extending from the coordinate origin. The Canvas is scaled to the Scene such that the pixel dimensions correspond to 3D coordinate units - a Canvas 200 pixels wide and 400 pixels high will extend 200 coordinate units across the x axis and 400 coordinate units across the y axis. Please note: direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted. - -A Canvas in a Scene has a specific forward face and a backward face. By default, the forward face of a Canvas should point in the direction of the positive z axis. If the property `backgroundColor` is used, this color should be used for the backward face of the Canvas. Otherwise, a reverse view of the forward face of the Canvas should be visible on the backward face. - -
- To Do: Add an image demonstrating default Canvas placement in Scene -
- -A `PointSelector` can be used to modify the point at which the Canvas will be painted, by establishing a new point to align with the top-left corner of the Canvas instead of the Scene coordinate origin. Transforms can also be used to modify Canvas rotation, scale, or translation. - -It may be desirable to exercise greater control over how the Canvas is painted into the Scene by selecting the coordinate points in the Scene that should correspond to each corner of the Canvas. This provides fine-grained manipulation of Canvas placement and/or scale, and for optionally introducing Canvas distortion or skew. Annotations may use a WktSelector to select different points in the Scene to align with the top-left, bottom-left, bottom-right, and top-right corners of the Canvas. In this case, the four Scene coordinates should be listed beginning with the coordinate corresponding to the top-left corner of the Canvas, and should proceed in a counter-clockwise winding order around the Canvas, with coordinates corresponding to bottom-left, bottom-right, and top-right corners in order respectively. The use of WktSelector for this purpose overrides any use of Transforms on the Canvas Annotation. - -Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at (1, 0, 0); and top-right at (1, 1, 0): -```json -"selector": [ - { - "type": "WktSelector", - "value": "POLYGONZ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" - } -] -``` - -When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. - -### Embedded Content - -e.g., painting TextualBody on Canvas - -Todo: This is mostly copy-pasted from properties, is it needed here? -It is important to be able to position the textual body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. The positioning of the textual body in a container is accomplished through the `position` property, which has as a value a Specific Resource identifying the targeted container as the source and a selector defining how the textual body should be positioned in the targeted container. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. - -### Comment Annotations - -(move to Annotation section) - - -### Choice of Alternative Resources - -(move to Annotation section) - - -### Non Rectangular Segments - -SvgSelector - move to SpecificResource too ^^ - - -### Style - -Move to SpecificResource - - -### Rotation - - -### Hotspot Linking and Activation - -Move to SpecificResource - - - -## Conveying Physical Dimensions - -(why is this important!?) - -(move the props to vocab doc) - -### spatialScale - -### temporalScale - - -``` -{ - "spatialScale": { - "factor": 22.0, - "units": "m" - }, - - - // this would be rarely used - "temporalScale": { - "factor": 0.00001 - } - -} -``` - -`factor` Required A floating point ratio. -`units` Required A real-world measuring unit. Always seconds for temporalScale. Possible values for spatialScale include: "m", "ft". (is that it?) - -For a Canvas, it's the physical "size" of each cartesian integer unit. -For a Scene, it's the physical size of the unit vector. -For a timeline it's the ratio of time in the recording to time in the real world. - - -(define props in the Vocabulary doc) - - -## HTTP Requests and Responses - -### URI Recommendations - -### Requests - -### Responses - -### Authentication - - -## Accessibility - -(new section) - -`provides` - - -## Appendices - -### Summary of Property Requirements - -### Example Manifest Response - -### Versioning - -### Acknowledgements - -### Change Log - -"Exclude Audio" diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 7cda8acc9..8e4665f2d 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -248,6 +248,358 @@ A simple example painting one Scene into another: +A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": -1.0, + "z": 3.0, + "refinedBy": { + "type": "FragmentSelector", + "value": "t=45,95" + } + } + ] + } +} +``` + +When using a URL fragment in place of a SpecificResource, the parameter `t` can be used to select the temporal region: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": "https://example.org/iiif/scene1#xyz=-1,-1,3&t=45,95" +} +``` + +An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": -1.0, + "z": 3.0, + "instant": 45.0 + } + ] + } +} +``` + +The Annotation's [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) can be used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. + +It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. + + +An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. + + +All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. + +Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). + +Example Annotation that positions a model at a point within a Scene: + +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": 0.0, + "z": 1.0 + } + ] + } +} +``` + +Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. + +
+❓Does WKTSelector have a duration/instant property? +
+ +Example Annotation that comments on a 3D polygon within a Scene: + +``` +Todo add example +``` + + + +## Scene-Specific Resources + +### 3D considerations / principles + +"models" (content resources in 3D) +"local coordinate spaces" + +### Camera + +A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. + +This specification defines two types of Camera: + +| Class | Description | +| ------------------- | ------------ | +| `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | +| `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | + +Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. The camera's up direction by default points along the y axis towards positive infinity, but this may be modified by transforms. + +The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. + +The `near` property defines the minimum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything nearer to the camera than this distance will not be viewed. Conversely, the `far` property defines a maximum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything further away will not be viewed. + +For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. + +If any of these properties are not specified explicitly, they default to the choice of the client implementation. + +drawing of a geometrical frustrum truncated by near and far distances + + +The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. + +```json +{ + "id": "https://example.org/iiif/camera/1", + "type": "PerspectiveCamera", + "near": 1.0, + "far": 100.0, + "fieldOfView": 45.0 +} +``` + + + +### Light + +One or more Lights MUST be present within the Scene in order to have objects within it be visible to the Cameras. + +This specification defines four types of Light: + +| Class | Description | +| ----- | ------------ | +| `AmbientLight` | AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. | +| `DirectionalLight` | DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. | +| `PointLight` | PointLight emits from a single point within the scene in all directions. | +| `SpotLight` | SpotLight emits a cone of light from a single point in a given direction. | + +Lights defined in this specification have a `color` and an `intensity`. The color is given as an RGB value, such as "#FFFFFF" for white. The intensity is the strength or brightness of the light, and described using a `Value` construct. + +SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. + +diagram of cone geometry showing how the angle of the cone is defined + +Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). If a Light does not have an explicit position in the coordinate space, then the default is at the origin. + +This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. + +If there are no Lights present within the Scene, then the viewer MUST add at least one Light. The types and properties of Lights added in this way are client-dependent. + +```json +{ + "id": "https://example.org/iiif/light/1", + "type": "AmbientLight", + "color": "#FFFFFF", + "intensity": {"type": "Value", "value": 0.6, "unit": "relativeUnit"} +} +``` + + + +### Transforms + +The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. + +This specification defines a new class of manipulations for SpecificResources called a `Transform`, with three specific sub-classes. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. + + +| Class | Description | +| --------------- | ------------ | +| ScaleTransform | A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 | +| RotateTransform | A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 | +| TranslateTransform | A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 | + +Transforms are added to a SpecificResource using the `transform` property. The value of the property is an array, which determines the order in which the transforms are to be applied. The resulting state of the first transform is the input state for the second transform, and so on. Different orders of the same set of transforms can have different results, so attention must be paid when creating the array and when processing it. + +The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. + +Transforms are only used in the Presentation API when the SpecificResource is the `body` of the Annotation, and are applied before the resource is painted into the scene at the point given in the `target`. + +```json +{ + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "transform": [ + { + "type": "RotateTransform", + "x": 0.0, + "y": 180.0, + "z": 0.0 + }, + { + "type": "TranslateTransform", + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + ] +} +``` + + +#### Relative Rotation + +It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. + +If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. + +This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. + +```json +"lookAt": { + "type": "PointSelector", + "x": 3, + "y": 0, + "z": -10 +} +``` + + +#### Excluding + +Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. + +Painting a Scene into another while excluding import of several types of resources: +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "exclude": ["Audio", "Lights", "Cameras", "Animations"], + "body": { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + }, + "target": "https://example.org/iiif/scene2" +} +``` + + + + + + + +### Nesting + +A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. + +When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the pixel origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (e.g., is colinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (e.g., is colinear to) the negative y axis extending from the coordinate origin. The Canvas is scaled to the Scene such that the pixel dimensions correspond to 3D coordinate units - a Canvas 200 pixels wide and 400 pixels high will extend 200 coordinate units across the x axis and 400 coordinate units across the y axis. Please note: direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted. + +A Canvas in a Scene has a specific forward face and a backward face. By default, the forward face of a Canvas should point in the direction of the positive z axis. If the property `backgroundColor` is used, this color should be used for the backward face of the Canvas. Otherwise, a reverse view of the forward face of the Canvas should be visible on the backward face. + +
+ To Do: Add an image demonstrating default Canvas placement in Scene +
+ +A `PointSelector` can be used to modify the point at which the Canvas will be painted, by establishing a new point to align with the top-left corner of the Canvas instead of the Scene coordinate origin. Transforms can also be used to modify Canvas rotation, scale, or translation. + +It may be desirable to exercise greater control over how the Canvas is painted into the Scene by selecting the coordinate points in the Scene that should correspond to each corner of the Canvas. This provides fine-grained manipulation of Canvas placement and/or scale, and for optionally introducing Canvas distortion or skew. Annotations may use a WktSelector to select different points in the Scene to align with the top-left, bottom-left, bottom-right, and top-right corners of the Canvas. In this case, the four Scene coordinates should be listed beginning with the coordinate corresponding to the top-left corner of the Canvas, and should proceed in a counter-clockwise winding order around the Canvas, with coordinates corresponding to bottom-left, bottom-right, and top-right corners in order respectively. The use of WktSelector for this purpose overrides any use of Transforms on the Canvas Annotation. + +Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at (1, 0, 0); and top-right at (1, 1, 0): +```json +"selector": [ + { + "type": "WktSelector", + "value": "POLYGONZ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" + } +] +``` + +When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. + + + + + + + + + + + + + + + + + + Whale bone with a camera and a light @@ -262,11 +614,612 @@ Comments, tags, etc transcripts (and back ref to OCR on images etc) +### Comment Annotations + + + +### Choice of Alternative Resources + + +### Embedded Content + +e.g., painting TextualBody on Canvas + +Todo: This is mostly copy-pasted from properties, is it needed here? +It is important to be able to position the textual body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. The positioning of the textual body in a container is accomplished through the `position` property, which has as a value a Specific Resource identifying the targeted container as the source and a selector defining how the textual body should be positioned in the targeted container. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. + + + + + +### Non Rectangular Segments + +SvgSelector - move to SpecificResource too ^^ + + +### Style + +Move to SpecificResource + + +### Rotation + + +### Hotspot Linking and Activation + +Move to SpecificResource + + + + +#### Annotation Page + +"Overlapping elements with a larger z-index cover those with a smaller one." +link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index + + + +#### Annotation Collection + +deal with this: +https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 + +use totalItems? https://iiif.io/api/discovery/1.0/#totalitems + + + + + + ### State -Content State -Activating annos +## Content State + +A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: + +A "bare" Manifest URI: + +``` +https://example.org/manifests/1 +``` + +A reference to a Manifest: + +```json +{ + "id": "https://example.org/manifests/1", + "type": "Manifest" +} +``` + +A region of a Canvas within a Manifest: + +```json +{ + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/1", + "type": "Manifest" + } +} +``` + +Two versions of a painting from different publishers: + +```json +[ + { + "id": "https://gallery-1.org/iiif/sunflowers/canvas1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-1.org/iiif/sunflowers", + "type": "Manifest" + } + ] + }, + { + "id": "https://gallery-2.org/collection/sunflowers/c1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-2.org/collection/sunflowers", + "type": "Manifest" + } + ] + } +] +``` + +A Scene with a Camera at a particular point: + + +```json +{ + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "items": [ + { + "id": "https://example.org/iiif/3d/anno8", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": { + "en": [ + "Perspective Camera Pointed At Front of Cranium and Mandible" + ] + }, + "fieldOfView": 50.0, + "near": 0.1, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + } + ] +} +``` + +The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). + +Annotations with the motivation `contentState` are referred to as _content state_ annotations. + +Content States are used for the following applications: + +### Load a particular view of a resource or group of resources + +In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. + +The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the [Content State Protocol API 2.0](content-state-2) specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. + + +### Load a particular view of some resource and modify it + +In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: + +```json +{ + "id": "https://example.org/import/3", + "type": "Annotation", + "motivation": "contentState", + "target": { + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/nook12", + "type": "Manifest" + }, + "annotations": [ + { + "id": "https://my-annotation-store.org/user4532/notes-on-book12/p1", + "type": "AnnotationPage" + } + ] + } +} +``` + +As well as adding resources not present in the referred-to resource, the Content State can also remove parts of the referred-to resource from the user's view by applying the behavior `hidden` to them: + +```jsonc +{ + // What does this actually look like? I want to load bnf_chateauroux example but HIDE the illumination + // ... + "id": "https://iiif.io/api/cookbook/recipe/0036-composition-from-multiple-images/annotation/p0001-image", + "type": "Annotation", + "motivation": "painting", + "behavior": ["hidden"] +} +``` + +TODO: what is the processing algorithm for applying incoming `hidden` ? + +When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. + + +### Modify the Container in a particular context + +The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. + + +Consider a Scene with two models, and two `commenting` annotations: + +```jsonc +{ + "id": "https://example.org/iiif/3d/whale_comment_scope_content_state.json", + "type": "Manifest", + "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ] + } + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/p1/annotations/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno7", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Mandibular tooth", + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno5", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Right pterygoid hamulus", + "target": { + // SpecificResource with PointSelector + } + } + ] + } + ] +} +``` + +In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. + +In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. It may be useful to light the Scene differently in different contexts. + +In the same way an incoming Content State can modify a Scene as it initializes the client, so can a Content State attached to each (non-`painting`) annotation target modify the Scene as the user moves between different annotations. + +The `scope` property of an annotation `target` provides _contextual_ Content State - the viewer should modify the Scene by applying the Content State carried by the `scope` property _only when the user is in the context of that annotation_. + +Taking the first commenting annotation from the above example and adding a `scope` property, whose value is an annotation with the motivation `contentState`, we can introduce a new Camera specifically for this particular annotation, so that when the user selects this comment, the client will switch the view to this camera. This example also changes the background color of the Scene: + +```jsonc +{ + "id": "https://example.org/iiif/3d/anno7", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Mandibular tooth", + "target": { + + // SpecificResource with PointSelector + // "type": "SpecificResource", + // "source": ... the Scene... + // "selector": ... a point ... + + "scope": { // a modification to the Scene, only in the context of this annotation + + "id": "https://example.org/iiif/3d/anno4", + "type": "Annotation", + "motivation": ["contentState"], + "target": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "backgroundColor": "yellow", + "items": [ + { + "id": "https://example.org/iiif/3d/anno8", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, + "fieldOfView": 50.0, + "near": 0.10, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + } + ] + } + } + } +} +``` + +In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of `scope` allows a precise storytelling experience to be specified, including: + + - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) + - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest + - hiding parts of the Scene for a step + - introducing additional models at a particular step + - (and many more!) + +Use of `scope` is permitted in annotations on any Container type, not just Scenes. For example, a 2D narrative around a Canvas might show or hide different `painting` annotations at each step. + + + + + + +#### The `sequence` behavior + +// Is this right? Language... + +While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. + +### Content States on Manifests + +When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. + +// Is there some overlap here with Range? + +### Processing Content States in Scopes: reset + +// This may not be what we have discussed... + +When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. + +The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `sequence`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. If this behavior is not wanted, the `reset` property of the content state annotation should be set to `true`: + +```json +{ + "type": "Annotation", + "motivation": ["contentState"], + "reset": true +} +``` + +Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. + +// I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... + +### Contribute additional information permanently + +Rerum inbox scenario - should be covered in CS2 protocol + +### activating - animation and interactions + +Annotations with the motivation `activating` are referred to as _activating_ annotations. + +There are two uses of `activating` annotations: + +#### Triggering a content state + +An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. + +The activating annotation is provided in a Container's `annotations` property. In this (contrived for brevity) example, if the user clicks the mandible model, the Scene background changes color: + +```jsonc +{ + "id": "https://example.org/iiif/3d/activating.json", + "type": "Manifest", + "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene", + "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "A label for the activation may be provided as a TextualBody" + }, + { + // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene", + "backgroundColor": "#FF99AA" + } + ], + "target": { + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", + "type": "Annotation" + } + } + ] + } + ] + } + ] + } + ] +} +``` + +// Can you put activating annotations in `manifest.annotations`? They would work there too, you have all the information. + + + +#### Triggering a named animation in a model + +Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. + +This pattern is similar to the above, except that: + + - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) + - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. + + The format of the `value` string is implementation-specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. + + + +```jsonc +{ + "id": "https://example.org/iiif/3d/activating-animation.json", + "type": "Manifest", + "label": { "en": ["Music Box with lid that opens as an internal animation"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/scene-with-activation-animation", + "type": "Scene", + "label": { "en": ["A Scene Containing a Music Box"] }, + "items": [ + { + "id": "https://example.org/iiif/scene-with-activation-animation/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-music-box", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "Click the box to open the lid" + } + ], + "target": [ + { + "type": "SpecificResource", + "source": "https://example.org/iiif/3d/painting-anno-for-music-box", + "selector": [ + { + "type": "AnimationSelector", + "value": "open-the-lid" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +``` + +// TODO + +activating to apply a content state and activating to trigger a named animation - use of body and target... what if we want to click a painting anno to trigger the animation? +Can we ADD that to the target, alongside the SpecificResource with the AnimationSelector? + +if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody (or list of TextualBody)? + +There is a more general rule here! + +### reset + +See above... + + + + + + ## Navigation @@ -327,10 +1280,77 @@ Paged collections and conceptual collections + +## Conveying Physical Dimensions + +(why is this important!?) + +(move the props to vocab doc) + +### spatialScale + +### temporalScale + + +``` +{ + "spatialScale": { + "factor": 22.0, + "units": "m" + }, + + + // this would be rarely used + "temporalScale": { + "factor": 0.00001 + } + +} +``` + +`factor` Required A floating point ratio. +`units` Required A real-world measuring unit. Always seconds for temporalScale. Possible values for spatialScale include: "m", "ft". (is that it?) + +For a Canvas, it's the physical "size" of each cartesian integer unit. +For a Scene, it's the physical size of the unit vector. +For a timeline it's the ratio of time in the recording to time in the real world. + + +(define props in the Vocabulary doc) + + + + ## Protocol +## HTTP Requests and Responses + +### URI Recommendations + +### Requests + +### Responses + +### Authentication + + + + + + +## Accessibility + +(new section) + +`provides` + + + + + + ## Terminology The principles of [Linked Data][org-linked-data] and the [Architecture of the Web][org-w3c-webarch] are adopted in order to provide a distributed and interoperable framework. The [Shared Canvas data model][shared-canvas] and [JSON-LD][org-w3c-json-ld] are leveraged to create an easy-to-implement, JSON-based format. @@ -344,3 +1364,15 @@ This specification uses the following terms: The terms _array_, _JSON object_, _number_, _string_, and _boolean_ in this document are to be interpreted as defined by the [Javascript Object Notation (JSON)][org-rfc-8259] specification. The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _SHOULD NOT_, _RECOMMENDED_, _MAY_, and _OPTIONAL_ in this document are to be interpreted as described in [RFC 2119][org-rfc-2119]. + + + +## Appendices + +### Versioning + +### Acknowledgements + +### Change Log + +"Exclude Audio" From 6eacf9d0160d24af2de7b8b6a432e4b78e89ec71 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 18 Mar 2025 14:15:08 -0400 Subject: [PATCH 039/192] skeleton of Image and AV sections --- source/presentation/4.0/index.md | 64 ++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 8e4665f2d..ae0ccf9fe 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -184,25 +184,59 @@ comment annotation about part of the previous example's Canvas using FragmentSel ``` -## Presenting Content Resources - what you came here for +## Presenting Content Resources + +This section of the specification uses the use cases listed in the introduction to demonstrate the use of the IIIF Presentation API and introduce additional features. + ### Images -A painting +#### Example 1: a painting + +This example demonstrates the use of the properties `label`, `metadata`, ... + +``` +Example: a painting {} +Will demonstrate: + +Manifest -> items -> Canvas -> items -> AnnoPage -> items -> Anno -> body -> Image +label, summary, metadata, rights, provider, homepage, thumbnail +``` + +Some text, maybe mention requiredStatement + +#### Example 2: a digitized book + +``` +Example: a paged thing - a book +requiredStatement, behavior, viewingDirection, (no Ranges), rendering - PDF version, start +``` + +Introduce new props used, link to model -A paged thing +More text - paging behaviors - ref the Model ### Audio and Video -A timeline - audio only +#### Example: a short recording with a transcript -A video on a Canvas with duration +``` +Timeline +duration, format, annotations (transcript), language, accompanyingContainer +``` + +#### Example: a movie with subtitles + +``` +Canvas +duration, format, Choice of video 720p, 4K? (forward ref), timeMode, placeholderContainer +``` ### 3D -A Scene in IIIF is a virtual container that represents a boundless three-dimensional space and has content resources, lights and cameras positioned at locations within it. It may also have a duration to allow the sequencing of events and timed media. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. +Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). @@ -211,7 +245,6 @@ The axes of the coordinate system are measured in arbitrary units and these unit -As multiple models, lights, cameras, and other resources can be associated with and placed within a Scene container, Scenes provide a straightforward way of grouping content resources together within a space. Scenes, as well as other IIIF containers such as Canvases, can also be embedded within a Scene, allowing for the nesting of content resources. A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. @@ -620,6 +653,8 @@ transcripts (and back ref to OCR on images etc) ### Choice of Alternative Resources +Multispectral here + ### Embedded Content @@ -1268,6 +1303,10 @@ Table of Contents as simple example thumbnail-nav sequence +`structures` property + +supplementary + ### Collections @@ -1277,8 +1316,19 @@ back ref to periodical? Paged collections and conceptual collections +partOf + +Periodicals - navDate, navPlace + + +## Integration + +seeAlso, service(s), extensions +mention search, image api, auth +profile for seeAlso +partOf - ## Conveying Physical Dimensions From 251268bf09712a8cd257eecd1c8a038d182cd573 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 18 Mar 2025 15:13:20 -0400 Subject: [PATCH 040/192] Image and Audio examples --- source/presentation/4.0/index.md | 38 +++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index ae0ccf9fe..11cbfa8af 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -139,6 +139,8 @@ The same linking mechanism is also used in IIIF with other motivations for trans The required properties of Annotations are `id`, `type`, `motivation`, and `target`. Most Annotations also have the `body` property. +The relationship between a Container and a painting annotation is not direct. Annotations are grouped within the `items` property of an Annotation Page, and the `items` property of the Container is a list of Annotation Pages. + (👀) [Model Documentation](model/#annotations) ``` @@ -191,9 +193,9 @@ This section of the specification uses the use cases listed in the introduction ### Images -#### Example 1: a painting +#### Use Case 1: Artwork -This example demonstrates the use of the properties `label`, `metadata`, ... +This example is a Manifest with one Canvas, with an image of an artwork "painted" onto the Canvas. It demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. ``` Example: a painting {} @@ -203,34 +205,45 @@ Manifest -> items -> Canvas -> items -> AnnoPage -> items -> Anno -> body -> Ima label, summary, metadata, rights, provider, homepage, thumbnail ``` -Some text, maybe mention requiredStatement +Notice that the painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. + -#### Example 2: a digitized book +#### Example 2: Book + +This example is a Manifest with multiple Canvases, each of which represents a page of a book. It demonstrates the use of the `behavior` property to indicate to a client that the object is _paged_: this helps a client generate the correct user experience. The `viewingDirection` property indicates that the book is read left-to-right. In this case, the property is redundant as `left-to-right` is the default value. The Manifest has a `rendering` property linking to a PDF representation; typically a client would offer this as a download or "view as" option. The `start` property is used to tell a client to initialize the view on a particular Canvas, useful if the digitized work contains a large amount of irrelevant front matter or blank pages. The `requiredStatement` is a message that a client MUST show to the user when presenting the Manifest. ``` Example: a paged thing - a book requiredStatement, behavior, viewingDirection, (no Ranges), rendering - PDF version, start ``` -Introduce new props used, link to model - -More text - paging behaviors - ref the Model ### Audio and Video -#### Example: a short recording with a transcript +#### Example: a 45 single with one Timeline per song/side + +This example is a Manifest with two Timelines, each of which represent a temporal extent during which a song is played. As in most cases, the Timeline `duration` is the same length as that of Content Resource painted into it. This example is a recording digitized from a 45 RPM 7 inch single. It demonstrates the use of `format` for the audio files' content type, `language` (One song is in English and one is in German), `behavior` with value "autoPlay" that tells a client to automatically advance to the second Timeline after playing the first, `annotations` that link to Annotation Pages of annotations with the motivation `supplementing` that provide the lyrics (one example is given afterwards) - and an `accompanyingContainer` that carries a picture of the single's cover that is shown while the songs are playing. + ``` Timeline -duration, format, annotations (transcript), language, accompanyingContainer +duration, autoPlay, format, annotations (transcript), language, accompanyingContainer +``` + +``` +... + (A single supplementing annotation for a line of the song) t= fragment +... ``` #### Example: a movie with subtitles +This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, the `timeMode` property + ``` Canvas -duration, format, Choice of video 720p, 4K? (forward ref), timeMode, placeholderContainer +duration, behavior=autoplay, format, Choice of video 720p, 4K? (forward ref), timeMode, placeholderContainer ``` @@ -244,7 +257,8 @@ The axes of the coordinate system are measured in arbitrary units and these unit diagram of Right handed cartesian coordinate system - +``` +``` A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. @@ -1395,6 +1409,8 @@ For a timeline it's the ratio of time in the recording to time in the real world (new section) `provides` +`provides[]` + From c1bfe1e51848f5d015afe86c02a67bc8be2c2c4c Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 18 Mar 2025 16:10:24 -0400 Subject: [PATCH 041/192] Periodicals example --- source/presentation/4.0/index.md | 49 ++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 11cbfa8af..237b7a931 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -63,8 +63,7 @@ Presentation, the clue is in the name 3. Audio and Video recordings (time-based, transcriptions) 4. 3D scans of objects (3D) 5. Periodicals (Collections, Ranges, navDate) -6. Archival collections (Collections, Ranges, navDate) -7. Storytelling and exhibitions (State, annotations) +6. Storytelling and exhibitions (State, annotations) see Terminology at the end @@ -239,16 +238,31 @@ duration, autoPlay, format, annotations (transcript), language, accompanyingCont #### Example: a movie with subtitles -This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, the `timeMode` property +This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, the `timeMode` property ..., and `placeholderContainer` that provides a poster image to show in place of the video file before the user initiates playback. ``` Canvas duration, behavior=autoplay, format, Choice of video 720p, 4K? (forward ref), timeMode, placeholderContainer ``` +{ + Canvas + duration: 3600 + movie.mp4 + duration: 3599.68 + movie.flv + duration: 3600.8 + +} + +Sometimes, two different formats derived from the same source may have slightly different durations, perhaps a few milliseconds out. What to do... + ### 3D +Need to get PointSelector in early + + Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). @@ -1273,6 +1287,33 @@ See above... ## Navigation +### Collection + +IIIF Collections are ordered lists of Manifests, Collections, and/or Specific Resources. Collections allow these resources to be grouped in a hierarchical structure for navigation and other purposes. + +:eyes: + +### Range + +IIIF Ranges are used to represent structure _WITHIN_ a Manifest beyond the default order of the Containers in the `items` property. Example uses include newspaper sections or articles, chapters within a book for a table of contents, or movements within a piece of music. Ranges can include Containers, parts of Containers via Specific Resources or fragment URIs, or other Ranges, creating a tree structure like a table of contents. The typical intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. + +:eyes: + +### Example: Periodical + +This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. Each of these year Collections in turn has one Manifest for each daily issue of the newspaper. + +Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections which may be spread across multiple columns and pages. + +Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. +The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each story's Range links to an Annotation Collection that provides the text of the story via the `supplementary` property. + + +``` +demonstrates navDate, navPlace, structures (Ranges), supplementary, Collections +... +``` + ### navXXXX These are just extracts as examples @@ -1312,6 +1353,8 @@ navDate ### Ranges + + Periodical example - with navDate again Table of Contents as simple example thumbnail-nav From 36c8f816e3f7a5d6b140415d33e2a8bbba6c2a92 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 18 Mar 2025 16:26:53 -0400 Subject: [PATCH 042/192] move content state below navigation --- source/presentation/4.0/index.md | 174 +++++++++++++------------------ 1 file changed, 72 insertions(+), 102 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 237b7a931..404c64477 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -734,7 +734,78 @@ use totalItems? https://iiif.io/api/discovery/1.0/#totalitems -### State + + +## Navigation + +### Collection + +IIIF Collections are ordered lists of Manifests, Collections, and/or Specific Resources. Collections allow these resources to be grouped in a hierarchical structure for navigation and other purposes. + +:eyes: + +### Range + +IIIF Ranges are used to represent structure _WITHIN_ a Manifest beyond the default order of the Containers in the `items` property. Example uses include newspaper sections or articles, chapters within a book for a table of contents, or movements within a piece of music. Ranges can include Containers, parts of Containers via Specific Resources or fragment URIs, or other Ranges, creating a tree structure like a table of contents. The typical intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. + +:eyes: + +### Example: Periodical + +This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. Each of these year Collections in turn has one Manifest for each daily issue of the newspaper. + +Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections which may be spread across multiple columns and pages. + +Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. +The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each story's Range links to an Annotation Collection that provides the text of the story via the `supplementary` property. + + +``` +demonstrates navDate, navPlace, structures (Ranges), supplementary, Collections +... +``` + + + +```json +"navPlace": { + "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature-collection/1", + "type": "FeatureCollection", + "features": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature/1", + "type": "Feature", + "properties": { + "label": { "en": ["Castel Sant'Angelo, Rome"] } + }, + "geometry": { + "type": "Point", + "coordinates": [12.4663, 41.9031] + } + } + ] +} +``` + + +thumbnail-nav +sequence + + + +## Integration + +seeAlso, service(s), extensions +mention search, image api, auth + +profile for seeAlso + +partOf - + + + + +## State ## Content State @@ -1285,107 +1356,6 @@ See above... -## Navigation - -### Collection - -IIIF Collections are ordered lists of Manifests, Collections, and/or Specific Resources. Collections allow these resources to be grouped in a hierarchical structure for navigation and other purposes. - -:eyes: - -### Range - -IIIF Ranges are used to represent structure _WITHIN_ a Manifest beyond the default order of the Containers in the `items` property. Example uses include newspaper sections or articles, chapters within a book for a table of contents, or movements within a piece of music. Ranges can include Containers, parts of Containers via Specific Resources or fragment URIs, or other Ranges, creating a tree structure like a table of contents. The typical intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. - -:eyes: - -### Example: Periodical - -This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. Each of these year Collections in turn has one Manifest for each daily issue of the newspaper. - -Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections which may be spread across multiple columns and pages. - -Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. -The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each story's Range links to an Annotation Collection that provides the text of the story via the `supplementary` property. - - -``` -demonstrates navDate, navPlace, structures (Ranges), supplementary, Collections -... -``` - -### navXXXX - -These are just extracts as examples - -```json -"navDate": "1776-01-01T00:00:00+00:00", -``` - -See this in Periodicals - - - -```json -"navPlace": { - "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature-collection/1", - "type": "FeatureCollection", - "features": [ - { - "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature/1", - "type": "Feature", - "properties": { - "label": { "en": ["Castel Sant'Angelo, Rome"] } - }, - "geometry": { - "type": "Point", - "coordinates": [12.4663, 41.9031] - } - } - ] -} -``` -Map example - -navDate -??? example - - -### Ranges - - - -Periodical example - with navDate again -Table of Contents as simple example -thumbnail-nav -sequence - -`structures` property - -supplementary - - -### Collections - -Multi-vol work -Archive example -back ref to periodical? - -Paged collections and conceptual collections - -partOf - -Periodicals - navDate, navPlace - - -## Integration - -seeAlso, service(s), extensions -mention search, image api, auth - -profile for seeAlso - -partOf - ## Conveying Physical Dimensions From 19ff0190eee7a50704c6982430f2ecf0a18c3c98 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 18 Mar 2025 17:11:09 -0400 Subject: [PATCH 043/192] porygonz --- source/presentation/4.0/index.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 404c64477..821810ae7 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -58,6 +58,18 @@ Presentation, the clue is in the name (non-exhaustive) List of use cases +1. Artwork +2. Book +3. 45 Single +4. Movie +5. 3D 1 (Single model at 0,0,0 in Scene with ambient Light and Camera) +6. 3D 2 (Complex stuff) +7. Periodical +8. 3D 3 (storytelling) +9. Manuscript (integration) + + + 1. Digitized books and manuscripts (images, paged things, transcripts, translations) 2. Artworks and Maps (navPlace, maybe commenting annos) 3. Audio and Video recordings (time-based, transcriptions) @@ -262,6 +274,12 @@ Sometimes, two different formats derived from the same source may have slightly Need to get PointSelector in early +Example 3D 1 + +Example 3D 2 + +backgroundColor, exclude, color, intensity, far, fieldOfView, near, viewHeight, interactionMode, lookAt + Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). @@ -637,7 +655,7 @@ Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at "selector": [ { "type": "WktSelector", - "value": "POLYGONZ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" + "value": "POLYGON Z ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" } ] ``` From e9dcc5ee6f5ba91b00bf0d05ab867117e2b19e24 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 18 Mar 2025 17:19:55 -0400 Subject: [PATCH 044/192] update --- source/presentation/4.0/model.md | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index d0b200ff2..3f34143a2 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -78,14 +78,7 @@ The descriptions also do not define how the classes are used, which is done in t ### Collection -A Collection is an ordered list of Manifests, and/or Collections. Collections allow Manifests and child Collections to be grouped in a hierarchical structure for presentation, which can be for generating navigation, showing dynamic results from a search, or providing fixed sets of related resources for any other purpose. IIIF Collections might align with the curated management of cultural heritage resources in sets, also called "collections", but can also be used for many other purposes. - -The intended usage of Collections is to allow clients to: - - * Load a pre-defined set of Manifests at initialization time. - * Receive a set of Manifests, such as search results, for rendering. - * Visualize lists or hierarchies of related Manifests. - * Provide navigation through a list or hierarchy of available Manifests. +A Collection is an ordered list of Manifests, and/or Collections. The identifier in `id` _MUST_ be able to be dereferenced to retrieve the JSON description of the Collection, and thus _MUST_ use the HTTP(S) URI scheme. @@ -231,8 +224,8 @@ Point Selectors have the following properties: | type | The class of the selector, which must be "PointSelector" | | x | A number (floating point or integer) giving the x coordinate of the point, relative to the dimensions of the source resource | | y | A number (floating point or integer) giving the y coordinate of the point, relative to the dimensions of the source resource | -| z | A number (floating point or integer) giving the z coordinate of the point, relative to the dimensions of the source resource | -| t | A number (floating point or integer) giving the time of the point in seconds, relative to the duration of the source resource | +| z | A number (floating point) giving the z coordinate of the point, relative to the dimensions of the source resource | +| t | A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource | ```json @@ -337,7 +330,7 @@ Animation Selectors have the following properties: ### Range -Ranges are used to represent structure within a Manifest beyond the default order of the Containers in the `items` property of the Manifest, such as newspaper sections or articles, chapters within a book, or movements within a piece of music. Ranges can include Containers, parts of Containers via SpecificResources or fragment URIs, or other Ranges, creating a tree structure like a table of contents. The typical intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. +Ranges are used to represent structure within a Manifest beyond the default order of the Containers in the `items` property. Ranges _MUST_ have URIs and they _SHOULD_ be HTTP(S) URIs. Top level Ranges are [embedded][prezi30-terminology] or externally [referenced][prezi30-terminology] within the Manifest in a `structures` property. These top level Ranges then embed or reference other Ranges, Containers or parts of Containers in the `items` property. Each entry in the `items` property _MUST_ be a JSON object, and it _MUST_ have the `id` and `type` properties. If a top level Range needs to be dereferenced by the client, then it _MUST NOT_ have the `items` property, such that clients are able to recognize that it should be retrieved in order to be processed. @@ -376,7 +369,7 @@ Ranges _MAY_ link to an Annotation Collection that has the content of the Range ##### accompanyingContainer {: #accompanyingContainer} -A single Container that provides additional content for use while rendering the resource that has the `accompanyingContainer` property. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. +A Container that provides additional content for use while the resource that has the `accompanyingContainer` property is shown or played. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. Clients _MAY_ display the content of an accompanying Container when presenting the resource. As with `placeholderContainer` above, when more than one accompanying Container is available, the client _SHOULD_ pick the one most specific to the content. Publishers _SHOULD NOT_ assume that the accompanying Container will be processed by all clients. Clients _SHOULD_ take care to avoid conflicts between time-based media in the accompanying Container and the content of the resource that has the `accompanyingContainer` property. From 61d00e7becd23fbefca37979e88c8db89f7cff8b Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 18 Mar 2025 18:00:57 -0400 Subject: [PATCH 045/192] smoot --- source/presentation/4.0/index.md | 16 +++++++++------- source/presentation/4.0/model.md | 18 +++++++++++++++--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 821810ae7..f178c7657 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1382,22 +1382,24 @@ See above... (move the props to vocab doc) -### spatialScale - -### temporalScale +Continental drift simulation example ``` { + "type": "Scene", + "spatialScale": { - "factor": 22.0, - "units": "m" + "type": "UnitValue", + "value": 22.0, + "unit": "m" }, - // this would be rarely used "temporalScale": { - "factor": 0.00001 + "type": "UnitValue", + "value": 0.00001, + "unit": "s" } } diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 3f34143a2..071e45510 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -216,6 +216,10 @@ The Web Annotation Data Model defines several Selectors, which describe how to f There are common use cases in which a point, rather than a range or area, is the target of the Annotation. For example, putting a pin in a map should result in an exact point, not a very small rectangle. Points in time are not very short durations, and user interfaces should also treat these differently. This is particularly important when zooming in (either spatially or temporally) beyond the scale of the frame of reference. + +* FIXME: either supply instant, or all applicable dimensions for the source + + Point Selectors have the following properties: | Name | Description | @@ -225,7 +229,7 @@ Point Selectors have the following properties: | x | A number (floating point or integer) giving the x coordinate of the point, relative to the dimensions of the source resource | | y | A number (floating point or integer) giving the y coordinate of the point, relative to the dimensions of the source resource | | z | A number (floating point) giving the z coordinate of the point, relative to the dimensions of the source resource | -| t | A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource | +| instant | A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource | ```json @@ -235,7 +239,7 @@ Point Selectors have the following properties: "x": 0.001, "y": 12.3, "z": 0, - "t": 180.0 + "instant": 180.0 } ``` @@ -325,6 +329,8 @@ Animation Selectors have the following properties: #### ImageApiSelector +FIXME: write this + @@ -359,7 +365,7 @@ Ranges _MAY_ link to an Annotation Collection that has the content of the Range ### Other Classes #### Agent #### Service -#### Value +#### UnitValue @@ -1502,6 +1508,12 @@ The value _MUST_ be a string. { "type": "Image" } ``` +##### unit + +FIXME: possible values are 'm' and 's' and 'relative' and not 'smoot' + + + ##### viewingDirection {: #viewingDirection} From eb6de24378ed0904769a1a26dd6b929b6fa4f307 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 19 Mar 2025 08:27:53 -0400 Subject: [PATCH 046/192] Re-calibrate markdown ## headings --- source/presentation/4.0/index.md | 61 +++++++++++++++----------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index f178c7657..3470886c0 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -466,14 +466,9 @@ Todo add example -## Scene-Specific Resources +#### Scene-Specific Resources -### 3D considerations / principles - -"models" (content resources in 3D) -"local coordinate spaces" - -### Camera +##### Camera A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. @@ -511,7 +506,7 @@ The first Camera defined and not hidden in a Scene is the default Camera used to -### Light +##### Light One or more Lights MUST be present within the Scene in order to have objects within it be visible to the Cameras. @@ -547,7 +542,7 @@ If there are no Lights present within the Scene, then the viewer MUST add at lea -### Transforms +#### Transforms The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. @@ -634,7 +629,7 @@ Painting a Scene into another while excluding import of several types of resourc -### Nesting +#### Nesting A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. @@ -693,16 +688,16 @@ Comments, tags, etc transcripts (and back ref to OCR on images etc) -### Comment Annotations +#### Comment Annotations -### Choice of Alternative Resources +#### Choice of Alternative Resources Multispectral here -### Embedded Content +#### Embedded Content e.g., painting TextualBody on Canvas @@ -713,20 +708,20 @@ It is important to be able to position the textual body of an annotation within -### Non Rectangular Segments +#### Non Rectangular Segments SvgSelector - move to SpecificResource too ^^ -### Style +#### Style Move to SpecificResource -### Rotation +#### Rotation -### Hotspot Linking and Activation +#### Hotspot Linking and Activation Move to SpecificResource @@ -826,7 +821,7 @@ partOf - ## State -## Content State +### Content State A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: @@ -940,14 +935,14 @@ Annotations with the motivation `contentState` are referred to as _content state Content States are used for the following applications: -### Load a particular view of a resource or group of resources +#### Load a particular view of a resource or group of resources In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the [Content State Protocol API 2.0](content-state-2) specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. -### Load a particular view of some resource and modify it +#### Load a particular view of some resource and modify it In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: @@ -991,7 +986,7 @@ TODO: what is the processing algorithm for applying incoming `hidden` ? When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. -### Modify the Container in a particular context +#### Modify the Container in a particular context The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. @@ -1165,13 +1160,13 @@ Use of `scope` is permitted in annotations on any Container type, not just Scene While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. -### Content States on Manifests +#### Content States on Manifests When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. // Is there some overlap here with Range? -### Processing Content States in Scopes: reset +#### Processing Content States in Scopes: reset // This may not be what we have discussed... @@ -1191,17 +1186,17 @@ Before applying the content state to the Scene, the client should reset the Scen // I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... -### Contribute additional information permanently +#### Contribute additional information permanently Rerum inbox scenario - should be covered in CS2 protocol -### activating - animation and interactions +#### activating - animation and interactions Annotations with the motivation `activating` are referred to as _activating_ annotations. There are two uses of `activating` annotations: -#### Triggering a content state +##### Triggering a content state An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. @@ -1275,7 +1270,7 @@ The activating annotation is provided in a Container's `annotations` property. I -#### Triggering a named animation in a model +##### Triggering a named animation in a model Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. @@ -1363,7 +1358,7 @@ if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody There is a more general rule here! -### reset +#### reset See above... @@ -1422,15 +1417,15 @@ For a timeline it's the ratio of time in the recording to time in the real world -## HTTP Requests and Responses +### HTTP Requests and Responses -### URI Recommendations +#### URI Recommendations -### Requests +#### Requests -### Responses +#### Responses -### Authentication +#### Authentication From dca504005f46f86fd7b33301d890e60f10dcfb12 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 19 Mar 2025 08:53:06 -0400 Subject: [PATCH 047/192] Remove link to Content State 2 --- source/presentation/4.0/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 3470886c0..3cfd7a6e8 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -939,7 +939,7 @@ Content States are used for the following applications: In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. -The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the [Content State Protocol API 2.0](content-state-2) specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. +The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the Content State Protocol API 2.0 specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. #### Load a particular view of some resource and modify it From 1d50ea8cac71827b2398a9ed8410bde68f8f9bc8 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 09:22:34 -0400 Subject: [PATCH 048/192] test blocks --- source/presentation/4.0/model.md | 248 +++++++++++++++++-------------- 1 file changed, 135 insertions(+), 113 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 071e45510..6f45ef149 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -70,6 +70,110 @@ The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _S + + +## JSON Considerations + +This section describes features applicable to all of the Presentation API content. + +### Case Sensitivity + +Keys in JSON objects are [case sensitive][org-w3c-json-ld-case]. The cases of properties and enumerated values in IIIF Presentation API responses _MUST_ match those used in this specification. For example to specify that a resource is a Manifest, the property _MUST_ be given as `type` and not `Type` or `tYpE`, and the value _MUST_ be given as `Manifest` and not `manifest` or `manIfEsT`. + +### Properties with Multiple Values + +Any of the properties in the API that can have multiple values _MUST_ always be given as an array of values, even if there is only a single item in that array. + +{% include api/code_header.html %} +``` json-doc +{ + "thumbnail": [ + { + "id": "https://example.org/images/thumb1.jpg", + "type": "Image", + "format": "image/jpeg" + } + ] +} +``` + +### Language of Property Values +{: #language-of-property-values} + +Language _SHOULD_ be associated with strings that are intended to be displayed to the user for the `label` and `summary` properties, plus the `label` and `value` properties of the `metadata` and `requiredStatement` objects. + +The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. + +{% include api/code_header.html %} +``` json-doc +{ + "label": { + "en": [ + "Whistler's Mother", + "Arrangement in Grey and Black No. 1: The Artist's Mother" + ], + "fr": [ + "Arrangement en gris et noir no 1", + "Portrait de la mère de l'artiste", + "La Mère de Whistler" + ], + "none": [ "Whistler (1871)" ] + } +} +``` + +Note that [BCP 47][org-bcp-47] allows the script of the text to be included after a hyphen, such as `ar-latn`, and clients should be aware of this possibility. + +In the case where multiple values are supplied, clients _MUST_ use the following algorithm to determine which values to display to the user. + +* If all of the values are associated with the `none` key, the client _MUST_ display all of those values. +* Else, the client should try to determine the user's language preferences, or failing that use some default language preferences. Then: + * If any of the values have a language associated with them, the client _MUST_ display all of the values associated with the language that best matches the language preference. + * If all of the values have a language associated with them, and none match the language preference, the client _MUST_ select a language and display all of the values associated with that language. + * If some of the values have a language associated with them, but none match the language preference, the client _MUST_ display all of the values that do not have a language associated with them. + +Note that this does not apply to [embedded][prezi30-terminology] textual bodies in Annotations, which use the Web Annotation pattern of `value` and `language` as separate properties. + +### HTML Markup in Property Values + +Minimal HTML markup _MAY_ be included for processing in the `summary` property and the `value` property in the `metadata` and `requiredStatement` objects. It _MUST NOT_ be used in `label` or other properties. This is included to allow content publishers to add links and simple formatting instructions to blocks of text. The content _MUST_ be well-formed XML and therefore _MUST_ be wrapped in an element such as `p` or `span`. There _MUST NOT_ be whitespace on either side of the HTML string, and thus the first character in the string _MUST_ be a '<' character and the last character _MUST_ be '>', allowing a consuming application to test whether the value is HTML or plain text using these. To avoid a non-HTML string matching this, it is _RECOMMENDED_ that an additional whitespace character be added to the end of the value in situations where plain text happens to start and end this way. + +In order to avoid HTML or script injection attacks, clients _MUST_ remove: + + * Tags such as `script`, `style`, `object`, `form`, `input` and similar. + * All attributes other than `href` on the `a` tag, `src` and `alt` on the `img` tag. + * All `href` attributes that start with the strings other than "http:", "https:", and "mailto:". + * CData sections. + * XML Comments. + * Processing instructions. + +Clients _SHOULD_ allow only `a`, `b`, `br`, `i`, `img`, `p`, `small`, `span`, `sub` and `sup` tags. Clients _MAY_ choose to remove any and all tags, therefore it _SHOULD NOT_ be assumed that the formatting will always be rendered. Note that publishers _MAY_ include arbitrary HTML content for processing using customized or experimental applications, and the requirements for clients assume an untrusted or unknown publisher. + +{% include api/code_header.html %} +``` json-doc +{ "summary": { "en": [ "

Short summary of the resource.

" ] } } +``` + +### JSON Description Availability + +JSON descriptions _SHOULD_ be [embedded][prezi30-terminology] within the JSON of parent resources, and _MAY_ also be available via separate requests from the HTTP(S) URI given in the resource's `id` property. Links to Content Resources _MUST_ be given as a JSON object with the `id` and `type` properties and _SHOULD_ have `format` or `profile` to give a hint as to what sort of resource is being referred to. + +{% include api/code_header.html %} +``` json-doc +{ + "rendering": [ + { + "id": "https://example.org/content/book.pdf", + "type": "Text", + "label": { "en": [ "Example Book (pdf)" ] }, + "format": "application/pdf" + } + ] +} +``` + + + ## Classes The following sub-sections define the classes used in the IIIF Presentation Data Model. The properties and relationships of the classes are defined in the following section, including which classes they are able to be used with. Only the semantics and core structural requirements are defined within this section, along with any deviations from other specifications that the classes might be drawn from. @@ -108,7 +212,12 @@ Collection Pages follow the ActivityStreams model, as also used in Annotation Co A Manifest is the primary unit of distribution of IIIF and provides a description of the structure and properties of a single item to be presented to the user. +Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. +The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. + + +!!! Properties A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items) A Manfiest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail) @@ -116,11 +225,6 @@ A Manfiest _SHOULD_ have the following properties: [metadata](#metadata), [summa A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). -Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. - -The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. - - ### Container Classes {: #containers} @@ -1510,7 +1614,21 @@ The value _MUST_ be a string. ##### unit -FIXME: possible values are 'm' and 's' and 'relative' and not 'smoot' +FIXME: possible values are 'm' and 's' and 'relative' + + +##### value + + +metadata: + +{label: value: {"en": ["foo"]}} + +UnitValue + +unit: value: 0.1234123 + +FIXME: use scoped context for UnitValue to change the meaning of `value` @@ -1602,112 +1720,9 @@ Additional motivations may be added to the Annotation to further clarify the int +## JSON-LD and Extensions - - - - -## 4. JSON-LD Considerations - -This section describes features applicable to all of the Presentation API content. For the most part, these are features of the JSON-LD specification that have particular uses within the API. - -### 4.1. Case Sensitivity - -Terms in JSON-LD are [case sensitive][org-w3c-json-ld-case]. The cases of properties and enumerated values in IIIF Presentation API responses _MUST_ match those used in this specification. For example to specify that a resource is a Manifest, the property _MUST_ be given as `type` and not `Type` or `tYpE`, and the value _MUST_ be given as `Manifest` and not `manifest` or `manIfEsT`. - -### 4.2. Resource Representations - -Resource descriptions _SHOULD_ be [embedded][prezi30-terminology] within the JSON description of parent resources, and _MAY_ also be available via separate requests from the HTTP(S) URI given in the resource's `id` property. Links to resources _MUST_ be given as a JSON object with the `id` and `type` properties and _SHOULD_ have `format` or `profile` to give a hint as to what sort of resource is being referred to. - -{% include api/code_header.html %} -``` json-doc -{ - "rendering": [ - { - "id": "https://example.org/content/book.pdf", - "type": "Text", - "label": { "en": [ "Example Book (pdf)" ] }, - "format": "application/pdf" - } - ] -} -``` - -### 4.3. Properties with Multiple Values - -Any of the properties in the API that can have multiple values _MUST_ always be given as an array of values, even if there is only a single item in that array. - -{% include api/code_header.html %} -``` json-doc -{ - "thumbnail": [ - { - "id": "https://example.org/images/thumb1.jpg", - "type": "Image", - "format": "image/jpeg" - } - ] -} -``` - -### 4.4. Language of Property Values -{: #language-of-property-values} - -Language _MAY_ be associated with strings that are intended to be displayed to the user for the `label` and `summary` properties, plus the `label` and `value` properties of the `metadata` and `requiredStatement` objects. - -The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. - -{% include api/code_header.html %} -``` json-doc -{ - "label": { - "en": [ - "Whistler's Mother", - "Arrangement in Grey and Black No. 1: The Artist's Mother" - ], - "fr": [ - "Arrangement en gris et noir no 1", - "Portrait de la mère de l'artiste", - "La Mère de Whistler" - ], - "none": [ "Whistler (1871)" ] - } -} -``` - -Note that [BCP 47][org-bcp-47] allows the script of the text to be included after a hyphen, such as `ar-latn`, and clients should be aware of this possibility. - -In the case where multiple values are supplied, clients _MUST_ use the following algorithm to determine which values to display to the user. - -* If all of the values are associated with the `none` key, the client _MUST_ display all of those values. -* Else, the client should try to determine the user's language preferences, or failing that use some default language preferences. Then: - * If any of the values have a language associated with them, the client _MUST_ display all of the values associated with the language that best matches the language preference. - * If all of the values have a language associated with them, and none match the language preference, the client _MUST_ select a language and display all of the values associated with that language. - * If some of the values have a language associated with them, but none match the language preference, the client _MUST_ display all of the values that do not have a language associated with them. - -Note that this does not apply to [embedded][prezi30-terminology] textual bodies in Annotations, which use the Web Annotation pattern of `value` and `language` as separate properties. - -### 4.5. HTML Markup in Property Values - -Minimal HTML markup _MAY_ be included for processing in the `summary` property and the `value` property in the `metadata` and `requiredStatement` objects. It _MUST NOT_ be used in `label` or other properties. This is included to allow content publishers to add links and simple formatting instructions to blocks of text. The content _MUST_ be well-formed XML and therefore _MUST_ be wrapped in an element such as `p` or `span`. There _MUST NOT_ be whitespace on either side of the HTML string, and thus the first character in the string _MUST_ be a '<' character and the last character _MUST_ be '>', allowing a consuming application to test whether the value is HTML or plain text using these. To avoid a non-HTML string matching this, it is _RECOMMENDED_ that an additional whitespace character be added to the end of the value in situations where plain text happens to start and end this way. - -In order to avoid HTML or script injection attacks, clients _MUST_ remove: - - * Tags such as `script`, `style`, `object`, `form`, `input` and similar. - * All attributes other than `href` on the `a` tag, `src` and `alt` on the `img` tag. - * All `href` attributes that start with the strings other than "http:", "https:", and "mailto:". - * CData sections. - * XML Comments. - * Processing instructions. - -Clients _SHOULD_ allow only `a`, `b`, `br`, `i`, `img`, `p`, `small`, `span`, `sub` and `sup` tags. Clients _MAY_ choose to remove any and all tags, therefore it _SHOULD NOT_ be assumed that the formatting will always be rendered. Note that publishers _MAY_ include arbitrary HTML content for processing using customized or experimental applications, and the requirements for clients assume an untrusted or unknown publisher. - -{% include api/code_header.html %} -``` json-doc -{ "summary": { "en": [ "

Short summary of the resource.

" ] } } -``` - -### 4.6. Linked Data Context and Extensions +### JSON-LD Contexts and Extensions The top level resource in the response _MUST_ have the `@context` property, and it _SHOULD_ appear as the very first key/value pair of the JSON representation. This tells Linked Data processors how to interpret the document. The IIIF Presentation API context, below, _MUST_ occur once per response in the top-most resource, and thus _MUST NOT_ appear within [embedded][prezi30-terminology] resources. For example, when embedding a Canvas within a Manifest, the Canvas will not have the `@context` property. @@ -1734,7 +1749,7 @@ Any additional properties beyond those defined in this specification or the Web The JSON representation _MUST NOT_ include the `@graph` key at the top level. This key might be created when serializing directly from RDF data using the JSON-LD 1.0 compaction algorithm. Instead, JSON-LD framing and/or custom code should be used to ensure the structure of the document is as defined by this specification. -### 4.7. Term Collisions between Contexts +### Term Collisions between Contexts There are some common terms used in more than one JSON-LD context document. Every attempt has been made to minimize these collisions, but some are inevitable. In order to know which specification is in effect at any given point, the class of the resource that has the property is the primary governing factor. Thus properties on Annotation based resources use the context from the [Web Annotation Data Model][org-w3c-webanno], whereas properties on classes defined by this specification use the IIIF Presentation API context's definition. @@ -1750,7 +1765,14 @@ The following properties are defined by both, and the IIIF representation is mor The `rights`, `partOf`, and `items` properties are defined by both in the same way. -### 4.8. Keyword Mappings +### Keyword Mappings The JSON-LD keywords `@id`, `@type` and `@none` are mapped to `id`, `type` and `none` by the Presentation API [linked data context][prezi30-ldce]. Thus in content conforming to this version of the Presentation API, the only JSON key beginning with `@` will be `@context`. However, the content may include data conforming to older specifications or external specifications that use keywords beginning with `@`. Clients should expect to encounter both syntaxes. +### Registries of Values + +FIXME: Describe the registries + + + + From 3600f9f97e29e527412a15706b47e128d0ed298a Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 10:24:27 -0400 Subject: [PATCH 049/192] testing class --- source/presentation/4.0/index.md | 67 ++++++++++++++----- source/presentation/4.0/model.md | 110 +++++++++++++++++++++++++------ 2 files changed, 141 insertions(+), 36 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 3cfd7a6e8..f17d41878 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -69,14 +69,6 @@ Presentation, the clue is in the name 9. Manuscript (integration) - -1. Digitized books and manuscripts (images, paged things, transcripts, translations) -2. Artworks and Maps (navPlace, maybe commenting annos) -3. Audio and Video recordings (time-based, transcriptions) -4. 3D scans of objects (3D) -5. Periodicals (Collections, Ranges, navDate) -6. Storytelling and exhibitions (State, annotations) - see Terminology at the end Mention model.md @@ -84,6 +76,8 @@ Mention model.md Mention cookbook +Consider diagrams + ## Foundations @@ -272,17 +266,59 @@ Sometimes, two different formats derived from the same source may have slightly ### 3D -Need to get PointSelector in early +3D Content Resources are painted into Scenes. + +Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. + +The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). + + +#### Example: Static 3D Model of a Spacesuit + + +This example is a Manifest with a single Scene, with a single model of a space suit painted at the Scene's origin. + + + + +The model also has its own local coordinate space, which may be scaled differently from the Scene's coordinate space. + +Unlike when you paint a resource into a Canvas where it fills the space, instead targeting the Scene is equivalent to having a point selector that targets the origin. + + + + +```jsonc + +manifest + scene + annotationpage + annotation + model +``` + + +model +light Ambient color +camera (put it in the right place looking -Z) near, far, fieldOfView, lookAt (note that Orthographic w/ viewHeight possible) +backgroundColor: #000 +point selector for positioning + + +#### Example: 3D Model of a Chessboard + +Chessboard is a Canvas with image +more than one model +transforms for scale and rotation +Scene in Scene +Exclude +interactionMode + -Example 3D 1 -Example 3D 2 -backgroundColor, exclude, color, intensity, far, fieldOfView, near, viewHeight, interactionMode, lookAt -Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. -The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). @@ -491,7 +527,6 @@ If any of these properties are not specified explicitly, they default to the cho drawing of a geometrical frustrum truncated by near and far distances - The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. ```json @@ -508,8 +543,6 @@ The first Camera defined and not hidden in a Scene is the default Camera used to ##### Light -One or more Lights MUST be present within the Scene in order to have objects within it be visible to the Cameras. - This specification defines four types of Light: | Class | Description | diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 6f45ef149..d89f29aad 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -70,8 +70,6 @@ The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _S - - ## JSON Considerations This section describes features applicable to all of the Presentation API content. @@ -178,9 +176,16 @@ JSON descriptions _SHOULD_ be [embedded][prezi30-terminology] within the JSON of The following sub-sections define the classes used in the IIIF Presentation Data Model. The properties and relationships of the classes are defined in the following section, including which classes they are able to be used with. Only the semantics and core structural requirements are defined within this section, along with any deviations from other specifications that the classes might be drawn from. -The descriptions also do not define how the classes are used, which is done in the Presentation API Processing Model. +Each class has a + +The descriptions also do not define how the classes are used, which is done in the Presentation API Overview. + + ### Collection +{: #Collection} + +`"type": "Collection"` A Collection is an ordered list of Manifests, and/or Collections. @@ -199,7 +204,10 @@ Collections with an empty `items` property are allowed but discouraged. For exa Collections or Manifests [referenced][prezi30-terminology] in the `items` property _MUST_ have the `id`, `type` and `label` properties. They _SHOULD_ have the `thumbnail` property. -#### CollectionPage +#### Collection Page +{: #CollectionPage} + +Class: `CollectionPage` A Collection Page is an arbitrary division of members within the Collection to make it easier to consume. @@ -214,6 +222,8 @@ A Manifest is the primary unit of distribution of IIIF and provides a descriptio Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. +The `type` property of a Manifest _MUST_ have the value `"Manifest"`. + The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. @@ -242,9 +252,17 @@ A Timeline is a Container that represents only a temporal duration, measured in A Canvas is a Container that represents a particular rectangular 2 dimensional view of the object and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as the 2 dimensional space. +FIXME: arbitrary units + #### Scene -A Scene is a Container that represents an infinitely large three-dimensional space, with an optional duration. As the Scene is infinite, it does not have `height`, `width` or `depth` properties. +A Scene is a Container that represents an infinitely large three-dimensional space, with an optional `duration` property. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. From a perspective looking along the z axis towards negative infinity, the positive y axis points upwards and the positive x axis points to the right (a [right-handed Cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). + +diagram of Right handed cartesian coordinate system + +The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement, unless `spatialScale` is supplied. + + ### Annotation Classes {: #annotations} @@ -264,7 +282,7 @@ Content that is to be rendered as part of the Container _MUST_ be associated by Note that the Web Annotation data model defines different patterns for the `value` property compared to IIIF, when used within an Annotation. The `value` of a Textual Body or a Fragment Selector, for example, are strings rather than JSON objects with languages and values. Care must be taken to use the correct string form in these cases. -#### AnnotationCollection +#### Annotation Collection Annotation Collections allow groups of Annotations to be recorded. For example, all of the English translation Annotations of a medieval French document could be kept separate from the transcription or an edition in modern French, or the director's commentary on a film can be separated from the script. @@ -273,7 +291,7 @@ Annotation Collections _MUST_ have a URI, and it _SHOULD_ be an HTTP(S) URI. The Annotation Collections are paged rather than enumerated. The first page of items is linked using the `first` property, and the last page with the `last` property. The pages link to the next and previous pages in a chain, using the `next` and `prev` properties respectively. -#### AnnotationPage +#### Annotation Page An ordered list of Annotations, typically associated with a Container, but may be referenced from other types of resource as well. Annotation Pages enumerate and order lists of Annotations, in the same way that Collection Pages order lists of Manifests and Collections within the containing Collection. @@ -286,11 +304,11 @@ The definition of `label` in the Web Annotation specification does not produce J {: .warning} -#### SpecificResource +#### Specific Resource A Specific Resource is a resource in the context of an Annotation. They are used to record further properties or relationships needed to understand the particular contextual use, such as which part of the resource is used or how it should be rendered. In IIIF, the Specific Resource model from the Web Annotation Data Model has some additional properties beyond those defined by the W3C, such as `transform`. -#### TextualBody +#### Textual Body A Textual Body is an embedded resource within an Annotation that carries, as the name suggests, a text as the body of the Annotation. It is defined by the Web Annotation Data Model, and this specification defines a new property for `position` that allows it to be positioned within a Container. @@ -298,6 +316,7 @@ A Textual Body is an embedded resource within an Annotation that carries, as the A Choice is a Web Annotation construction that allows one entry from a list to be selected for processing or display. This specification allows `behavior` to be added to a Choice to influence how it is processed. + ### Content Resources Content resources are resources on the Web such as images, audio, video, or text which can be associated with a Container via an Annotation, or provide a representation of any resource. @@ -316,7 +335,7 @@ Containers _MAY_ be treated as content resources for the purposes of annotating The Web Annotation Data Model defines several Selectors, which describe how to find a specific segment of that resource to be used. As noted, the nature of Selectors are dependent on the type of resources that they select out of, and the methods needed for those descriptions will vary. The Selectors from the Web Annotation Data Model and other sources can be used within the IIIF Data Model. This specification defines additional Selector classes for use. -#### PointSelector +#### Point Selector There are common use cases in which a point, rather than a range or area, is the target of the Annotation. For example, putting a pin in a map should result in an exact point, not a very small rectangle. Points in time are not very short durations, and user interfaces should also treat these differently. This is particularly important when zooming in (either spatially or temporally) beyond the scale of the frame of reference. @@ -330,9 +349,7 @@ Point Selectors have the following properties: |------|-------------| | id | The HTTP(S) URI of the selector | | type | The class of the selector, which must be "PointSelector" | -| x | A number (floating point or integer) giving the x coordinate of the point, relative to the dimensions of the source resource | -| y | A number (floating point or integer) giving the y coordinate of the point, relative to the dimensions of the source resource | -| z | A number (floating point) giving the z coordinate of the point, relative to the dimensions of the source resource | + | instant | A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource | @@ -348,7 +365,7 @@ Point Selectors have the following properties: ``` -#### WktSelector +#### WKT Selector Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MultiPolygon. Additional types, such as CIRCULARSTRING may also be supported. @@ -371,7 +388,7 @@ WKT Selectors have the following properties: -#### AudioContentSelector +#### Audio Content Selector Video content resources consist of both visual and audio content within the same bit-level representation. There are situations when it is useful to refer to only one aspect of the content – either the visual or the audio, but not both. For example, an Annotation might associate only the visual content of a video that has spoken English in the audio, and an audio file that has the translation of that content in Spanish. The Audio Content Selector selects all of the audio content from an A/V content resource, and may be further refined with subsequent selectors to select a segment of it. @@ -391,7 +408,7 @@ Audio Content Selectors have the following properties: ``` -#### VisualContentSelector +#### Visual Content Selector Similar to Audio Content Selectors, Visual Content Selectors select the visual aspects of the content of an A/V content resource. They may be further refined by subsequent selectors that select an area or temporal segment of it. @@ -410,7 +427,7 @@ Visual Content Selectors have the following properties: ``` -#### AnimationSelector +#### Animation Selector More interactive content resources, such as 3d models, may have activatable animations or similar features. For example, a model of a box might have an animation that opens the lid and a second animation that closes the lid. In order to activate those animations, they need to be selectable, and thus the specification defines an Animation Selector. @@ -448,25 +465,74 @@ The included Containers and parts of Containers need not be contiguous or in the Ranges _MAY_ link to an Annotation Collection that has the content of the Range using the `supplementary` property. The [referenced][prezi30-terminology] Annotation Collection will contain Annotations that target the Containers within the Range and link content resources to those Containers. + ### Scene Components #### Cameras + +A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. + ##### PerspectiveCamera + +`PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller + +!!! Properties +... + + +```json +{ + "id": "https://example.org/iiif/camera/1", + "type": "PerspectiveCamera", + "near": 1.0, + "far": 100.0, + "fieldOfView": 45.0 +} +``` + + ##### OrthographicCamera +`OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera + + + + + + + + #### Lights + + ##### AmbientLight + +AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. + + ##### DirectionalLight + +DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. + + ##### PointLight + + PointLight emits from a single point within the scene in all directions. + ##### SpotLight +SpotLight emits a cone of light from a single point in a given direction. + + + + #### Transforms ##### TranslateTransform ##### RotateTransform ##### ScaleTransform -### Other Classes +### Utility Classes #### Agent #### Service #### UnitValue @@ -1684,16 +1750,22 @@ The value _MUST_ be a positive integer. ``` json-doc { "width": 1200 } ``` + ##### x {: #x} +A number (floating point or integer) giving the x coordinate of the point, relative to the dimensions of the source resource + + ##### y {: #y} +A number (floating point or integer) giving the y coordinate of the point, relative to the dimensions of the source resource + ##### z {: #z} - +A number (floating point) giving the z coordinate of the point, relative to the dimensions of the source resource From b83852b726896e3bcf51e90c57d55d7c40b9b12b Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 10:57:57 -0400 Subject: [PATCH 050/192] model stuff --- source/presentation/4.0/index.md | 28 +++++++---- source/presentation/4.0/model.md | 82 +++++++++++++++++++++----------- 2 files changed, 73 insertions(+), 37 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index f17d41878..7dff58071 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -318,12 +318,9 @@ interactionMode +This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). -The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement. This allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). - -diagram of Right handed cartesian coordinate system - ``` ``` @@ -490,9 +487,6 @@ Example Annotation that positions a model at a point within a Scene: Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. -
-❓Does WKTSelector have a duration/instant property? -
Example Annotation that comments on a 3D polygon within a Scene: @@ -501,6 +495,9 @@ Todo add example ``` +### Give example of refinedBy ? e.g. WktSelector + Instant + + #### Scene-Specific Resources @@ -515,7 +512,10 @@ This specification defines two types of Camera: | `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | | `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | -Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. The camera's up direction by default points along the y axis towards positive infinity, but this may be modified by transforms. +Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. + +If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. + The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. @@ -558,7 +558,11 @@ SpotLight has an additional property of `angle`, specified in degrees, which is diagram of cone geometry showing how the angle of the cone is defined -Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). If a Light does not have an explicit position in the coordinate space, then the default is at the origin. +Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. + + + If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). + If a Light does not have an explicit position in the coordinate space, then the default is at the origin. This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. @@ -1211,10 +1215,14 @@ The client should reset the Container to its original state before applying the { "type": "Annotation", "motivation": ["contentState"], - "reset": true + "behavior": ["reset"] } ``` +behavior: `linear-nav` -- cannot jump around only one step forward/back + + + Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. // I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index d89f29aad..e4ab3db8d 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -174,13 +174,9 @@ JSON descriptions _SHOULD_ be [embedded][prezi30-terminology] within the JSON of ## Classes -The following sub-sections define the classes used in the IIIF Presentation Data Model. The properties and relationships of the classes are defined in the following section, including which classes they are able to be used with. Only the semantics and core structural requirements are defined within this section, along with any deviations from other specifications that the classes might be drawn from. - -Each class has a - -The descriptions also do not define how the classes are used, which is done in the Presentation API Overview. - +The following sub-sections define the classes used in the IIIF Presentation Data Model. Only the semantics and core structural requirements are defined within this section, along with any deviations from other specifications that the classes might be drawn from. The descriptions do not define how the classes are used together, which is done in the Presentation API Overview. +The name of each class is given at the top of its definition below. The exact string _MUST_ be used as the value of `type` in the JSON for the class. ### Collection {: #Collection} @@ -337,20 +333,13 @@ The Web Annotation Data Model defines several Selectors, which describe how to f #### Point Selector +`"type": "PointSelector"` + There are common use cases in which a point, rather than a range or area, is the target of the Annotation. For example, putting a pin in a map should result in an exact point, not a very small rectangle. Points in time are not very short durations, and user interfaces should also treat these differently. This is particularly important when zooming in (either spatially or temporally) beyond the scale of the frame of reference. * FIXME: either supply instant, or all applicable dimensions for the source - - -Point Selectors have the following properties: - -| Name | Description | -|------|-------------| -| id | The HTTP(S) URI of the selector | -| type | The class of the selector, which must be "PointSelector" | - -| instant | A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource | + list properties here like manifest ```json @@ -472,6 +461,16 @@ Ranges _MAY_ link to an Annotation Collection that has the content of the Range A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. +FIXME: If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. + +The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, (PERSPECTIVE) and a vertical projection angle that provides the top and bottom planes of the region. (viewHeight?) + + +##### OrthographicCamera + +`OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera + + ##### PerspectiveCamera `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller @@ -491,9 +490,7 @@ A Camera provides a view of a region of the Scene's space from a particular posi ``` -##### OrthographicCamera -`OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera @@ -505,32 +502,50 @@ A Camera provides a view of a region of the Scene's space from a particular posi #### Lights -##### AmbientLight -AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. +##### Ambient Light + +Ambient Lights evenly illuminates all objects in the scene, and does not have a direction or position. -##### DirectionalLight +##### Directional Light -DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. +Directional Lights emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. + If a DirectionalLight does not have an explicit direction, then the default is in the negative y direction (downwards). -##### PointLight - PointLight emits from a single point within the scene in all directions. +##### Point Light -##### SpotLight + Point Lights emits from a single point within the scene in all directions. -SpotLight emits a cone of light from a single point in a given direction. +##### Spot Light +Spot Lights emit a cone of light from a single point in a given direction. + + If a SpotLight does not have an explicit direction, then the default is in the negative y direction (downwards). #### Transforms -##### TranslateTransform + +here are the rules about transforms? + + + ##### RotateTransform + +A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 + + ##### ScaleTransform +A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 + +##### TranslateTransform + +A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 + ### Utility Classes #### Agent @@ -852,6 +867,15 @@ The existence of an HTTP(S) URI in the `id` property does not mean that the URI ``` json-doc { "id": "https://example.org/iiif/1/manifest" } ``` + +##### instant +{: #instant} + +A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource + +FIXME: fix + + ##### intensity {: #intensity} @@ -1649,6 +1673,10 @@ _Summary here_ The value of this property is an array of JSON objects, each of which is a Transform. +Process them in order. + + + ##### type {: #type} From 998ddbd6be61759ba66abf3ac42a1a1466fb508b Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 19 Mar 2025 13:16:44 -0400 Subject: [PATCH 051/192] linear-nav --- source/presentation/4.0/index.md | 66 +++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 7dff58071..a669e93ee 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1205,22 +1205,76 @@ When an annotation with the motivation `contentState` is provided via the `annot #### Processing Content States in Scopes: reset -// This may not be what we have discussed... - When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. -The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `sequence`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. If this behavior is not wanted, the `reset` property of the content state annotation should be set to `true`: +The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `linear-nav`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. This can be overridden for an individual annotation with the behavior `reset`: + +`linear-nav` does not inherit, but `reset` does. `reset` is the default behavior for AnnotationPage and Annotation. ```json { - "type": "Annotation", - "motivation": ["contentState"], - "behavior": ["reset"] + // a story, but we reset the Scene for each content state + "type": "AnnotationPage", + "behavior": ["linear-nav"], + "items": [ + + ] } ``` +```json +{ + // a story, but the application of content-state is cumulative + // what if you go backwards? + // What if other content states have been applied before you start the story? + // **** Is linear-nav implicitly reset on the first anno? + // Should all anno pages reset the Scene - no because I might send you a view with a content state + "type": "AnnotationPage", + "behavior": ["linear-nav", "no-reset"], // no-reset is a behavior for the annos not the page + "items": [ + + ] +} +``` + +```jsonc +[ + { + "id": "https://.../step-1", + "type": "Annotation", + "motivation": ["contentState"] + // if you really want to ensure that any ad-hoc applied content states are wiped out, + // then put an explicit reset here. But usually, we can start the nav by applying + // the content state in the scope to the Scene without worrying that someone has + // modified the Scene already. + }, + // .... + + + { + "id": "https://.../step-20", + "type": "Annotation", + "motivation": ["contentState"] + // inherit no-reset + }, + + + { + // However, this particular step (step 37) needs to reset the Scene to the initial state. + "id": "https://.../step-37", + "type": "Annotation", + "motivation": ["contentState"], + "behavior": ["reset"] + } +] +``` + behavior: `linear-nav` -- cannot jump around only one step forward/back +client _MUST_ support forward nav and _MAY_ support backward nav + +If you go backwards from step n in a linear-nav, **and** you have applied one or more content states during the linear-nav, the client _MAY_ reset the whole Scene to default condition and then replay the linear-nav up to step n-1. (client doesn't have to maintain infinite undo history) + Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. From 17fb09ceadd432e6c8262fa19057184af520a6cc Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 14:25:51 -0400 Subject: [PATCH 052/192] Audio --- source/presentation/4.0/index.md | 21 ++++++-- source/presentation/4.0/model.md | 87 +++++++++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index a669e93ee..fc8fb49a0 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -278,9 +278,6 @@ The positive y axis points upwards, the positive x axis points to the right, and This example is a Manifest with a single Scene, with a single model of a space suit painted at the Scene's origin. - - - The model also has its own local coordinate space, which may be scaled differently from the Scene's coordinate space. Unlike when you paint a resource into a Canvas where it fills the space, instead targeting the Scene is equivalent to having a point selector that targets the origin. @@ -318,6 +315,8 @@ interactionMode + + This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). @@ -450,6 +449,22 @@ It is an error to select a temporal region of a Scene that does not have a `dura An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. +Audio and 3D + + +AmbientAudio (everywhere) +PointAudio (sphere) +SpotAudio (cone) + + source: Audio (id, type, format, profile, duration, label) + volume: UnitValue (value: 0.3, unit: relative) + angle: degrees of the cone, per SpotLight + +Ambient and Point can be painted on to Canvas +hidden on audio = inaudible + + + All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index e4ab3db8d..6d54613bd 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -240,6 +240,11 @@ All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. Th Containers _MUST_ have an `items` property which is a list of Annotation Pages. Each Annotation Page, defined below, maintains a list of Annotations, which associate Content Resources to be rendered as part of the Container. Annotations that do not associate content to be rendered, but instead are about the Container such as a comment or tag, are recorded using Annotation Pages in the `annotations` property of the Container. +FIXME: It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. + + + + #### Timeline A Timeline is a Container that represents only a temporal duration, measured in seconds. Timelines allow audio content to be presented, but do not allow anything with a height or width like an image or video. The duration of the Timeline is given in the `duration` property. @@ -258,6 +263,10 @@ A Scene is a Container that represents an infinitely large three-dimensional spa The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement, unless `spatialScale` is supplied. +All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. + + + ### Annotation Classes @@ -327,6 +336,13 @@ If there is a need to distinguish between content resources, then the resource _ Containers _MAY_ be treated as content resources for the purposes of annotating on to other Containers. In this situation, the Container _MAY_ be [embedded][prezi30-terminology] within the Annotation, be a reference within the same Manifest, or require dereferencing to obtain its description. + +### Audio Content + + + + + ### Selectors The Web Annotation Data Model defines several Selectors, which describe how to find a specific segment of that resource to be used. As noted, the nature of Selectors are dependent on the type of resources that they select out of, and the methods needed for those descriptions will vary. The Selectors from the Web Annotation Data Model and other sources can be used within the IIIF Data Model. This specification defines additional Selector classes for use. @@ -515,6 +531,10 @@ Directional Lights emits in a specific direction as if it is infinitely far away If a DirectionalLight does not have an explicit direction, then the default is in the negative y direction (downwards). +this is really that the light always has a direction of (-y) and is rotated from there. So no rotation = "default" direction. + + + ##### Point Light Point Lights emits from a single point within the scene in all directions. @@ -527,6 +547,53 @@ Spot Lights emit a cone of light from a single point in a given direction. +#### Audio in Scenes + +All have `source`, `volume` + +##### Ambient Audio + + +##### Point Audio + + +##### Spot Audio + + +```json + + +"body": +{ + "id": "iiif/my/spotAudio", + "type": "SpotAudio", + "source": { + "id": "/path/to/my.mp3", + "type": "Audio", + "format": "audio/mp3", + "profile": "some profile thing of mp3" + }, + "angle": 45.0 +} +"target": + { + "type": "SpecificResource", + "selector": [{ + "type": "PointSelector" + "x", "y", "z" + }, + "transform": + {"RotateTransform"} + } + + +`angle` + +No default direction, MUST provide a Rotate Transform. + + + + #### Transforms here are the rules about transforms? @@ -746,6 +813,9 @@ The value _MUST_ be a positive floating point number. _Summary here_ +Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. + + _On Annotation, a list of strings drawn from table_ | Value | Description | @@ -1019,12 +1089,20 @@ The value of this property _MUST_ be an array of JSON objects, each of which _MU {: #lookAt} _Summary here_ +It is useful to be able to rotate a light or camera or audio resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. + +If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. + +This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. + The value _MUST_ be a JSON object, conforming to either a reference to an Annotation, or an embedded PointSelector. If this property is not specified, then the default value for cameras is to look straight backwards (-Z) and for lights to point straight down (-Y). * A Camera _MAY_ have the `lookAt` property.
Clients _SHOULD_ process the `lookAt` property on Cameras. * A SpotLight or a DirectionalLight _SHOULD_ have the `lookAt` property.
+* A SpotSound _SHOULD_ have the `lookAt` property. + ```json "lookAt": { @@ -1673,7 +1751,7 @@ _Summary here_ The value of this property is an array of JSON objects, each of which is a Transform. -Process them in order. +Process them in order given. @@ -1693,14 +1771,19 @@ The value _MUST_ be a string. | Class | Description | | ------------- | -------------------------------- | +| `Audio` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | | `Dataset` | Data not intended to be rendered to humans directly, such as a CSV, an RDF serialization or a zip file | | `Image` | Two dimensional visual resources primarily intended to be seen, such as might be rendered with an <img> HTML tag | | `Model` | A three dimensional spatial model intended to be visualized, such as might be rendered with a 3d javascript library | -| `Sound` | Auditory resources primarily intended to be heard, such as might be rendered with an <audio> HTML tag | + | `Text` | Resources primarily intended to be read | | `Video` | Moving images, with or without accompanying audio, such as might be rendered with a <video> HTML tag | {: .api-table #table-type} +!!! note +For compatibility with previous versions, clients _SHOULD_ accept `Sound` as a synonym for `Audio`. + + {% include api/code_header.html %} ``` json-doc { "type": "Image" } From ea1d5aa60607657cfbd3e9dffc2ecdbe67e6047f Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 14:37:16 -0400 Subject: [PATCH 053/192] please build --- source/presentation/4.0/index.md | 17 ++++++----------- source/presentation/4.0/model.md | 29 ++++++++--------------------- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index fc8fb49a0..de0b9a8e2 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -317,6 +317,9 @@ interactionMode + +#### Merge the below into the examples or into model + This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). @@ -709,28 +712,20 @@ Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. +--- +## Annotations and State +### Example: Multi-spectral Images with Comments - - - - - - -Whale bone with a camera and a light - - -## Annotations and State - ### Annotations non-painting diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 6d54613bd..8ff6323d6 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -228,7 +228,7 @@ A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [labe A Manfiest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail) -A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). +A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholdercontainer), [accompanyingContainer](#accompanyingcontainer), [viewingDirection](#viewingdirection), [behavior](#behavior), [seeAlso](#seealso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partof), [start](#start), [structures](#structures), and [annotations](#annotations). ### Container Classes @@ -561,33 +561,17 @@ All have `source`, `volume` ```json - - -"body": { "id": "iiif/my/spotAudio", "type": "SpotAudio", "source": { "id": "/path/to/my.mp3", "type": "Audio", - "format": "audio/mp3", - "profile": "some profile thing of mp3" + "format": "audio/mp3" }, "angle": 45.0 } -"target": - { - "type": "SpecificResource", - "selector": [{ - "type": "PointSelector" - "x", "y", "z" - }, - "transform": - {"RotateTransform"} - } - - -`angle` +``` No default direction, MUST provide a Rotate Transform. @@ -625,7 +609,7 @@ A TranslateTransform moves all of the objects in the local coordinate space the ##### accompanyingContainer -{: #accompanyingContainer} +{: #accompanyingcontainer} A Container that provides additional content for use while the resource that has the `accompanyingContainer` property is shown or played. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. @@ -759,12 +743,15 @@ The value _MUST_ be an array of strings. | | **Collection Behaviors** | | `multi-part` | Valid only on Collections. Collections that have this behavior consist of multiple Manifests or Collections which together form part of a logical whole or a contiguous set, such as multi-volume books or a set of journal issues. Clients might render these Collections as a table of contents rather than with thumbnails, or provide viewing interfaces that can easily advance from one member to the next. Disjoint with `together`.| | `together` | Valid only on Collections. A client _SHOULD_ present all of the child Manifests to the user at once in a separate viewing area with its own controls. Clients _SHOULD_ catch attempts to create too many viewing areas. This behavior _SHOULD NOT_ be interpreted as applying to the members of any child resources. Disjoint with `multi-part`.| -| | **Range Behaviors** | +| | **Navigation Behaviors** | | `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Containers listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| | `thumbnail-nav`{: style="white-space:nowrap;"} | Valid only on Ranges. Ranges that have this behavior _MAY_ be used by the client to present an alternative navigation or overview based on thumbnails, such as regular keyframes along a timeline for a video, or sections of a long scroll. Clients _SHOULD NOT_ use them to generate a conventional table of contents. Child Ranges of a Range with this behavior _MUST_ have a suitable `thumbnail` property. Disjoint with `sequence` and `no-nav`.| | `no-nav` | Valid only on Ranges. Ranges that have this behavior _MUST NOT_ be displayed to the user in a navigation hierarchy. This allows for Ranges to be present that capture unnamed regions with no interesting content, such as the set of blank pages at the beginning of a book, or dead air between parts of a performance, that are still part of the Manifest but do not need to be navigated to directly. Disjoint with `sequence` and `thumbnail-nav`.| +| `linear-nav` | FIXME: ... | | | **Miscellaneous Behaviors** | | `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources, Lights, Cameras and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | +| `reset` | Valid on Annotations with a scope property. FIXME: ... | +| `no-reset` | Valid on Annotations with a scope property. FIXME: ... | {: .api-table #table-behavior} {% include api/code_header.html %} From c764eec3d5e298e885ec5d9c3050dd172aa59413 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 14:41:39 -0400 Subject: [PATCH 054/192] revert case of anchors --- source/presentation/4.0/model.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 8ff6323d6..cd5c1e049 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -223,13 +223,11 @@ The `type` property of a Manifest _MUST_ have the value `"Manifest"`. The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. -!!! Properties -A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items) - -A Manfiest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail) - -A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholdercontainer), [accompanyingContainer](#accompanyingcontainer), [viewingDirection](#viewingdirection), [behavior](#behavior), [seeAlso](#seealso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partof), [start](#start), [structures](#structures), and [annotations](#annotations). - +__Properties__
+A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items)
+A Manifest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail)
+A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). +{: .note} ### Container Classes {: #containers} @@ -609,7 +607,7 @@ A TranslateTransform moves all of the objects in the local coordinate space the ##### accompanyingContainer -{: #accompanyingcontainer} +{: #accompanyingContainer} A Container that provides additional content for use while the resource that has the `accompanyingContainer` property is shown or played. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. From 99fb71e47bff592bf0e7b3dfa7845727ea51959f Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 14:52:39 -0400 Subject: [PATCH 055/192] update --- source/presentation/4.0/model.md | 33 +++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index cd5c1e049..9b40d5770 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -203,7 +203,7 @@ Collections or Manifests [referenced][prezi30-terminology] in the `items` proper #### Collection Page {: #CollectionPage} -Class: `CollectionPage` +`"type": "CollectionPage"` A Collection Page is an arbitrary division of members within the Collection to make it easier to consume. @@ -214,18 +214,18 @@ Collection Pages follow the ActivityStreams model, as also used in Annotation Co ### Manifest +`"type": "Manifest"` + A Manifest is the primary unit of distribution of IIIF and provides a description of the structure and properties of a single item to be presented to the user. Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. -The `type` property of a Manifest _MUST_ have the value `"Manifest"`. - The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. __Properties__
-A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items)
-A Manifest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail)
+A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items)

+A Manifest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail)

A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). {: .note} @@ -827,6 +827,10 @@ The value is a non-negative floating point number, in the coordinate space of th ```json-doc { "far": 200.0 } ``` + +##### first + + ##### fieldOfView {: #fieldOfView} @@ -1043,6 +1047,9 @@ The value _MUST_ be an array of strings. Each item in the array _MUST_ be a vali ``` json-doc { "language": [ "en" ] } ``` + +##### last + ##### logo {: #logo} @@ -1070,6 +1077,7 @@ The value of this property _MUST_ be an array of JSON objects, each of which _MU ] } ``` + ##### lookAt {: #lookAt} @@ -1194,6 +1202,7 @@ The value of the property _MUST_ be a [GeoJSON Feature Collection] [link] contai } } ``` + ##### near {: #near} @@ -1208,6 +1217,11 @@ The value is a non-negative floating point number, in the coordinate space of th { "near": 1.5 } ``` +##### next + +... + + ##### partOf {: #partOf} @@ -1285,6 +1299,10 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe } ``` + +##### prev + + ##### profile {: #profile} @@ -1729,6 +1747,11 @@ The value _MUST_ be a string. ``` +##### totalItems + +For compatability with the Web Annotation Data Model, clients _SHOULD_ also accept `total` as the name of this property when used on the `AnnotationCollection` class. + + ##### transform {: #transform} From 049829809d6ad781bf19078abdf5159255347820 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 19 Mar 2025 15:09:44 -0400 Subject: [PATCH 056/192] Add type: ClassName to all Classes --- source/presentation/4.0/index.md | 2 +- source/presentation/4.0/model.md | 120 ++++++++++++++++++++----------- 2 files changed, 78 insertions(+), 44 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index de0b9a8e2..1c4f43d0d 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1289,7 +1289,7 @@ If you go backwards from step n in a linear-nav, **and** you have applied one or Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. -// I am assuming reset is always true except in `sequence` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... +// I am assuming reset is always true except in `linear-nav` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... #### Contribute additional information permanently diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 9b40d5770..ce1b35615 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -245,16 +245,22 @@ FIXME: It is an error to select a temporal region of a Scene that does not have #### Timeline +`"type": "Timeline"` + A Timeline is a Container that represents only a temporal duration, measured in seconds. Timelines allow audio content to be presented, but do not allow anything with a height or width like an image or video. The duration of the Timeline is given in the `duration` property. #### Canvas +`"type": "Canvas"` + A Canvas is a Container that represents a particular rectangular 2 dimensional view of the object and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as the 2 dimensional space. FIXME: arbitrary units #### Scene +`"type": "Scene"` + A Scene is a Container that represents an infinitely large three-dimensional space, with an optional `duration` property. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. From a perspective looking along the z axis towards negative infinity, the positive y axis points upwards and the positive x axis points to the right (a [right-handed Cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). diagram of Right handed cartesian coordinate system @@ -274,6 +280,8 @@ The following set of classes are defined by the W3C's [Web Annotation Data Model #### Annotation +`"type": "Annotation"` + Annotations are used to associate content resources with Containers, as well as for transcriptions, commentary, tags and the association of other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. Annotations _MUST_ have their own HTTP(S) URIs, conveyed in the `id` property. The JSON-LD description of the Annotation _SHOULD_ be returned if the URI is dereferenced, according to the [Web Annotation Protocol][org-w3c-webanno-protocol]. @@ -287,6 +295,8 @@ Note that the Web Annotation data model defines different patterns for the `valu #### Annotation Collection +`"type": "AnnotationCollection"` + Annotation Collections allow groups of Annotations to be recorded. For example, all of the English translation Annotations of a medieval French document could be kept separate from the transcription or an edition in modern French, or the director's commentary on a film can be separated from the script. Annotation Collections _MUST_ have a URI, and it _SHOULD_ be an HTTP(S) URI. They _SHOULD_ have a `label` and _MAY_ have any of the other descriptive, linking or rights properties. @@ -296,6 +306,8 @@ Annotation Collections are paged rather than enumerated. The first page of items #### Annotation Page +`"type": "AnnotationPage"` + An ordered list of Annotations, typically associated with a Container, but may be referenced from other types of resource as well. Annotation Pages enumerate and order lists of Annotations, in the same way that Collection Pages order lists of Manifests and Collections within the containing Collection. An Annotation Page _MUST_ have an HTTP(S) URI given in `id`, and _MAY_ have any of the other properties defined in this specification or the Web Annotation specification. The Annotations are listed in the `items` property of the Annotation Page. @@ -309,14 +321,20 @@ The definition of `label` in the Web Annotation specification does not produce J #### Specific Resource +`"type": "SpecificResource"` + A Specific Resource is a resource in the context of an Annotation. They are used to record further properties or relationships needed to understand the particular contextual use, such as which part of the resource is used or how it should be rendered. In IIIF, the Specific Resource model from the Web Annotation Data Model has some additional properties beyond those defined by the W3C, such as `transform`. #### Textual Body +`"type": "TextualBody"` + A Textual Body is an embedded resource within an Annotation that carries, as the name suggests, a text as the body of the Annotation. It is defined by the Web Annotation Data Model, and this specification defines a new property for `position` that allows it to be positioned within a Container. #### Choice +`"type": "Choice"` + A Choice is a Web Annotation construction that allows one entry from a list to be selected for processing or display. This specification allows `behavior` to be added to a Choice to influence how it is processed. @@ -370,15 +388,11 @@ There are common use cases in which a point, rather than a range or area, is the #### WKT Selector -Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MultiPolygon. Additional types, such as CIRCULARSTRING may also be supported. +`"type": "WktSelector"` -WKT Selectors have the following properties: +Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MultiPolygon. Additional types, such as CIRCULARSTRING may also be supported. -| Name | Description | -|-------|-------------| -| id | The HTTP(S) URI of the selector | -| type | The class of the selector, which must be "WktSelector" | -| value | The WKT string that defines the geometry to be selected | +WKT Selectors _MUST_ have a `value` property, which is the WKT string that defines the geometry to be selected. ```json { @@ -393,14 +407,9 @@ WKT Selectors have the following properties: #### Audio Content Selector -Video content resources consist of both visual and audio content within the same bit-level representation. There are situations when it is useful to refer to only one aspect of the content – either the visual or the audio, but not both. For example, an Annotation might associate only the visual content of a video that has spoken English in the audio, and an audio file that has the translation of that content in Spanish. The Audio Content Selector selects all of the audio content from an A/V content resource, and may be further refined with subsequent selectors to select a segment of it. - -Audio Content Selectors have the following properties: +`"type": "AudioContentSelector"` -| Name | Description | -|------|-------------| -| id | The HTTP(S) URI of the selector | -| type | The class of the selector, which must be "AudioContentSelector" | +Video content resources consist of both visual and audio content within the same bit-level representation. There are situations when it is useful to refer to only one aspect of the content – either the visual or the audio, but not both. For example, an Annotation might associate only the visual content of a video that has spoken English in the audio, and an audio file that has the translation of that content in Spanish. The Audio Content Selector selects all of the audio content from an A/V content resource, and may be further refined with subsequent selectors to select a segment of it. ```json @@ -413,14 +422,9 @@ Audio Content Selectors have the following properties: #### Visual Content Selector -Similar to Audio Content Selectors, Visual Content Selectors select the visual aspects of the content of an A/V content resource. They may be further refined by subsequent selectors that select an area or temporal segment of it. - -Visual Content Selectors have the following properties: +`"type": "VisualContentSelector"` -| Name | Description | -|------|-------------| -| id | The HTTP(S) URI of the selector | -| type | The class of the selector, which must be "VisualContentSelector" | +Similar to Audio Content Selectors, Visual Content Selectors select the visual aspects of the content of an A/V content resource. They may be further refined by subsequent selectors that select an area or temporal segment of it. ```json { @@ -432,16 +436,11 @@ Visual Content Selectors have the following properties: #### Animation Selector -More interactive content resources, such as 3d models, may have activatable animations or similar features. For example, a model of a box might have an animation that opens the lid and a second animation that closes the lid. In order to activate those animations, they need to be selectable, and thus the specification defines an Animation Selector. - -Animation Selectors have the following properties: +`"type": "AnimationSelector"` -| Name | Description | -|-------|-------------| -| id | The HTTP(S) URI of the selector | -| type | The class of the selector, which must be "AnimationSelector" | -| value | The identity of the animation in whichever form is used by the source resource | +More interactive content resources, such as 3D models, may have animations or similar features that can be _activated_ by user interaction. For example, a model of a box might have an animation that opens the lid and a second animation that closes the lid. In order to activate those animations, they need to be selectable, and thus the specification defines an Animation Selector. +Animation Selectors _MUST_ have a `value` property, which is the identity of the animation in whichever form is used by the source resource. ```json { @@ -451,7 +450,9 @@ Animation Selectors have the following properties: } ``` -#### ImageApiSelector +#### IIIF Image API Selector + +`"type": "ImageApiSelector"` FIXME: write this @@ -460,6 +461,8 @@ FIXME: write this ### Range +`"type": "Range"` + Ranges are used to represent structure within a Manifest beyond the default order of the Containers in the `items` property. Ranges _MUST_ have URIs and they _SHOULD_ be HTTP(S) URIs. Top level Ranges are [embedded][prezi30-terminology] or externally [referenced][prezi30-terminology] within the Manifest in a `structures` property. These top level Ranges then embed or reference other Ranges, Containers or parts of Containers in the `items` property. Each entry in the `items` property _MUST_ be a JSON object, and it _MUST_ have the `id` and `type` properties. If a top level Range needs to be dereferenced by the client, then it _MUST NOT_ have the `items` property, such that clients are able to recognize that it should be retrieved in order to be processed. @@ -480,17 +483,20 @@ FIXME: If either the position or direction is not specified, then the position d The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, (PERSPECTIVE) and a vertical projection angle that provides the top and bottom planes of the region. (viewHeight?) -##### OrthographicCamera +##### Orthographic Camera + +`"type": "OrthographicCamera"` `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera -##### PerspectiveCamera +##### Perspective Camera + +`"type": "PerspectiveCamera"` `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller -!!! Properties -... +Properties... ```json @@ -519,29 +525,37 @@ The region of the Scene's space that is observable by the camera is bounded by t ##### Ambient Light +`"type": "AmbientLight"` + Ambient Lights evenly illuminates all objects in the scene, and does not have a direction or position. ##### Directional Light -Directional Lights emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. +`"type": "DirectionalLight"` - If a DirectionalLight does not have an explicit direction, then the default is in the negative y direction (downwards). +Directional Lights emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. +If a DirectionalLight does not have an explicit direction, then the default is in the negative y direction (downwards). -this is really that the light always has a direction of (-y) and is rotated from there. So no rotation = "default" direction. +This is really that the light always has a direction of (-y) and is rotated from there. So no rotation = "default" direction. ##### Point Light - Point Lights emits from a single point within the scene in all directions. +`"type": "PointLight"` + +Point Lights emits from a single point within the scene in all directions. + ##### Spot Light +`"type": "SpotLight"` + Spot Lights emit a cone of light from a single point in a given direction. - If a SpotLight does not have an explicit direction, then the default is in the negative y direction (downwards). +If a SpotLight does not have an explicit direction, then the default is in the negative y direction (downwards). @@ -551,12 +565,16 @@ All have `source`, `volume` ##### Ambient Audio +`"type": "AmbientAudio"` + ##### Point Audio +`"type": "PointAudio"` ##### Spot Audio +`"type": "SpotAudio"` ```json { @@ -582,24 +600,39 @@ here are the rules about transforms? -##### RotateTransform +##### Rotate Transform + +`"type": "RotateTransform"` A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 -##### ScaleTransform +##### Scale Transform + +`"type": "ScaleTransform"` A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 -##### TranslateTransform +##### Translate Transform + +`"type": "TranslateTransform"` A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 ### Utility Classes + #### Agent + +`"type": "Agent"` + #### Service -#### UnitValue + +`"type": "Service"` + +#### Unit Value + +`"type": "UnitValue"` @@ -650,6 +683,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 90, and ```json "angle": 15.0 ``` + ##### annotations {: #annotations} From a581beb0a3e7bd58c78f786d842ca10793d20bde Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 17:38:14 -0400 Subject: [PATCH 057/192] push --- source/presentation/4.0/model.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index ce1b35615..d7b471e2d 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -234,7 +234,7 @@ A Manifest _MAY_ have the following properties: [requiredStatement](#requiredSta A Container is a frame of reference that allows the relative positioning of content. -All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. The URI of the Container _MUST NOT_ contain a fragment (a `#` followed by further characters), as this would make it impossible to refer to a segment of the Container's area using the [media fragment syntax][org-w3c-media-frags] of `#xywh=` for spatial regions, and/or `#t=` for temporal segments. Containers _MAY_ be able to be dereferenced separately from the Manifest via their URIs as well as being [embedded][prezi30-terminology]. +All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. The URI of the Container _MUST NOT_ contain a fragment (a `#` followed by further characters), as this would make it impossible to refer to a segment of the Container's area using the [media fragment syntax][org-w3c-media-frags] of `#xywh=` for spatial regions, and/or `#t=` for temporal segments. The temporal segment _MUST_ be expressed using seconds. Containers _MAY_ be able to be dereferenced separately from the Manifest via their URIs as well as being [embedded][prezi30-terminology]. Containers _MUST_ have an `items` property which is a list of Annotation Pages. Each Annotation Page, defined below, maintains a list of Annotations, which associate Content Resources to be rendered as part of the Container. Annotations that do not associate content to be rendered, but instead are about the Container such as a comment or tag, are recorded using Annotation Pages in the `annotations` property of the Container. @@ -639,7 +639,7 @@ A TranslateTransform moves all of the objects in the local coordinate space the ## Properties -##### accompanyingContainer +### accompanyingContainer {: #accompanyingContainer} A Container that provides additional content for use while the resource that has the `accompanyingContainer` property is shown or played. Examples include an image to show while a duration-only Canvas is playing audio; or background audio to play while a user is navigating an image-only Manifest. @@ -670,7 +670,7 @@ The value of `accompanyingContainer` _MUST_ be a JSON object with the `id` and ` } ``` -##### angle +### angle {: #angle} !!! warning "Need more info" @@ -684,7 +684,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 90, and "angle": 15.0 ``` -##### annotations +### annotations {: #annotations} An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Canvas. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource or part of it. @@ -717,7 +717,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have at least the } ``` -##### backgroundColor +### backgroundColor {: #backgroundColor} This property sets the background color behind any painted resources on a spatial Container, such as a Canvas or Scene. From 29bd63fa804609c6271189633870370155bcaa2e Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 19 Mar 2025 17:38:57 -0400 Subject: [PATCH 058/192] add TODO referencing issue --- source/presentation/4.0/model.md | 1 + 1 file changed, 1 insertion(+) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index ce1b35615..ea0458df6 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -757,6 +757,7 @@ The value _MUST_ be an array of strings. !!! Could continuous stitch together Timelines? +TODO: Address https://github.com/IIIF/api/issues/2318 | Value | Description | | ----- | ----------- | From 3c97d66b889eefd35549c75b75f703f3deae1e08 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Mar 2025 17:39:34 -0400 Subject: [PATCH 059/192] hello toc --- source/presentation/4.0/model.md | 108 +++++++++++++++---------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 426c208dd..0fc8da575 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -734,7 +734,7 @@ The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value { "backgroundColor": "#FFFFFF" } ``` -##### behavior +### behavior {: #behavior} A set of user experience features that the publisher of the content would prefer the client to use when presenting the resource. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. @@ -792,7 +792,7 @@ TODO: Address https://github.com/IIIF/api/issues/2318 { "behavior": [ "auto-advance", "individuals" ] } ``` -##### color +### color {: #color} This property sets the color of a Light. @@ -807,7 +807,7 @@ The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value "color": "#FFA0A0" ``` -##### duration +### duration {: #duration} The duration of a container or external content resource, given in seconds. @@ -828,7 +828,7 @@ The value _MUST_ be a positive floating point number. { "duration": 125.0 } ``` -##### exclude +### exclude {: #exclude} _Summary here_ @@ -849,7 +849,7 @@ _On Annotation, a list of strings drawn from table_ "exclude": [ "Audio", "Lights", "Cameras", "Animations" ] ``` -##### far +### far {: #far} This property gives the distance from the camera after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. @@ -863,10 +863,10 @@ The value is a non-negative floating point number, in the coordinate space of th { "far": 200.0 } ``` -##### first +### first -##### fieldOfView +### fieldOfView {: #fieldOfView} The angle which a PerspectiveCamera can "see". @@ -881,7 +881,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 180, an ```json-doc { "fieldOfView": 50.0 } ``` -##### format +### format {: #format} The specific media type (often called a MIME type) for a content resource, for example `image/jpeg`. This is important for distinguishing different formats of the same overall type of resource, such as distinguishing text in XML from plain text. @@ -899,7 +899,7 @@ The value _MUST_ be a string, and it _SHOULD_ be the value of the `Content-Type` ``` json-doc { "format": "application/xml" } ``` -##### height +### height {: #height} The height of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the width, it conveys an aspect ratio for the space in which content resources are located. @@ -917,7 +917,7 @@ The value _MUST_ be a positive integer. ``` json-doc { "height": 1800 } ``` -##### homepage +### homepage {: #homepage} A web page that is about the object represented by the resource that has the `homepage` property. The web page is usually published by the organization responsible for the object, and might be generated by a content management system or other cataloging system. The resource _MUST_ be able to be displayed directly to the user. Resources that are related, but not home pages, _MUST_ instead be added into the `metadata` property, with an appropriate `label` or `value` to describe the relationship. @@ -945,7 +945,7 @@ Please note that this specification has stricter requirements about the JSON pat ] } ``` -##### id +### id {: #id} The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Canvases, which _MUST_ have their own URI without a fragment. @@ -962,7 +962,7 @@ The existence of an HTTP(S) URI in the `id` property does not mean that the URI { "id": "https://example.org/iiif/1/manifest" } ``` -##### instant +### instant {: #instant} A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource @@ -970,7 +970,7 @@ A number (floating point) giving the time of the point in seconds, relative to t FIXME: fix -##### intensity +### intensity {: #intensity} This property sets the strength or brightness of a Light. @@ -987,7 +987,7 @@ This specification defines the unit value of "relative" which constrains the val "intensity": {"id": "", "type": "UnitValue", "value": 0.5, "unit": "relative"} } ``` -##### interactionMode +### interactionMode {: #interactionMode} *within* the Scene, whereas viewingDirection and behavior are across containers. @@ -1004,7 +1004,7 @@ free free-direction other examples: no-zoom, no-scrub, rti-mode -##### items +### items {: #items} Much of the functionality of the IIIF Presentation API is simply recording the order in which child resources occur within a parent resource, such as Collections or Manifests within a parent Collection, or Canvases within a Manifest. All of these situations are covered with a single property, `items`. @@ -1040,7 +1040,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ] } ``` -##### label +### label {: #label} A human readable label, name or title. The `label` property is intended to be displayed as a short, textual surrogate for the resource if a human needs to make a distinction between it and similar resources, for example between objects, pages, or options for a choice of images to display. The `label` property can be fully internationalized, and each language can have multiple values. This pattern is described in more detail in the [languages][prezi40-languages] section. @@ -1066,7 +1066,7 @@ The value of the property _MUST_ be a JSON object, as described in the [language ``` json-doc { "label": { "en": [ "Example Object Title" ] } } ``` -##### language +### language {: #language} The language or languages used in the content of this external resource. This property is already available from the Web Annotation model for content resources that are the body or target of an Annotation, however it _MAY_ also be used for resources [referenced][prezi30-terminology] from `homepage`, `rendering`, and `partOf`. @@ -1083,9 +1083,9 @@ The value _MUST_ be an array of strings. Each item in the array _MUST_ be a vali { "language": [ "en" ] } ``` -##### last +### last -##### logo +### logo {: #logo} A small image resource that represents the Agent resource it is associated with. The logo _MUST_ be clearly rendered when the resource is displayed or used, without cropping, rotating or otherwise distorting the image. It is _RECOMMENDED_ that a [IIIF Image API][image-api] service be available for this image for other manipulations such as resizing. @@ -1113,7 +1113,7 @@ The value of this property _MUST_ be an array of JSON objects, each of which _MU } ``` -##### lookAt +### lookAt {: #lookAt} _Summary here_ @@ -1140,7 +1140,7 @@ The value _MUST_ be a JSON object, conforming to either a reference to an Annota "z": -10 } ``` -##### metadata +### metadata {: #metadata} An ordered list of descriptions to be displayed to the user when they interact with the resource, given as pairs of human readable `label` and `value` entries. The content of these entries is intended for presentation only; descriptive semantics _SHOULD NOT_ be inferred. An entry might be used to convey information about the creation of the object, a physical description, ownership information, or other purposes. @@ -1169,7 +1169,7 @@ Clients _SHOULD_ display the entries in the order provided. Clients _SHOULD_ exp ] } ``` -##### navDate +### navDate {: #navDate} A date that clients may use for navigation purposes when presenting the resource to the user in a date-based user interface, such as a calendar or timeline. More descriptive date ranges, intended for display directly to the user, _SHOULD_ be included in the `metadata` property for human consumption. If the resource contains Canvases that have the `duration` property, the datetime given corresponds to the navigation datetime of the start of the resource. For example, a Range that includes a Canvas that represents a set of video content recording a historical event, the `navDate` is the datetime of the first moment of the recorded event. @@ -1193,7 +1193,7 @@ The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _ ``` json-doc { "navDate": "2010-01-01T00:00:00Z" } ``` -##### navPlace +### navPlace {: #navPlace} A geographic location that clients may use for navigation purposes when presenting the resource to the user in a map-based user interface. The location is identified using structured data, described below, with latitude and longitude based points or polygons. If the location is only textual, then the information should instead be included in the `metadata` property. @@ -1238,7 +1238,7 @@ The value of the property _MUST_ be a [GeoJSON Feature Collection] [link] contai } ``` -##### near +### near {: #near} This property gives the distance from the camera from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. @@ -1252,12 +1252,12 @@ The value is a non-negative floating point number, in the coordinate space of th { "near": 1.5 } ``` -##### next +### next ... -##### partOf +### partOf {: #partOf} A containing resource that includes the resource that has the `partOf` property. When a client encounters the `partOf` property, it might retrieve the [referenced][prezi30-terminology] containing resource, if it is not [embedded][prezi30-terminology] in the current representation, in order to contribute to the processing of the contained resource. For example, the `partOf` property on a Canvas can be used to reference an external Manifest in order to enable the discovery of further relevant information. Similarly, a Manifest can reference a containing Collection using `partOf` to aid in navigation. @@ -1274,7 +1274,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and The resources referred to by the `accompanyingContainer` and `placeholderContainer` properties are `partOf` that referring Container. -##### placeholderContainer +### placeholderContainer {: #placeholderContainer} A single Container that provides additional content for use before the main content of the resource that has the `placeholderContainer` property is rendered, or as an advertisement or stand-in for that content. Examples include images, text and sound standing in for video content before the user initiates playback; or a film poster to attract user attention. The content provided by `placeholderContainer` differs from a thumbnail: a client might use `thumbnail` to summarize and navigate multiple resources, then show content from `placeholderContainer` as part of the initial presentation of a single resource. A placeholder Container is likely to have different dimensions to those of the Container(s) of the resource that has the `placeholderContainer` property. A placeholder Container may be of a different type from the resource that has the `placeholderContainer` property. For example, a `Scene` may have a placeholder Container of type `Canvas`. @@ -1305,7 +1305,7 @@ The value of `placeholderContainer` _MUST_ be a JSON object with the `id` and `t } } ``` -##### position +### position {: #position} It is important to be able to position the (textual) body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. @@ -1335,10 +1335,10 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe ``` -##### prev +### prev -##### profile +### profile {: #profile} A schema or named set of functionality available from the resource. The profile can further clarify the `type` and/or `format` of an external resource or service, allowing clients to customize their handling of the resource that has the `profile` property. @@ -1354,7 +1354,7 @@ The value _MUST_ be a string, either taken from the [profiles registry][registry ``` json-doc { "profile": "https://example.org/profile/statuary" } ``` -##### provider +### provider {: #provider} An organization or person that contributed to providing the content of the resource. Clients can then display this information to the user to acknowledge the provider's contributions. This differs from the `requiredStatement` property, in that the data is structured, allowing the client to do more than just present text but instead have richer information about the people and organizations to use in different interfaces. @@ -1414,7 +1414,7 @@ The value _MUST_ be an array of JSON objects, where each item in the array confo ] } ``` -##### provides +### provides {: #provides} A set of features or additional functionality that a linked resource enables relative to the linking or including resource, which is not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). @@ -1451,7 +1451,7 @@ Note that the majority of the values have been selected from [accessibility feat ``` !!! warning "This breaks the graph as the file doesn't provide X in all contexts" -##### rendering +### rendering {: #rendering} A resource that is an alternative, non-IIIF representation of the resource that has the `rendering` property. Such representations typically cannot be painted onto a single Canvas, as they either include too many views, have incompatible dimensions, or are compound resources requiring additional rendering functionality. The `rendering` resource _MUST_ be able to be displayed directly to a human user, although the presentation may be outside of the IIIF client. The resource _MUST NOT_ have a splash page or other interstitial resource that mediates access to it. If access control is required, then the [IIIF Authentication API][iiif-auth] is _RECOMMENDED_. Examples include a rendering of a book as a PDF or EPUB, a slide deck with images of a building, or a 3D model of a statue. @@ -1474,7 +1474,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id`, `t ] } ``` -##### requiredStatement +### requiredStatement {: #requiredStatement} Text that _MUST_ be displayed when the resource is displayed or used. For example, the `requiredStatement` property could be used to present copyright or ownership statements, an acknowledgement of the owning and/or publishing institution, or any other text that the publishing organization deems critical to display to the user. Given the wide variation of potential client user interfaces, it will not always be possible to display this statement to the user in the client's initial state. If initially hidden, clients _MUST_ make the method of revealing it as obvious as possible. @@ -1493,7 +1493,7 @@ The value of the property _MUST_ be a JSON object, that has the `label` and `val } } ``` -##### rights +### rights {: #rights} A string that identifies a license or rights statement that applies to the content of the resource, such as the JSON of a Manifest or the pixels of an image. The value _MUST_ be drawn from the set of [Creative Commons][org-cc-licenses] license URIs, the [RightsStatements.org][org-rs-terms] rights statement URIs, or those added via the [extension][prezi40-ldce] mechanism. The inclusion of this property is informative, and for example could be used to display an icon representing the rights assertions. @@ -1516,7 +1516,7 @@ __Machine actionable URIs and links for users__
The machine actionable URIs for both Creative Commons licenses and RightsStatements.org right statements are `http` URIs. In both cases, human readable descriptions are available from equivalent `https` URIs. Clients may wish to rewrite links presented to users to use these equivalent `https` URIs. {: .note} -##### seeAlso +### seeAlso {: #seeAlso} A machine-readable resource such as an XML or RDF description that is related to the current resource that has the `seeAlso` property. Properties of the resource should be given to help the client select between multiple descriptions (if provided), and to make appropriate use of the document. If the relationship between the resource and the document needs to be more specific, then the document should include that relationship rather than the IIIF resource. Other IIIF resources are also valid targets for `seeAlso`, for example to link to a Manifest that describes a related object. The URI of the document _MUST_ identify a single representation of the data in a particular format. For example, if the same data exists in JSON and XML, then separate resources should be added for each representation, with distinct `id` and `format` properties. @@ -1542,7 +1542,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ``` -##### service +### service {: #service} A service that the client might interact with directly and gain additional information or functionality for using the resource that has the `service` property, such as from an Image to the base URI of an associated [IIIF Image API][image-api] service. The service resource _SHOULD_ have additional information associated with it in order to allow the client to determine how to make appropriate use of it. Please see the [Service Registry][registry-services] document for the details of currently known service types. @@ -1597,7 +1597,7 @@ Implementations _SHOULD_ be prepared to recognize the `@id` and `@type` property ] } ``` -##### services +### services {: #services} A list of one or more service definitions on the top-most resource of the document, that are typically shared by more than one subsequent resource. This allows for these shared services to be collected together in a single place, rather than either having their information duplicated potentially many times throughout the document, or requiring a consuming client to traverse the entire document structure to find the information. The resource that the service applies to _MUST_ still have the `service` property, as described above, where the service resources have at least the `id` and `type` or `@id` and `@type` properties. This allows the client to know that the service applies to that resource. Usage of the `services` property is at the discretion of the publishing system. @@ -1631,7 +1631,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ] } ``` -##### start +### start {: #start} A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. @@ -1664,7 +1664,7 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert } } ``` -##### structures +### structures {: #structures} The structure of an object represented as a Manifest can be described using a hierarchy of Ranges. Ranges can be used to describe the "table of contents" of the object or other structures that the user can interact with beyond the order given by the `items` property of the Manifest. The hierarchy is built by nesting the child Range resources in the `items` array of the higher level Range. The top level Ranges of these hierarchies are given in the `structures` property. @@ -1688,7 +1688,7 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ] } ``` -##### summary +### summary {: #summary} A short textual summary intended to be conveyed to the user when the `metadata` entries for the resource are not being displayed. This could be used as a brief description for item level search results, for small-screen environments, or as an alternative user interface when the `metadata` property is not currently being rendered. The `summary` property follows the same pattern as the `label` property described above. @@ -1709,7 +1709,7 @@ The value of the property _MUST_ be a JSON object, as described in the [language { "summary": { "en": [ "This is a summary of the object." ] } } ``` -##### supplementary +### supplementary {: #supplementary} A link from this Range to an Annotation Collection that includes the `supplementing` Annotations of content resources for the Range. Clients might use this to present additional content to the user from a different Canvas when interacting with the Range, or to jump to the next part of the Range within the same Canvas. For example, the Range might represent a newspaper article that spans non-sequential pages, and then uses the `supplementary` property to reference an Annotation Collection that consists of the Annotations that record the text, split into Annotation Pages per newspaper page. Alternatively, the Range might represent the parts of a manuscript that have been transcribed or translated, when there are other parts that have yet to be worked on. The Annotation Collection would be the Annotations that transcribe or translate, respectively. @@ -1726,7 +1726,7 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert { "supplementary": { "id": "https://example.org/iiif/1/annos/1", "type": "AnnotationCollection" } } ``` -##### thumbnail +### thumbnail {: #thumbnail} A content resource, such as a small image or short audio clip, that represents the resource that has the `thumbnail` property. A resource _MAY_ have multiple thumbnail resources that have the same or different `type` and `format`. @@ -1759,7 +1759,7 @@ The value _MUST_ be an array of JSON objects, each of which _MUST_ have the `id` } ``` -##### timeMode +### timeMode {: #timeMode} A mode associated with an Annotation that is to be applied to the rendering of any time-based media, or otherwise could be considered to have a duration, used as a body resource of that Annotation. Note that the association of `timeMode` with the Annotation means that different resources in the body cannot have different values. This specification defines the values specified in the table below. Others may be defined externally as an [extension][prezi30-ldce]. @@ -1782,12 +1782,12 @@ The value _MUST_ be a string. ``` -##### totalItems +### totalItems For compatability with the Web Annotation Data Model, clients _SHOULD_ also accept `total` as the name of this property when used on the `AnnotationCollection` class. -##### transform +### transform {: #transform} _Summary here_ @@ -1798,7 +1798,7 @@ Process them in order given. -##### type +### type {: #type} The type or class of the resource. For classes defined for this specification, the value of `type` will be described in the sections below describing each individual class. @@ -1832,12 +1832,12 @@ For compatibility with previous versions, clients _SHOULD_ accept `Sound` as a s { "type": "Image" } ``` -##### unit +### unit FIXME: possible values are 'm' and 's' and 'relative' -##### value +### value metadata: @@ -1852,7 +1852,7 @@ FIXME: use scoped context for UnitValue to change the meaning of `value` -##### viewingDirection +### viewingDirection {: #viewingDirection} !!! Rewrite to be where is the navigation control to step to the next/ previous in the items of hte manifest @@ -1886,7 +1886,7 @@ The value _MUST_ be a string. { "viewingDirection": "left-to-right" } ``` -##### width +### width {: #width} The width of the Canvas or external content resource. For content resources, the value is in pixels. For Canvases, the value does not have a unit. In combination with the height, it conveys an aspect ratio for the space in which content resources are located. @@ -1905,18 +1905,18 @@ The value _MUST_ be a positive integer. { "width": 1200 } ``` -##### x +### x {: #x} A number (floating point or integer) giving the x coordinate of the point, relative to the dimensions of the source resource -##### y +### y {: #y} A number (floating point or integer) giving the y coordinate of the point, relative to the dimensions of the source resource -##### z +### z {: #z} A number (floating point) giving the z coordinate of the point, relative to the dimensions of the source resource From 429f7a12d386e1cc3c0583e07f89d1fb54d05357 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Tue, 1 Apr 2025 18:36:35 -0400 Subject: [PATCH 060/192] Changes to UnitValue, inensity, lights --- source/presentation/4.0/model.md | 80 +++++++++++++++++--------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 0fc8da575..563c0a544 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -509,54 +509,35 @@ Properties... } ``` - - - - - - - - - - #### Lights - - - + ##### Ambient Light `"type": "AmbientLight"` -Ambient Lights evenly illuminates all objects in the scene, and does not have a direction or position. - +Ambient Light evenly illuminates all objects in the Scene, and does not have a direction or position. ##### Directional Light `"type": "DirectionalLight"` -Directional Lights emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. - -If a DirectionalLight does not have an explicit direction, then the default is in the negative y direction (downwards). - -This is really that the light always has a direction of (-y) and is rotated from there. So no rotation = "default" direction. - +Directional Light emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. +The light emits in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. ##### Point Light `"type": "PointLight"` -Point Lights emits from a single point within the scene in all directions. - +Point Light emits from a single point within the Scene in all directions. ##### Spot Light `"type": "SpotLight"` -Spot Lights emit a cone of light from a single point in a given direction. - -If a SpotLight does not have an explicit direction, then the default is in the negative y direction (downwards). +Spot Light emits a cone of light from a single point in a given direction. The Spot Light's `angle` property defines the radius of the cone. +The light emits in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. #### Audio in Scenes @@ -632,9 +613,9 @@ A TranslateTransform moves all of the objects in the local coordinate space the #### Unit Value -`"type": "UnitValue"` - +A UnitValue expresses a quantity through a numerical value and associated unit of measurement. +`"type": "UnitValue"` ## Properties @@ -973,18 +954,24 @@ FIXME: fix ### intensity {: #intensity} -This property sets the strength or brightness of a Light. - -The value _MUST_ be a JSON object, that has the `type`, `value` and `unit` properties. All three properties are required. The value of `type` _MUST_ be the string "UnitValue". The value of `value` is a floating point number. The value of `unit` is a string, drawn from a controlled vocabulary of units. If this property is not specified, then the default intensity value is client-dependent. +This property sets the strength or brightness of a Light. If this property is not specified, then the default intensity value is client-dependent. -This specification defines the unit value of "relative" which constrains the value to be a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). +The value of this proerty _MUST_ be a UnitValue object. +The `unit` property of the UnitValue _MUST_ be `relative`. +The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. * A Light _SHOULD_ have the `intensity` property.
- Clients _SHOULD_ process the `intensity` property on Lights. + Clients _SHOULD_ process the `intensity` property on Lights.
+ Clients _SHOULD_ interpret the `value` on a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render) +* Other resources _MUST NOT_ have the `intensity` property. ```json { - "intensity": {"id": "", "type": "UnitValue", "value": 0.5, "unit": "relative"} + "intensity": { + "id": "https://example.org/iiif/intensity/1", + "type": "UnitValue", + "value": 0.5, + "unit": "relative"} } ``` ### interactionMode @@ -1834,8 +1821,19 @@ For compatibility with previous versions, clients _SHOULD_ accept `Sound` as a s ### unit -FIXME: possible values are 'm' and 's' and 'relative' +The unit of measurement of a quantity expressed by a UnitValue. +The value _MUST_ be a string value. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. + +| Value | Unit | +|----------|-----------| +| m | meters | +| s | seconds | +| relative | relative | + +* A UnitValue _MUST_ have the `unit` property + +FIXME: possible values are 'm' and 's' and 'relative'. Is relative always 0-1.0, or context-dependent (see def of intensity)? Allow extensions? ### value @@ -1844,13 +1842,21 @@ metadata: {label: value: {"en": ["foo"]}} -UnitValue +### value (UnitValue) + +The `value` property of a UnitValue represents the numerical component of a quantity. + +The value _MUST_ be a floating point number. + +* A UnitValue _MUST_ have the `value` property. -unit: value: 0.1234123 +`"value": 0.1234123` FIXME: use scoped context for UnitValue to change the meaning of `value` +### value (WktSelector) +FIXME: another value value! ### viewingDirection {: #viewingDirection} From 1a13e1fac4565792c6681682cf37250157c56c7e Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 2 Apr 2025 11:23:56 -0400 Subject: [PATCH 061/192] Work on audio --- source/presentation/4.0/model.md | 73 ++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 563c0a544..59be01cbe 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -523,7 +523,7 @@ Ambient Light evenly illuminates all objects in the Scene, and does not have a d Directional Light emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. -The light emits in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. +The light is emitted in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. ##### Point Light @@ -537,42 +537,66 @@ Point Light emits from a single point within the Scene in all directions. Spot Light emits a cone of light from a single point in a given direction. The Spot Light's `angle` property defines the radius of the cone. -The light emits in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. +The Spot Light emits in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. +```json +{ + "id": "https://example.org/iiif/spotLight/1", + "type": "SpotLight", + "angle": 15.0, + "color": "#FFFFFF", + "intensity": { + "type": "UnitValue", + "unit": "relative", + "value": 0.5 + } +} +``` #### Audio in Scenes -All have `source`, `volume` +Positional audio is supported through the use of Audio resources annotated into Scenes. +Audio resources _MUST_ have a `source` property that references an audio Content Resource, and _SHOULD_ have a `volume` property. ##### Ambient Audio `"type": "AmbientAudio"` +Ambient Audio emits equally throughout the Scene, and does not have a position or direction. ##### Point Audio `"type": "PointAudio"` +Point Audio emits from a single point in the Scene in all directions. + ##### Spot Audio `"type": "SpotAudio"` +Spot Audio emits a cone of sound from a single point in a given direction. The Spot Audio's `angle` property defines the radius of the cone. + +The Spot Audio emits in the negative Y (-y) direction by default, but the orientation of the sound can be altered by subsequent transforms. + ```json { - "id": "iiif/my/spotAudio", + "id": "https://example.org/iiif/spotAudio/1", "type": "SpotAudio", "source": { - "id": "/path/to/my.mp3", + "id": "https://example.org/media/path/to/my.mp3", "type": "Audio", "format": "audio/mp3" }, - "angle": 45.0 + "angle": 45.0, + "volume": { + "type": "UnitValue", + "unit": "relative", + "value": 2.0 + } } ``` -No default direction, MUST provide a Rotate Transform. - - +FIXME: "No default direction, MUST provide a Rotate Transform.", changed language to default to -y to match Spot Light #### Transforms @@ -954,16 +978,15 @@ FIXME: fix ### intensity {: #intensity} -This property sets the strength or brightness of a Light. If this property is not specified, then the default intensity value is client-dependent. +This property sets the strength or brightness of a Light. The `value` of the referenced UnitValue indicates the desired intensity on a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). If this property is not specified, then the default intensity value is client-dependent. -The value of this proerty _MUST_ be a UnitValue object. +The value of this proerty _MUST_ be a UnitValue. The `unit` property of the UnitValue _MUST_ be `relative`. The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. * A Light _SHOULD_ have the `intensity` property.
- Clients _SHOULD_ process the `intensity` property on Lights.
- Clients _SHOULD_ interpret the `value` on a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render) -* Other resources _MUST NOT_ have the `intensity` property. + Clients _SHOULD_ process the `intensity` property on a Light. +* Other types of resource _MUST NOT_ have the `intensity` property. ```json { @@ -1438,6 +1461,7 @@ Note that the majority of the values have been selected from [accessibility feat ``` !!! warning "This breaks the graph as the file doesn't provide X in all contexts" + ### rendering {: #rendering} @@ -1618,6 +1642,15 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ] } ``` + +### source +{: #source} + +A Content Resource that is used as the souce of audio information in an Audio resource. The value _MUST_ be a Content Resource with the `id`, `type`, and `format` properties. + +* Audio resources _MUST_ have the `source` property.
+ Clients _SHOULD_ process the `source` property on an Audio resource. + ### start {: #start} @@ -1892,6 +1925,18 @@ The value _MUST_ be a string. { "viewingDirection": "left-to-right" } ``` +### volume +{: #volume} + +The volume propery represents the relative volume of an audio source. The `value` of the specified UnitValue represents the desired volume on a linear scale from 0.0 (silence) to 1.0 (maximum volume). If this property is not specified, then the default volume value is client-dependent. + +The value of this property _MUST_ be a UnitValue. +The `unit` property of the UnitValue _MUST_ be `relative`. +The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. + +* Audio resource types _SHOULD_ have the `volume` property.
+ Clients _SHOULD_ process the `volume` property on an Audio resource. + ### width {: #width} From ec905def3b7227440be50aaaaabb8283e5d62998 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 2 Apr 2025 11:31:50 -0400 Subject: [PATCH 062/192] Changes to intensity and source --- source/presentation/4.0/model.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 59be01cbe..3955ed9cf 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -986,7 +986,6 @@ The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. * A Light _SHOULD_ have the `intensity` property.
Clients _SHOULD_ process the `intensity` property on a Light. -* Other types of resource _MUST NOT_ have the `intensity` property. ```json { @@ -1646,7 +1645,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ### source {: #source} -A Content Resource that is used as the souce of audio information in an Audio resource. The value _MUST_ be a Content Resource with the `id`, `type`, and `format` properties. +A Content Resource that is used as the souce of audio information in an Audio resource. The value _MUST_ be a Content Resource with the `id`, `type` properties. * Audio resources _MUST_ have the `source` property.
Clients _SHOULD_ process the `source` property on an Audio resource. From 95ff1d347e3a1bebb6e67d0bee89f730ba523637 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Fri, 4 Apr 2025 13:54:15 -0400 Subject: [PATCH 063/192] Fix property typo --- source/presentation/4.0/model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 3955ed9cf..2212e863d 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1927,7 +1927,7 @@ The value _MUST_ be a string. ### volume {: #volume} -The volume propery represents the relative volume of an audio source. The `value` of the specified UnitValue represents the desired volume on a linear scale from 0.0 (silence) to 1.0 (maximum volume). If this property is not specified, then the default volume value is client-dependent. +The volume property represents the relative volume of an audio source. The `value` of the specified UnitValue represents the desired volume on a linear scale from 0.0 (silence) to 1.0 (maximum volume). If this property is not specified, then the default volume value is client-dependent. The value of this property _MUST_ be a UnitValue. The `unit` property of the UnitValue _MUST_ be `relative`. From 5693034b4c90dfa5a11011f499b1d4f140a945e7 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 4 Apr 2025 16:13:26 -0400 Subject: [PATCH 064/192] updates --- source/presentation/4.0/model.md | 112 ++++++++++++++++++++----------- 1 file changed, 74 insertions(+), 38 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 2212e863d..3c674e8f0 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1,7 +1,7 @@ --- title: "Presentation API 4.0 Properties" title_override: "IIIF Presentation API 4.0 Properties" -id: presentation-api-properties +id: presentation-api-model layout: spec cssversion: 3 tags: [specifications, presentation-api] @@ -10,8 +10,8 @@ minor: 0 patch: 0 pre: redirect_from: - - /presentation/properties.html - - /presentation/4/properties.html + - /presentation/model.html + - /presentation/4/model.html editors: - name: Michael Appleby ORCID: https://orcid.org/0000-0002-1266-298X @@ -55,6 +55,9 @@ __Previous Version:__ [3.0][prezi30] ## Introduction +The IIIF Presentation API is backed by a standards-based data model inspired by both earlier tree structured representations of cultural heritage objects, as well as linked data approaches with the same goal. It comprises four main types of resource: Structural (such as Collections, Manifests, and Ranges), Presentational Containers (Canvas, Scene and Timeline), Linking (Annotations), and Content (the images, texts, audio, video and models to be displayed). +The model intentionaly does not include any semantic or descriptive relationships or properties such as the author of a book or the place where a statue was sculpted; it is solely for presenting content in a structured fashion to human users. + ### Terminology @@ -69,7 +72,6 @@ The terms _array_, _JSON object_, _number_, _string_, and _boolean_ in this docu The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _SHOULD NOT_, _RECOMMENDED_, _MAY_, and _OPTIONAL_ in this document are to be interpreted as described in [RFC 2119][org-rfc-2119]. - ## JSON Considerations This section describes features applicable to all of the Presentation API content. @@ -100,7 +102,7 @@ Any of the properties in the API that can have multiple values _MUST_ always be Language _SHOULD_ be associated with strings that are intended to be displayed to the user for the `label` and `summary` properties, plus the `label` and `value` properties of the `metadata` and `requiredStatement` objects. -The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. +The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The script _SHOULD NOT_ be included in the tag, even though BCP 47 allows for this possibility. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. {% include api/code_header.html %} ``` json-doc @@ -120,8 +122,6 @@ The values of these properties _MUST_ be JSON objects, with the keys being the [ } ``` -Note that [BCP 47][org-bcp-47] allows the script of the text to be included after a hyphen, such as `ar-latn`, and clients should be aware of this possibility. - In the case where multiple values are supplied, clients _MUST_ use the following algorithm to determine which values to display to the user. * If all of the values are associated with the `none` key, the client _MUST_ display all of those values. @@ -134,7 +134,7 @@ Note that this does not apply to [embedded][prezi30-terminology] textual bodies ### HTML Markup in Property Values -Minimal HTML markup _MAY_ be included for processing in the `summary` property and the `value` property in the `metadata` and `requiredStatement` objects. It _MUST NOT_ be used in `label` or other properties. This is included to allow content publishers to add links and simple formatting instructions to blocks of text. The content _MUST_ be well-formed XML and therefore _MUST_ be wrapped in an element such as `p` or `span`. There _MUST NOT_ be whitespace on either side of the HTML string, and thus the first character in the string _MUST_ be a '<' character and the last character _MUST_ be '>', allowing a consuming application to test whether the value is HTML or plain text using these. To avoid a non-HTML string matching this, it is _RECOMMENDED_ that an additional whitespace character be added to the end of the value in situations where plain text happens to start and end this way. +Minimal HTML markup _MAY_ be included for processing in the `summary` property and the `value` property in the `metadata` and `requiredStatement` objects. It _MUST NOT_ be used in `label` or other properties. This is included to allow content publishers to add links and simple formatting instructions to blocks of text. The content _MUST_ be well-formed XML and wrapped in a single element such as `div`, `p` or `span`. There _MUST NOT_ be whitespace on either side of the HTML string, and thus the first character in the string _MUST_ be a '<' character and the last character _MUST_ be '>', allowing a consuming application to test whether the value is HTML or plain text using these. To avoid a non-HTML string matching this, it is _RECOMMENDED_ that an additional whitespace character be added to the end of the value in situations where plain text happens to start and end this way. In order to avoid HTML or script injection attacks, clients _MUST_ remove: @@ -145,7 +145,7 @@ In order to avoid HTML or script injection attacks, clients _MUST_ remove: * XML Comments. * Processing instructions. -Clients _SHOULD_ allow only `a`, `b`, `br`, `i`, `img`, `p`, `small`, `span`, `sub` and `sup` tags. Clients _MAY_ choose to remove any and all tags, therefore it _SHOULD NOT_ be assumed that the formatting will always be rendered. Note that publishers _MAY_ include arbitrary HTML content for processing using customized or experimental applications, and the requirements for clients assume an untrusted or unknown publisher. +Clients _SHOULD_ allow only `a`, `b`, `br`, `div`, `i`, `img`, `p`, `small`, `span`, `sub` and `sup` tags. Clients _MAY_ choose to remove any and all tags, therefore it _SHOULD NOT_ be assumed that the formatting will always be rendered. Note that publishers _MAY_ include arbitrary HTML content for processing using customized or experimental applications, and the requirements for clients assume an untrusted or unknown publisher. {% include api/code_header.html %} ``` json-doc @@ -154,7 +154,7 @@ Clients _SHOULD_ allow only `a`, `b`, `br`, `i`, `img`, `p`, `small`, `span`, `s ### JSON Description Availability -JSON descriptions _SHOULD_ be [embedded][prezi30-terminology] within the JSON of parent resources, and _MAY_ also be available via separate requests from the HTTP(S) URI given in the resource's `id` property. Links to Content Resources _MUST_ be given as a JSON object with the `id` and `type` properties and _SHOULD_ have `format` or `profile` to give a hint as to what sort of resource is being referred to. +JSON descriptions _SHOULD_ be embedded within the JSON of parent resources, and _MAY_ also be available via separate requests from the HTTP(S) URI given in the resource's `id` property. Links to Content Resources _MUST_ be given as a JSON object with the `id` and `type` properties and _SHOULD_ have `format` or `profile` to give a hint as to what sort of resource is being referred to. {% include api/code_header.html %} ``` json-doc @@ -170,8 +170,6 @@ JSON descriptions _SHOULD_ be [embedded][prezi30-terminology] within the JSON of } ``` - - ## Classes The following sub-sections define the classes used in the IIIF Presentation Data Model. Only the semantics and core structural requirements are defined within this section, along with any deviations from other specifications that the classes might be drawn from. The descriptions do not define how the classes are used together, which is done in the Presentation API Overview. @@ -181,44 +179,57 @@ The name of each class is given at the top of its definition below. The exact st ### Collection {: #Collection} -`"type": "Collection"` +> `"type": "Collection"` A Collection is an ordered list of Manifests, and/or Collections. -The identifier in `id` _MUST_ be able to be dereferenced to retrieve the JSON description of the Collection, and thus _MUST_ use the HTTP(S) URI scheme. +A Collection _MUST_ have an HTTP(S) URI given in `id`. It _MUST_ be able to be dereferenced to retrieve the JSON description. -The members of a Collection are typically listed in the `items` property. The members _MAY_ include both other Collections and Manifests, in order, to form a tree-structured hierarchy. +The members of a Collection are typically listed in the `items` property or in a series of Collection Pages. The members _MAY_ include both other Collections and Manifests, in order, to form a tree-structured hierarchy. Collections without any members are allowed but discouraged. For example, a collection that had its last member removed might still be valuable to maintain as an empty collection. -If there are too many members in the collection to fit within a single document, then the members _MAY_ be listed in Collection Pages. A reference to the first page of members is given in the `first` property, and the last page in the `last` property. In this case, the Collection _MUST NOT_ use the `items` property. +If there are too many members in the collection to fit within a single document, then the members _MAY_ be listed in Collection Pages. A reference to the first page of members is given in the `first` property, and the last page in the `last` property. In this case, the Collection _MUST NOT_ use the `items` property. Collections with pages _MUST_ have at least two pages, otherwise the members should be included in `items` on the Collection. Collection Pages _MUST NOT_ be embedded within the Collection for the same reason. -Member Collections _MAY_ be [embedded][prezi30-terminology] inline within other Collections, such as when the Collection is used primarily to subdivide a larger one into more manageable pieces, however Manifests _MUST NOT_ be [embedded][prezi30-terminology] within Collections. An [embedded][prezi30-terminology] Collection _SHOULD_ also have its own URI from which the JSON description is available. +Member Collections _MAY_ be embedded inline within other Collections, however Manifests _MUST NOT_ be embedded within Collections. An embedded Collection _SHOULD_ also have its own URI from which the JSON description is available. Manifests or Collections _MAY_ be [referenced][prezi30-terminology] from more than one Collection. For example, an institution might define four Collections: one for modern works, one for historical works, one for newspapers and one for books. The Manifest for a modern newspaper would then appear in both the modern Collection and the newspaper Collection. Alternatively, the institution may choose to have two separate newspaper Collections, and reference each as a sub-Collection of modern and historical. -Collections with an empty `items` property are allowed but discouraged. For example, if the user performs a search that matches no Manifests, then the server _MAY_ return a Collection response with no Manifests. -Collections or Manifests [referenced][prezi30-terminology] in the `items` property _MUST_ have the `id`, `type` and `label` properties. They _SHOULD_ have the `thumbnail` property. +Collections or Manifests referenced in the `items` property _MUST_ have the `id`, `type` and `label` properties. They _SHOULD_ have the `thumbnail` property. + +__Properties__
+A Collection _MUST_ have the following properties: [id](#id), [type](#type), and [label](#label)

+A Collection _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), and [items](#items)

+A Collection _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [first](#first), [last](#last), [total](#total) and [annotations](#annotations). +{: .note} + #### Collection Page {: #CollectionPage} -`"type": "CollectionPage"` +> `"type": "CollectionPage"` + +A Collection Page is an arbitrary division of members within the Collection to make it easier to consume by clients. It does not have any semantic implications by itself. The Collection Page model follows the ActivityStreams OrderedCollection model, as also used in Annotation Collections, the IIIF Change Discovery API, and the IIIF Search API. -A Collection Page is an arbitrary division of members within the Collection to make it easier to consume. +A Collection Page _MUST_ have an HTTP(S) URI given in `id`. It _MUST_ be able to be dereferenced to retrieve the JSON description. Collection Pages _MUST NOT_ be embedded within Collections. -A Collection Page _MUST_ have an HTTP(S) URI given in `id`. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Collection Page. +All Collection Pages in a Collection, with the exception of the last page, _MUST_ have the `next` property, which provides a reference to the following Collection Page. All Collection Pages in a Collection, with the exception of the first page, _MUST_ have the `prev` property, which provides a reference to the preceding Collection Page. These properties allow the navigation backwards and forwards within the overall set of pages. There is no way to jump to arbitrary positions in the sequence of pages, and clients _MUST NOT_ attempt to infer such methods from the structure of the URI of the Collection Page. Collection Pages _MUST_ have the `partOf` property, refering to the Collection of which they are part. -Collection Pages follow the ActivityStreams model, as also used in Annotation Collections, the IIIF Change Discovery API, and the IIIF Search API. +__Properties__
+A Collection Page _MUST_ have the following properties: [id](#id), [type](#type), [partOf](#partOf) and [items](#items)

+A Collection Page _SHOULD_ have the following properties: [next](#next), and [prev](#prev)

+A Collection Page _MAY_ have the following properties: [startIndex](#startIndex), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), and [annotations](#annotations). +{: .note} ### Manifest +{: #Manifest} -`"type": "Manifest"` +> `"type": "Manifest"` A Manifest is the primary unit of distribution of IIIF and provides a description of the structure and properties of a single item to be presented to the user. -Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description of the Manifest. +Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description. The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. @@ -234,32 +245,44 @@ A Manifest _MAY_ have the following properties: [requiredStatement](#requiredSta A Container is a frame of reference that allows the relative positioning of content. -All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. The URI of the Container _MUST NOT_ contain a fragment (a `#` followed by further characters), as this would make it impossible to refer to a segment of the Container's area using the [media fragment syntax][org-w3c-media-frags] of `#xywh=` for spatial regions, and/or `#t=` for temporal segments. The temporal segment _MUST_ be expressed using seconds. Containers _MAY_ be able to be dereferenced separately from the Manifest via their URIs as well as being [embedded][prezi30-terminology]. +All Containers _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI. The URI of the Container _MUST NOT_ contain a fragment (a `#` followed by further characters), as this would make it impossible to refer to a segment of the Container's area using the [media fragment syntax][org-w3c-media-frags] of `#xywh=` for spatial regions, and/or `#t=` for temporal segments. The temporal segment _MUST_ be expressed using seconds. Containers _MAY_ be able to be dereferenced separately from the Manifest via their URIs as well as being embedded. Containers _MUST_ have an `items` property which is a list of Annotation Pages. Each Annotation Page, defined below, maintains a list of Annotations, which associate Content Resources to be rendered as part of the Container. Annotations that do not associate content to be rendered, but instead are about the Container such as a comment or tag, are recorded using Annotation Pages in the `annotations` property of the Container. -FIXME: It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. - +For Timelines and Canvases, Annotations _MUST NOT_ target spatial or temporal points or regions outside of the bounds of the Container. For Scenes with a `duration`, Annotations _MUST NOT_ target temporal points or regions outside of that duration. Scenes, Canvases and other content with spatial extents _MUST NOT_ be annotated directly onto a Timeline which does not have a spatial extent. Resources with a `duration`, including Timelines and Canvases, _MAY_ be painted into Canvases and Scenes without a `duration`, however the playback of the resource will not able to be controlled or synchronized without other time-based media. +__Properties__
+All Containers _MUST_ have the following properties: [id](#id), and [type](#type)

+All Containers _SHOULD_ have the following properties: [label](#label), and [items](#items)

+All Containers _MAY_ have the following properites: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), and [annotations](#annotations). +{: .note} #### Timeline -`"type": "Timeline"` +> `"type": "Timeline"` A Timeline is a Container that represents only a temporal duration, measured in seconds. Timelines allow audio content to be presented, but do not allow anything with a height or width like an image or video. The duration of the Timeline is given in the `duration` property. +__Properties__
+A Timeline _MUST_ have the following additional properties: [duration](#duration). +{: .note} + #### Canvas -`"type": "Canvas"` +> `"type": "Canvas"` + +A Canvas is a Container that represents a particular rectangular 2 dimensional view of the object and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. The values of these properties are not pixels, but arbitrary units into which pixel-based resources can be scaled. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as the 2 dimensional space. -A Canvas is a Container that represents a particular rectangular 2 dimensional view of the object and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as the 2 dimensional space. +__Properties__
+A Canvas _MUST_ have the following additional properties: [height](#height), and [width](#width).

+A Canvas _MAY_ have the following additional properties: [duration](#duration). +{: .note} -FIXME: arbitrary units #### Scene -`"type": "Scene"` +> `"type": "Scene"` A Scene is a Container that represents an infinitely large three-dimensional space, with an optional `duration` property. Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 on each axis (the origin of the coordinate system) is treated as the center of the scene's space. From a perspective looking along the z axis towards negative infinity, the positive y axis points upwards and the positive x axis points to the right (a [right-handed Cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). @@ -269,7 +292,9 @@ The axes of the coordinate system are measured in arbitrary units and these unit All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. - +__Properties__
+A Scene _MAY_ have the following additional properties: [duration](#duration). +{: .note} @@ -280,7 +305,7 @@ The following set of classes are defined by the W3C's [Web Annotation Data Model #### Annotation -`"type": "Annotation"` +> `"type": "Annotation"` Annotations are used to associate content resources with Containers, as well as for transcriptions, commentary, tags and the association of other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. @@ -1653,10 +1678,14 @@ A Content Resource that is used as the souce of audio information in an Audio re ### start {: #start} -A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. +A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases by using either a Canvas URI, a Canvas URI with a fragment in the URI, or a SpecificResource with a Selector. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. + +If the resource with the `start` property is a Collection, then the Canvas (or SpecificResource) _MUST_ have the `partOf` property refering to the Manifest that it is part of, such that the client can retrieve it. The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` properties. The object _MUST_ be either a Canvas (as in the first example below), or a Specific Resource with a Selector and a `source` property where the value is a Canvas (as in the second example below). + * A Collection _MAY_ have the `start` property.
+ Clients _SHOULD_ process `start` on a Collection. * A Manifest _MAY_ have the `start` property.
Clients _SHOULD_ process `start` on a Manifest. * A Range _MAY_ have the `start` property.
@@ -1683,6 +1712,12 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert } } ``` + +### startIndex +{: #startIndex} + + + ### structures {: #structures} @@ -1801,9 +1836,10 @@ The value _MUST_ be a string. ``` -### totalItems +### total -For compatability with the Web Annotation Data Model, clients _SHOULD_ also accept `total` as the name of this property when used on the `AnnotationCollection` class. +For compatability with ActivityStreams and the Change Discovery API, clients _SHOULD_ also accept `totalItems` as the name of this property. +{: .note} ### transform From 18fb1a5b033a48d18a2acf130f105267fb261ab4 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 4 Apr 2025 17:40:51 -0400 Subject: [PATCH 065/192] update --- source/presentation/4.0/model.md | 127 ++++++++++++++++++++++--------- 1 file changed, 91 insertions(+), 36 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 3c674e8f0..3fd81106d 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -176,6 +176,10 @@ The following sub-sections define the classes used in the IIIF Presentation Data The name of each class is given at the top of its definition below. The exact string _MUST_ be used as the value of `type` in the JSON for the class. +__Properties__
+All resources _MUST_ have the following properties: [id](#id), and [type](#type). +{: .note} + ### Collection {: #Collection} @@ -199,7 +203,7 @@ Collections or Manifests referenced in the `items` property _MUST_ have the `id` __Properties__
A Collection _MUST_ have the following properties: [id](#id), [type](#type), and [label](#label)

A Collection _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), and [items](#items)

-A Collection _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [first](#first), [last](#last), [total](#total) and [annotations](#annotations). +A Collection _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [first](#first), [last](#last), [total](#total), [canonical](#canonical), [via](#via), and [annotations](#annotations). {: .note} @@ -218,7 +222,7 @@ All Collection Pages in a Collection, with the exception of the last page, _MUST __Properties__
A Collection Page _MUST_ have the following properties: [id](#id), [type](#type), [partOf](#partOf) and [items](#items)

A Collection Page _SHOULD_ have the following properties: [next](#next), and [prev](#prev)

-A Collection Page _MAY_ have the following properties: [startIndex](#startIndex), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), and [annotations](#annotations). +A Collection Page _MAY_ have the following properties: [startIndex](#startIndex), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations). {: .note} @@ -237,7 +241,7 @@ The members of a Manifest are listed in the `items` property. The members of Man __Properties__
A Manifest _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), and [items](#items)

A Manifest _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), and [thumbnail](#thumbnail)

-A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [structures](#structures), and [annotations](#annotations). +A Manifest _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [canonical](#canonical), [via](#via), [structures](#structures), and [annotations](#annotations). {: .note} ### Container Classes @@ -254,7 +258,7 @@ For Timelines and Canvases, Annotations _MUST NOT_ target spatial or temporal po __Properties__
All Containers _MUST_ have the following properties: [id](#id), and [type](#type)

All Containers _SHOULD_ have the following properties: [label](#label), and [items](#items)

-All Containers _MAY_ have the following properites: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), and [annotations](#annotations). +All Containers _MAY_ have the following properites: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [canonical](#canonical), [via](#via), and [annotations](#annotations). {: .note} @@ -309,58 +313,92 @@ The following set of classes are defined by the W3C's [Web Annotation Data Model Annotations are used to associate content resources with Containers, as well as for transcriptions, commentary, tags and the association of other content. This provides a single, unified method for aligning information, and provides a standards-based framework for distinguishing parts of resources and parts of Canvases. -Annotations _MUST_ have their own HTTP(S) URIs, conveyed in the `id` property. The JSON-LD description of the Annotation _SHOULD_ be returned if the URI is dereferenced, according to the [Web Annotation Protocol][org-w3c-webanno-protocol]. +An Annotation _MUST_ have an HTTP(S) URI given in `id`. The JSON-LD description of the Annotation _SHOULD_ be returned if the URI is dereferenced, according to the [Web Annotation Protocol][org-w3c-webanno-protocol]. -When Annotations are used to associate content resources with a Canvas, the content resource is linked in the `body` of the Annotation. The URI of the Canvas _MUST_ be repeated in the `target` property of the Annotation, or the `source` property of a Specific Resource used in the `target` property. +When Annotations are used to associate content resources with a Canvas, the content resource is linked in the `body` of the Annotation. The URI of the Canvas _MUST_ be repeated in the `target` property of the Annotation, or the `source` property of a Specific Resource used in the `target` property. Content that is to be rendered as part of the Container _MUST_ be associated by an Annotation that has the `motivation` value `painting`. -Content that is to be rendered as part of the Container _MUST_ be associated by an Annotation that has the `motivation` value `painting`. +Annotations _SHOULD NOT_ use the `bodyValue` property defined by the Web Annotation Data Model, but instead use the more consistent TextualBody class. -Note that the Web Annotation data model defines different patterns for the `value` property compared to IIIF, when used within an Annotation. The `value` of a Textual Body or a Fragment Selector, for example, are strings rather than JSON objects with languages and values. Care must be taken to use the correct string form in these cases. +__Properties__
+An Annotation _MUST_ have the following properties: [id](#id), [type](#type), [target](#target), [motivation](#motivation).

+An Annotation _SHOULD_ have the following properties: [body](#body).

+An Annotation _MAY_ have the following properties: [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [provides](#provides), [behavior](#behavior), [timeMode](#timeMode), [stylesheet](#stylesheet), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [canonical](#canonical), and [via](#via).

+{: .note} #### Annotation Collection -`"type": "AnnotationCollection"` +> `"type": "AnnotationCollection"` Annotation Collections allow groups of Annotations to be recorded. For example, all of the English translation Annotations of a medieval French document could be kept separate from the transcription or an edition in modern French, or the director's commentary on a film can be separated from the script. -Annotation Collections _MUST_ have a URI, and it _SHOULD_ be an HTTP(S) URI. They _SHOULD_ have a `label` and _MAY_ have any of the other descriptive, linking or rights properties. +Annotation Collections _MUST_ have an HTTP(S) URI. The JSON-LD description _SHOULD_ be returned if the URI is dereferenced. -Annotation Collections are paged rather than enumerated. The first page of items is linked using the `first` property, and the last page with the `last` property. The pages link to the next and previous pages in a chain, using the `next` and `prev` properties respectively. +Annotation Collections are always paged using `first` and `last`, rather than `items` as with IIIF Collections. + +__Properties__
+An Annotation Collection _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), [first](#first), and [last](#last).

+An Annotation Collection _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail).

+An Annotation Collection _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [first](#first), [last](#last), [total](#total), [canonical](#canonical), [via](#via), and [annotations](#annotations). +{: .note} #### Annotation Page -`"type": "AnnotationPage"` +> `"type": "AnnotationPage"` An ordered list of Annotations, typically associated with a Container, but may be referenced from other types of resource as well. Annotation Pages enumerate and order lists of Annotations, in the same way that Collection Pages order lists of Manifests and Collections within the containing Collection. -An Annotation Page _MUST_ have an HTTP(S) URI given in `id`, and _MAY_ have any of the other properties defined in this specification or the Web Annotation specification. The Annotations are listed in the `items` property of the Annotation Page. +An Annotation Page _MUST_ have an HTTP(S) URI given in `id`. The Annotations are listed in the `items` property of the Annotation Page. -Annotations are embedded within an Annotation Page in the `items` property. - -__Incompatibility Warning__
-The definition of `label` in the Web Annotation specification does not produce JSON conformant with the structure defined in this specification for languages. Given the absolute requirement for internationalized labels and the strong desire for consistently handling properties, the `label` property on Annotation model classes does not conform to the string requirement of the Web Annotation Data Model. This [issue has been filed with the W3C][github-webanno-437] and will hopefully be addressed in a future version of the standard. -{: .warning} +__Properties__
+An Annotation Page _MUST_ have the following properties: [id](#id), [type](#type), and [items](#items)

+An Annotation Page _SHOULD_ have the following properties: [next](#next), [prev](#prev), and [partOf](#partOf)

+An Annotation Page _MAY_ have the following properties: [label](#label), [startIndex](#startIndex), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations). +{: .note} #### Specific Resource -`"type": "SpecificResource"` +> `"type": "SpecificResource"` -A Specific Resource is a resource in the context of an Annotation. They are used to record further properties or relationships needed to understand the particular contextual use, such as which part of the resource is used or how it should be rendered. In IIIF, the Specific Resource model from the Web Annotation Data Model has some additional properties beyond those defined by the W3C, such as `transform`. +A Specific Resource is a resource in the context of an Annotation. They are used to record further properties or relationships needed to understand the particular contextual use, such as which part of the resource is used or how it should be rendered. In IIIF, the Specific Resource model from the Web Annotation Data Model has some additional properties beyond those defined by the W3C, such as `transform` and `position`. + +A Specific Resource _MUST_ have an HTTP(S) URI given in `id`. This allows for it to be addressed by other parts of the model, such as Content State Annotations. + +__Properties__
+A Specific Resource _MUST_ have the following properties: [id](#id), [type](#type), [source](#source)

+A Specific Resource _SHOULD_ have the following properties: [selector](#selector)

+A Specific Resource _MAY_ have the following properties: [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

+{: .note} #### Textual Body -`"type": "TextualBody"` +> `"type": "TextualBody"` A Textual Body is an embedded resource within an Annotation that carries, as the name suggests, a text as the body of the Annotation. It is defined by the Web Annotation Data Model, and this specification defines a new property for `position` that allows it to be positioned within a Container. +A Textual Body _MUST_ have an HTTP(S) URI given in `id`. This allows for it to be addressed by other parts of the model, such as Content State Annotations. + +__Properties__
+A Textual Body _MUST_ have the following properties: [id](#id), [type](#type), [value](#value)

+A Specific Resource _MAY_ have the following properties: [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [format](#format), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

+{: .note} + + #### Choice -`"type": "Choice"` +> `"type": "Choice"` + +A Choice is a Web Annotation construction that allows one entry from a list to be selected for processing or display. This specification allows `behavior` and other properties to be added to a Choice to influence how it is processed. -A Choice is a Web Annotation construction that allows one entry from a list to be selected for processing or display. This specification allows `behavior` to be added to a Choice to influence how it is processed. +A Choice _MUST_ have an HTTP(S) URI given in `id`. It _SHOULD_ have a `label` in order to present the choice to the user, along with its items. This allows for it to be addressed by other parts of the model, such as Content State Annotations. + +__Properties__
+A Choice _MUST_ have the following properties: [id](#id), [type](#type), [items](#items)

+A Choice _SHOULD_ have the following properties: [label](#label)

+A Choice _MAY_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [behavior](#behavior), and [seeAlso](#seeAlso).

+{: .note} ### Content Resources @@ -378,12 +416,6 @@ If there is a need to distinguish between content resources, then the resource _ Containers _MAY_ be treated as content resources for the purposes of annotating on to other Containers. In this situation, the Container _MAY_ be [embedded][prezi30-terminology] within the Annotation, be a reference within the same Manifest, or require dereferencing to obtain its description. -### Audio Content - - - - - ### Selectors The Web Annotation Data Model defines several Selectors, which describe how to find a specific segment of that resource to be used. As noted, the nature of Selectors are dependent on the type of resources that they select out of, and the methods needed for those descriptions will vary. The Selectors from the Web Annotation Data Model and other sources can be used within the IIIF Data Model. This specification defines additional Selector classes for use. @@ -822,6 +854,10 @@ TODO: Address https://github.com/IIIF/api/issues/2318 { "behavior": [ "auto-advance", "individuals" ] } ``` +### canonical +{: #canonical} + + ### color {: #color} @@ -1670,10 +1706,8 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ### source {: #source} -A Content Resource that is used as the souce of audio information in an Audio resource. The value _MUST_ be a Content Resource with the `id`, `type` properties. -* Audio resources _MUST_ have the `source` property.
- Clients _SHOULD_ process the `source` property on an Audio resource. + ### start {: #start} @@ -1742,6 +1776,14 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ] } ``` + +### styleClass +{: #styleClass} + +### stylesheet +{: #stylesheet} + + ### summary {: #summary} @@ -1905,8 +1947,7 @@ FIXME: possible values are 'm' and 's' and 'relative'. Is relative always 0-1.0 ### value - -metadata: +within metadata: {label: value: {"en": ["foo"]}} @@ -1922,9 +1963,15 @@ The value _MUST_ be a floating point number. FIXME: use scoped context for UnitValue to change the meaning of `value` -### value (WktSelector) +### value (WktSelector, TextualBody) + +FIXME: string value! + + +### via + + -FIXME: another value value! ### viewingDirection {: #viewingDirection} @@ -2067,6 +2114,14 @@ There are some common terms used in more than one JSON-LD context document. Ever There is one property that is in direct conflict - the `label` property is defined by both and is available for every resource. The use of `label` in IIIF follows modern best practices for internationalization by allowing the language to be associated with the value using the language map construction [described above][prezi30-languages], also allowing multiple languages to be used. The Web Annotation Data Model uses it only for [Annotation Collections][prezi30-annocoll], and mandates the format is a string. For this property, the API overrides the definition from the Annotation model to ensure that labels can consistently be represented in multiple languages. +__Incompatibility Warning__
+The definition of `label` in the Web Annotation specification does not produce JSON conformant with the structure defined in this specification for languages. Given the absolute requirement for internationalized labels and the strong desire for consistently handling properties, the `label` property on Annotation model classes does not conform to the string requirement of the Web Annotation Data Model. This [issue has been filed with the W3C][github-webanno-437] and will hopefully be addressed in a future version of the standard. +{: .warning} + + +### FIXME: value, value, and value + + The following properties are defined by both, and the IIIF representation is more specific than the Web Annotation Data Model but are not in conflict, or are never used on the same resource: * `homepage`: In IIIF the home page of a resource is represented as a JSON object, whereas in the Web Annotation Data Model it can also be a string. From 54737e3020065557db96cb14841522bea9705909 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 4 Apr 2025 21:02:17 -0400 Subject: [PATCH 066/192] more class updates --- source/presentation/4.0/model.md | 91 +++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 24 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 3fd81106d..9f9f02585 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -403,33 +403,40 @@ A Choice _MAY_ have the following properties: [metadata](#metadata), [summary](# ### Content Resources -Content resources are resources on the Web such as images, audio, video, or text which can be associated with a Container via an Annotation, or provide a representation of any resource. +Content Resources are resources on the Web such as images, audio, video, 3d models, or text which can be associated with a Container via an Annotation, or be used with `thumbnail`, `rendering` or similar properties. -Content resources _MUST_ have an `id` property, with the value being the URI at which the resource can be obtained. +Content Resources _MUST_ have an HTTP(s) given in `id`. It _MUST_ be able to be dereferenced to retrieve the representation of the Content Resource. -The type of the content resource _MUST_ be included, and _SHOULD_ be taken from the table listed under the definition of `type`. The `format` of the resource _SHOULD_ be included and, if so, _SHOULD_ be the media type that is returned when the resource is dereferenced. The `profile` of the resource, if it has one, _SHOULD_ also be included. +If the Content Resource is an Image, and a IIIF Image service is available for it, then the `id` property of the Content Resource _MAY_ be a complete URI to any particular representation supported by the Image Service, such as `https://example.org/image1/full/1000,/0/default.jpg`, but _MUST NOT_ be just the URI of the Image Service. The Image _SHOULD_ have the service referenced from it using the `service` property. -If the content resource is an Image, and a IIIF Image service is available for it, then the `id` property of the content resource _MAY_ be a complete URI to any particular representation supported by the Image Service, such as `https://example.org/image1/full/1000,/0/default.jpg`, but _MUST NOT_ be just the URI of the IIIF Image service. Its `type` value _MUST_ be the string `Image`. Its media type _MAY_ be listed in `format`, and its height and width _MAY_ be given as integer values for `height` and `width` respectively. The Image _SHOULD_ have the service [referenced][prezi30-terminology] from it using the `service` property. - -If there is a need to distinguish between content resources, then the resource _SHOULD_ have the `label` property. +If there is a need to distinguish between Content Resources, then the resource _SHOULD_ have the `label` property. Containers _MAY_ be treated as content resources for the purposes of annotating on to other Containers. In this situation, the Container _MAY_ be [embedded][prezi30-terminology] within the Annotation, be a reference within the same Manifest, or require dereferencing to obtain its description. +__Properties__
+A Content Resource _MUST_ have the following properties: [id](#id), and [type](#type)

+A Content Resource _SHOULD_ have the following properties: [label](#label)

+A Content Resource _MAY_ have the following properties: [height](#height), [width](#width), [duration](#duration), [language](#language), [format](#format), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [profile](#profile), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

+{: .note} + ### Selectors The Web Annotation Data Model defines several Selectors, which describe how to find a specific segment of that resource to be used. As noted, the nature of Selectors are dependent on the type of resources that they select out of, and the methods needed for those descriptions will vary. The Selectors from the Web Annotation Data Model and other sources can be used within the IIIF Data Model. This specification defines additional Selector classes for use. -#### Point Selector -`"type": "PointSelector"` +#### Point Selector -There are common use cases in which a point, rather than a range or area, is the target of the Annotation. For example, putting a pin in a map should result in an exact point, not a very small rectangle. Points in time are not very short durations, and user interfaces should also treat these differently. This is particularly important when zooming in (either spatially or temporally) beyond the scale of the frame of reference. +> `"type": "PointSelector"` +There are common use cases in which a point, rather than a range or area, is the target of the Annotation. For example, putting a pin in a map should result in an exact point, not a very small rectangle. Points in time are not very short durations, and user interfaces should, equally, treat these differently. This is particularly important when zooming in (either spatially or temporally) beyond the scale of the frame of reference. -* FIXME: either supply instant, or all applicable dimensions for the source - list properties here like manifest +If `instant` is not supplied, and the target resource has a `duration`, the selector is interpreted as targeting the entire duration. If `instant` is supplied, but no spatial point, the selector is interpreted as targeting the entire spatial aspect of the resource. +__Properties__
+A Point Selector _MUST_ have the following properties: [id](#id), and [type](#type)

+A Point Selector _MAY_ have the following properties: [x](#x), [y](#y), [z](#z), and [instant](#instant).

+{: .note} ```json { @@ -445,11 +452,15 @@ There are common use cases in which a point, rather than a range or area, is the #### WKT Selector -`"type": "WktSelector"` +> `"type": "WktSelector"` Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MultiPolygon. Additional types, such as CIRCULARSTRING may also be supported. -WKT Selectors _MUST_ have a `value` property, which is the WKT string that defines the geometry to be selected. +The text representation is given in the `value` property of the selector. + +__Properties__
+A WKT Selector _MUST_ have the following properties: [id](#id), [type](#type), and [value](#value). +{: .note} ```json { @@ -459,15 +470,15 @@ WKT Selectors _MUST_ have a `value` property, which is the WKT string that defin } ``` - - - #### Audio Content Selector -`"type": "AudioContentSelector"` +> `"type": "AudioContentSelector"` Video content resources consist of both visual and audio content within the same bit-level representation. There are situations when it is useful to refer to only one aspect of the content – either the visual or the audio, but not both. For example, an Annotation might associate only the visual content of a video that has spoken English in the audio, and an audio file that has the translation of that content in Spanish. The Audio Content Selector selects all of the audio content from an A/V content resource, and may be further refined with subsequent selectors to select a segment of it. +__Properties__
+An Audio Content Selector _MUST_ have the following properties: [id](#id), and [type](#type). +{: .note} ```json { @@ -479,7 +490,7 @@ Video content resources consist of both visual and audio content within the same #### Visual Content Selector -`"type": "VisualContentSelector"` +> `"type": "VisualContentSelector"` Similar to Audio Content Selectors, Visual Content Selectors select the visual aspects of the content of an A/V content resource. They may be further refined by subsequent selectors that select an area or temporal segment of it. @@ -490,14 +501,20 @@ Similar to Audio Content Selectors, Visual Content Selectors select the visual a } ``` +__Properties__
+A Visual Content Selector _MUST_ have the following properties: [id](#id), and [type](#type). +{: .note} + #### Animation Selector -`"type": "AnimationSelector"` +> `"type": "AnimationSelector"` -More interactive content resources, such as 3D models, may have animations or similar features that can be _activated_ by user interaction. For example, a model of a box might have an animation that opens the lid and a second animation that closes the lid. In order to activate those animations, they need to be selectable, and thus the specification defines an Animation Selector. +More interactive content resources, such as 3D models, may have animations or similar features that can be _activated_ by user interaction. For example, a model of a box might have an animation that opens the lid and a second animation that closes the lid. In order to activate those animations, they need to be selectable, and thus the specification defines an Animation Selector. The identity of the activatable aspect is given in the `value` property. -Animation Selectors _MUST_ have a `value` property, which is the identity of the animation in whichever form is used by the source resource. +__Properties__
+An Animation Selector _MUST_ have the following properties: [id](#id), [type](#type), and [value](#value). +{: .note} ```json { @@ -509,16 +526,38 @@ Animation Selectors _MUST_ have a `value` property, which is the identity of the #### IIIF Image API Selector -`"type": "ImageApiSelector"` +> `"type": "ImageApiSelector"` -FIXME: write this +The Image API Selector is used to describe the operations available via the Image API in order to retrieve a particular image representation. In this case the resource is the abstract image as identified by the [IIIF Image API][image-api] base URI plus identifier, and the retrieval process involves adding the correct parameters after that base URI. +The Image API Selector has properties following the parameters from the API, and record the values needed to fill out the URL structure in the request. If the property is not given, then a default should be used. +| Property | Default | Description | +| -------- | --------- | ----------------------------------------------------- | +| region | "full" | The string to put in the region parameter of the URI. | +| size | "max" | The string to put in the size parameter of the URI. If used with a version 2.0 Image API server, the default should be considered to be "full". | +| rotation | "0" | The string to put in the rotation parameter of the URI. Note that this must be a string in order to allow mirroring, for example "!90". | +| quality | "default" | The string to put in the quality parameter of the URI. | +| format | "jpg" | The string to put in the format parameter of the URI. Note that the '.' character is not part of the format, just the URI syntax. | +{: .api-table} +__Properties__
+A IIIF Image API Selector _MUST_ have the following properties: [id](#id), [type](#type).

+A IIIF Image API Selector _MAY_ have the following properties: [region](#region), [size](#size), [rotation](#rotation), [quality](#quality), [format](#format). +{: .note} + +```json +{ + "id": "https://example.org/selectors/6", + "type": "ImageApiSelector", + "region": "0,0,256,256", + "rotation": "90" +} +``` ### Range -`"type": "Range"` +> `"type": "Range"` Ranges are used to represent structure within a Manifest beyond the default order of the Containers in the `items` property. @@ -698,6 +737,10 @@ A UnitValue expresses a quantity through a numerical value and associated unit o `"type": "UnitValue"` + + + + ## Properties From 4d212f9d0a6b9244a370470068b1ad2959790aff Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 4 Apr 2025 21:47:04 -0400 Subject: [PATCH 067/192] more class updates --- source/presentation/4.0/model.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 9f9f02585..88f394b3a 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -561,18 +561,28 @@ A IIIF Image API Selector _MAY_ have the following properties: [region](#region) Ranges are used to represent structure within a Manifest beyond the default order of the Containers in the `items` property. -Ranges _MUST_ have URIs and they _SHOULD_ be HTTP(S) URIs. Top level Ranges are [embedded][prezi30-terminology] or externally [referenced][prezi30-terminology] within the Manifest in a `structures` property. These top level Ranges then embed or reference other Ranges, Containers or parts of Containers in the `items` property. Each entry in the `items` property _MUST_ be a JSON object, and it _MUST_ have the `id` and `type` properties. If a top level Range needs to be dereferenced by the client, then it _MUST NOT_ have the `items` property, such that clients are able to recognize that it should be retrieved in order to be processed. +Ranges _MUST_ have an HTTP(s) given in `id`. Top level Ranges are embedded or externally referenced within the Manifest in a `structures` property. These top level Ranges then embed or reference other Ranges, Containers or parts of Containers in the `items` property. Each entry in the `items` property _MUST_ be a JSON object, and it _MUST_ have the `id` and `type` properties. If a top level Range needs to be dereferenced by the client, then it _MUST NOT_ have the `items` property, such that clients are able to recognize that it should be retrieved. The included Containers and parts of Containers need not be contiguous or in the same order as in the Manifest's `items` property or any other Range. Examples include newspaper articles that are continued in different sections, a chapter that starts half way through a page, or time segments of a single canvas that represent different sections of a piece of music. -Ranges _MAY_ link to an Annotation Collection that has the content of the Range using the `supplementary` property. The [referenced][prezi30-terminology] Annotation Collection will contain Annotations that target the Containers within the Range and link content resources to those Containers. +Ranges _MAY_ link to an Annotation Collection that has the content of the Range using the `supplementary` property. The referenced Annotation Collection will contain Annotations that target the Containers within the Range and link content resources to those Containers. + +__Properties__
+A Range _MUST_ have the following properties: [id](#id), and [type](#type).

+A Range _SHOULD_ have the following properties: . +A Range _MAY_ have the following properties: . +{: .note} + ### Scene Components +The following classes are only usable within Scenes. + + #### Cameras -A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. +A Camera provides a view of a region of a Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the Camera to render that region. The size and aspect ratio of the viewport is client and device dependent. FIXME: If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. From a967c3ebec9bbc5908bede9702c31e4106af1779 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Wed, 16 Apr 2025 17:40:47 +0100 Subject: [PATCH 068/192] Temporarily disabling internal link checking --- .github/workflows/preview.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 90595a6d3..740c20086 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -32,10 +32,10 @@ jobs: # A workflow run is made up of one or more jobs that can run sequentially run: bundle exec rake build:preview - name: Test html run: bundle exec rake test:html - - name: Test internal links - run: bundle exec rake test:links:internal - - name: Test *iiif.io* links - run: bundle exec rake test:links:iiif +# - name: Test internal links +# run: bundle exec rake test:links:internal +# - name: Test *iiif.io* links +# run: bundle exec rake test:links:iiif - name: Spec tests run: bundle exec rake api:spec - name: Create GitHub deployment # Deploy to Preview site From 661a867311dba7082ca8653f81f51264f5d22cc3 Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Wed, 23 Apr 2025 11:34:13 -0500 Subject: [PATCH 069/192] Add interactionMode description to model --- source/presentation/4.0/model.md | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 88f394b3a..19086da77 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1113,18 +1113,34 @@ The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. ### interactionMode {: #interactionMode} -*within* the Scene, whereas viewingDirection and behavior are across containers. +A set of features that guide or limit user interaction with Cameras viewing 3D content within a Scene that the publisher of the content would prefer the client to use when presenting the resource. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. The client _SHOULD_ use `interactionMode` to determine the user experience features and approaches whereby users are permitted to change or adjust Camera perspectives when viewing content within a Scene (e.g., orbiting around the scene or locking the user to a first-person perspective). -* Containers _MAY_ have the `interactionMode` +When more than one interaction mode is present, the client _SHOULD_ pick the first interaction mode that the client is capable of supporting. -Table here with values +For interaction modes that involve a Camera orbiting around a target point, the target point _SHOULD_ be the same as the Camera's `lookAt` property. +The value _MUST_ be an array of strings. + +* A Container (scene?) _MAY_ have the `interactionMode` property.
+ Clients _SHOULD_ process `interactionMode` on a Container. +* Other types of resource _MUST NOT_ have the `interactionMode` property.
+ Clients _SHOULD_ ignore `interactionMode` on other types of resource. + +| Value | Description | +| ----- | ----------- | +| `locked` | Camera is locked. User interaction _MUST NOT_ modify Camera. | +| `orbit` | Camera orbits around a target point in response to user interaction. A client _MAY_ allow user interacton to truck, dolly, or zoom Camera. | +| `hemisphere-orbit` | Camera orbits around a target point in response to user interaction, but orbital freedom is limited to a hemisphere. A client _MAY_ allow Camera truck, dolly, or zoom. | +| `free` | Camera mimics a first-person perspective. User interaction pans or tilts Camera perspective, trucks Camera position, and/or dollies or zooms Camera. | +| `free-direction` | Camera mimics a first-person perspective, but Camera position is fixed. User interaction pans or tilts Camera perspective. | +{: .api-table #table-interaction} -locked -orbit -hemisphere-orbit -free -free-direction +?: Allow dolly/zoom in `locked` or `free-direction`? + +{% include api/code_header.html %} +``` json-doc +{ "interactionMode": [ "hemisphere-orbit", "orbit" ] } +``` other examples: no-zoom, no-scrub, rti-mode ### items From af55f9d1032a5b34f4160a11422dd8500fca041e Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Wed, 23 Apr 2025 13:28:16 -0500 Subject: [PATCH 070/192] Update interactionMode language --- source/presentation/4.0/model.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 19086da77..c5eae9a54 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1113,7 +1113,7 @@ The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. ### interactionMode {: #interactionMode} -A set of features that guide or limit user interaction with Cameras viewing 3D content within a Scene that the publisher of the content would prefer the client to use when presenting the resource. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. The client _SHOULD_ use `interactionMode` to determine the user experience features and approaches whereby users are permitted to change or adjust Camera perspectives when viewing content within a Scene (e.g., orbiting around the scene or locking the user to a first-person perspective). +A set of features that guide or limit user interaction with content within a Container that the publisher of the content would prefer the client to use when presenting the resource. This specification defines values in the table below that guide interactions with Cameras within a Scene. Other values for other Container types or specifying other interaction modes for 3D content may be defined externally as an [extension][prezi30-ldce]. For interaction modes pertaining to Cameras within a Scene, the client _SHOULD_ use `interactionMode` to determine the user experience features and approaches whereby users are permitted to change or adjust Cameras when viewing content within a Scene (e.g., orbiting around the scene or locking the user to a first-person perspective). When more than one interaction mode is present, the client _SHOULD_ pick the first interaction mode that the client is capable of supporting. @@ -1121,7 +1121,7 @@ For interaction modes that involve a Camera orbiting around a target point, the The value _MUST_ be an array of strings. -* A Container (scene?) _MAY_ have the `interactionMode` property.
+* A Container _MAY_ have the `interactionMode` property.
Clients _SHOULD_ process `interactionMode` on a Container. * Other types of resource _MUST NOT_ have the `interactionMode` property.
Clients _SHOULD_ ignore `interactionMode` on other types of resource. @@ -1129,20 +1129,16 @@ The value _MUST_ be an array of strings. | Value | Description | | ----- | ----------- | | `locked` | Camera is locked. User interaction _MUST NOT_ modify Camera. | -| `orbit` | Camera orbits around a target point in response to user interaction. A client _MAY_ allow user interacton to truck, dolly, or zoom Camera. | -| `hemisphere-orbit` | Camera orbits around a target point in response to user interaction, but orbital freedom is limited to a hemisphere. A client _MAY_ allow Camera truck, dolly, or zoom. | +| `orbit` | Camera orbits around a target point in response to user interaction. | +| `hemisphere-orbit` | Camera orbits around a target point in response to user interaction, but orbital freedom is limited to a hemisphere. | | `free` | Camera mimics a first-person perspective. User interaction pans or tilts Camera perspective, trucks Camera position, and/or dollies or zooms Camera. | | `free-direction` | Camera mimics a first-person perspective, but Camera position is fixed. User interaction pans or tilts Camera perspective. | {: .api-table #table-interaction} -?: Allow dolly/zoom in `locked` or `free-direction`? - {% include api/code_header.html %} ``` json-doc { "interactionMode": [ "hemisphere-orbit", "orbit" ] } ``` - -other examples: no-zoom, no-scrub, rti-mode ### items {: #items} From 70c3e740e9897948134abff68f238804d6fddcf3 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 25 Apr 2025 16:19:20 -0400 Subject: [PATCH 071/192] update --- source/presentation/4.0/model.md | 48 ++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index c5eae9a54..477ec2266 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -102,7 +102,7 @@ Any of the properties in the API that can have multiple values _MUST_ always be Language _SHOULD_ be associated with strings that are intended to be displayed to the user for the `label` and `summary` properties, plus the `label` and `value` properties of the `metadata` and `requiredStatement` objects. -The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The script _SHOULD NOT_ be included in the tag, even though BCP 47 allows for this possibility. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. +The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The locale, script and other subtags _MAY_ be included. Clients _SHOULD_ process subtags when comparing the values with the user's provided preferences, however _MAY_ simply reduce all tags down to just the language, discarding everything after the first hyphen, and display all matching values. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. {% include api/code_header.html %} ``` json-doc @@ -454,7 +454,7 @@ A Point Selector _MAY_ have the following properties: [x](#x), [y](#y), [z](#z), > `"type": "WktSelector"` -Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MultiPolygon. Additional types, such as CIRCULARSTRING may also be supported. +Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MULTIPOLYGON. Additional types, such as CIRCULARSTRING may also be supported. The text representation is given in the `value` property of the selector. @@ -528,7 +528,7 @@ An Animation Selector _MUST_ have the following properties: [id](#id), [type](#t > `"type": "ImageApiSelector"` -The Image API Selector is used to describe the operations available via the Image API in order to retrieve a particular image representation. In this case the resource is the abstract image as identified by the [IIIF Image API][image-api] base URI plus identifier, and the retrieval process involves adding the correct parameters after that base URI. +The Image API Selector is used to describe the operations available via the IIIF Image API in order to retrieve a particular image representation. In this case the resource is the abstract image as identified by the [IIIF Image API][image-api] base URI plus identifier, and the retrieval process involves adding the correct parameters after that base URI. The Image API Selector has properties following the parameters from the API, and record the values needed to fill out the URL structure in the request. If the property is not given, then a default should be used. @@ -565,42 +565,47 @@ Ranges _MUST_ have an HTTP(s) given in `id`. Top level Ranges are embedded or ex The included Containers and parts of Containers need not be contiguous or in the same order as in the Manifest's `items` property or any other Range. Examples include newspaper articles that are continued in different sections, a chapter that starts half way through a page, or time segments of a single canvas that represent different sections of a piece of music. -Ranges _MAY_ link to an Annotation Collection that has the content of the Range using the `supplementary` property. The referenced Annotation Collection will contain Annotations that target the Containers within the Range and link content resources to those Containers. - __Properties__
A Range _MUST_ have the following properties: [id](#id), and [type](#type).

-A Range _SHOULD_ have the following properties: . -A Range _MAY_ have the following properties: . +A Range _SHOULD_ have the following properties: [label](#label), and [items](#items)

. +A Range _MAY_ have the following properties: [start](#start), [supplementary](#supplementary), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [canonical](#canonical), [via](#via), and [annotations](#annotations). {: .note} - ### Scene Components The following classes are only usable within Scenes. - #### Cameras A Camera provides a view of a region of a Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the Camera to render that region. The size and aspect ratio of the viewport is client and device dependent. -FIXME: If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. +If either the position or direction is not specified, then the position defaults to the origin of the Scene, and the direction defaults to pointing along the z axis towards negative infinity. -The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, (PERSPECTIVE) and a vertical projection angle that provides the top and bottom planes of the region. (viewHeight?) +__Properties__
+All Cameras _MUST_ have the following properties: [id](#id), and [type](#type).

+All Cameras _MAY_ have the following properties: [label](#label), [lookAt](#lookAt), [near](#near), and [far](#far) +{: .note} ##### Orthographic Camera -`"type": "OrthographicCamera"` +> `"type": "OrthographicCamera"` + +An Orthographic Camera removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera. -`OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera +__Properties__
+Orthographic Cameras _SHOULD_ have the following additional properties: [viewHeight](#viewHeight). +{: .note} ##### Perspective Camera -`"type": "PerspectiveCamera"` +> `"type": "PerspectiveCamera"` -`PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller +`PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller. + +The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region in the `fieldOfView` property. Properties... @@ -662,7 +667,10 @@ The Spot Light emits in the negative Y (-y) direction by default, but the orient #### Audio in Scenes Positional audio is supported through the use of Audio resources annotated into Scenes. -Audio resources _MUST_ have a `source` property that references an audio Content Resource, and _SHOULD_ have a `volume` property. +Audio resources _MUST_ have a `source` property that references an audio Content Resource, and _SHOULD_ have a `volume` property. Positional Audio classes are subclasses of SpecificResource. + +Volume is relative to the input audio source's volume. + ##### Ambient Audio @@ -684,6 +692,9 @@ Spot Audio emits a cone of sound from a single point in a given direction. The The Spot Audio emits in the negative Y (-y) direction by default, but the orientation of the sound can be altered by subsequent transforms. +Can have a Timeline as the source of the audio? + + ```json { "id": "https://example.org/iiif/spotAudio/1", @@ -697,8 +708,9 @@ The Spot Audio emits in the negative Y (-y) direction by default, but the orient "volume": { "type": "UnitValue", "unit": "relative", - "value": 2.0 - } + "value": 1.0 + }, + "transform": [] } ``` From ee74f6a92e1d3ea6cf15088b30c9425127097bc5 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 25 Apr 2025 16:55:53 -0400 Subject: [PATCH 072/192] minor updates --- source/presentation/4.0/model.md | 99 ++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 17 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 477ec2266..7c953dc18 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -598,6 +598,16 @@ __Properties__
Orthographic Cameras _SHOULD_ have the following additional properties: [viewHeight](#viewHeight). {: .note} +```json +{ + "id": "https://example.org/iiif/camera/1", + "type": "OrthographicCamera", + "near": 1.0, + "far": 100.0, + "viewHeight": 40.0 +} +``` + ##### Perspective Camera @@ -607,12 +617,14 @@ Orthographic Cameras _SHOULD_ have the following additional properties: [viewHei The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region in the `fieldOfView` property. -Properties... +__Properties__
+Perspective Cameras _SHOULD_ have the following additional properties: [fieldOfView](#fieldOfView). +{: .note} ```json { - "id": "https://example.org/iiif/camera/1", + "id": "https://example.org/iiif/camera/2", "type": "PerspectiveCamera", "near": 1.0, "far": 100.0, @@ -621,42 +633,95 @@ Properties... ``` #### Lights + +It is necessary for there to be a Light within a Scene that illuminates the objects. If no Light is provided by the Scene's description, then the client _MUST_ add a Light. + +This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. + +The specification defines four types of Light, below. + +__Properties__
+All Lights _MUST_ have the following properties: [id](#id), and [type](#type).

+All Lights _SHOULD_ have the following properties: [color](#color), and [intensity](#intensity).

+All Lights _MAY_ have the following properties: [label](#label). +{: .note} + ##### Ambient Light -`"type": "AmbientLight"` +> `"type": "AmbientLight"` -Ambient Light evenly illuminates all objects in the Scene, and does not have a direction or position. +Ambient Light evenly illuminates all objects in the Scene, and does not have a direction or position. It does not have any new properties. The Light itself _MUST_ be added into the scene at a specific position, however this is only such that editing interfaces can render the object to the user. + +```json +{ + "id": "https://example.org/iiif/light/1", + "type": "AmbientLight", + "color": "#F0A0F0", +} +``` ##### Directional Light -`"type": "DirectionalLight"` +> `"type": "DirectionalLight"` + +Directional Lights emit their light in a specific direction as if infinitely far away, and as such the light does not come from a specific position. The rays produced are all parallel. The Light itself _MUST_ be added into the scene at a specific position, however this is only such that editing interfaces can render the object to the user. -Directional Light emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. +The light is emitted in the negative Y (-y) direction by default, thus straight down, but the orientation of the light can be altered with `lookAt` or with a `RotationTransform`. -The light is emitted in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. +__Properties__
+Directional Lights _MAY_ have the following additional properties: [lookAt](#lookAt) +{: .note} + +```json +{ + "id": "https://example.org/iiif/light/2", + "type": "DirectionalLight", + "color": "#A0A0F0", + "lookAt": {"id": "https://example.org/iiif/annotations/models/1"} +} +``` ##### Point Light -`"type": "PointLight"` +> `"type": "PointLight"` + +Point Lights emit from a single point within the Scene in all directions. + +```json +{ + "id": "https://example.org/iiif/light/3", + "type": "PointLight", + "color": "#A0F0F0" +} +``` -Point Light emits from a single point within the Scene in all directions. ##### Spot Light -`"type": "SpotLight"` +> `"type": "SpotLight"` Spot Light emits a cone of light from a single point in a given direction. The Spot Light's `angle` property defines the radius of the cone. The Spot Light emits in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. +diagram of cone geometry showing how the angle of the cone is defined + +__Properties__
+Spot Lights _SHOULD_ have the following additional properties: [angle](#angle)

+Spot Lights _MAY_ have the following additional properties: [lookAt](#lookAt) +{: .note} + + + ```json { - "id": "https://example.org/iiif/spotLight/1", + "id": "https://example.org/iiif/spotlight/1", "type": "SpotLight", "angle": 15.0, "color": "#FFFFFF", "intensity": { + "id": "https://example.org/iiif/spotlight/1/value", "type": "UnitValue", "unit": "relative", "value": 0.5 @@ -674,19 +739,19 @@ Volume is relative to the input audio source's volume. ##### Ambient Audio -`"type": "AmbientAudio"` +> `"type": "AmbientAudio"` Ambient Audio emits equally throughout the Scene, and does not have a position or direction. ##### Point Audio -`"type": "PointAudio"` +> `"type": "PointAudio"` Point Audio emits from a single point in the Scene in all directions. ##### Spot Audio -`"type": "SpotAudio"` +> `"type": "SpotAudio"` Spot Audio emits a cone of sound from a single point in a given direction. The Spot Audio's `angle` property defines the radius of the cone. @@ -725,20 +790,20 @@ here are the rules about transforms? ##### Rotate Transform -`"type": "RotateTransform"` +> `"type": "RotateTransform"` A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 ##### Scale Transform -`"type": "ScaleTransform"` +> `"type": "ScaleTransform"` A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 ##### Translate Transform -`"type": "TranslateTransform"` +> `"type": "TranslateTransform"` A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 From 76b78f051ce1f0cc44b50cb6a23f9aed5f40e82a Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 9 May 2025 16:19:01 +0100 Subject: [PATCH 073/192] temporal and spatial scale in Prez4 model --- source/presentation/4.0/model.md | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 7c953dc18..0279e8efc 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1849,6 +1849,29 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re {: #source} +### spatialScale +{: #spatialScale} + +A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 metres wide. The value of `unit` _MUST_ always be `m`, i.e., metres. + + +{% include api/code_header.html %} +``` json-doc +{ + "type": "Scene", + + "spatialScale": { + "type": "UnitValue", + "value": 22.0, + "unit": "m" + } +} +``` + + * A Canvas _MAY_ have the `spatialScale` property.
+ Clients _SHOULD_ process `spatialScale` on a Canvas. + * A Scene _MAY_ have the `spatialScale` property.
+ Clients _SHOULD_ process `spatialScale` on a Scene. ### start @@ -1964,6 +1987,33 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert { "supplementary": { "id": "https://example.org/iiif/1/annos/1", "type": "AnnotationCollection" } } ``` +### temporalScale +{: #temporalScale} + +A single UnitValue that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `value` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ always be `s`, i.e., seconds. + + +{% include api/code_header.html %} +``` json-doc +{ + "type": "Canvas", + + "temporalScale": { + "type": "UnitValue", + "value": 1000, + "unit": "s" + } +} +``` + + * A Timeline _MAY_ have the `temporalScale` property.
+ Clients _MAY_ process `temporalScale` on a Timeline. + * A Canvas _MAY_ have the `temporalScale` property.
+ Clients _MAY_ process `temporalScale` on a Canvas. + * A Scene _MAY_ have the `temporalScale` property.
+ Clients _MAY_ process `temporalScale` on a Scene. + + ### thumbnail {: #thumbnail} From 6eefe1fd4789620cec3710cb2c1e4ee209acaadb Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 9 May 2025 16:38:33 +0100 Subject: [PATCH 074/192] phys dims in index.md --- source/presentation/4.0/index.md | 38 +++++--------------------------- 1 file changed, 5 insertions(+), 33 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 1c4f43d0d..632cea93b 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1478,43 +1478,15 @@ See above... ## Conveying Physical Dimensions -(why is this important!?) +It is often important to know how big something is, especially when comparing objects together. The dimensions of a Canvas, or the pixel density of a photograph, are unrelated to the real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. -(move the props to vocab doc) +The `spatialScale` property of a Canvas or Scene provides a corresponding real-world scale for a unit of the Canvas or Scene coordinate system, allowing clients to provide scale information to users, for example by an on-screen virtual ruler. In a 2-up viewer, a client could scale two views to convey the true relative sizes of two objects. +The value of `spatialScale` is a `UnitValue` (ref) that always has the value "m", i.e., metres. If source size metadata is machine readable (or parse-able) in other measurement systems (e.g., feet and inches) then it should be converted to metres for use in `spatialScale`. Publishers may wish to present the original given measure (e.g., from catalogue metadata) in a `metadata` field for context. -Continental drift simulation example - -``` -{ - "type": "Scene", - - "spatialScale": { - "type": "UnitValue", - "value": 22.0, - "unit": "m" - }, - - // this would be rarely used - "temporalScale": { - "type": "UnitValue", - "value": 0.00001, - "unit": "s" - } - -} -``` - -`factor` Required A floating point ratio. -`units` Required A real-world measuring unit. Always seconds for temporalScale. Possible values for spatialScale include: "m", "ft". (is that it?) - -For a Canvas, it's the physical "size" of each cartesian integer unit. -For a Scene, it's the physical size of the unit vector. -For a timeline it's the ratio of time in the recording to time in the real world. - - -(define props in the Vocabulary doc) +The Presentation API also offers a corresponding `temporalScale` property for the `duration` dimension of a Container, when 1 second in the Container does not correspond to 1 second of real time. This is useful for speeded-up or slowed-down audio or video. +An extreme example of both physical dimension properties together is a Canvas showing an animation of continental drift over the course of Earth history, where the spatialScale could convey that each Canvas unit is several thousand metres, and each second of the Canvas `duration` is several million years. From 41a97e5c9897622ce832cb9e364d523294d1e4dd Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 9 May 2025 18:14:20 +0100 Subject: [PATCH 075/192] Rationalise ### headings in P4 index --- source/presentation/4.0/index.md | 91 +++++++++++++------------------- 1 file changed, 36 insertions(+), 55 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 1c4f43d0d..3174f957f 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -191,14 +191,10 @@ comment annotation about part of the previous example's Canvas using FragmentSel ``` -## Presenting Content Resources -This section of the specification uses the use cases listed in the introduction to demonstrate the use of the IIIF Presentation API and introduce additional features. +## Image Content - -### Images - -#### Use Case 1: Artwork +### Use Case 1: Artwork This example is a Manifest with one Canvas, with an image of an artwork "painted" onto the Canvas. It demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. @@ -213,7 +209,7 @@ label, summary, metadata, rights, provider, homepage, thumbnail Notice that the painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. -#### Example 2: Book +### Example 2: Book This example is a Manifest with multiple Canvases, each of which represents a page of a book. It demonstrates the use of the `behavior` property to indicate to a client that the object is _paged_: this helps a client generate the correct user experience. The `viewingDirection` property indicates that the book is read left-to-right. In this case, the property is redundant as `left-to-right` is the default value. The Manifest has a `rendering` property linking to a PDF representation; typically a client would offer this as a download or "view as" option. The `start` property is used to tell a client to initialize the view on a particular Canvas, useful if the digitized work contains a large amount of irrelevant front matter or blank pages. The `requiredStatement` is a message that a client MUST show to the user when presenting the Manifest. @@ -224,9 +220,9 @@ requiredStatement, behavior, viewingDirection, (no Ranges), rendering - PDF vers -### Audio and Video +## Audio and Video -#### Example: a 45 single with one Timeline per song/side +### Example: a 45 single with one Timeline per song/side This example is a Manifest with two Timelines, each of which represent a temporal extent during which a song is played. As in most cases, the Timeline `duration` is the same length as that of Content Resource painted into it. This example is a recording digitized from a 45 RPM 7 inch single. It demonstrates the use of `format` for the audio files' content type, `language` (One song is in English and one is in German), `behavior` with value "autoPlay" that tells a client to automatically advance to the second Timeline after playing the first, `annotations` that link to Annotation Pages of annotations with the motivation `supplementing` that provide the lyrics (one example is given afterwards) - and an `accompanyingContainer` that carries a picture of the single's cover that is shown while the songs are playing. @@ -242,7 +238,7 @@ duration, autoPlay, format, annotations (transcript), language, accompanyingCont ... ``` -#### Example: a movie with subtitles +### Example: a movie with subtitles This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, the `timeMode` property ..., and `placeholderContainer` that provides a poster image to show in place of the video file before the user initiates playback. @@ -264,7 +260,7 @@ duration, behavior=autoplay, format, Choice of video 720p, 4K? (forward ref), ti Sometimes, two different formats derived from the same source may have slightly different durations, perhaps a few milliseconds out. What to do... -### 3D +## 3D 3D Content Resources are painted into Scenes. @@ -273,7 +269,7 @@ Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). -#### Example: Static 3D Model of a Spacesuit +### Example: Static 3D Model of a Spacesuit This example is a Manifest with a single Scene, with a single model of a space suit painted at the Scene's origin. @@ -302,7 +298,7 @@ backgroundColor: #000 point selector for positioning -#### Example: 3D Model of a Chessboard +### Example: 3D Model of a Chessboard Chessboard is a Canvas with image more than one model @@ -318,7 +314,7 @@ interactionMode -#### Merge the below into the examples or into model +### Merge the below into the examples or into model This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). @@ -517,9 +513,9 @@ Todo add example -#### Scene-Specific Resources +### Scene-Specific Resources -##### Camera +#### Camera A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. @@ -559,7 +555,7 @@ The first Camera defined and not hidden in a Scene is the default Camera used to -##### Light +#### Light This specification defines four types of Light: @@ -718,33 +714,20 @@ When a Scene is nested into another Scene, the `backgroundColor` of the Scene to -## Annotations and State - - - -### Example: Multi-spectral Images with Comments - +## Annotations -### Annotations - -non-painting - -Comments, tags, etc -transcripts (and back ref to OCR on images etc) +### Comment Annotations -#### Comment Annotations +### Choice of Alternative Resources +Example: Multi-spectral Images with Comments -#### Choice of Alternative Resources -Multispectral here - - -#### Embedded Content +### Embedded Content e.g., painting TextualBody on Canvas @@ -755,34 +738,34 @@ It is important to be able to position the textual body of an annotation within -#### Non Rectangular Segments +### Non Rectangular Segments SvgSelector - move to SpecificResource too ^^ -#### Style +### Style Move to SpecificResource -#### Rotation +### Rotation -#### Hotspot Linking and Activation +### Hotspot Linking and Activation Move to SpecificResource -#### Annotation Page +### Annotation Page "Overlapping elements with a larger z-index cover those with a smaller one." link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index -#### Annotation Collection +### Annotation Collection deal with this: https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 @@ -865,10 +848,8 @@ partOf - -## State - -### Content State +## Content State A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: @@ -982,14 +963,14 @@ Annotations with the motivation `contentState` are referred to as _content state Content States are used for the following applications: -#### Load a particular view of a resource or group of resources +### Load a particular view of a resource or group of resources In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the Content State Protocol API 2.0 specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. -#### Load a particular view of some resource and modify it +### Load a particular view of some resource and modify it In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: @@ -1033,7 +1014,7 @@ TODO: what is the processing algorithm for applying incoming `hidden` ? When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. -#### Modify the Container in a particular context +### Modify the Container in a particular context The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. @@ -1201,19 +1182,19 @@ Use of `scope` is permitted in annotations on any Container type, not just Scene -#### The `sequence` behavior +### The `sequence` behavior // Is this right? Language... While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. -#### Content States on Manifests +### Content States on Manifests When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. // Is there some overlap here with Range? -#### Processing Content States in Scopes: reset +### Processing Content States in Scopes: reset When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. @@ -1291,17 +1272,17 @@ Before applying the content state to the Scene, the client should reset the Scen // I am assuming reset is always true except in `linear-nav` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... -#### Contribute additional information permanently +### Contribute additional information permanently Rerum inbox scenario - should be covered in CS2 protocol -#### activating - animation and interactions +### activating - animation and interactions Annotations with the motivation `activating` are referred to as _activating_ annotations. There are two uses of `activating` annotations: -##### Triggering a content state +#### Triggering a content state An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. @@ -1375,7 +1356,7 @@ The activating annotation is provided in a Container's `annotations` property. I -##### Triggering a named animation in a model +#### Triggering a named animation in a model Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. @@ -1463,7 +1444,7 @@ if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody There is a more general rule here! -#### reset +### reset See above... From 829d911e6893b567d4feec97932728a28280ceee Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 19 May 2025 18:22:27 +0100 Subject: [PATCH 076/192] expand the index.md text for containers and annotation --- source/presentation/4.0/index.md | 220 +++++++++++++++++++++++++++---- 1 file changed, 197 insertions(+), 23 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 3174f957f..9fa43a2c9 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -53,27 +53,29 @@ __Previous Version:__ [3.0][prezi30] ## Introduction -Presentation, the clue is in the name +The purpose of the IIIF Presentation API specification is to provide a [model](model) and JSON serialization format of that model. +It provides a document format - the IIIF Manifest - for cultural heritage organizations (and anyone else) to publish standardized, interoperable objects. This allows compatible software such as viewers and annotation tools to load and present complex digital objects on the web. -(non-exhaustive) List of use cases +The specification is solely concerned with presentation - providing enough information to render an object in compatible software, and leaving the meaning of the object to external descriptive metadata standards. -1. Artwork -2. Book -3. 45 Single -4. Movie -5. 3D 1 (Single model at 0,0,0 in Scene with ambient Light and Camera) -6. 3D 2 (Complex stuff) -7. Periodical -8. 3D 3 (storytelling) -9. Manuscript (integration) +_Presentation, the clue is in the name_ +This specification is presented in two parts. This document acts as an introduction to the specification through a set of typical (but non-exhaustive) use cases. The model [model](model) provides the formal specification of the terms used in this introduction. -see Terminology at the end +### IIIF Use cases -Mention model.md +1. **Artwork** - a IIIF Manifest that represents a painting, comprising a single image and accompanying display information. +2. **Book** - a IIIF Manifest that represents a digitized bound volume made up many separate images in order. The IIIF model provides structural elements to indicate the chapters. The text of the book is made available in machine-readable form as Web Annotations. +3. **45 Single** - a IIIF Manifest that represents the digitized audio from the two sides of a vinyl 7 inch record. +4. **Movie** - a IIIF Manifest that represents the digitized video of a film. A transcript of the audio is provided as Web Annotations, and additional machine-readable files provide subtitles and captions. +5. **Simple 3D Model** - a IIIF Manifest that publishes a single 3D model. +6. **Complex Scene** - a IIIF Manifest that publishes a complex 3D scene comprising multiple models, lights and cameras. +7. **Periodical** - a IIIF Collection that provides multiple IIIF child IIIF Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements. +8. **Storytelling in 3D** - a IIIF Manifest that defines a sequence of states in a complex scene for the purposes of guiding a user through a particular experience. +9. **Manuscript** - (integration) -Mention cookbook +These use case were chosen as a broad sample to introduce IIIF Concepts. Many more use cases are provided as recipes in the [IIIF Cookbook](link). Consider diagrams @@ -81,6 +83,8 @@ Consider diagrams ## Foundations +(needs updating) +

Data Model

@@ -96,8 +100,19 @@ Manifests have descriptive, technical and linking properties. The required prope (👀) [Model Documentation](model/#manifest) -``` -Manifest JSON + +```json +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json", + "type": "Manifest", + "label": { + "en": [ "Single Image Example" ] + }, + "items": [ + // A list of Containers + ] +} ``` @@ -122,6 +137,7 @@ A Container that represents a bounded, two-dimensional space, optionally with a Canvases have two additional required properties: `height` and `width`, which give the spatial extent as unitless integers. Canvases may also have the `duration` property in the same manner as Timelines. + #### Scene A Container that represents a boundless three-dimensional space, optionally with a bounded temporal range. Scenes are typically used for rendering 3D models, and can additionally have Cameras and Lights. @@ -131,15 +147,112 @@ Scenes may also have the `duration` property in the same manner as Timelines. (👀) [Model Documentation](model/#containers) ```json -Manifest JSON with a Timeline, a Canvas and a Scene +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers", + "type": "Manifest", + "label": { + "en": [ "A Manifest with all three types of Container" ] + }, + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/timeline", + "type": "Timeline", + "duration": 32.76, + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/t1", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/audio/clip.mp3", + "type": "Audio", + "format": "audio/mp3", + "duration": 32.76, + }, + "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/timeline" + } + ] + } + ] + }, + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas", + "type": "Canvas", + "width": 12000, + "height": 9000, + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p2", + "type": "AnnotationPage", + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/c1", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 4000, + "height": 3000 + }, + "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas" + } + ] + } + ] + }, + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/scene", + "type": "Scene", + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p3", + "type": "AnnotationPage", + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/s1", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/models/astronaut.glb", + "type": "Model", + "format": "model/gltf-binary" + }, + "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/scene" + } + ] + } + ] + } + ] +} ``` +The above Manifest has three Containers, one of each type. While contrived, it is still valid and the expected user experience would be for a viewer to begin on the Timeline Container, presenting UI for the user to play the audio. The viewer would also present navigation elements to move to the next Container (the Canvas) or otherwise navigate the available Content Containers. Usually, even when a Manifest has a large number of Containers in its `items` property, they are of the same type (e.g., a 100 page book is modelled as a Manifest with 100 Canvases, each bearing an image of one page). But it is not a requirement that all Containers in a Manifest must be of the same type. + +In each of the three Containers, an **Annotation** links the Container to a Content Resource. The Content Resource is _painted_ into the Container by an Annotation whose `target` property is the `id` of the Container. In all three simple cases here the `target` property is the the `id` of the Container with no further qualification. + + + ### Annotations IIIF uses the concept of _Annotation_ to link resources together from around the web. This specification uses a World Wide Web Consortium (W3C) standard for this called the [Web Annotation Data Model][org-web-anno]. This is a structured linking mechanism useful for making comments about Content Resources, but IIIF's primary use of it is to associate the images, audio and other Content Resources with their Containers for presentation. Different uses of Annotation are distinguished through their `motivation` property. This specification defines a value for `motivation` called `painting` for associating Content Resources with Containers, which this specification calls a Painting Annotation. The verb "paint" is also used to refer to the associating of a Content Resource with a Container by a Painting Annotation. This is from the notion of painting onto a canvas, a metaphor borrowed from art and used for image-based digital applications, and expanded by IIIF into "painting" any Content Resource into a Container of any number of dimensions. +In the example Manifest above the first Container is a Timeline. One content resource, an MP3 file, is associated with the Timeline via a Painting Annotation for its entire duration. Typically the duration of the Timeline matches the duration of its content. This is the simplest time-based use case. The `target` property of the Painting Annotation is the whole Timeline, because it is simply the `id` of the Timeline without further qualification. In this simple case, playing the Timeline is the same as playing the MP3. + +The second Container is a Canvas, representing a 2D surface. In this case the Canvas represents an artwork, and there is no duration property. The content resource, a JPEG image of the artwork, is associated with the Canvas via a Painting Annotation. The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image. The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. + +The third Container is a Scene. Unlike a Canvas, it is not a bounded spatial extent, but may be a bounded temporal extent if it has the optional duration property. It still establishes a coordinate space (x, y, z) but doesn't need any spatial properties to do so as it is always the same, infinite unbounded space. The Annotation paints the astronaut model into the Scene. As no further qualification is given, the astronaut model is placed at the (0,0,0) origin of the Scene. Later examples will show how to control the lighting and camera position(s) and properties, but this is not required; a IIIF viewer is expected to supply ambient light and a default camera position in the absence of specific values. + + The same linking mechanism is also used in IIIF with other motivations for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning content, and provides a standards-based framework for referencing parts of resources. As Annotations can be added later, it promotes a distributed system in which further content such as commentary can be aligned with the objects published on the web. The required properties of Annotations are `id`, `type`, `motivation`, and `target`. Most Annotations also have the `body` property. @@ -148,8 +261,34 @@ The relationship between a Container and a painting annotation is not direct. An (👀) [Model Documentation](model/#annotations) -``` -JSON of painting anno - image to canvas +```json +{ + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas", + "type": "Canvas", + "width": 12000, + "height": 9000, + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p2", + "type": "AnnotationPage", + "items": [ + { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/c1", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 4000, + "height": 3000 + }, + "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas" + } + ] + } + ] +} ``` ### Content Resources @@ -158,6 +297,7 @@ Content Resources are external web resources, including images, video, audio, 3D The required properties of Content Resources are `id` and `type`. Other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. +The Containers example also demonstrates that if you have existing content resources with web URIs - images, audio, video and models - you can quite easily publish IIIF Manifests for them by constructing the appropriate JSON around them and publishing the JSON documents. This requires careful consideration of the URI schemes for `id` properties of Containers and their Manifests to ensure they remain referenceable in the future. The choice of Timeline or Canvas dimensions (duration, width, height) can usually be derived simply from the content; the same duration as the audio or video, and the same unit Canvas dimensions as the image or video pixel dimensions, with the caveat that you should avoid low values for `width` and `height` (ref model). #### Containers as Content Resources @@ -173,10 +313,23 @@ Parts of resources on the Web are identified using URIs with a fragment componen There are different types of fragment based on the format of the resource. The most commonly used type in IIIF is the W3C's Media Fragments specification, as it can define a temporal and 2D spatial region. -``` -comment annotation about part of the previous example's Canvas using #Fragment +```json +{ + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/comments/c1", + "type": "Annotation", + "motivation": "commenting", + "body": { + "type": "TextualBody", + "value": "Koto with a cover being carried", + "language": "en", + "format": "text/plain" + }, + "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas#xywh=6050,3220,925,1250" +} ``` +Here the Canvas `id` from the earlier example is still the `target` of an Annotation, but it has been qualified to a specific region of that Canvas by a Fragment Selector `#xywh=6050,3220,925,1250`. Note that the x, y, w, and h are in the Canvas coordinate space, not the pixel dimensions space. This annotation has no knowledge of or dependency on the particular image we painted onto the Canvas; we could replace that image with one of a different, higher resolution without affecting this annotation or the region of the Canvas it targets. + ##### Specific Resource @@ -186,8 +339,29 @@ Several different classes of Selector are used in IIIF, including an alternative The required properties of Specific Resources are `id`, `type`, and `source`. Other commonly used properties include `selector`, `transform`, and `scope`. -``` -comment annotation about part of the previous example's Canvas using FragmentSelector +```json +{ + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/comments/c1", + "type": "Annotation", + "motivation": "commenting", + "body": { + "type": "TextualBody", + "value": "Koto with a cover being carried", + "language": "en", + "format": "text/plain" + }, + "target": { + "type": "SpecificResource", + "source": { + "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas", + "type": "Canvas" + }, + "selector": { + "type": "FragmentSelector", + "value": "xywh=6050,3220,925,1250" + } + } +} ``` From 0bf6b9f76032f9151d193f7918c24c6bb30d6dbd Mon Sep 17 00:00:00 2001 From: Tom Crane Date: Wed, 21 May 2025 13:38:34 +0100 Subject: [PATCH 077/192] Apply suggestions from code review Co-authored-by: Julie Winchester --- source/presentation/4.0/index.md | 2 +- source/presentation/4.0/model.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 632cea93b..bb3c2b938 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1478,7 +1478,7 @@ See above... ## Conveying Physical Dimensions -It is often important to know how big something is, especially when comparing objects together. The dimensions of a Canvas, or the pixel density of a photograph, are unrelated to the real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. +In many cases, the dimensions of a Canvas, or the pixel density of a photograph, are not necessarily related to the real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. But it can be important to know how big something is or if there is a relationship between pixel density and physical length, especially when comparing objects together. An X-Ray image may have a tight expectation for the physical distance between two adjacent pixels, or a scanned 3D model may be constructed such that each 3D coordinate unit corresponds to one meter of physical distance. The `spatialScale` property of a Canvas or Scene provides a corresponding real-world scale for a unit of the Canvas or Scene coordinate system, allowing clients to provide scale information to users, for example by an on-screen virtual ruler. In a 2-up viewer, a client could scale two views to convey the true relative sizes of two objects. diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 0279e8efc..9a837fc8b 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1852,7 +1852,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ### spatialScale {: #spatialScale} -A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 metres wide. The value of `unit` _MUST_ always be `m`, i.e., metres. +A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance between adjacent units horizontally and vertically. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 metres wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ always be `m`, i.e., metres. {% include api/code_header.html %} From bd809b889128fa4bbe178bec54702f3783e7e395 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 21 May 2025 11:18:40 -0400 Subject: [PATCH 078/192] AnnotationCollection and AnnotationPage properties --- source/presentation/4.0/model.md | 81 +++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 7c953dc18..829ecbf4b 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1060,7 +1060,24 @@ The value is a non-negative floating point number, in the coordinate space of th ``` ### first +{: #first} +This property references the first Annotation Page within an Annotation Collection. + +The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _MUST_ be the HTTP(S) URI of the referenced Annotation Page. The value of `type` _MUST_ be `AnnotationPage`. + +* A non-empty AnnotationCollection _MUST_ have the `first` property.
+ Clients _MUST_ process the `first` property on an AnnotationCollection. + +{% include api/code_header.html %} +``` json-doc +{ + "first": { + "id": "https://example.org/iiif/annotationPage/1", + "type": "AnnotationPage" + } +} +``` ### fieldOfView {: #fieldOfView} @@ -1296,6 +1313,24 @@ The value _MUST_ be an array of strings. Each item in the array _MUST_ be a vali ``` ### last +{: #lsst} + +This property references the last Annotation Page within an Annotation Collection. + +The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _MUST_ be the HTTP(S) URI of the referenced Annotation Page. The value of `type` _MUST_ be `AnnotationPage`. + +* A non-empty AnnotationCollection _SHOULD_ have the `last` property.
+ Clients _SHOULD_ process the `last` property on an AnnotationCollection. + +{% include api/code_header.html %} +``` json-doc +{ + "last": { + "id": "https://example.org/iiif/annotationPage/17", + "type": "AnnotationPage" + } +} +``` ### logo {: #logo} @@ -1465,9 +1500,24 @@ The value is a non-negative floating point number, in the coordinate space of th ``` ### next +{: #next} + +A reference from an Annotation Page to the following Annotation Page within an Annotation Collection. + +The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the following Annotation Page. The value of the `type` property must be the string `AnnotationPage`. -... +* An AnnotationPage _MUST_ have a `next` property, unless it is the last page in the AnnotationCollection.
+ Clients _MUST_ processs the `next` property on an AnnotationPage. +{% include api/code_header.html %} +``` json-doc +{ + "next": { + "id": "https://example.org/iiif/annotationPage/3", + "type": "AnnotationPage" + } +} +``` ### partOf {: #partOf} @@ -1548,7 +1598,24 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe ``` ### prev +{: #prev} +A reference from an Annotation Page to the preceding Annotation Page within an Annotation Collection. + +The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the preceding Annotation Page. The value of the `type` property must be the string `AnnotationPage`. + +* An AnnotationPage _SHOULD_ have a `prev` property, unless it is the first page in the AnnotationCollection.
+ Clients _SHOULD_ processs the `prev` property on an AnnotationPage. + +{% include api/code_header.html %} +``` json-doc +{ + "prev": { + "id": "https://example.org/iiif/annotationPage/1", + "type": "AnnotationPage" + } +} +``` ### profile {: #profile} @@ -2021,10 +2088,22 @@ The value _MUST_ be a string. ### total +{: #total} For compatability with ActivityStreams and the Change Discovery API, clients _SHOULD_ also accept `totalItems` as the name of this property. {: .note} +The `total` property indicates the total number of annotations contained in an Annotation Collection. + +The value of this property _MUST_ be a non-negative integer. + +* An AnnotationCollection _SHOULD_ have the `total` property.
+ Clients _SHOULD_ process the `total` property on an AnnotationCollection. + +{% include api/code_header.html %} +``` json-doc +{ "total": 1701 } +``` ### transform {: #transform} From 49dcef6e76624c84f339d88403ca9e5543553677 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 21 May 2025 11:22:28 -0400 Subject: [PATCH 079/192] a->the and alpha order --- source/presentation/4.0/model.md | 34 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 829ecbf4b..073a38ad3 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1059,6 +1059,22 @@ The value is a non-negative floating point number, in the coordinate space of th { "far": 200.0 } ``` +### fieldOfView +{: #fieldOfView} + +The angle which a PerspectiveCamera can "see". + +!!! warning "Need more info" + +The value _MUST_ be a floating point number greater than 0 and less than 180, and is measured in degrees. If this property is not specified, then the default value is client-dependent. + +* A PerspectiveCamera _SHOULD_ have the `fieldOfView` property.
+ Clients _SHOULD_ process the `fieldOfView` property on Cameras. + +```json-doc +{ "fieldOfView": 50.0 } +``` + ### first {: #first} @@ -1079,21 +1095,7 @@ The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _M } ``` -### fieldOfView -{: #fieldOfView} - -The angle which a PerspectiveCamera can "see". - -!!! warning "Need more info" -The value _MUST_ be a floating point number greater than 0 and less than 180, and is measured in degrees. If this property is not specified, then the default value is client-dependent. - -* A PerspectiveCamera _SHOULD_ have the `fieldOfView` property.
- Clients _SHOULD_ process the `fieldOfView` property on Cameras. - -```json-doc -{ "fieldOfView": 50.0 } -``` ### format {: #format} @@ -1506,7 +1508,7 @@ A reference from an Annotation Page to the following Annotation Page within an A The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the following Annotation Page. The value of the `type` property must be the string `AnnotationPage`. -* An AnnotationPage _MUST_ have a `next` property, unless it is the last page in the AnnotationCollection.
+* An AnnotationPage _MUST_ have the `next` property, unless it is the last page in the AnnotationCollection.
Clients _MUST_ processs the `next` property on an AnnotationPage. {% include api/code_header.html %} @@ -1604,7 +1606,7 @@ A reference from an Annotation Page to the preceding Annotation Page within an A The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the preceding Annotation Page. The value of the `type` property must be the string `AnnotationPage`. -* An AnnotationPage _SHOULD_ have a `prev` property, unless it is the first page in the AnnotationCollection.
+* An AnnotationPage _SHOULD_ have the `prev` property, unless it is the first page in the AnnotationCollection.
Clients _SHOULD_ processs the `prev` property on an AnnotationPage. {% include api/code_header.html %} From d9d168e0031987504da20cf6b49606d03061dc28 Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Thu, 22 May 2025 12:31:39 -0500 Subject: [PATCH 080/192] Update transform property and class definitions --- source/presentation/4.0/model.md | 65 +++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 7c953dc18..6b858caac 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -781,32 +781,62 @@ Can have a Timeline as the source of the audio? FIXME: "No default direction, MUST provide a Rotate Transform.", changed language to default to -y to match Spot Light - #### Transforms -here are the rules about transforms? - +An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into the relatively more global coordinate space of a Scene. +__Properties__
+All Transforms _MUST_ have the following properties: [type](#type).

+All Transforms _MAY_ have the following properties: [x](#x), [y](#y), and [z](#z). +{: .note} ##### Rotate Transform > `"type": "RotateTransform"` -A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 +A RotateTransform rotates the resource around one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be angular values in degrees that specify the extent of rotation around each axis. Positive angular values indicate counter-clockwise rotation around the axis due to coordinate right-handedness. Axis rotation is performed with a pivot point at the origin of the local coordinate space. As an example, for a point at (1, 1, 0) in local coordinate space, rotating 90 degrees around the x axis would transform the point to be at (1, 0, 1). If any property `x`, `y`, or `z` is not specified or is specified to be 0.0, rotation around that axis does not occur. When more than one axis rotation is specified through multiple non-zero values for `x`, `y`, and `z`, rotations comprise an Euler angle with ordering x-y-z, and rotation _MUST_ be carried out first around the x axis, second around the y axis, and third around the z axis. +{% include api/code_header.html %} +```json +{ + "type": "RotateTransform", + "x": 0.0, + "y": 180.0, + "z": 0.0 +} +``` ##### Scale Transform > `"type": "ScaleTransform"` -A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 +A ScaleTransform scales the resource along one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be multiplicative scale factors that specify the extent of scaling along each axis. As an example, for a point at 3.5 along the x axis in local coordinate space, scaling along the x axis by 2.0 would result in the point being at 7.0. If any property `x`, `y`, or `z` is not specified or is specified to be 1.0, scaling does not occur along that axis. Negative scale factor values indicate mirroring as well as scaling along that axis. + +{% include api/code_header.html %} +```json +{ + "type": "ScaleTransform", + "x": 2.0, + "y": 2.0, + "z": 2.0 +} +``` ##### Translate Transform > `"type": "TranslateTransform"` -A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 +A TranslateTransform translates or moves the resource across one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be coordinate unit distances that specify the distance across each axis to translate the resource. As an example, for a point at 1.0 along the x axis, translating across the x axis by 3.0 would result in the point being at 4.0. If any property `x`, `y`, or `z` is not present or is specified to be 0.0, translation does not occur across that axis. +{% include api/code_header.html %} +```json +{ + "type": "TranslateTransform", + "x": -1.0, + "y": 0.0, + "z": 0.0 +} +``` ### Utility Classes @@ -2029,13 +2059,28 @@ For compatability with ActivityStreams and the Change Discovery API, clients _SH ### transform {: #transform} -_Summary here_ - -The value of this property is an array of JSON objects, each of which is a Transform. +An ordered list of 3D transform operations (translation, rotation, and scale) to be performed on a resource prior to painting that resource into a Scene. Transforms _MUST_ be applied to the resource in the order given. The resulting state of the resource after applying a transform _MUST_ be the input state for the subsequent transform in the ordered list. Therefore, transforms are not independent, and different orders of the same set of transforms can produce different results. The list of transforms _MAY_ include multiple transforms of the same type, e.g., multiple rotation operations. -Process them in order given. +The value of this property _MUST_ be array of JSON objects, each of which _MUST_ be a Transform. +* A Specific Resource _MAY_ have the `transform` property.
+ Clients _SHOULD_ process the `transform` property on Specific Resources. +* Other classes _MUST NOT_ have the `transform` property.
+ Clients _MUST_ ignore the `transform` property on all other classes. +{% include api/code_header.html %} +```json +{ + "transform": [ + { + "type": "RotateTransform", + "x": 0.0, + "y": 180.0, + "z": 0.0 + } + ] +} +``` ### type {: #type} From b851906c73bb0bf6f1161a9e4a6dc40cba0e07fc Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Thu, 22 May 2025 13:03:15 -0500 Subject: [PATCH 081/192] Update source/presentation/4.0/model.md --- source/presentation/4.0/model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 073a38ad3..23f74b0bc 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1315,7 +1315,7 @@ The value _MUST_ be an array of strings. Each item in the array _MUST_ be a vali ``` ### last -{: #lsst} +{: #last} This property references the last Annotation Page within an Annotation Collection. From 4b793fca8ac9b1b29429c778444f160e3a1b9407 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 27 May 2025 12:08:17 -0400 Subject: [PATCH 082/192] merge conflict --- source/presentation/4.0/model.md | 96 ++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 36 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 02f3584fd..399c073dd 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -8,7 +8,7 @@ tags: [specifications, presentation-api] major: 4 minor: 0 patch: 0 -pre: +pre: redirect_from: - /presentation/model.html - /presentation/4/model.html @@ -26,10 +26,10 @@ editors: ORCID: institution: UCLA - name: Julie Winchester - ORCID: + ORCID: institution: Duke University - name: Jeff Mixter - ORCID: + ORCID: institution: OCLC hero: image: '' @@ -613,7 +613,7 @@ Orthographic Cameras _SHOULD_ have the following additional properties: [viewHei > `"type": "PerspectiveCamera"` -`PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller. +A Perspective Camera mimics the way the human eye sees, in that objects further from the camera are smaller. The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region in the `fieldOfView` property. @@ -646,7 +646,7 @@ All Lights _SHOULD_ have the following properties: [color](#color), and [intensi All Lights _MAY_ have the following properties: [label](#label). {: .note} - + ##### Ambient Light > `"type": "AmbientLight"` @@ -667,7 +667,7 @@ Ambient Light evenly illuminates all objects in the Scene, and does not have a d Directional Lights emit their light in a specific direction as if infinitely far away, and as such the light does not come from a specific position. The rays produced are all parallel. The Light itself _MUST_ be added into the scene at a specific position, however this is only such that editing interfaces can render the object to the user. -The light is emitted in the negative Y (-y) direction by default, thus straight down, but the orientation of the light can be altered with `lookAt` or with a `RotationTransform`. +The light is emitted in the negative Y direction by default, thus straight down, but the orientation of the light can be altered with `lookAt` or with a `RotationTransform`. __Properties__
Directional Lights _MAY_ have the following additional properties: [lookAt](#lookAt) @@ -686,7 +686,7 @@ Directional Lights _MAY_ have the following additional properties: [lookAt](#loo > `"type": "PointLight"` -Point Lights emit from a single point within the Scene in all directions. +Point Lights emit in all directions from a single point within the Scene. ```json { @@ -701,9 +701,9 @@ Point Lights emit from a single point within the Scene in all directions. > `"type": "SpotLight"` -Spot Light emits a cone of light from a single point in a given direction. The Spot Light's `angle` property defines the radius of the cone. +Spot Light emits a cone of light in a given direction from a single point. The Spot Light's `angle` property defines the radius of the cone. The default angle is client dependent if not specified. -The Spot Light emits in the negative Y (-y) direction by default, but the orientation of the light can be altered by subsequent transforms. +The Spot Light emits in the negative Y direction by default, but the orientation of the light can be altered by subsequent transforms, or by setting the `lookAt` property. diagram of cone geometry showing how the angle of the cone is defined @@ -712,8 +712,6 @@ Spot Lights _SHOULD_ have the following additional properties: [angle](#angle) +All Audio Emitters _MUST_ have the following properties: [id](#id), [type](#type) and [source](#source).

+All Audio Emitters _SHOULD_ have the following properties: [volume](#volume).

+All Audio Emitters _MAY_ have the following properties: [label](#label). +{: .note} ##### Ambient Audio > `"type": "AmbientAudio"` -Ambient Audio emits equally throughout the Scene, and does not have a position or direction. +Ambient Audio emits equally throughout the Scene, and does not have a position or direction. The Emitter _MUST_ be annotated somewhere within the Scene so that it can be rendered by editing interfaces, and exists within the Scene's hierarchy. + +```json +{ + "id": "https://example.org/iiif/audio/1", + "type": "AmbientAudio", + "source": { + "id": "https://example.org/media/path/to/my.mp3", + "type": "Audio", + "format": "audio/mp3" + } +} +``` ##### Point Audio > `"type": "PointAudio"` -Point Audio emits from a single point in the Scene in all directions. +Point Audio emits in all directions from a single point in the Scene. + +```json +{ + "id": "https://example.org/iiif/audio/2", + "type": "PointAudio", + "source": { + "id": "https://example.org/media/path/to/my.mp3", + "type": "Audio", + "format": "audio/mp3" + } +} +``` ##### Spot Audio > `"type": "SpotAudio"` -Spot Audio emits a cone of sound from a single point in a given direction. The Spot Audio's `angle` property defines the radius of the cone. +Spot Audio emits a cone of sound in a given direction from a single point. The Spot Audio's `angle` property defines the radius of the cone. The default angle is client dependent if not specified. -The Spot Audio emits in the negative Y (-y) direction by default, but the orientation of the sound can be altered by subsequent transforms. +The Spot Audio emits in the negative Y direction by default, but the orientation of the sound can be altered by subsequent transforms, or by setting the `lookAt` property. -Can have a Timeline as the source of the audio? +__Properties__
+Spot Audio Emitters _SHOULD_ have the following additional properties: [angle](#angle)

+Spot Audio Emitters _MAY_ have the following additional properties: [lookAt](#lookAt) +{: .note} ```json { - "id": "https://example.org/iiif/spotAudio/1", + "id": "https://example.org/iiif/audio/3", "type": "SpotAudio", "source": { "id": "https://example.org/media/path/to/my.mp3", @@ -774,16 +805,13 @@ Can have a Timeline as the source of the audio? "type": "UnitValue", "unit": "relative", "value": 1.0 - }, - "transform": [] + } } ``` -FIXME: "No default direction, MUST provide a Rotate Transform.", changed language to default to -y to match Spot Light - #### Transforms -An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into the relatively more global coordinate space of a Scene. +An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into the relatively more global coordinate space of a Scene. __Properties__
All Transforms _MUST_ have the following properties: [type](#type).

@@ -794,7 +822,7 @@ All Transforms _MAY_ have the following properties: [x](#x), [y](#y), and [z](#z > `"type": "RotateTransform"` -A RotateTransform rotates the resource around one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be angular values in degrees that specify the extent of rotation around each axis. Positive angular values indicate counter-clockwise rotation around the axis due to coordinate right-handedness. Axis rotation is performed with a pivot point at the origin of the local coordinate space. As an example, for a point at (1, 1, 0) in local coordinate space, rotating 90 degrees around the x axis would transform the point to be at (1, 0, 1). If any property `x`, `y`, or `z` is not specified or is specified to be 0.0, rotation around that axis does not occur. When more than one axis rotation is specified through multiple non-zero values for `x`, `y`, and `z`, rotations comprise an Euler angle with ordering x-y-z, and rotation _MUST_ be carried out first around the x axis, second around the y axis, and third around the z axis. +A RotateTransform rotates the resource around one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be angular values in degrees that specify the extent of rotation around each axis. Positive angular values indicate counter-clockwise rotation around the axis due to coordinate right-handedness. Axis rotation is performed with a pivot point at the origin of the local coordinate space. As an example, for a point at (1, 1, 0) in local coordinate space, rotating 90 degrees around the x axis would transform the point to be at (1, 0, 1). If any property `x`, `y`, or `z` is not specified or is specified to be 0.0, rotation around that axis does not occur. When more than one axis rotation is specified through multiple non-zero values for `x`, `y`, and `z`, rotations comprise an Euler angle with ordering x-y-z, and rotation _MUST_ be carried out first around the x axis, second around the y axis, and third around the z axis. {% include api/code_header.html %} ```json @@ -810,7 +838,7 @@ A RotateTransform rotates the resource around one or more axes. If present, the > `"type": "ScaleTransform"` -A ScaleTransform scales the resource along one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be multiplicative scale factors that specify the extent of scaling along each axis. As an example, for a point at 3.5 along the x axis in local coordinate space, scaling along the x axis by 2.0 would result in the point being at 7.0. If any property `x`, `y`, or `z` is not specified or is specified to be 1.0, scaling does not occur along that axis. Negative scale factor values indicate mirroring as well as scaling along that axis. +A ScaleTransform scales the resource along one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be multiplicative scale factors that specify the extent of scaling along each axis. As an example, for a point at 3.5 along the x axis in local coordinate space, scaling along the x axis by 2.0 would result in the point being at 7.0. If any property `x`, `y`, or `z` is not specified or is specified to be 1.0, scaling does not occur along that axis. Negative scale factor values indicate mirroring as well as scaling along that axis. {% include api/code_header.html %} ```json @@ -826,7 +854,7 @@ A ScaleTransform scales the resource along one or more axes. If present, the val > `"type": "TranslateTransform"` -A TranslateTransform translates or moves the resource across one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be coordinate unit distances that specify the distance across each axis to translate the resource. As an example, for a point at 1.0 along the x axis, translating across the x axis by 3.0 would result in the point being at 4.0. If any property `x`, `y`, or `z` is not present or is specified to be 0.0, translation does not occur across that axis. +A TranslateTransform translates or moves the resource across one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be coordinate unit distances that specify the distance across each axis to translate the resource. As an example, for a point at 1.0 along the x axis, translating across the x axis by 3.0 would result in the point being at 4.0. If any property `x`, `y`, or `z` is not present or is specified to be 0.0, translation does not occur across that axis. {% include api/code_header.html %} ```json @@ -852,7 +880,7 @@ A TranslateTransform translates or moves the resource across one or more axes. I A UnitValue expresses a quantity through a numerical value and associated unit of measurement. -`"type": "UnitValue"` +`"type": "UnitValue"` @@ -1241,7 +1269,7 @@ The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. A set of features that guide or limit user interaction with content within a Container that the publisher of the content would prefer the client to use when presenting the resource. This specification defines values in the table below that guide interactions with Cameras within a Scene. Other values for other Container types or specifying other interaction modes for 3D content may be defined externally as an [extension][prezi30-ldce]. For interaction modes pertaining to Cameras within a Scene, the client _SHOULD_ use `interactionMode` to determine the user experience features and approaches whereby users are permitted to change or adjust Cameras when viewing content within a Scene (e.g., orbiting around the scene or locking the user to a first-person perspective). -When more than one interaction mode is present, the client _SHOULD_ pick the first interaction mode that the client is capable of supporting. +When more than one interaction mode is present, the client _SHOULD_ pick the first interaction mode that the client is capable of supporting. For interaction modes that involve a Camera orbiting around a target point, the target point _SHOULD_ be the same as the Camera's `lookAt` property. @@ -2142,7 +2170,7 @@ The value of this property _MUST_ be a non-negative integer. An ordered list of 3D transform operations (translation, rotation, and scale) to be performed on a resource prior to painting that resource into a Scene. Transforms _MUST_ be applied to the resource in the order given. The resulting state of the resource after applying a transform _MUST_ be the input state for the subsequent transform in the ordered list. Therefore, transforms are not independent, and different orders of the same set of transforms can produce different results. The list of transforms _MAY_ include multiple transforms of the same type, e.g., multiple rotation operations. -The value of this property _MUST_ be array of JSON objects, each of which _MUST_ be a Transform. +The value of this property _MUST_ be array of JSON objects, each of which _MUST_ be a Transform. * A Specific Resource _MAY_ have the `transform` property.
Clients _SHOULD_ process the `transform` property on Specific Resources. @@ -2407,7 +2435,3 @@ The JSON-LD keywords `@id`, `@type` and `@none` are mapped to `id`, `type` and ` ### Registries of Values FIXME: Describe the registries - - - - From 9ed1fb36369e9a96965da3d1557e9c4914a1af13 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 27 May 2025 15:02:05 -0400 Subject: [PATCH 083/192] Updates --- source/presentation/4.0/model.md | 43 ++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 399c073dd..a441cc400 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -811,22 +811,23 @@ Spot Audio Emitters _MAY_ have the following additional properties: [lookAt](#lo #### Transforms -An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into the relatively more global coordinate space of a Scene. +An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into any subsequent coordinate space. __Properties__
-All Transforms _MUST_ have the following properties: [type](#type).

-All Transforms _MAY_ have the following properties: [x](#x), [y](#y), and [z](#z). +All Transforms _MUST_ have the following properties: [id](#id), [type](#type).

+All Transforms _MAY_ have the following properties: [label](#label), [x](#x), [y](#y), and [z](#z). {: .note} ##### Rotate Transform > `"type": "RotateTransform"` -A RotateTransform rotates the resource around one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be angular values in degrees that specify the extent of rotation around each axis. Positive angular values indicate counter-clockwise rotation around the axis due to coordinate right-handedness. Axis rotation is performed with a pivot point at the origin of the local coordinate space. As an example, for a point at (1, 1, 0) in local coordinate space, rotating 90 degrees around the x axis would transform the point to be at (1, 0, 1). If any property `x`, `y`, or `z` is not specified or is specified to be 0.0, rotation around that axis does not occur. When more than one axis rotation is specified through multiple non-zero values for `x`, `y`, and `z`, rotations comprise an Euler angle with ordering x-y-z, and rotation _MUST_ be carried out first around the x axis, second around the y axis, and third around the z axis. +A Rotate Transform rotates the resource around one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be angular values in degrees that specify the extent of rotation around each axis. Positive angular values indicate counter-clockwise rotation around the axis due to coordinate right-handedness. Axis rotation is performed with a pivot point at the origin of the local coordinate space. As an example, for a point at (1, 1, 0) in local coordinate space, rotating 90 degrees around the x axis would transform the point to be at (1, 0, 1). If any property `x`, `y`, or `z` is not specified or is specified to be 0.0, rotation around that axis does not occur. When more than one axis rotation is specified through multiple non-zero values for `x`, `y`, and `z`, rotations comprise a Euler angle with ordering x-y-z, and rotation _MUST_ be carried out first around the x axis, second around the y axis, and third around the z axis. {% include api/code_header.html %} ```json { + "id": "https://example.org/iiif/transform/1", "type": "RotateTransform", "x": 0.0, "y": 180.0, @@ -838,11 +839,12 @@ A RotateTransform rotates the resource around one or more axes. If present, the > `"type": "ScaleTransform"` -A ScaleTransform scales the resource along one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be multiplicative scale factors that specify the extent of scaling along each axis. As an example, for a point at 3.5 along the x axis in local coordinate space, scaling along the x axis by 2.0 would result in the point being at 7.0. If any property `x`, `y`, or `z` is not specified or is specified to be 1.0, scaling does not occur along that axis. Negative scale factor values indicate mirroring as well as scaling along that axis. +A Scale Transform scales the resource along one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be multiplicative scale factors that specify the extent of scaling along each axis. As an example, for a point at 3.5 along the x axis in local coordinate space, scaling along the x axis by 2.0 would result in the point being at 7.0. If any property `x`, `y`, or `z` is not specified or is specified to be 1.0, scaling does not occur along that axis. Negative scale factor values indicate mirroring as well as scaling along that axis. {% include api/code_header.html %} ```json { + "id": "https://example.org/iiif/transform/2", "type": "ScaleTransform", "x": 2.0, "y": 2.0, @@ -854,11 +856,12 @@ A ScaleTransform scales the resource along one or more axes. If present, the val > `"type": "TranslateTransform"` -A TranslateTransform translates or moves the resource across one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be coordinate unit distances that specify the distance across each axis to translate the resource. As an example, for a point at 1.0 along the x axis, translating across the x axis by 3.0 would result in the point being at 4.0. If any property `x`, `y`, or `z` is not present or is specified to be 0.0, translation does not occur across that axis. +A Translate Transform translates or moves the resource across one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be coordinate unit distances that specify the distance across each axis to translate the resource. As an example, for a point at 1.0 along the x axis, translating across the x axis by 3.0 would result in the point being at 4.0. If any property `x`, `y`, or `z` is not present or is specified to be 0.0, translation does not occur across that axis. {% include api/code_header.html %} ```json { + "id": "https://example.org/iiif/transform/3", "type": "TranslateTransform", "x": -1.0, "y": 0.0, @@ -870,19 +873,37 @@ A TranslateTransform translates or moves the resource across one or more axes. I #### Agent -`"type": "Agent"` +> `"type": "Agent"` + +An Agent represents a person or organization, typically referenced with the `provider` property. +The Agent is not intended to be used as a primary identifier for the person or organization, nor to provide structured metadata, but instead to ensure that the information to be rendered to the user can be kept together in the situation when there are multiple agents being referenced. + +__Properties__
+An Agent _MUST_ have the following properties: [id](#id), [type](#type), and [label](#label).

+An Agent _SHOULD_ have the following properties: [homepage](#homepage), and [logo](#logo)

. +An Agent _MAY_ have the following properties: [seeAlso](#seeAlso), and [summary](#summary). +{: .note} + #### Service -`"type": "Service"` +> `"type": "Service"` -#### Unit Value +A Service is a software application outside of the Manifest that a client might interact with to gain additional information or functionality for the resource that is associated with the Service. The IIIF Image API is an example of a Service, as are the Auth API services. Known types of Service are registered in the Service Registry. -A UnitValue expresses a quantity through a numerical value and associated unit of measurement. +__Properties__
+A Service _MUST_ have the following properties: [id](#id), and [type](#type).

+A Service _SHOULD_ have the following properties: [label](#label), [profile](#profile).

+A Service _MAY_ have the following properties: [service](#service).

+Services will also have specific requirements as to additional properties based on the type of service. +{: .note} -`"type": "UnitValue"` +#### Unit Value + +> `"type": "UnitValue"` +A UnitValue expresses a quantity through a numerical value and associated unit of measurement. From 451563df18a00ecef9f059527409826df802076d Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Thu, 29 May 2025 09:54:32 -0400 Subject: [PATCH 084/192] More work on classes --- source/presentation/4.0/model.md | 55 ++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index a441cc400..df8086f87 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -621,7 +621,7 @@ __Properties__
Perspective Cameras _SHOULD_ have the following additional properties: [fieldOfView](#fieldOfView). {: .note} - +{% include api/code_header.html %} ```json { "id": "https://example.org/iiif/camera/2", @@ -653,6 +653,7 @@ All Lights _MAY_ have the following properties: [label](#label). Ambient Light evenly illuminates all objects in the Scene, and does not have a direction or position. It does not have any new properties. The Light itself _MUST_ be added into the scene at a specific position, however this is only such that editing interfaces can render the object to the user. +{% include api/code_header.html %} ```json { "id": "https://example.org/iiif/light/1", @@ -673,6 +674,7 @@ __Properties__
Directional Lights _MAY_ have the following additional properties: [lookAt](#lookAt) {: .note} +{% include api/code_header.html %} ```json { "id": "https://example.org/iiif/light/2", @@ -688,6 +690,7 @@ Directional Lights _MAY_ have the following additional properties: [lookAt](#loo Point Lights emit in all directions from a single point within the Scene. +{% include api/code_header.html %} ```json { "id": "https://example.org/iiif/light/3", @@ -712,6 +715,7 @@ Spot Lights _SHOULD_ have the following additional properties: [angle](#angle) `"type": "UnitValue"` -A UnitValue expresses a quantity through a numerical value and associated unit of measurement. +A UnitValue expresses a quantity through a numerical value and associated unit of measurement. The unit _MUST_ be drawn from the +__Properties__
+A Unit Value _MUST_ have the following properties: [id](#id), [type](#type), [value](#value), and [unit](#unit).

+A Unit Value _MAY_ have the following properties: [label](#label). +{: .note} + +{% include api/code_header.html %} +```json +{ + "id": "https://example.org/iiif/unit/2", + "type": "UnitValue", + "value": 1.0, + "unit": "m" +} +``` + ## Properties From c1756b263dad492d69ff9db15506bb02f3d87be8 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Thu, 29 May 2025 10:10:30 -0400 Subject: [PATCH 085/192] Hit commit too quickly :) --- source/presentation/4.0/model.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index df8086f87..2b10f7a94 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -937,8 +937,7 @@ Services will also have specific requirements as to additional properties based > `"type": "UnitValue"` -A UnitValue expresses a quantity through a numerical value and associated unit of measurement. The unit _MUST_ be drawn from the - +A UnitValue expresses a quantity through a numerical value and associated unit of measurement. The value of `unit` _MUST_ be drawn from the list of possible units, or a registered extension. __Properties__
A Unit Value _MUST_ have the following properties: [id](#id), [type](#type), [value](#value), and [unit](#unit).

From 86b0492e6c9ec20fd0808b1a55d631bebf7acb51 Mon Sep 17 00:00:00 2001 From: Tom Crane Date: Mon, 2 Jun 2025 09:19:22 +0100 Subject: [PATCH 086/192] Apply suggestions from code review Co-authored-by: Julie Winchester --- source/presentation/4.0/index.md | 2 +- source/presentation/4.0/model.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index bb3c2b938..4c4a65f8d 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1482,7 +1482,7 @@ In many cases, the dimensions of a Canvas, or the pixel density of a photograph, The `spatialScale` property of a Canvas or Scene provides a corresponding real-world scale for a unit of the Canvas or Scene coordinate system, allowing clients to provide scale information to users, for example by an on-screen virtual ruler. In a 2-up viewer, a client could scale two views to convey the true relative sizes of two objects. -The value of `spatialScale` is a `UnitValue` (ref) that always has the value "m", i.e., metres. If source size metadata is machine readable (or parse-able) in other measurement systems (e.g., feet and inches) then it should be converted to metres for use in `spatialScale`. Publishers may wish to present the original given measure (e.g., from catalogue metadata) in a `metadata` field for context. +The value of `spatialScale` is a `UnitValue` (ref) that has as a value a length unit. This specification defines only one length unit, "m", i.e., metres, though others may be defined externally as an [extension][prezi30-ldce]. If source size metadata is machine readable (or parse-able) in other measurement systems (e.g., feet and inches) then it should be converted to metres for use in `spatialScale`. Publishers may wish to present the original given measure (e.g., from catalogue metadata) in a `metadata` field for context. The Presentation API also offers a corresponding `temporalScale` property for the `duration` dimension of a Container, when 1 second in the Container does not correspond to 1 second of real time. This is useful for speeded-up or slowed-down audio or video. diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 9a837fc8b..67170c1c0 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1852,7 +1852,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ### spatialScale {: #spatialScale} -A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance between adjacent units horizontally and vertically. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 metres wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ always be `m`, i.e., metres. +A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance between adjacent units horizontally and vertically. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 metres wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., metres. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. {% include api/code_header.html %} From 7cb83025c6332655927aa1d1defe3c5c4cd4ce4a Mon Sep 17 00:00:00 2001 From: Tom Crane Date: Mon, 2 Jun 2025 09:20:21 +0100 Subject: [PATCH 087/192] Apply suggestions from code review Co-authored-by: Julie Winchester --- source/presentation/4.0/model.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 67170c1c0..9b5ceeb44 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1859,12 +1859,11 @@ A single UnitValue that defines a real-world scale factor for the coordinate uni ``` json-doc { "type": "Scene", - - "spatialScale": { - "type": "UnitValue", - "value": 22.0, - "unit": "m" - } + "spatialScale": { + "type": "UnitValue", + "value": 22.0, + "unit": "m" + } } ``` @@ -1990,19 +1989,18 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert ### temporalScale {: #temporalScale} -A single UnitValue that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `value` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ always be `s`, i.e., seconds. +A single UnitValue that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `value` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. {% include api/code_header.html %} ``` json-doc { "type": "Canvas", - - "temporalScale": { - "type": "UnitValue", - "value": 1000, - "unit": "s" - } + "temporalScale": { + "type": "UnitValue", + "value": 1000, + "unit": "s" + } } ``` From bfbe5a0ee24484d7fa6da9b01eee8a566cea48e0 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 2 Jun 2025 09:20:51 +0100 Subject: [PATCH 088/192] physical dims --- source/presentation/4.0/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index bb3c2b938..6f01c5478 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1478,7 +1478,7 @@ See above... ## Conveying Physical Dimensions -In many cases, the dimensions of a Canvas, or the pixel density of a photograph, are not necessarily related to the real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. But it can be important to know how big something is or if there is a relationship between pixel density and physical length, especially when comparing objects together. An X-Ray image may have a tight expectation for the physical distance between two adjacent pixels, or a scanned 3D model may be constructed such that each 3D coordinate unit corresponds to one meter of physical distance. +In many cases, the dimensions of a Canvas, or the pixel density of a photograph, are not necessarily related to the real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. But it can be important to know how big something is or if there is a relationship between pixel density and physical length, especially when comparing objects together. Each pixel in an image may correspond precisely to a physical area in the real world, or a scanned 3D model may be constructed such that each 3D coordinate unit corresponds to one meter of physical distance. The `spatialScale` property of a Canvas or Scene provides a corresponding real-world scale for a unit of the Canvas or Scene coordinate system, allowing clients to provide scale information to users, for example by an on-screen virtual ruler. In a 2-up viewer, a client could scale two views to convey the true relative sizes of two objects. From 2c0ea1292c0a43a91a1c405d7791dd3cb07a5936 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 2 Jun 2025 09:24:59 +0100 Subject: [PATCH 089/192] metres --- source/presentation/4.0/index.md | 6 +++--- source/presentation/4.0/model.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index fe5202e6f..e6031f60d 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1478,15 +1478,15 @@ See above... ## Conveying Physical Dimensions -In many cases, the dimensions of a Canvas, or the pixel density of a photograph, are not necessarily related to the real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. But it can be important to know how big something is or if there is a relationship between pixel density and physical length, especially when comparing objects together. Each pixel in an image may correspond precisely to a physical area in the real world, or a scanned 3D model may be constructed such that each 3D coordinate unit corresponds to one meter of physical distance. +In many cases, the dimensions of a Canvas, or the pixel density of a photograph, are not necessarily related to a real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. But it can be important to know how big something is or if there is a relationship between pixel density and physical length, especially when comparing objects together. Each pixel in an image may correspond precisely to a physical area, allowing measurement of real world distances from the image. A scanned 3D model may be constructed such that each 3D coordinate unit corresponds to one meter of physical distance. The `spatialScale` property of a Canvas or Scene provides a corresponding real-world scale for a unit of the Canvas or Scene coordinate system, allowing clients to provide scale information to users, for example by an on-screen virtual ruler. In a 2-up viewer, a client could scale two views to convey the true relative sizes of two objects. -The value of `spatialScale` is a `UnitValue` (ref) that has as a value a length unit. This specification defines only one length unit, "m", i.e., metres, though others may be defined externally as an [extension][prezi30-ldce]. If source size metadata is machine readable (or parse-able) in other measurement systems (e.g., feet and inches) then it should be converted to metres for use in `spatialScale`. Publishers may wish to present the original given measure (e.g., from catalogue metadata) in a `metadata` field for context. +The value of `spatialScale` is a `UnitValue` (ref) that has as a value a length unit. This specification defines only one length unit, "m", i.e., meters, though others may be defined externally as an [extension][prezi30-ldce]. If source size metadata is machine readable (or parse-able) in other measurement systems (e.g., feet and inches) then it should be converted to meters for use in `spatialScale`. Publishers may wish to present the original given measure (e.g., from catalogue metadata) in a `metadata` field for context. The Presentation API also offers a corresponding `temporalScale` property for the `duration` dimension of a Container, when 1 second in the Container does not correspond to 1 second of real time. This is useful for speeded-up or slowed-down audio or video. -An extreme example of both physical dimension properties together is a Canvas showing an animation of continental drift over the course of Earth history, where the spatialScale could convey that each Canvas unit is several thousand metres, and each second of the Canvas `duration` is several million years. +An extreme example of both physical dimension properties together is a Canvas showing an animation of continental drift over the course of Earth history, where the spatialScale could convey that each Canvas unit is several thousand meters, and each second of the Canvas `duration` is several million years. diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 9b5ceeb44..af041e126 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1852,7 +1852,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ### spatialScale {: #spatialScale} -A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance between adjacent units horizontally and vertically. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 metres wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., metres. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. +A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance between adjacent units horizontally and vertically. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. {% include api/code_header.html %} From 3796dfcadb31e69b60a5c63202a5d9d74375512a Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 2 Jun 2025 09:50:28 +0100 Subject: [PATCH 090/192] clarify scale units --- source/presentation/4.0/model.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 13fa01084..bf41cdb13 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -276,7 +276,7 @@ A Timeline _MUST_ have the following additional properties: [duration](#duration > `"type": "Canvas"` -A Canvas is a Container that represents a particular rectangular 2 dimensional view of the object and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. The values of these properties are not pixels, but arbitrary units into which pixel-based resources can be scaled. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as the 2 dimensional space. +A Canvas is a Container that represents a particular rectangular 2 dimensional view of the object and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. The values of these properties are not pixels, but arbitrary square units into which pixel-based resources can be scaled. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as the 2 dimensional space. __Properties__
A Canvas _MUST_ have the following additional properties: [height](#height), and [width](#width).

@@ -292,7 +292,7 @@ A Scene is a Container that represents an infinitely large three-dimensional spa diagram of Right handed cartesian coordinate system -The axes of the coordinate system are measured in arbitrary units and these units do not necessarily correspond to any physical unit of measurement, unless `spatialScale` is supplied. +The axes of the coordinate system are measured in arbitrary units. All axes use the same unit scaling and do not necessarily correspond to any physical unit of measurement, unless `spatialScale` is supplied. All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. @@ -2048,7 +2048,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re ### spatialScale {: #spatialScale} -A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance between adjacent units horizontally and vertically. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. +A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. {% include api/code_header.html %} From 6e6dc93e3c39b8193dc7967b0dc4e2cbf8e715ae Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 2 Jun 2025 11:17:59 +0100 Subject: [PATCH 091/192] Leeds tweaks --- source/presentation/4.0/index.md | 391 +++++++++++++---------------- source/presentation/4.0/model.md | 2 +- source/presentation/4.0/scratch.md | 6 + 3 files changed, 181 insertions(+), 218 deletions(-) create mode 100644 source/presentation/4.0/scratch.md diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index e873827dd..647ad7b84 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -35,7 +35,7 @@ hero: image: '' --- -## Status of this Document +# Status of this Document {:.no_toc} __This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} @@ -51,57 +51,57 @@ __Previous Version:__ [3.0][prezi30] ---- -## Introduction +# Introduction The purpose of the IIIF Presentation API specification is to provide a [model](model) and JSON serialization format of that model. -It provides a document format - the IIIF Manifest - for cultural heritage organizations (and anyone else) to publish standardized, interoperable objects. This allows compatible software such as viewers and annotation tools to load and present complex digital objects on the web. +It provides a document format - the IIIF Manifest - for cultural heritage organizations (and anyone else) to present objects in a standardized, interoperable fashion. This allows compatible software such as viewers and annotation tools to load and present complex digital objects on the web from thousands of different providers. -The specification is solely concerned with presentation - providing enough information to render an object in compatible software, and leaving the meaning of the object to external descriptive metadata standards. +**If you have existing images, audio, video and models on the web, you can easily provide IIIF Manifests for them by publishing the appropriate JSON documents.** -_Presentation, the clue is in the name_ +The IIIF Presentation API is concerned with enabling user experiences - providing enough information to present objects in compatible software, and leaving the meaning of the objects to external descriptive metadata standards. -This specification is presented in two parts. This document acts as an introduction to the specification through a set of typical (but non-exhaustive) use cases. The model [model](model) provides the formal specification of the terms used in this introduction. +This document acts as an introduction to the specification through a set of typical (but non-exhaustive) use cases. The model [model](model) document provides the formal specification of the terms used in this introduction. -### IIIF Use cases +## IIIF Use cases -1. **Artwork** - a IIIF Manifest that represents a painting, comprising a single image and accompanying display information. -2. **Book** - a IIIF Manifest that represents a digitized bound volume made up many separate images in order. The IIIF model provides structural elements to indicate the chapters. The text of the book is made available in machine-readable form as Web Annotations. -3. **45 Single** - a IIIF Manifest that represents the digitized audio from the two sides of a vinyl 7 inch record. -4. **Movie** - a IIIF Manifest that represents the digitized video of a film. A transcript of the audio is provided as Web Annotations, and additional machine-readable files provide subtitles and captions. -5. **Simple 3D Model** - a IIIF Manifest that publishes a single 3D model. -6. **Complex Scene** - a IIIF Manifest that publishes a complex 3D scene comprising multiple models, lights and cameras. -7. **Periodical** - a IIIF Collection that provides multiple IIIF child IIIF Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements. -8. **Storytelling in 3D** - a IIIF Manifest that defines a sequence of states in a complex scene for the purposes of guiding a user through a particular experience. +1. **Artwork** - a Manifest that represents a painting, comprising a single image and accompanying display information. +2. **Book** - a Manifest that represents a digitized bound volume made up many separate images in order. The IIIF model provides structural elements to indicate the chapters. The text of the book is made available in machine-readable form as Web Annotations. +3. **45 Single** - a Manifest that represents the digitized audio from the two sides of a vinyl 7 inch record. +4. **Movie** - a Manifest that represents the digitized video of a film. A transcript of the audio is provided as Web Annotations, and additional machine-readable files provide subtitles and captions. +5. **Simple 3D Model** - a Manifest that publishes a single 3D model. +6. **Complex Scene** - a Manifest that publishes a complex 3D scene comprising multiple models, lights and cameras. +7. **Periodical** - a IIIF Collection that provides multiple child Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements. +8. **Storytelling in 3D** - a Manifest that defines a sequence of states in a complex scene for the purposes of guiding a user through a particular experience. 9. **Manuscript** - (integration) -These use case were chosen as a broad sample to introduce IIIF Concepts. Many more use cases are provided as recipes in the [IIIF Cookbook](link). +These use case were chosen as a broad sample to introduce IIIF concepts. Many more use cases are provided as recipes in the [IIIF Cookbook](link). -Consider diagrams +> TODO Consider diagrams -## Foundations +# Foundations -(needs updating) +This section is what you need to know to make sense of the examples that follow it.

Data Model

-### Manifests +## Manifests A Manifest is the primary unit of distribution of IIIF. Each Manifest usually describes how to present an object, such as a book, statue, music album or 3 dimensional scene. It is a JSON document that carries information needed for the client to present content to the user, such as a title and other descriptive information. The scope of what constitutes an object, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. -The Manifest's `items` property is an ordered list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents the Content Resources to the user in that order. +The Manifest's `items` property is an ordered list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents each Container's Content Resources. The client software also presents user interface controls to navigate the list of Content Containers. Manifests have descriptive, technical and linking properties. The required properties of Manifests are `id`, `type`, `items` and `label`. Other commonly used properties include `summary`, `metadata`, `rights`, `thumbnail`, `homepage` and `provider`. (👀) [Model Documentation](model/#manifest) -```json +```jsonc { "@context": "http://iiif.io/api/presentation/4/context.json", "id": "https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json", @@ -116,7 +116,8 @@ Manifests have descriptive, technical and linking properties. The required prope ``` -### Containers + +## Containers A Container is a frame of reference that allows the relative positioning of Content Resources, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). @@ -124,109 +125,33 @@ The required properties of all Containers are `id`, and `type`. Most Containers The defined Container types are: -#### Timeline +### Timeline A Container that represents a bounded temporal range, without any spatial coordinates. It is typically used for audio-only content. Timelines have an additional required property of `duration`, which gives the extent of the Timeline as a floating point number of seconds. - -#### Canvas - -A Container that represents a bounded, two-dimensional space, optionally with a bounded temporal range. Canvases are typically used for Image and Video content. - -Canvases have two additional required properties: `height` and `width`, which give the spatial extent as unitless integers. Canvases may also have the `duration` property in the same manner as Timelines. - - -#### Scene - -A Container that represents a boundless three-dimensional space, optionally with a bounded temporal range. Scenes are typically used for rendering 3D models, and can additionally have Cameras and Lights. - -Scenes may also have the `duration` property in the same manner as Timelines. - -(👀) [Model Documentation](model/#containers) - ```json { - "@context": "http://iiif.io/api/presentation/4/context.json", - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers", - "type": "Manifest", - "label": { - "en": [ "A Manifest with all three types of Container" ] - }, + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/timeline", + "type": "Timeline", + "duration": 32.76, "items": [ { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/timeline", - "type": "Timeline", - "duration": 32.76, - "items": [ - { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/t1", - "type": "Annotation", - "motivation": "painting", - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/audio/clip.mp3", - "type": "Audio", - "format": "audio/mp3", - "duration": 32.76, - }, - "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/timeline" - } - ] - } - ] - }, - { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas", - "type": "Canvas", - "width": 12000, - "height": 9000, - "items": [ - { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p2", - "type": "AnnotationPage", - "items": [ - { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/c1", - "type": "Annotation", - "motivation": "painting", - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", - "type": "Image", - "format": "image/jpeg", - "width": 4000, - "height": 3000 - }, - "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas" - } - ] - } - ] - }, - { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/scene", - "type": "Scene", + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/page/p1", + "type": "AnnotationPage", "items": [ { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p3", - "type": "AnnotationPage", - "items": [ - { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/s1", - "type": "Annotation", - "motivation": "painting", - "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/models/astronaut.glb", - "type": "Model", - "format": "model/gltf-binary" - }, - "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/scene" - } - ] + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/t1", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/audio/clip.mp3", + "type": "Audio", + "format": "audio/mp3", + "duration": 32.76 + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/timeline" } ] } @@ -234,48 +159,27 @@ Scenes may also have the `duration` property in the same manner as Timelines. } ``` -The above Manifest has three Containers, one of each type. While contrived, it is still valid and the expected user experience would be for a viewer to begin on the Timeline Container, presenting UI for the user to play the audio. The viewer would also present navigation elements to move to the next Container (the Canvas) or otherwise navigate the available Content Containers. Usually, even when a Manifest has a large number of Containers in its `items` property, they are of the same type (e.g., a 100 page book is modelled as a Manifest with 100 Canvases, each bearing an image of one page). But it is not a requirement that all Containers in a Manifest must be of the same type. - -In each of the three Containers, an **Annotation** links the Container to a Content Resource. The Content Resource is _painted_ into the Container by an Annotation whose `target` property is the `id` of the Container. In all three simple cases here the `target` property is the the `id` of the Container with no further qualification. - - - -### Annotations - -IIIF uses the concept of _Annotation_ to link resources together from around the web. This specification uses a World Wide Web Consortium (W3C) standard for this called the [Web Annotation Data Model][org-web-anno]. This is a structured linking mechanism useful for making comments about Content Resources, but IIIF's primary use of it is to associate the images, audio and other Content Resources with their Containers for presentation. - -Different uses of Annotation are distinguished through their `motivation` property. This specification defines a value for `motivation` called `painting` for associating Content Resources with Containers, which this specification calls a Painting Annotation. The verb "paint" is also used to refer to the associating of a Content Resource with a Container by a Painting Annotation. This is from the notion of painting onto a canvas, a metaphor borrowed from art and used for image-based digital applications, and expanded by IIIF into "painting" any Content Resource into a Container of any number of dimensions. - -In the example Manifest above the first Container is a Timeline. One content resource, an MP3 file, is associated with the Timeline via a Painting Annotation for its entire duration. Typically the duration of the Timeline matches the duration of its content. This is the simplest time-based use case. The `target` property of the Painting Annotation is the whole Timeline, because it is simply the `id` of the Timeline without further qualification. In this simple case, playing the Timeline is the same as playing the MP3. - -The second Container is a Canvas, representing a 2D surface. In this case the Canvas represents an artwork, and there is no duration property. The content resource, a JPEG image of the artwork, is associated with the Canvas via a Painting Annotation. The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image. The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. - -The third Container is a Scene. Unlike a Canvas, it is not a bounded spatial extent, but may be a bounded temporal extent if it has the optional duration property. It still establishes a coordinate space (x, y, z) but doesn't need any spatial properties to do so as it is always the same, infinite unbounded space. The Annotation paints the astronaut model into the Scene. As no further qualification is given, the astronaut model is placed at the (0,0,0) origin of the Scene. Later examples will show how to control the lighting and camera position(s) and properties, but this is not required; a IIIF viewer is expected to supply ambient light and a default camera position in the absence of specific values. - - -The same linking mechanism is also used in IIIF with other motivations for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning content, and provides a standards-based framework for referencing parts of resources. As Annotations can be added later, it promotes a distributed system in which further content such as commentary can be aligned with the objects published on the web. - -The required properties of Annotations are `id`, `type`, `motivation`, and `target`. Most Annotations also have the `body` property. +### Canvas -The relationship between a Container and a painting annotation is not direct. Annotations are grouped within the `items` property of an Annotation Page, and the `items` property of the Container is a list of Annotation Pages. +A Container that represents a bounded, two-dimensional space, optionally with a bounded temporal range. Canvases are typically used for Image and Video content. -(👀) [Model Documentation](model/#annotations) +Canvases have two additional required properties: `height` and `width`, which give the spatial extent as integers. Canvases may also have the `duration` property in the same manner as Timelines. ```json { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas", + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas", "type": "Canvas", "width": 12000, "height": 9000, "items": [ { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/page/p2", + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/page/p2", "type": "AnnotationPage", "items": [ { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/annotation/c1", + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/c1", "type": "Annotation", - "motivation": "painting", + "motivation": [ "painting" ], "body": { "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", "type": "Image", @@ -283,7 +187,7 @@ The relationship between a Container and a painting annotation is not direct. An "width": 4000, "height": 3000 }, - "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas" + "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas" } ] } @@ -291,23 +195,76 @@ The relationship between a Container and a painting annotation is not direct. An } ``` -### Content Resources +### Scene -Content Resources are external web resources, including images, video, audio, 3D models, data, web pages or any other format. Typically these are the resources that will be "painted" onto a Container using a Painting Annotation. +A Container that represents a boundless three-dimensional space, optionally with a bounded temporal range. Scenes are typically used for rendering 3D models, and can additionally have Cameras and Lights. -The required properties of Content Resources are `id` and `type`. Other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. +Scenes may also have the `duration` property in the same manner as Timelines. -The Containers example also demonstrates that if you have existing content resources with web URIs - images, audio, video and models - you can quite easily publish IIIF Manifests for them by constructing the appropriate JSON around them and publishing the JSON documents. This requires careful consideration of the URI schemes for `id` properties of Containers and their Manifests to ensure they remain referenceable in the future. The choice of Timeline or Canvas dimensions (duration, width, height) can usually be derived simply from the content; the same duration as the audio or video, and the same unit Canvas dimensions as the image or video pixel dimensions, with the caveat that you should avoid low values for `width` and `height` (ref model). +```json +{ + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/scene", + "type": "Scene", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/page/p3", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/s1", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/models/astronaut.glb", + "type": "Model", + "format": "model/gltf-binary" + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/scene" + } + ] + } + ] +} +``` + +[👀 Model Documentation](model/#containers) -#### Containers as Content Resources + +## Annotations + + +IIIF uses the concept of _Annotation_ to link resources together from around the web. This specification uses a World Wide Web Consortium (W3C) standard for this called the [Web Annotation Data Model][org-web-anno]. This is a structured linking mechanism useful for making comments about Content Resources, but IIIF's primary use of it is to associate the images, audio and other Content Resources with their Containers for presentation. + +In each of the three Containers above, an **Annotation** links the Container to a Content Resource. The Content Resource in the `body` property is _painted_ into the Container by an Annotation whose `target` property is the `id` of the Container. In all three simple cases here the `target` property is the `id` of the Container with no further qualification. + +Different uses of Annotation are distinguished through their `motivation` property. This specification defines a value for `motivation` called `painting` for associating Content Resources with Containers, which this specification calls a Painting Annotation. The verb "paint" is also used to refer to the associating of a Content Resource with a Container by a Painting Annotation. This is from the notion of painting onto a canvas, a metaphor borrowed from art and used for image-based digital applications, and expanded by IIIF into "painting" any Content Resource into a Container of any number of dimensions. + +The same linking mechanism is also used in IIIF with other motivations for transcriptions, commentary, tags and other content. This provides a single, unified method for aligning content, and provides a standards-based framework for referencing parts of resources. As Annotations can be added later, it promotes a distributed system in which further content such as commentary can be aligned with the objects published on the web. + +Annotations are grouped within the `items` property of an Annotation Page, and the `items` property of the Container is a list of Annotation Pages. This allows consistent grouping of Annotations when required. + +(👀) [Model Documentation](model/#annotations) + + +## Content Resources + +Content Resources are external web resources, including images, video, audio, 3D models, data, web pages or any other format. Typically these are the resources that will be painted into a Container using a Painting Annotation. + +In addition to the required properties `id` and `type`, other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. + +If you have existing content resources with web URIs - images, audio, video and models - you can publish IIIF Manifests for them by constructing the appropriate JSON around them and publishing the JSON documents. This requires careful consideration of the URI schemes for `id` properties of Containers and their Manifests to ensure they remain referenceable in the future. The choice of Timeline or Canvas dimensions (duration, width, height) can usually be derived simply from the content; the same duration as the audio or video, and the same unit Canvas dimensions as the image or video pixel dimensions, with the caveat that you should avoid low values for `width` and `height` (ref model). + +(👀) [Model Documentation](model/#contentresources) + +### Containers as Content Resources Containers may also be treated as Content Resources and painted into other Containers. This allows rich composition of content, such as painting a Canvas bearing a Video into a Scene, or painting a 3D model along with its associated Lights into an encompassing Scene. -#### Referencing Parts of Resources +### Referencing Parts of Resources A common requirement is to refer to only part of a resource, either a Container or a Content Resource. There are two primary methods for achieving this: adding a fragment to the end of the URI for the resource, or creating a Specific Resource that describes the method for selecting the desired part. -##### Fragments +#### Fragments Parts of resources on the Web are identified using URIs with a fragment component that both describes how to select the part from the resource, and, as a URI, also identifies it. In HTML this is frequently used to refer to part of the web page, called an anchor. The URI with the fragment can be used in place of the URI without the fragment in order to refer to this part. @@ -315,7 +272,7 @@ There are different types of fragment based on the format of the resource. The m ```json { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/comments/c1", + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/comments/c1", "type": "Annotation", "motivation": "commenting", "body": { @@ -324,14 +281,14 @@ There are different types of fragment based on the format of the resource. The m "language": "en", "format": "text/plain" }, - "target": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas#xywh=6050,3220,925,1250" + "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas#xywh=6050,3220,925,1250" } ``` Here the Canvas `id` from the earlier example is still the `target` of an Annotation, but it has been qualified to a specific region of that Canvas by a Fragment Selector `#xywh=6050,3220,925,1250`. Note that the x, y, w, and h are in the Canvas coordinate space, not the pixel dimensions space. This annotation has no knowledge of or dependency on the particular image we painted onto the Canvas; we could replace that image with one of a different, higher resolution without affecting this annotation or the region of the Canvas it targets. -##### Specific Resource +#### Specific Resource URIs with fragments are insufficient for complex referencing, like circular regions or arbitrary text spans, and do not support other useful features such as describing styling or transformation. The Web Annotation Data Model introduces a class called `SpecificResource` that represents the resource in a specific context or role, which IIIF uses to describe these more complex requirements. The Specific Resource then identifies the part, and the description of how to extract it is given as an instance of a `Selector` class associated with it. @@ -341,7 +298,7 @@ The required properties of Specific Resources are `id`, `type`, and `source`. Ot ```json { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/comments/c1", + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/comments/c1", "type": "Annotation", "motivation": "commenting", "body": { @@ -353,7 +310,7 @@ The required properties of Specific Resources are `id`, `type`, and `source`. Ot "target": { "type": "SpecificResource", "source": { - "id": "https://iiif.io/api/presentation/examples/manifest-with-containers/canvas", + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas", "type": "Canvas" }, "selector": { @@ -366,9 +323,9 @@ The required properties of Specific Resources are `id`, `type`, and `source`. Ot -## Image Content +# Image Content -### Use Case 1: Artwork +## Use Case 1: Artwork This example is a Manifest with one Canvas, with an image of an artwork "painted" onto the Canvas. It demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. @@ -380,10 +337,10 @@ Manifest -> items -> Canvas -> items -> AnnoPage -> items -> Anno -> body -> Ima label, summary, metadata, rights, provider, homepage, thumbnail ``` -Notice that the painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. +Notice that the Painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. -### Example 2: Book +## Example 2: Book This example is a Manifest with multiple Canvases, each of which represents a page of a book. It demonstrates the use of the `behavior` property to indicate to a client that the object is _paged_: this helps a client generate the correct user experience. The `viewingDirection` property indicates that the book is read left-to-right. In this case, the property is redundant as `left-to-right` is the default value. The Manifest has a `rendering` property linking to a PDF representation; typically a client would offer this as a download or "view as" option. The `start` property is used to tell a client to initialize the view on a particular Canvas, useful if the digitized work contains a large amount of irrelevant front matter or blank pages. The `requiredStatement` is a message that a client MUST show to the user when presenting the Manifest. @@ -394,9 +351,9 @@ requiredStatement, behavior, viewingDirection, (no Ranges), rendering - PDF vers -## Audio and Video +# Audio and Video -### Example: a 45 single with one Timeline per song/side +## Example: a 45 single with one Timeline per song/side This example is a Manifest with two Timelines, each of which represent a temporal extent during which a song is played. As in most cases, the Timeline `duration` is the same length as that of Content Resource painted into it. This example is a recording digitized from a 45 RPM 7 inch single. It demonstrates the use of `format` for the audio files' content type, `language` (One song is in English and one is in German), `behavior` with value "autoPlay" that tells a client to automatically advance to the second Timeline after playing the first, `annotations` that link to Annotation Pages of annotations with the motivation `supplementing` that provide the lyrics (one example is given afterwards) - and an `accompanyingContainer` that carries a picture of the single's cover that is shown while the songs are playing. @@ -412,7 +369,7 @@ duration, autoPlay, format, annotations (transcript), language, accompanyingCont ... ``` -### Example: a movie with subtitles +## Example: a movie with subtitles This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, the `timeMode` property ..., and `placeholderContainer` that provides a poster image to show in place of the video file before the user initiates playback. @@ -434,7 +391,7 @@ duration, behavior=autoplay, format, Choice of video 720p, 4K? (forward ref), ti Sometimes, two different formats derived from the same source may have slightly different durations, perhaps a few milliseconds out. What to do... -## 3D +# 3D 3D Content Resources are painted into Scenes. @@ -443,7 +400,7 @@ Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). -### Example: Static 3D Model of a Spacesuit +## Example: Static 3D Model of a Spacesuit This example is a Manifest with a single Scene, with a single model of a space suit painted at the Scene's origin. @@ -472,7 +429,7 @@ backgroundColor: #000 point selector for positioning -### Example: 3D Model of a Chessboard +## Example: 3D Model of a Chessboard Chessboard is a Canvas with image more than one model @@ -488,7 +445,7 @@ interactionMode -### Merge the below into the examples or into model +## Merge the below into the examples or into model This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). @@ -683,13 +640,13 @@ Todo add example ``` -### Give example of refinedBy ? e.g. WktSelector + Instant +## Give example of refinedBy ? e.g. WktSelector + Instant -### Scene-Specific Resources +## Scene-Specific Resources -#### Camera +### Camera A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. @@ -729,7 +686,7 @@ The first Camera defined and not hidden in a Scene is the default Camera used to -#### Light +### Light This specification defines four types of Light: @@ -767,7 +724,7 @@ If there are no Lights present within the Scene, then the viewer MUST add at lea -#### Transforms +### Transforms The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. @@ -811,7 +768,7 @@ Transforms are only used in the Presentation API when the SpecificResource is th ``` -#### Relative Rotation +### Relative Rotation It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. @@ -829,7 +786,7 @@ This rotation happens after the resource has been added to the Scene, and thus a ``` -#### Excluding +### Excluding Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. @@ -854,7 +811,7 @@ Painting a Scene into another while excluding import of several types of resourc -#### Nesting +### Nesting A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. @@ -888,20 +845,20 @@ When a Scene is nested into another Scene, the `backgroundColor` of the Scene to -## Annotations +# Annotations -### Comment Annotations +## Comment Annotations -### Choice of Alternative Resources +## Choice of Alternative Resources Example: Multi-spectral Images with Comments -### Embedded Content +## Embedded Content e.g., painting TextualBody on Canvas @@ -912,34 +869,34 @@ It is important to be able to position the textual body of an annotation within -### Non Rectangular Segments +## Non Rectangular Segments SvgSelector - move to SpecificResource too ^^ -### Style +## Style Move to SpecificResource -### Rotation +## Rotation -### Hotspot Linking and Activation +## Hotspot Linking and Activation Move to SpecificResource -### Annotation Page +## Annotation Page "Overlapping elements with a larger z-index cover those with a smaller one." link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index -### Annotation Collection +## Annotation Collection deal with this: https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 @@ -953,21 +910,21 @@ use totalItems? https://iiif.io/api/discovery/1.0/#totalitems -## Navigation +# Navigation -### Collection +## Collection IIIF Collections are ordered lists of Manifests, Collections, and/or Specific Resources. Collections allow these resources to be grouped in a hierarchical structure for navigation and other purposes. :eyes: -### Range +## Range IIIF Ranges are used to represent structure _WITHIN_ a Manifest beyond the default order of the Containers in the `items` property. Example uses include newspaper sections or articles, chapters within a book for a table of contents, or movements within a piece of music. Ranges can include Containers, parts of Containers via Specific Resources or fragment URIs, or other Ranges, creating a tree structure like a table of contents. The typical intent of adding a Range to the Manifest is to allow the client to display a linear or hierarchical navigation interface to enable the user to quickly move through the object's content. :eyes: -### Example: Periodical +## Example: Periodical This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. Each of these year Collections in turn has one Manifest for each daily issue of the newspaper. @@ -1010,7 +967,7 @@ sequence -## Integration +# Integration seeAlso, service(s), extensions mention search, image api, auth @@ -1023,7 +980,7 @@ partOf - -## Content State +# Content State A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: @@ -1137,14 +1094,14 @@ Annotations with the motivation `contentState` are referred to as _content state Content States are used for the following applications: -### Load a particular view of a resource or group of resources +## Load a particular view of a resource or group of resources In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the Content State Protocol API 2.0 specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. -### Load a particular view of some resource and modify it +## Load a particular view of some resource and modify it In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: @@ -1188,7 +1145,7 @@ TODO: what is the processing algorithm for applying incoming `hidden` ? When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. -### Modify the Container in a particular context +## Modify the Container in a particular context The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. @@ -1356,19 +1313,19 @@ Use of `scope` is permitted in annotations on any Container type, not just Scene -### The `sequence` behavior +## The `sequence` behavior // Is this right? Language... While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. -### Content States on Manifests +## Content States on Manifests When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. // Is there some overlap here with Range? -### Processing Content States in Scopes: reset +## Processing Content States in Scopes: reset When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. @@ -1446,19 +1403,19 @@ Before applying the content state to the Scene, the client should reset the Scen // I am assuming reset is always true except in `linear-nav` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... -### Contribute additional information permanently +## Contribute additional information permanently Rerum inbox scenario - should be covered in CS2 protocol -### activating - animation and interactions +## activating - animation and interactions Annotations with the motivation `activating` are referred to as _activating_ annotations. There are two uses of `activating` annotations: -#### Triggering a content state +### Triggering a content state -An activating annotation links a painting annotation to a content state. When a user interacts with the painting annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The painting annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. +An activating annotation links a Painting Annotation to a content state. When a user interacts with the Painting Annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The Painting Annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. The activating annotation is provided in a Container's `annotations` property. In this (contrived for brevity) example, if the user clicks the mandible model, the Scene background changes color: @@ -1530,14 +1487,14 @@ The activating annotation is provided in a Container's `annotations` property. I -#### Triggering a named animation in a model +### Triggering a named animation in a model Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. This pattern is similar to the above, except that: - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) - - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the painting annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. + - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the Painting Annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. The format of the `value` string is implementation-specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. @@ -1618,7 +1575,7 @@ if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody There is a more general rule here! -### reset +## reset See above... @@ -1631,7 +1588,7 @@ See above... -## Conveying Physical Dimensions +# Conveying Physical Dimensions In many cases, the dimensions of a Canvas, or the pixel density of a photograph, are not necessarily related to a real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. But it can be important to know how big something is or if there is a relationship between pixel density and physical length, especially when comparing objects together. Each pixel in an image may correspond precisely to a physical area, allowing measurement of real world distances from the image. A scanned 3D model may be constructed such that each 3D coordinate unit corresponds to one meter of physical distance. @@ -1645,26 +1602,26 @@ An extreme example of both physical dimension properties together is a Canvas sh -## Protocol +# Protocol -### HTTP Requests and Responses +## HTTP Requests and Responses -#### URI Recommendations +### URI Recommendations -#### Requests +### Requests -#### Responses +### Responses -#### Authentication +### Authentication -## Accessibility +# Accessibility (new section) @@ -1677,7 +1634,7 @@ An extreme example of both physical dimension properties together is a Canvas sh -## Terminology +# Terminology The principles of [Linked Data][org-linked-data] and the [Architecture of the Web][org-w3c-webarch] are adopted in order to provide a distributed and interoperable framework. The [Shared Canvas data model][shared-canvas] and [JSON-LD][org-w3c-json-ld] are leveraged to create an easy-to-implement, JSON-based format. @@ -1693,12 +1650,12 @@ The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _S -## Appendices +# Appendices -### Versioning +## Versioning -### Acknowledgements +## Acknowledgements -### Change Log +## Change Log "Exclude Audio" diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index bf41cdb13..6b89d0bc4 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1294,7 +1294,7 @@ The URI that identifies the resource. If the resource is only available embedded The value _MUST_ be a string, and the value _MUST_ be an HTTP(S) URI for resources defined in this specification. If the resource is retrievable via HTTP(S), then the URI _MUST_ be the URI at which it is published. External resources, such as profiles, _MAY_ have non-HTTP(S) URIs defined by other communities. -The existence of an HTTP(S) URI in the `id` property does not mean that the URI will always be dereferencable. If the resource with the `id` property is [embedded][prezi30-terminology], it _MAY_ also be dereferenceable. If the resource is referenced (again, see the [terminology section][prezi30-terminology] for an explanation of "referenced"), it _MUST_ be dereferenceable. The [definitions of the Resources][prezi30-resource-structure] give further guidance. +The existence of an HTTP(S) URI in the `id` property does not mean that the URI will always be dereferenceable. If the resource with the `id` property is [embedded][prezi30-terminology], it _MAY_ also be dereferenceable. If the resource is referenced (again, see the [terminology section][prezi30-terminology] for an explanation of "referenced"), it _MUST_ be dereferenceable. The [definitions of the Resources][prezi30-resource-structure] give further guidance. * All resource types _MUST_ have the `id` property.
Clients _MAY_ render `id` on any resource type, and _SHOULD_ render `id` on Collections, Manifests and Canvases. diff --git a/source/presentation/4.0/scratch.md b/source/presentation/4.0/scratch.md new file mode 100644 index 000000000..3142c74e6 --- /dev/null +++ b/source/presentation/4.0/scratch.md @@ -0,0 +1,6 @@ + +In the example Manifest above the first Container is a Timeline. One content resource, an MP3 file, is associated with the Timeline via a Painting Annotation for its entire duration. Typically the duration of the Timeline matches the duration of its content. This is the simplest time-based use case. The `target` property of the Painting Annotation is the whole Timeline, because it is simply the `id` of the Timeline without further qualification. In this simple case, playing the Timeline is the same as playing the MP3. + +The second Container is a Canvas, representing a 2D surface. In this case the Canvas represents an artwork, and there is no duration property. The content resource, a JPEG image of the artwork, is associated with the Canvas via a Painting Annotation. The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image. The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. + +The third Container is a Scene. Unlike a Canvas, it is not a bounded spatial extent, but may be a bounded temporal extent if it has the optional duration property. It still establishes a coordinate space (x, y, z) but doesn't need any spatial properties to do so as it is always the same, infinite unbounded space. The Annotation paints the astronaut model into the Scene. As no further qualification is given, the astronaut model is placed at the (0,0,0) origin of the Scene. Later examples will show how to control the lighting and camera position(s) and properties, but this is not required; a IIIF viewer is expected to supply ambient light and a default camera position in the absence of specific values. \ No newline at end of file From 7a56441b3e25929f3441bb57eb4241ddee7a6fdc Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 11:18:26 +0100 Subject: [PATCH 092/192] Model --- source/presentation/4.0/model.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 6b89d0bc4..2a2925390 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -235,7 +235,7 @@ A Manifest is the primary unit of distribution of IIIF and provides a descriptio Manifests _MUST_ be identified by a URI and it _MUST_ be an HTTP(S) URI, given in the `id` property. It _MUST_ be able to be dereferenced to retrieve the JSON description. -The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. +The members of a Manifest are listed in the `items` property. The members of Manifests _MUST_ be Containers, defined below, and are embedded within the Manifest. The Containers in a single Manifest _MAY_ be of different classes. The Manifest _MAY_ have a `structures` property listing one or more [Ranges][#range] which describe additional structure of the content, such as might be rendered as a table of contents. The Manifest _MAY_ have an `annotations` property, which includes Annotation Page resources where the Annotations have the Manifest as their `target`. These Annotations _MUST NOT_ have `painting` as their `motivation`. __Properties__
@@ -245,7 +245,7 @@ A Manifest _MAY_ have the following properties: [requiredStatement](#requiredSta {: .note} ### Container Classes -{: #containers} +{: #Containers} A Container is a frame of reference that allows the relative positioning of content. @@ -263,6 +263,7 @@ All Containers _MAY_ have the following properites: [metadata](#metadata), [summ #### Timeline +{: #Timeline} > `"type": "Timeline"` @@ -273,6 +274,7 @@ A Timeline _MUST_ have the following additional properties: [duration](#duration {: .note} #### Canvas +{: #Canvas} > `"type": "Canvas"` @@ -285,6 +287,7 @@ A Canvas _MAY_ have the following additional properties: [duration](#duration). #### Scene +{: #Scene} > `"type": "Scene"` @@ -301,13 +304,13 @@ A Scene _MAY_ have the following additional properties: [duration](#duration). {: .note} - ### Annotation Classes -{: #annotations} +{: #Annotations} The following set of classes are defined by the W3C's [Web Annotation Data Model][org-w3c-webanno] and Vocabulary, and are heavily used within the IIIF Data Model. Any necessary deviations from those specifications are explicitly noted and explained, such as the need for internationalization of labels. #### Annotation +{: #Annotation} > `"type": "Annotation"` @@ -327,6 +330,7 @@ An Annotation _MAY_ have the following properties: [label](#label), [metadata](# #### Annotation Collection +{: #AnnotationCollection} > `"type": "AnnotationCollection"` @@ -344,6 +348,7 @@ An Annotation Collection _MAY_ have the following properties: [requiredStatement #### Annotation Page +{: #AnnotationPage} > `"type": "AnnotationPage"` @@ -359,6 +364,7 @@ An Annotation Page _MAY_ have the following properties: [label](#label), [startI #### Specific Resource +{: #SpecificResource} > `"type": "SpecificResource"` @@ -373,6 +379,7 @@ A Specific Resource _MAY_ have the following properties: [position](#position), {: .note} #### Textual Body +{: #TextualBody} > `"type": "TextualBody"` @@ -387,6 +394,7 @@ A Specific Resource _MAY_ have the following properties: [position](#position), #### Choice +{: #Choice} > `"type": "Choice"` @@ -402,6 +410,7 @@ A Choice _MAY_ have the following properties: [metadata](#metadata), [summary](# ### Content Resources +{: #ContentResources} Content Resources are resources on the Web such as images, audio, video, 3d models, or text which can be associated with a Container via an Annotation, or be used with `thumbnail`, `rendering` or similar properties. @@ -421,11 +430,13 @@ A Content Resource _MAY_ have the following properties: [height](#height), [widt ### Selectors +{: #Selectors} The Web Annotation Data Model defines several Selectors, which describe how to find a specific segment of that resource to be used. As noted, the nature of Selectors are dependent on the type of resources that they select out of, and the methods needed for those descriptions will vary. The Selectors from the Web Annotation Data Model and other sources can be used within the IIIF Data Model. This specification defines additional Selector classes for use. #### Point Selector +{: #PointSelector} > `"type": "PointSelector"` @@ -451,6 +462,7 @@ A Point Selector _MAY_ have the following properties: [x](#x), [y](#y), [z](#z), #### WKT Selector +{: #WktSelector} > `"type": "WktSelector"` @@ -2206,7 +2218,7 @@ A single UnitValue that defines a multiplier or scale factor for the `duration` Clients _MAY_ process `temporalScale` on a Canvas. * A Scene _MAY_ have the `temporalScale` property.
Clients _MAY_ process `temporalScale` on a Scene. - + ### thumbnail {: #thumbnail} From ead08e788ac17f665c2d378577ae902f1a2a9f35 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 11:20:37 +0100 Subject: [PATCH 093/192] Update model.md --- source/presentation/4.0/model.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 2a2925390..02e34b4c6 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -483,6 +483,7 @@ A WKT Selector _MUST_ have the following properties: [id](#id), [type](#type), a ``` #### Audio Content Selector +{: #AudioContentSelector} > `"type": "AudioContentSelector"` @@ -501,6 +502,7 @@ An Audio Content Selector _MUST_ have the following properties: [id](#id), and [ #### Visual Content Selector +{: #VisualContentSelector} > `"type": "VisualContentSelector"` From 988de7e0814ebd8c8e9a731039a05e59a0620323 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 2 Jun 2025 11:26:47 +0100 Subject: [PATCH 094/192] ORCIDs --- source/presentation/4.0/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 647ad7b84..527511e93 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -23,13 +23,13 @@ editors: ORCID: https://orcid.org/0000-0003-4441-6852 institution: J. Paul Getty Trust - name: Dawn Childress - ORCID: + ORCID: https://orcid.org/0000-0003-2602-2788 institution: UCLA - name: Julie Winchester - ORCID: + ORCID: https://orcid.org/0000-0001-6578-764X institution: Duke University - name: Jeff Mixter - ORCID: + ORCID: https://orcid.org/0000-0002-8411-2952 institution: OCLC hero: image: '' From 0ce7b72b3c3a1cdc35f15c7e9027337b1304fbb0 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 13:55:24 +0100 Subject: [PATCH 095/192] Update provides to annotation --- source/presentation/4.0/model.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 02e34b4c6..078e8b00f 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -23,13 +23,13 @@ editors: ORCID: https://orcid.org/0000-0003-4441-6852 institution: Yale University - name: Dawn Childress - ORCID: + ORCID: https://orcid.org/0000-0003-2602-2788 institution: UCLA - name: Julie Winchester - ORCID: + ORCID: https://orcid.org/0000-0001-6578-764X institution: Duke University - name: Jeff Mixter - ORCID: + ORCID: https://orcid.org/0000-0002-8411-2952 institution: OCLC hero: image: '' @@ -1839,17 +1839,14 @@ The value _MUST_ be an array of JSON objects, where each item in the array confo ### provides {: #provides} -A set of features or additional functionality that a linked resource enables relative to the linking or including resource, which is not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). +A set of features or additional functionality that a linked resource enables relative to the linking or including resource, often for accessibility purposes and which are not defined by the `type`, `format` or `profile` of the linked resource. It provides information as to why and how a client might want to interact with the resource, rather than what the resource is. For example, a text file (linked resource) that `provides` a `closedCaptions` for a Video (context resource), or an audio file (linked resource) that `provides` an `audioDescription` of a Canvas (context resource). The value _MUST_ be an array of strings, each string identifies a particular feature and _MUST_ be taken from the table below or the [provides registry][link]. Note that the majority of the values have been selected from [accessibility feature spec][link] and thus use the original form rather than being consistent with the hyphen-based form of the values of `behavior` and `viewingDirection`. - -* Annotations with the `painting` motivation _SHOULD NOT_ have the `provides` property.
- Clients _SHOULD_ ignore the `provides` property on Annotations with the `painting` motivation. -* Any resource linked to or included in another resource _MAY_ have the `provides` property.
- Clients _SHOULD_ process the `provides` property on these resources. +* Annotations with the `supplementing` motivation _MAY_ have the `provides` property.
+ Clients _SHOULD_ ignore the `provides` property on all other resource. | Value | Description | | ----- | ----------- | From db6d0b81489ee98b9af09ebdef38b0e6acb7846c Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 13:56:26 +0100 Subject: [PATCH 096/192] Remove warning --- source/presentation/4.0/model.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 078e8b00f..d61d2035d 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1869,8 +1869,6 @@ Note that the majority of the values have been selected from [accessibility feat { "provides": [ "closedCaption" ] } ``` -!!! warning "This breaks the graph as the file doesn't provide X in all contexts" - ### rendering {: #rendering} From 4d9dbafa56f9774f00e986d9273067124fcd45de Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 2 Jun 2025 13:57:44 +0100 Subject: [PATCH 097/192] Leeds tweaks 2 --- source/presentation/4.0/index.md | 91 ++++++++++++++++-------------- source/presentation/4.0/scratch.md | 5 +- 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 527511e93..30be9aba7 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -243,30 +243,26 @@ The same linking mechanism is also used in IIIF with other motivations for trans Annotations are grouped within the `items` property of an Annotation Page, and the `items` property of the Container is a list of Annotation Pages. This allows consistent grouping of Annotations when required. -(👀) [Model Documentation](model/#annotations) +(👀) [Model Documentation](model/#Annotations) ## Content Resources Content Resources are external web resources, including images, video, audio, 3D models, data, web pages or any other format. Typically these are the resources that will be painted into a Container using a Painting Annotation. -In addition to the required properties `id` and `type`, other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. +In addition to the required properties `id` and `type`, other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. The values of these properties are often the source of the equivalent Container properties. -If you have existing content resources with web URIs - images, audio, video and models - you can publish IIIF Manifests for them by constructing the appropriate JSON around them and publishing the JSON documents. This requires careful consideration of the URI schemes for `id` properties of Containers and their Manifests to ensure they remain referenceable in the future. The choice of Timeline or Canvas dimensions (duration, width, height) can usually be derived simply from the content; the same duration as the audio or video, and the same unit Canvas dimensions as the image or video pixel dimensions, with the caveat that you should avoid low values for `width` and `height` (ref model). - -(👀) [Model Documentation](model/#contentresources) +(👀) [Model Documentation](model/#ContentResources) ### Containers as Content Resources -Containers may also be treated as Content Resources and painted into other Containers. This allows rich composition of content, such as painting a Canvas bearing a Video into a Scene, or painting a 3D model along with its associated Lights into an encompassing Scene. +Containers may also be treated as Content Resources and painted into other Containers. This allows composition of content, such as painting a Canvas bearing a Video into a Scene, or painting a 3D model along with its associated Lights into an encompassing Scene. ### Referencing Parts of Resources -A common requirement is to refer to only part of a resource, either a Container or a Content Resource. There are two primary methods for achieving this: adding a fragment to the end of the URI for the resource, or creating a Specific Resource that describes the method for selecting the desired part. - -#### Fragments +A common scenario is to refer to only part of a resource, either a Container or a Content Resource. There are two primary methods for achieving this: adding a fragment to the end of the URI for the resource, or creating a Specific Resource that describes the method for selecting the desired part. -Parts of resources on the Web are identified using URIs with a fragment component that both describes how to select the part from the resource, and, as a URI, also identifies it. In HTML this is frequently used to refer to part of the web page, called an anchor. The URI with the fragment can be used in place of the URI without the fragment in order to refer to this part. +Parts of resources on the Web can be identified using URIs with a fragment component that both describes how to select the part from the resource, and, as a URI, also identifies it. In HTML this is frequently used to refer to part of the web page, called an anchor. The URI with the fragment can be used in place of the URI without the fragment in order to refer to this part. There are different types of fragment based on the format of the resource. The most commonly used type in IIIF is the W3C's Media Fragments specification, as it can define a temporal and 2D spatial region. @@ -274,8 +270,9 @@ There are different types of fragment based on the format of the resource. The m { "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/comments/c1", "type": "Annotation", - "motivation": "commenting", + "motivation": [ "commenting" ], "body": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", "type": "TextualBody", "value": "Koto with a cover being carried", "language": "en", @@ -285,35 +282,40 @@ There are different types of fragment based on the format of the resource. The m } ``` -Here the Canvas `id` from the earlier example is still the `target` of an Annotation, but it has been qualified to a specific region of that Canvas by a Fragment Selector `#xywh=6050,3220,925,1250`. Note that the x, y, w, and h are in the Canvas coordinate space, not the pixel dimensions space. This annotation has no knowledge of or dependency on the particular image we painted onto the Canvas; we could replace that image with one of a different, higher resolution without affecting this annotation or the region of the Canvas it targets. +Here the Canvas `id` from the earlier example is still the `target` of an Annotation, but it has been qualified to a specific region of that Canvas by a URI fragment `#xywh=6050,3220,925,1250`. Note that the x, y, w, and h are in the Canvas coordinate space, not the image pixel dimensions space. This annotation has no knowledge of or dependency on the particular image we painted onto the Canvas; we could replace that image with one of a different, higher resolution without affecting this annotation or the region of the Canvas it targets. -#### Specific Resource +### Specific Resource -URIs with fragments are insufficient for complex referencing, like circular regions or arbitrary text spans, and do not support other useful features such as describing styling or transformation. The Web Annotation Data Model introduces a class called `SpecificResource` that represents the resource in a specific context or role, which IIIF uses to describe these more complex requirements. The Specific Resource then identifies the part, and the description of how to extract it is given as an instance of a `Selector` class associated with it. +URIs with fragments are insufficient for complex referencing, like circular regions or arbitrary text spans, and do not support other useful features such as describing styling or transformation. The Web Annotation Data Model introduces a class called `SpecificResource` that represents the resource in a specific context or role, which IIIF uses to describe these more complex requirements. Several different classes of Selector are used in IIIF, including an alternative implementation of the fragment pattern called `FragmentSelector`. The fragment is given in the `value` property of the `FragmentSelector`, and the resource it should be applied to is given in `source`. The required properties of Specific Resources are `id`, `type`, and `source`. Other commonly used properties include `selector`, `transform`, and `scope`. +The fragment example above can be expressed using a Specific Resource: + ```json { "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/comments/c1", "type": "Annotation", - "motivation": "commenting", + "motivation": [ "commenting" ], "body": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", "type": "TextualBody", "value": "Koto with a cover being carried", "language": "en", "format": "text/plain" }, "target": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/resources/koto-sr", "type": "SpecificResource", "source": { "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas", "type": "Canvas" }, "selector": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/selectors/koto-selector", "type": "FragmentSelector", "value": "xywh=6050,3220,925,1250" } @@ -493,34 +495,37 @@ A content resource may be annotated into a Scene for a period of time by use of ```json { - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": -1.0, - "z": 3.0, - "refinedBy": { - "type": "FragmentSelector", - "value": "t=45,95" - } - } - ] - } + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "id": "https://example.org/iiif/selectors/model1-glb-sr", + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "id": "https://example.org/uuid/9fbd580b-895b-41b9-974a-1553329037f2", + "type": "PointSelector", + "x": -1.0, + "y": -1.0, + "z": 3.0, + "refinedBy": { + "id": "https://example.org/uuid/3d0d097b-2b37-4a15-b6a5-506e417d5115", + "type": "FragmentSelector", + "value": "t=45,95" + } + } + ] + } } ``` diff --git a/source/presentation/4.0/scratch.md b/source/presentation/4.0/scratch.md index 3142c74e6..273543e6d 100644 --- a/source/presentation/4.0/scratch.md +++ b/source/presentation/4.0/scratch.md @@ -3,4 +3,7 @@ In the example Manifest above the first Container is a Timeline. One content res The second Container is a Canvas, representing a 2D surface. In this case the Canvas represents an artwork, and there is no duration property. The content resource, a JPEG image of the artwork, is associated with the Canvas via a Painting Annotation. The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image. The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. -The third Container is a Scene. Unlike a Canvas, it is not a bounded spatial extent, but may be a bounded temporal extent if it has the optional duration property. It still establishes a coordinate space (x, y, z) but doesn't need any spatial properties to do so as it is always the same, infinite unbounded space. The Annotation paints the astronaut model into the Scene. As no further qualification is given, the astronaut model is placed at the (0,0,0) origin of the Scene. Later examples will show how to control the lighting and camera position(s) and properties, but this is not required; a IIIF viewer is expected to supply ambient light and a default camera position in the absence of specific values. \ No newline at end of file +The third Container is a Scene. Unlike a Canvas, it is not a bounded spatial extent, but may be a bounded temporal extent if it has the optional duration property. It still establishes a coordinate space (x, y, z) but doesn't need any spatial properties to do so as it is always the same, infinite unbounded space. The Annotation paints the astronaut model into the Scene. As no further qualification is given, the astronaut model is placed at the (0,0,0) origin of the Scene. Later examples will show how to control the lighting and camera position(s) and properties, but this is not required; a IIIF viewer is expected to supply ambient light and a default camera position in the absence of specific values. + + +This requires careful consideration of the URI schemes for `id` properties of Containers and their Manifests to ensure they remain referenceable in the future. \ No newline at end of file From 676c2d81df2bc18167045ca1f1fe7de1b640688a Mon Sep 17 00:00:00 2001 From: tomcrane Date: Mon, 2 Jun 2025 14:57:04 +0100 Subject: [PATCH 098/192] key points --- source/presentation/4.0/index.md | 116 +++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 7 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 30be9aba7..2220ebe79 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -329,18 +329,120 @@ The fragment example above can be expressed using a Specific Resource: ## Use Case 1: Artwork -This example is a Manifest with one Canvas, with an image of an artwork "painted" onto the Canvas. It demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. +This example is a Manifest with one Canvas, representing a 2D surface. In this case the Canvas represents an artwork, and there is no duration property. The content resource, a JPEG image of the artwork, is associated with the Canvas via a Painting Annotation. The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image. The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. -``` -Example: a painting {} -Will demonstrate: +It demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. -Manifest -> items -> Canvas -> items -> AnnoPage -> items -> Anno -> body -> Image -label, summary, metadata, rights, provider, homepage, thumbnail +```json +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://iiif.io/api/cookbook/recipe/0001-mvm-image/manifest.json", + "type": "Manifest", + "label": { + "en": [ "Use case 1: Artwork" ] + }, + "metadata": [ + { + "label": { "en": [ "Artist" ] }, + "value": { "en": [ "Anne Artist" ] } + }, + { + "label": { "en": [ "Date" ] }, + "value": { "en": [ "c. 1800" ] } + } + ], + "summary": { "en": [ "A longer piece of text to be shown when the metadata is not." ] }, + "rights": "http://rightsstatements.org/vocab/NoC-NC/1.0/", + "homepage": [ + { + "id": "https://example.org/works/artwork37", + "type": "Text", + "format": "text/html", + "label": { "en": [ "Homepage for artwork37" ] } + } + ], + "thumbnail": [ + { + "id": "https://example.org/works/artwork37/thumbnail.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 100, + "height": 150 + } + ], + "provider": + [ + { + "id": "https://example.org/about", + "type": "Agent", + "label": { "en": [ "Example Organization" ] }, + "homepage": [ + { + "id": "https://example.org/", + "type": "Text", + "label": { "en": [ "Example Organization Homepage" ] }, + "format": "text/html" + } + ], + "logo": [ + { + "id": "https://example.org/images/logo.png", + "type": "Image", + "format": "image/png", + "height": 100, + "width": 120 + } + ] + } + ], + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas", + "type": "Canvas", + "width": 12000, + "height": 9000, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/page/p2", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/annotation/c1", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", + "type": "Image", + "format": "image/jpeg", + "width": 4000, + "height": 3000 + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-containers/canvas" + } + ] + } + ] + } + ] +} ``` -Notice that the Painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. +
+ + **Key Points** + + * All IIIF documents begin with the `@context` key, which maps the JSON structure into a linked data representation. The value identifies the version of the specification in use. [👀 Model Documentation](model/#json-ld-contexts-and-extensions) + * Every JSON object that has a `type` property also has an `id` property and vice versa. + * Text elements intended for display to the user are conveyed by _Language Maps_, JSON objects in which the keys are language codes and the values are lists of one or more strings in that language. [👀 Model Documentation](model/#language-of-property-values) + * The Painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. + * The `metadata` label and value pairs are for display to the user rather than for machines to interpret. + * The `rights` property is always a single string value which is a URI. +
+{: .note} + + +> List of properties used with links to model for each ## Example 2: Book From ee528a1d87abacbaf8def6ff43d5292e074d38cb Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 14:57:32 +0100 Subject: [PATCH 099/192] Tweaks --- source/presentation/4.0/model.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index d61d2035d..40712425f 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -100,7 +100,7 @@ Any of the properties in the API that can have multiple values _MUST_ always be ### Language of Property Values {: #language-of-property-values} -Language _SHOULD_ be associated with strings that are intended to be displayed to the user for the `label` and `summary` properties, plus the `label` and `value` properties of the `metadata` and `requiredStatement` objects. +Language _SHOULD_ be associated with strings that are intended to be displayed to the user for the `label` and `summary` properties, plus the `label` and `value` properties of the `metadata` and `requiredStatement` objects. This construction is called a Language Map in the [JSON-LD specification](https://www.w3.org/TR/json-ld11/#language-maps). The values of these properties _MUST_ be JSON objects, with the keys being the [BCP 47][org-bcp-47] language code for the language, or if the language is either not known or the string does not have a language, then the key _MUST_ be the string `none`. The locale, script and other subtags _MAY_ be included. Clients _SHOULD_ process subtags when comparing the values with the user's provided preferences, however _MAY_ simply reduce all tags down to just the language, discarding everything after the first hyphen, and display all matching values. The associated values _MUST_ be arrays of strings, where each item is the content in the given language. @@ -2502,8 +2502,10 @@ Additional motivations may be added to the Annotation to further clarify the int ## JSON-LD and Extensions +{: #json-ld-and-extensions} ### JSON-LD Contexts and Extensions +{: #json-ld-contexts-and-extensions} The top level resource in the response _MUST_ have the `@context` property, and it _SHOULD_ appear as the very first key/value pair of the JSON representation. This tells Linked Data processors how to interpret the document. The IIIF Presentation API context, below, _MUST_ occur once per response in the top-most resource, and thus _MUST NOT_ appear within [embedded][prezi30-terminology] resources. For example, when embedding a Canvas within a Manifest, the Canvas will not have the `@context` property. @@ -2531,6 +2533,7 @@ Any additional properties beyond those defined in this specification or the Web The JSON representation _MUST NOT_ include the `@graph` key at the top level. This key might be created when serializing directly from RDF data using the JSON-LD 1.0 compaction algorithm. Instead, JSON-LD framing and/or custom code should be used to ensure the structure of the document is as defined by this specification. ### Term Collisions between Contexts +{: #term-collisions-between-contexts} There are some common terms used in more than one JSON-LD context document. Every attempt has been made to minimize these collisions, but some are inevitable. In order to know which specification is in effect at any given point, the class of the resource that has the property is the primary governing factor. Thus properties on Annotation based resources use the context from the [Web Annotation Data Model][org-w3c-webanno], whereas properties on classes defined by this specification use the IIIF Presentation API context's definition. From dc113d2431c5023eeb28c1f4ae6c26c1cebcbf77 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 15:01:35 +0100 Subject: [PATCH 100/192] Fix callout? --- source/presentation/4.0/index.md | 107 +++++++++++++++---------------- 1 file changed, 51 insertions(+), 56 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 2220ebe79..abd3dba33 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -8,7 +8,7 @@ tags: [specifications, presentation-api] major: 4 minor: 0 patch: 0 -pre: +pre: redirect_from: - /presentation/index.html - /presentation/4/index.html @@ -53,9 +53,9 @@ __Previous Version:__ [3.0][prezi30] # Introduction -The purpose of the IIIF Presentation API specification is to provide a [model](model) and JSON serialization format of that model. +The purpose of the IIIF Presentation API specification is to provide a [model](model) and JSON serialization format of that model. -It provides a document format - the IIIF Manifest - for cultural heritage organizations (and anyone else) to present objects in a standardized, interoperable fashion. This allows compatible software such as viewers and annotation tools to load and present complex digital objects on the web from thousands of different providers. +It provides a document format - the IIIF Manifest - for cultural heritage organizations (and anyone else) to present objects in a standardized, interoperable fashion. This allows compatible software such as viewers and annotation tools to load and present complex digital objects on the web from thousands of different providers. **If you have existing images, audio, video and models on the web, you can easily provide IIIF Manifests for them by publishing the appropriate JSON documents.** @@ -63,15 +63,15 @@ The IIIF Presentation API is concerned with enabling user experiences - providin This document acts as an introduction to the specification through a set of typical (but non-exhaustive) use cases. The model [model](model) document provides the formal specification of the terms used in this introduction. -## IIIF Use cases +## IIIF Use cases -1. **Artwork** - a Manifest that represents a painting, comprising a single image and accompanying display information. +1. **Artwork** - a Manifest that represents a painting, comprising a single image and accompanying display information. 2. **Book** - a Manifest that represents a digitized bound volume made up many separate images in order. The IIIF model provides structural elements to indicate the chapters. The text of the book is made available in machine-readable form as Web Annotations. 3. **45 Single** - a Manifest that represents the digitized audio from the two sides of a vinyl 7 inch record. 4. **Movie** - a Manifest that represents the digitized video of a film. A transcript of the audio is provided as Web Annotations, and additional machine-readable files provide subtitles and captions. 5. **Simple 3D Model** - a Manifest that publishes a single 3D model. 6. **Complex Scene** - a Manifest that publishes a complex 3D scene comprising multiple models, lights and cameras. -7. **Periodical** - a IIIF Collection that provides multiple child Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements. +7. **Periodical** - a IIIF Collection that provides multiple child Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements. 8. **Storytelling in 3D** - a Manifest that defines a sequence of states in a complex scene for the purposes of guiding a user through a particular experience. 9. **Manuscript** - (integration) @@ -94,7 +94,7 @@ This section is what you need to know to make sense of the examples that follow A Manifest is the primary unit of distribution of IIIF. Each Manifest usually describes how to present an object, such as a book, statue, music album or 3 dimensional scene. It is a JSON document that carries information needed for the client to present content to the user, such as a title and other descriptive information. The scope of what constitutes an object, and thus its Manifest, is up to the publisher of that Manifest. The Manifest contains sufficient information for the client to initialize itself and begin to display something quickly to the user. -The Manifest's `items` property is an ordered list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents each Container's Content Resources. The client software also presents user interface controls to navigate the list of Content Containers. +The Manifest's `items` property is an ordered list of _Containers_ of _Content Resources_ (images, 3D models, audio, etc). Client software loads the Manifest and presents each Container's Content Resources. The client software also presents user interface controls to navigate the list of Content Containers. Manifests have descriptive, technical and linking properties. The required properties of Manifests are `id`, `type`, `items` and `label`. Other commonly used properties include `summary`, `metadata`, `rights`, `thumbnail`, `homepage` and `provider`. @@ -119,11 +119,11 @@ Manifests have descriptive, technical and linking properties. The required prope ## Containers -A Container is a frame of reference that allows the relative positioning of Content Resources, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). +A Container is a frame of reference that allows the relative positioning of Content Resources, a concept borrowed from standards like PDF and HTML, or applications like Photoshop and PowerPoint, where an initially blank display surface has images, video, text and other content "painted" on to it. The frame is defined by a set of dimensions, with different types of Container having different dimensions. This specification defines three sub-classes of Container: Timeline (which only has a duration), Canvas (which has bounded height and width, and may have a duration), and Scene (which has infinite height, width and depth, and may have a duration). The required properties of all Containers are `id`, and `type`. Most Containers also have the `items` and `label` properties. Further properties are required for the different types of Container. -The defined Container types are: +The defined Container types are: ### Timeline @@ -235,7 +235,7 @@ Scenes may also have the `duration` property in the same manner as Timelines. IIIF uses the concept of _Annotation_ to link resources together from around the web. This specification uses a World Wide Web Consortium (W3C) standard for this called the [Web Annotation Data Model][org-web-anno]. This is a structured linking mechanism useful for making comments about Content Resources, but IIIF's primary use of it is to associate the images, audio and other Content Resources with their Containers for presentation. -In each of the three Containers above, an **Annotation** links the Container to a Content Resource. The Content Resource in the `body` property is _painted_ into the Container by an Annotation whose `target` property is the `id` of the Container. In all three simple cases here the `target` property is the `id` of the Container with no further qualification. +In each of the three Containers above, an **Annotation** links the Container to a Content Resource. The Content Resource in the `body` property is _painted_ into the Container by an Annotation whose `target` property is the `id` of the Container. In all three simple cases here the `target` property is the `id` of the Container with no further qualification. Different uses of Annotation are distinguished through their `motivation` property. This specification defines a value for `motivation` called `painting` for associating Content Resources with Containers, which this specification calls a Painting Annotation. The verb "paint" is also used to refer to the associating of a Content Resource with a Container by a Painting Annotation. This is from the notion of painting onto a canvas, a metaphor borrowed from art and used for image-based digital applications, and expanded by IIIF into "painting" any Content Resource into a Container of any number of dimensions. @@ -250,7 +250,7 @@ Annotations are grouped within the `items` property of an Annotation Page, and t Content Resources are external web resources, including images, video, audio, 3D models, data, web pages or any other format. Typically these are the resources that will be painted into a Container using a Painting Annotation. -In addition to the required properties `id` and `type`, other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. The values of these properties are often the source of the equivalent Container properties. +In addition to the required properties `id` and `type`, other commonly used properties include `format`, and `width`, `height` and `duration` as appropriate to the Content Resource format. The values of these properties are often the source of the equivalent Container properties. (👀) [Model Documentation](model/#ContentResources) @@ -370,7 +370,7 @@ It demonstrates the use of the common descriptive properties `label` for the tit "height": 150 } ], - "provider": + "provider": [ { "id": "https://example.org/about", @@ -427,18 +427,13 @@ It demonstrates the use of the common descriptive properties `label` for the tit } ``` - -
- - **Key Points** - - * All IIIF documents begin with the `@context` key, which maps the JSON structure into a linked data representation. The value identifies the version of the specification in use. [👀 Model Documentation](model/#json-ld-contexts-and-extensions) - * Every JSON object that has a `type` property also has an `id` property and vice versa. - * Text elements intended for display to the user are conveyed by _Language Maps_, JSON objects in which the keys are language codes and the values are lists of one or more strings in that language. [👀 Model Documentation](model/#language-of-property-values) - * The Painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. - * The `metadata` label and value pairs are for display to the user rather than for machines to interpret. - * The `rights` property is always a single string value which is a URI. -
+**Key Points** +* All IIIF documents begin with the `@context` key, which maps the JSON structure into a linked data representation. The value identifies the version of the specification in use. [👀 Model Documentation](model/#json-ld-contexts-and-extensions) +* Every JSON object that has a `type` property also has an `id` property and vice versa. +* Text elements intended for display to the user are conveyed by _Language Maps_, JSON objects in which the keys are language codes and the values are lists of one or more strings in that language. [👀 Model Documentation](model/#language-of-property-values) +* The Painting Annotation is a member of the `items` property of an Annotation Page. While in this case there is only one Annotation Page and one Annotation, the mechanism is needed for consistency when there are multiple Annotation Pages, and it allows for Annotation Pages in general to be separate resources on the web. +* The `metadata` label and value pairs are for display to the user rather than for machines to interpret. +* The `rights` property is always a single string value which is a URI. {: .note} @@ -561,7 +556,7 @@ This (no units for scale) allows arbitrarily scaled models to be used, including A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. -As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. +As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. ```json { @@ -570,11 +565,11 @@ As with other containers in IIIF, Annotations are used to target the Scene to pl "label": {"en": ["Chessboard"]}, "backgroundColor": "#000000", "items": [ - "Note: Annotations Live Here" + "Note: Annotations Live Here" ] } ``` -As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in Transforms(transforms_section). +As with other resources, it may be appropriate to modify the initial scale, rotation, or translation of a content resource Scene prior to painting it within another Scene. Scenes associated with SpecificResources may be manipulated through the transforms described in Transforms(transforms_section). A simple example painting one Scene into another: @@ -624,7 +619,7 @@ A content resource may be annotated into a Scene for a period of time by use of "id": "https://example.org/uuid/3d0d097b-2b37-4a15-b6a5-506e417d5115", "type": "FragmentSelector", "value": "t=45,95" - } + } } ] } @@ -646,7 +641,7 @@ When using a URL fragment in place of a SpecificResource, the parameter `t` can } ``` -An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. +An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. ```json { @@ -708,7 +703,7 @@ Annotations may use a type of Selector called a `PointSelector` to align the Ann Example Annotation that positions a model at a point within a Scene: -```json +```json { "id": "https://example.org/iiif/3d/anno1", "type": "Annotation", @@ -773,7 +768,7 @@ The region of the Scene's space that is observable by the camera is bounded by t The `near` property defines the minimum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything nearer to the camera than this distance will not be viewed. Conversely, the `far` property defines a maximum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything further away will not be viewed. -For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. +For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. If any of these properties are not specified explicitly, they default to the choice of the client implementation. @@ -787,7 +782,7 @@ The first Camera defined and not hidden in a Scene is the default Camera used to "type": "PerspectiveCamera", "near": 1.0, "far": 100.0, - "fieldOfView": 45.0 + "fieldOfView": 45.0 } ``` @@ -806,7 +801,7 @@ This specification defines four types of Light: Lights defined in this specification have a `color` and an `intensity`. The color is given as an RGB value, such as "#FFFFFF" for white. The intensity is the strength or brightness of the light, and described using a `Value` construct. -SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. +SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. diagram of cone geometry showing how the angle of the cone is defined @@ -895,7 +890,7 @@ This rotation happens after the resource has been added to the Scene, and thus a ### Excluding -Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. +Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. Painting a Scene into another while excluding import of several types of resources: ```json @@ -920,7 +915,7 @@ Painting a Scene into another while excluding import of several types of resourc ### Nesting -A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. +A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the pixel origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (e.g., is colinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (e.g., is colinear to) the negative y axis extending from the coordinate origin. The Canvas is scaled to the Scene such that the pixel dimensions correspond to 3D coordinate units - a Canvas 200 pixels wide and 400 pixels high will extend 200 coordinate units across the x axis and 400 coordinate units across the y axis. Please note: direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted. @@ -944,7 +939,7 @@ Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at ] ``` -When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. +When a Scene is nested into another Scene, the `backgroundColor` of the Scene to be nested should be ignored as it is non-sensible to import. All Annotations painted into the Scene to be nested will be painted into the Scene into which content is being nested, including Light or Camera resources. If the Scene to be nested has one or more Camera Annotations while the Scene into which content is being nested does not, the first Camera Annotation from the nested Scene will become the default Camera for the overall Scene. --- @@ -1008,7 +1003,7 @@ link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index deal with this: https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 -use totalItems? https://iiif.io/api/discovery/1.0/#totalitems +use totalItems? https://iiif.io/api/discovery/1.0/#totalitems @@ -1023,7 +1018,7 @@ use totalItems? https://iiif.io/api/discovery/1.0/#totalitems IIIF Collections are ordered lists of Manifests, Collections, and/or Specific Resources. Collections allow these resources to be grouped in a hierarchical structure for navigation and other purposes. -:eyes: +:eyes: ## Range @@ -1037,7 +1032,7 @@ This example demonstrates the use of IIIF Collections to group Manifests into a Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections which may be spread across multiple columns and pages. -Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. +Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each story's Range links to an Annotation Collection that provides the text of the story via the `supplementary` property. @@ -1081,7 +1076,7 @@ mention search, image api, auth profile for seeAlso -partOf - +partOf - @@ -1249,12 +1244,12 @@ As well as adding resources not present in the referred-to resource, the Content TODO: what is the processing algorithm for applying incoming `hidden` ? -When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. +When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. ## Modify the Container in a particular context -The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. +The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. Consider a Scene with two models, and two `commenting` annotations: @@ -1282,7 +1277,7 @@ Consider a Scene with two models, and two `commenting` annotations: "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", "type": "Model" }, - "target": { + "target": { // SpecificResource with PointSelector } }, @@ -1294,7 +1289,7 @@ Consider a Scene with two models, and two `commenting` annotations: "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", "type": "Model" }, - "target": { + "target": { // SpecificResource with PointSelector } } @@ -1313,7 +1308,7 @@ Consider a Scene with two models, and two `commenting` annotations: "type": "Annotation", "motivation": ["commenting"], "bodyValue": "Mandibular tooth", - "target": { + "target": { // SpecificResource with PointSelector } }, @@ -1322,7 +1317,7 @@ Consider a Scene with two models, and two `commenting` annotations: "type": "Annotation", "motivation": ["commenting"], "bodyValue": "Right pterygoid hamulus", - "target": { + "target": { // SpecificResource with PointSelector } } @@ -1332,7 +1327,7 @@ Consider a Scene with two models, and two `commenting` annotations: } ``` -In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. +In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. It may be useful to light the Scene differently in different contexts. @@ -1468,10 +1463,10 @@ The client should reset the Container to its original state before applying the ```jsonc [ - { + { "id": "https://.../step-1", "type": "Annotation", - "motivation": ["contentState"] + "motivation": ["contentState"] // if you really want to ensure that any ad-hoc applied content states are wiped out, // then put an explicit reset here. But usually, we can start the nav by applying // the content state in the scope to the Scene without worrying that someone has @@ -1479,8 +1474,8 @@ The client should reset the Container to its original state before applying the }, // .... - - { + + { "id": "https://.../step-20", "type": "Annotation", "motivation": ["contentState"] @@ -1488,7 +1483,7 @@ The client should reset the Container to its original state before applying the }, - { + { // However, this particular step (step 37) needs to reset the Scene to the initial state. "id": "https://.../step-37", "type": "Annotation", @@ -1549,7 +1544,7 @@ The activating annotation is provided in a Container's `annotations` property. I "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", "type": "Model" }, - "target": { + "target": { // SpecificResource with PointSelector } } @@ -1630,7 +1625,7 @@ This pattern is similar to the above, except that: "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", "type": "Model" }, - "target": { + "target": { // SpecificResource with PointSelector } } @@ -1699,11 +1694,11 @@ See above... In many cases, the dimensions of a Canvas, or the pixel density of a photograph, are not necessarily related to a real-world size of the object they show. A large wall painting and a tiny miniature may both be conveyed by 20 megapixel source images on a 4000 by 3000 unit Canvas. But it can be important to know how big something is or if there is a relationship between pixel density and physical length, especially when comparing objects together. Each pixel in an image may correspond precisely to a physical area, allowing measurement of real world distances from the image. A scanned 3D model may be constructed such that each 3D coordinate unit corresponds to one meter of physical distance. -The `spatialScale` property of a Canvas or Scene provides a corresponding real-world scale for a unit of the Canvas or Scene coordinate system, allowing clients to provide scale information to users, for example by an on-screen virtual ruler. In a 2-up viewer, a client could scale two views to convey the true relative sizes of two objects. +The `spatialScale` property of a Canvas or Scene provides a corresponding real-world scale for a unit of the Canvas or Scene coordinate system, allowing clients to provide scale information to users, for example by an on-screen virtual ruler. In a 2-up viewer, a client could scale two views to convey the true relative sizes of two objects. The value of `spatialScale` is a `UnitValue` (ref) that has as a value a length unit. This specification defines only one length unit, "m", i.e., meters, though others may be defined externally as an [extension][prezi30-ldce]. If source size metadata is machine readable (or parse-able) in other measurement systems (e.g., feet and inches) then it should be converted to meters for use in `spatialScale`. Publishers may wish to present the original given measure (e.g., from catalogue metadata) in a `metadata` field for context. -The Presentation API also offers a corresponding `temporalScale` property for the `duration` dimension of a Container, when 1 second in the Container does not correspond to 1 second of real time. This is useful for speeded-up or slowed-down audio or video. +The Presentation API also offers a corresponding `temporalScale` property for the `duration` dimension of a Container, when 1 second in the Container does not correspond to 1 second of real time. This is useful for speeded-up or slowed-down audio or video. An extreme example of both physical dimension properties together is a Canvas showing an animation of continental drift over the course of Earth history, where the spatialScale could convey that each Canvas unit is several thousand meters, and each second of the Canvas `duration` is several million years. From b0e6762c5fca9ba77368d7fb87502c9265b216a3 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 15:17:14 +0100 Subject: [PATCH 101/192] push? --- source/presentation/4.0/index.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index abd3dba33..c2aac18de 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -329,9 +329,11 @@ The fragment example above can be expressed using a Specific Resource: ## Use Case 1: Artwork -This example is a Manifest with one Canvas, representing a 2D surface. In this case the Canvas represents an artwork, and there is no duration property. The content resource, a JPEG image of the artwork, is associated with the Canvas via a Painting Annotation. The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image. The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. +This example is a Manifest with one Canvas, representing an artwork. The content resource, a JPEG image of the artwork, is associated with the Canvas via a Painting Annotation. -It demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. +The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image.The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. + +The example demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. ```json { @@ -428,6 +430,7 @@ It demonstrates the use of the common descriptive properties `label` for the tit ``` **Key Points** + * All IIIF documents begin with the `@context` key, which maps the JSON structure into a linked data representation. The value identifies the version of the specification in use. [👀 Model Documentation](model/#json-ld-contexts-and-extensions) * Every JSON object that has a `type` property also has an `id` property and vice versa. * Text elements intended for display to the user are conveyed by _Language Maps_, JSON objects in which the keys are language codes and the values are lists of one or more strings in that language. [👀 Model Documentation](model/#language-of-property-values) @@ -436,8 +439,13 @@ It demonstrates the use of the common descriptive properties `label` for the tit * The `rights` property is always a single string value which is a URI. {: .note} +!!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties + +__Definitions__
+Classes: [Manifest](#model/Manifest), ...

+Properties: [id](#model/id), [type](#type), [label](#label), [lookAt](#lookAt), [near](#near), and [far](#far) +{: .note} -> List of properties used with links to model for each ## Example 2: Book From 3a9576de4dd5606bf63aa9297f80dc8ddf08f1b8 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Mon, 2 Jun 2025 15:24:38 +0100 Subject: [PATCH 102/192] css :( --- source/presentation/4.0/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index c2aac18de..303bccee3 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -429,8 +429,9 @@ The example demonstrates the use of the common descriptive properties `label` fo } ``` -**Key Points** +> +**Key Points** * All IIIF documents begin with the `@context` key, which maps the JSON structure into a linked data representation. The value identifies the version of the specification in use. [👀 Model Documentation](model/#json-ld-contexts-and-extensions) * Every JSON object that has a `type` property also has an `id` property and vice versa. * Text elements intended for display to the user are conveyed by _Language Maps_, JSON objects in which the keys are language codes and the values are lists of one or more strings in that language. [👀 Model Documentation](model/#language-of-property-values) From a229838f5df376de0c6d233275dc76f7a943aa84 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Tue, 3 Jun 2025 07:03:14 -0700 Subject: [PATCH 103/192] add book use case json --- source/presentation/4.0/index.md | 128 ++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 4 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 303bccee3..5f278d4ec 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -448,15 +448,135 @@ Properties: [id](#model/id), [type](#type), [label](#label), [lookAt](#lookAt), {: .note} -## Example 2: Book +## Use Case 2: Book This example is a Manifest with multiple Canvases, each of which represents a page of a book. It demonstrates the use of the `behavior` property to indicate to a client that the object is _paged_: this helps a client generate the correct user experience. The `viewingDirection` property indicates that the book is read left-to-right. In this case, the property is redundant as `left-to-right` is the default value. The Manifest has a `rendering` property linking to a PDF representation; typically a client would offer this as a download or "view as" option. The `start` property is used to tell a client to initialize the view on a particular Canvas, useful if the digitized work contains a large amount of irrelevant front matter or blank pages. The `requiredStatement` is a message that a client MUST show to the user when presenting the Manifest. -``` -Example: a paged thing - a book -requiredStatement, behavior, viewingDirection, (no Ranges), rendering - PDF version, start +```json +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/presentation/examples/manifest-with-book.json", + "type": "Manifest", + "label": { "en": [ "Use case 2: Book" ] }, + "behavior": [ "paged" ], + "viewingDirection": "left-to-right", + "rendering": [ + { + "id": "https://example.org/pdfs/book.pdf", + "type": "Text", + "label": { "en": [ "PDF version" ] }, + "format": "application/pdf" + } + ], + "start": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c2", + "type": "Canvas" + }, + "requiredStatement": { + "label": { "en": [ "Attribution" ] }, + "value": { "en": [ "Provided courtesy of Example Institution" ] } + }, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c1", + "type": "Canvas", + "label": { "en": [ "Blank page" ] }, + "height": 4613, + "width": 3204, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/page/p1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/annotation/a1", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/image/page1.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c1" + } + ] + } + ] + }, + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c2", + "type": "Canvas", + "label": { "en": [ "Frontispiece" ] }, + "height": 4613, + "width": 3204, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/page/p2", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/annotation/a2", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/image/page2.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c2" + } + ] + } + ] + }, + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c3", + "type": "Canvas", + "label": { "en": [ "Title Page" ] }, + "height": 4613, + "width": 3204, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/page/p3", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-book/annotation/a3", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://iiif.io/api/presentation/example-content-resources/image/page3.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-book/canvas/c3" + } + ] + } + ] + }, + // Additional Canvases... + ] +} ``` +> +**Key Points** +* Recommend using Canvas labels when more than one Canvas... +{: .note} + +!!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties + +__Definitions__
+Classes: [Manifest](#model/Manifest), ...

+Properties: [behavior](#model/behavior), [viewingDirection](#model/viewingDirection), [start](#model/start), [rendering](#model/rendering), [requiredStatement](#model/requiredStatement) +{: .note} # Audio and Video From ef53e08003fd012ea5b5297d76b86c631c56c0f9 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 4 Jun 2025 13:38:23 +0100 Subject: [PATCH 104/192] anchors --- source/presentation/4.0/model.md | 45 +++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 40712425f..ad8be5db9 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -54,12 +54,14 @@ __Previous Version:__ [3.0][prezi30] # IIIF Presentation API Data Model ## Introduction +{: #introduction} The IIIF Presentation API is backed by a standards-based data model inspired by both earlier tree structured representations of cultural heritage objects, as well as linked data approaches with the same goal. It comprises four main types of resource: Structural (such as Collections, Manifests, and Ranges), Presentational Containers (Canvas, Scene and Timeline), Linking (Annotations), and Content (the images, texts, audio, video and models to be displayed). The model intentionaly does not include any semantic or descriptive relationships or properties such as the author of a book or the place where a statue was sculpted; it is solely for presenting content in a structured fashion to human users. ### Terminology +{: #terminology} This specification uses the following terms: @@ -73,14 +75,17 @@ The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _S ## JSON Considerations +{: #json-considerations} This section describes features applicable to all of the Presentation API content. ### Case Sensitivity +{: #case-sensitivity} Keys in JSON objects are [case sensitive][org-w3c-json-ld-case]. The cases of properties and enumerated values in IIIF Presentation API responses _MUST_ match those used in this specification. For example to specify that a resource is a Manifest, the property _MUST_ be given as `type` and not `Type` or `tYpE`, and the value _MUST_ be given as `Manifest` and not `manifest` or `manIfEsT`. ### Properties with Multiple Values +{: #properties-with-multiple-values} Any of the properties in the API that can have multiple values _MUST_ always be given as an array of values, even if there is only a single item in that array. @@ -521,7 +526,7 @@ A Visual Content Selector _MUST_ have the following properties: [id](#id), and [ #### Animation Selector - +{: #AnimationSelector} > `"type": "AnimationSelector"` More interactive content resources, such as 3D models, may have animations or similar features that can be _activated_ by user interaction. For example, a model of a box might have an animation that opens the lid and a second animation that closes the lid. In order to activate those animations, they need to be selectable, and thus the specification defines an Animation Selector. The identity of the activatable aspect is given in the `value` property. @@ -539,7 +544,7 @@ An Animation Selector _MUST_ have the following properties: [id](#id), [type](#t ``` #### IIIF Image API Selector - +{: #ImageApiSelector} > `"type": "ImageApiSelector"` The Image API Selector is used to describe the operations available via the IIIF Image API in order to retrieve a particular image representation. In this case the resource is the abstract image as identified by the [IIIF Image API][image-api] base URI plus identifier, and the retrieval process involves adding the correct parameters after that base URI. @@ -570,7 +575,7 @@ A IIIF Image API Selector _MAY_ have the following properties: [region](#region) ``` ### Range - +{: #Range} > `"type": "Range"` Ranges are used to represent structure within a Manifest beyond the default order of the Containers in the `items` property. @@ -587,10 +592,12 @@ A Range _MAY_ have the following properties: [start](#start), [supplementary](#s ### Scene Components +{: #scene-components} The following classes are only usable within Scenes. #### Cameras +{: #Camera} A Camera provides a view of a region of a Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the Camera to render that region. The size and aspect ratio of the viewport is client and device dependent. @@ -603,6 +610,7 @@ All Cameras _MAY_ have the following properties: [label](#label), [lookAt](#look ##### Orthographic Camera +{: #OrthographicCamera} > `"type": "OrthographicCamera"` @@ -624,7 +632,7 @@ Orthographic Cameras _SHOULD_ have the following additional properties: [viewHei ##### Perspective Camera - +{: #PerspectiveCamera} > `"type": "PerspectiveCamera"` A Perspective Camera mimics the way the human eye sees, in that objects further from the camera are smaller. @@ -647,6 +655,7 @@ Perspective Cameras _SHOULD_ have the following additional properties: [fieldOfV ``` #### Lights +{: #Light} It is necessary for there to be a Light within a Scene that illuminates the objects. If no Light is provided by the Scene's description, then the client _MUST_ add a Light. @@ -662,7 +671,7 @@ All Lights _MAY_ have the following properties: [label](#label). ##### Ambient Light - +{: #AmbientLight} > `"type": "AmbientLight"` Ambient Light evenly illuminates all objects in the Scene, and does not have a direction or position. It does not have any new properties. The Light itself _MUST_ be added into the scene at a specific position, however this is only such that editing interfaces can render the object to the user. @@ -677,7 +686,7 @@ Ambient Light evenly illuminates all objects in the Scene, and does not have a d ``` ##### Directional Light - +{: #DirectionalLight} > `"type": "DirectionalLight"` Directional Lights emit their light in a specific direction as if infinitely far away, and as such the light does not come from a specific position. The rays produced are all parallel. The Light itself _MUST_ be added into the scene at a specific position, however this is only such that editing interfaces can render the object to the user. @@ -699,7 +708,7 @@ Directional Lights _MAY_ have the following additional properties: [lookAt](#loo ``` ##### Point Light - +{: #PointLight} > `"type": "PointLight"` Point Lights emit in all directions from a single point within the Scene. @@ -715,7 +724,7 @@ Point Lights emit in all directions from a single point within the Scene. ##### Spot Light - +{: #SpotLight} > `"type": "SpotLight"` Spot Light emits a cone of light in a given direction from a single point. The Spot Light's `angle` property defines the radius of the cone. The default angle is client dependent if not specified. @@ -746,6 +755,7 @@ Spot Lights _MAY_ have the following additional properties: [lookAt](#lookAt) ``` #### Audio Emitters +{: #AudioEmitters} Positional audio is supported through the use of Audio Emitter resources annotated into Scenes, in the same way that light is emitted from the various subclasses of Light. @@ -760,7 +770,7 @@ All Audio Emitters _MAY_ have the following properties: [label](#label). {: .note} ##### Ambient Audio - +{: #AmbientAudio} > `"type": "AmbientAudio"` Ambient Audio emits equally throughout the Scene, and does not have a position or direction. The Emitter _MUST_ be annotated somewhere within the Scene so that it can be rendered by editing interfaces, and exists within the Scene's hierarchy. @@ -779,7 +789,7 @@ Ambient Audio emits equally throughout the Scene, and does not have a position o ``` ##### Point Audio - +{: #PointAudio} > `"type": "PointAudio"` Point Audio emits in all directions from a single point in the Scene. @@ -798,6 +808,7 @@ Point Audio emits in all directions from a single point in the Scene. ``` ##### Spot Audio +{: #SpotAudio} > `"type": "SpotAudio"` @@ -831,6 +842,7 @@ Spot Audio Emitters _MAY_ have the following additional properties: [lookAt](#lo ``` #### Transforms +{: #Transforms} An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into any subsequent coordinate space. @@ -840,7 +852,7 @@ All Transforms _MAY_ have the following properties: [label](#label), [x](#x), [y {: .note} ##### Rotate Transform - +{: #RotateTransform} > `"type": "RotateTransform"` A Rotate Transform rotates the resource around one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be angular values in degrees that specify the extent of rotation around each axis. Positive angular values indicate counter-clockwise rotation around the axis due to coordinate right-handedness. Axis rotation is performed with a pivot point at the origin of the local coordinate space. As an example, for a point at (1, 1, 0) in local coordinate space, rotating 90 degrees around the x axis would transform the point to be at (1, 0, 1). If any property `x`, `y`, or `z` is not specified or is specified to be 0.0, rotation around that axis does not occur. When more than one axis rotation is specified through multiple non-zero values for `x`, `y`, and `z`, rotations comprise a Euler angle with ordering x-y-z, and rotation _MUST_ be carried out first around the x axis, second around the y axis, and third around the z axis. @@ -857,7 +869,7 @@ A Rotate Transform rotates the resource around one or more axes. If present, the ``` ##### Scale Transform - +{: #ScaleTransform} > `"type": "ScaleTransform"` A Scale Transform scales the resource along one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be multiplicative scale factors that specify the extent of scaling along each axis. As an example, for a point at 3.5 along the x axis in local coordinate space, scaling along the x axis by 2.0 would result in the point being at 7.0. If any property `x`, `y`, or `z` is not specified or is specified to be 1.0, scaling does not occur along that axis. Negative scale factor values indicate mirroring as well as scaling along that axis. @@ -874,7 +886,7 @@ A Scale Transform scales the resource along one or more axes. If present, the va ``` ##### Translate Transform - +{: #TranslateTransform} > `"type": "TranslateTransform"` A Translate Transform translates or moves the resource across one or more axes. If present, the values of properties `x`, `y`, and `z` _MUST_ be coordinate unit distances that specify the distance across each axis to translate the resource. As an example, for a point at 1.0 along the x axis, translating across the x axis by 3.0 would result in the point being at 4.0. If any property `x`, `y`, or `z` is not present or is specified to be 0.0, translation does not occur across that axis. @@ -891,9 +903,10 @@ A Translate Transform translates or moves the resource across one or more axes. ``` ### Utility Classes +{: #utility-classes} #### Agent - +{: #Agent} > `"type": "Agent"` An Agent represents a person or organization, typically referenced with the `provider` property. @@ -934,6 +947,7 @@ An Agent _MAY_ have the following properties: [seeAlso](#seeAlso), and [summary] #### Service +{: #Service} > `"type": "Service"` @@ -948,6 +962,7 @@ Services will also have specific requirements as to additional properties based #### Unit Value +{: #UnitValue} > `"type": "UnitValue"` @@ -970,7 +985,7 @@ A Unit Value _MAY_ have the following properties: [label](#label). ## Properties - +{: #properties} ### accompanyingContainer {: #accompanyingContainer} From b7e52d41a570e09d9ab84e5698b615858199345d Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 4 Jun 2025 14:32:44 +0100 Subject: [PATCH 105/192] Add fileSize property on Content Resources with rationale --- source/presentation/4.0/model.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index ad8be5db9..b7806a778 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -430,7 +430,7 @@ Containers _MAY_ be treated as content resources for the purposes of annotating __Properties__
A Content Resource _MUST_ have the following properties: [id](#id), and [type](#type)

A Content Resource _SHOULD_ have the following properties: [label](#label)

-A Content Resource _MAY_ have the following properties: [height](#height), [width](#width), [duration](#duration), [language](#language), [format](#format), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [profile](#profile), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

+A Content Resource _MAY_ have the following properties: [height](#height), [width](#width), [duration](#duration), [language](#language), [format](#format), [fileSize](#fileSize),[metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [profile](#profile), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

{: .note} @@ -1231,6 +1231,19 @@ The value _MUST_ be a floating point number greater than 0 and less than 180, an { "fieldOfView": 50.0 } ``` +### fileSize + +The size of a content resource in bytes. This will allow clients to determine whether the resource should be retrieved in the user's current context. For example, the same 3d Model or AV file might be available in multiple formats, and the client can choose the most appropriate one based on the `fileSize` property. + +The value _MUST_ be a positive integer. + +* Any Content Resource _MAY_ have the `fileSize` property.
+ Clients _SHOULD_ process the `fileSize` property on Resources. + +```json-doc +{ "fileSize": 132465987 } +``` + ### first {: #first} From aee20aa4688448d575e2c5f0fac270e4ae27c8a2 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Wed, 4 Jun 2025 14:26:59 -0700 Subject: [PATCH 106/192] add json to use case 3 --- source/presentation/4.0/index.md | 149 +++++++++++++++++++++++++++++-- 1 file changed, 140 insertions(+), 9 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 5f278d4ec..15696fa18 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -561,7 +561,7 @@ This example is a Manifest with multiple Canvases, each of which represents a pa } ] }, - // Additional Canvases... + // Additional Canvases ] } ``` @@ -581,21 +581,152 @@ Properties: [behavior](#model/behavior), [viewingDirection](#model/viewingDirect # Audio and Video -## Example: a 45 single with one Timeline per song/side +## Use Case 3: a 45 single with one Timeline per song/side This example is a Manifest with two Timelines, each of which represent a temporal extent during which a song is played. As in most cases, the Timeline `duration` is the same length as that of Content Resource painted into it. This example is a recording digitized from a 45 RPM 7 inch single. It demonstrates the use of `format` for the audio files' content type, `language` (One song is in English and one is in German), `behavior` with value "autoPlay" that tells a client to automatically advance to the second Timeline after playing the first, `annotations` that link to Annotation Pages of annotations with the motivation `supplementing` that provide the lyrics (one example is given afterwards) - and an `accompanyingContainer` that carries a picture of the single's cover that is shown while the songs are playing. -``` -Timeline -duration, autoPlay, format, annotations (transcript), language, accompanyingContainer +```json +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio.json", + "type": "Manifest", + "label": { "en": [ "Use case 3: 45 single with 2 tracks" ] }, + "behavior": [ "autoPlay" ], + "accompanyingContainer": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/c1", + "type": "Canvas", + "label": { "en": [ "Photo of cover sleeve" ] }, + "height": 900, + "width": 900, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/c1/page", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/c1/image", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://example.org/presentation/example-content-resources/image/cover.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 900, + "width": 900 + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/ac1" + } + ] + } + ] + }, + + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1", + "type": "Timeline", + "label": { "en": [ "Side A: 99 Luftballons" ] }, + "duration": 242.40, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/track/tr1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/annotation/a1", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://example.org/presentation/example-content-resources/audio/track1.mp4", + "type": "Sound", + "format": "audio/mp4", + "duration": 242.40, + "language": [ "de" ], + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1" + } + ] + } + ] + }, + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t2", + "type": "Timeline", + "label": { "en": [ "Side B: 99 Red Balloons" ] }, + "duration": 242.40, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/track/tr2", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/annotation/a2", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://example.org/presentation/example-content-resources/audio/track2.mp4", + "type": "Sound", + "format": "audio/mp4", + "duration": 242.40, + "language": [ "en" ], + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t2" + } + ] + } + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/presentation/examples/external-anno.json", + "type": "AnnotationPage", + } + } ``` +```json +{ + "@context": "http://iiif.io/api/presentation/3/context.json", + "id": "https://example.org/iiif/presentation/examples/external-anno.json", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/external-anno/a1", + "type": "Annotation", + "motivation": "supplementing", + "body": { + "id": "https://example.org/presentation/example-content-resources/lyrics1.txt", + "type": "TextualBody", + "language": "de", + "format": "text/plain", + "value": "Hast du etwas Zeit für mich?" + }, + "target": { + "type": "SpecificResource", + "source": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1", + "selector": { + "type": "PointSelector", + "instant": 3.5 + } + } + ] +} ``` -... - (A single supplementing annotation for a line of the song) t= fragment -... -``` + +> +**Key Points** +* t vs. instant / verbose vs. append to URI??? +{: .note} + +!!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties + +__Definitions__
+Classes: [Manifest](#model/Manifest), ...

+Properties: [duration](#model/duration), [format](#model/format), [language](#model/language), [behavior](#model/behavior), [annotations](#model/annotations), [accompanyingContainer](#model/accompanyingContainer) +{: .note} + ## Example: a movie with subtitles From 459be328f6e49860a8e6ad4dc1a44e19c9536c35 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Wed, 4 Jun 2025 14:41:16 -0700 Subject: [PATCH 107/192] use case 3 anno --- source/presentation/4.0/index.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 15696fa18..d1bc41134 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -703,13 +703,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "format": "text/plain", "value": "Hast du etwas Zeit für mich?" }, - "target": { - "type": "SpecificResource", - "source": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1", - "selector": { - "type": "PointSelector", - "instant": 3.5 - } + "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#instant=3.5" } ] } From da9590e676f449585627ca955f0930a3814c8619 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Thu, 5 Jun 2025 07:16:08 -0700 Subject: [PATCH 108/192] fix auto-advance in use case 3 --- source/presentation/4.0/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index d1bc41134..519c07eaf 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -583,7 +583,7 @@ Properties: [behavior](#model/behavior), [viewingDirection](#model/viewingDirect ## Use Case 3: a 45 single with one Timeline per song/side -This example is a Manifest with two Timelines, each of which represent a temporal extent during which a song is played. As in most cases, the Timeline `duration` is the same length as that of Content Resource painted into it. This example is a recording digitized from a 45 RPM 7 inch single. It demonstrates the use of `format` for the audio files' content type, `language` (One song is in English and one is in German), `behavior` with value "autoPlay" that tells a client to automatically advance to the second Timeline after playing the first, `annotations` that link to Annotation Pages of annotations with the motivation `supplementing` that provide the lyrics (one example is given afterwards) - and an `accompanyingContainer` that carries a picture of the single's cover that is shown while the songs are playing. +This example is a Manifest with two Timelines, each of which represent a temporal extent during which a song is played. As in most cases, the Timeline `duration` is the same length as that of Content Resource painted into it. This example is a recording digitized from a 45 RPM 7 inch single. It demonstrates the use of `format` for the audio files' content type, `language` (One song is in English and one is in German), `behavior` with value "auto-advance" that tells a client to automatically advance to the second Timeline after playing the first, `annotations` that link to Annotation Pages of annotations with the motivation `supplementing` that provide the lyrics (one example is given afterwards) - and an `accompanyingContainer` that carries a picture of the single's cover that is shown while the songs are playing. ```json @@ -592,7 +592,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/manifest-with-audio.json", "type": "Manifest", "label": { "en": [ "Use case 3: 45 single with 2 tracks" ] }, - "behavior": [ "autoPlay" ], + "behavior": [ "auto-advance" ], "accompanyingContainer": { "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/c1", "type": "Canvas", @@ -627,7 +627,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1", "type": "Timeline", "label": { "en": [ "Side A: 99 Luftballons" ] }, - "duration": 242.40, + "duration": 231, "items": [ { "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/track/tr1", @@ -641,7 +641,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/presentation/example-content-resources/audio/track1.mp4", "type": "Sound", "format": "audio/mp4", - "duration": 242.40, + "duration": 231, "language": [ "de" ], }, "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1" @@ -654,7 +654,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t2", "type": "Timeline", "label": { "en": [ "Side B: 99 Red Balloons" ] }, - "duration": 242.40, + "duration": 230.5, "items": [ { "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/track/tr2", @@ -668,7 +668,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/presentation/example-content-resources/audio/track2.mp4", "type": "Sound", "format": "audio/mp4", - "duration": 242.40, + "duration": 230.5, "language": [ "en" ], }, "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t2" From 4f69435c3b1cb1842ea7bae71444de7240dd02e4 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 00:46:39 -0700 Subject: [PATCH 109/192] example 3 movie json --- source/presentation/4.0/index.md | 123 ++++++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 519c07eaf..179ef5e57 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -581,7 +581,7 @@ Properties: [behavior](#model/behavior), [viewingDirection](#model/viewingDirect # Audio and Video -## Use Case 3: a 45 single with one Timeline per song/side +## Use Case 3: A 45 single with 2 tracks This example is a Manifest with two Timelines, each of which represent a temporal extent during which a song is played. As in most cases, the Timeline `duration` is the same length as that of Content Resource painted into it. This example is a recording digitized from a 45 RPM 7 inch single. It demonstrates the use of `format` for the audio files' content type, `language` (One song is in English and one is in German), `behavior` with value "auto-advance" that tells a client to automatically advance to the second Timeline after playing the first, `annotations` that link to Annotation Pages of annotations with the motivation `supplementing` that provide the lyrics (one example is given afterwards) - and an `accompanyingContainer` that carries a picture of the single's cover that is shown while the songs are playing. @@ -722,13 +722,119 @@ Properties: [duration](#model/duration), [format](#model/format), [language](#mo {: .note} -## Example: a movie with subtitles +## Use Case 4: Movie with subtitles This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, the `timeMode` property ..., and `placeholderContainer` that provides a poster image to show in place of the video file before the user initiates playback. +```json +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie.json", + "type": "Manifest", + "label": { "en": [ "Use Case 4: Movie with Subtitles" ] }, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas", + "type": "Canvas", + "height": 360, + "width": 480, + "duration": 3600, + "timeMode": "trim", + "placeholderContainer": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/placeholder", + "type": "Canvas", + "height": 320, + "width": 400, + "items": [ + { + "id": "https://example.org/image/placeholder/annopage", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/placeholder/image", + "type": "Annotation", + "motivation": "painting", + "body": { + "id": "https://example.org/image/placeholder.png", + "type": "Image", + "format": "image/png", + "height": 320, + "width": 400, + }, + "target": "https://iiif.io/api/cookbook/recipe/0013-placeholderCanvas/canvas/donizetti/placeholder" + } + ] + } + ] + }, + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/annopage1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/anno1", + "type": "Annotation", + "motivation": "painting", + "body": { + "type": "Choice", + "items": [ + { + "id": "https://example.org/video/movie.mp4", + "type": "Video", + "height": 360, + "width": 480, + "duration": 3599.68, + "format": "video/mp4" + }, + { + "id": "https://example.org/video/movie.flv", + "type": "Video", + "height": 360, + "width": 480, + "duration": 3600.8, + "format": "video/flv" + } + ] + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas" + } + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/subtitles", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/subtitles/anno", + "type": "Annotation", + "motivation": "supplementing", + "body": { + "id": "https://example.org/text/subtitles.vtt", + "type": "Text", + "format": "text/vtt", + "label": { + "en": [ + "Subtitles in WebVTT format" + ] + }, + "language": "en" + }, + "target": "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas" + } + ] + } + ] + } + ] +} +``` + ``` Canvas -duration, behavior=autoplay, format, Choice of video 720p, 4K? (forward ref), timeMode, placeholderContainer +duration, behavior=auto-advance, format, Choice of video 720p, 4K? (forward ref), timeMode, placeholderContainer ``` { @@ -743,6 +849,17 @@ duration, behavior=autoplay, format, Choice of video 720p, 4K? (forward ref), ti Sometimes, two different formats derived from the same source may have slightly different durations, perhaps a few milliseconds out. What to do... +> +**Key Points** +* +{: .note} + +!!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties + +__Definitions__
+Classes: [Manifest](#model/Manifest), ...

+Properties: [duration](#model/duration), [format](#model/format), [timeMode](#model/timeMode), [behavior](#model/behavior), [placeholderContainer](#model/placeholderContainer) +{: .note} # 3D From cc0aad5152ed9dcbfd8ff19ea77c976592a4ee55 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 6 Jun 2025 10:26:43 +0100 Subject: [PATCH 110/192] Start to update id, props, fileSize --- source/presentation/4.0/model.md | 70 ++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index b7806a778..2cd75396f 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -378,9 +378,9 @@ A Specific Resource is a resource in the context of an Annotation. They are used A Specific Resource _MUST_ have an HTTP(S) URI given in `id`. This allows for it to be addressed by other parts of the model, such as Content State Annotations. __Properties__
-A Specific Resource _MUST_ have the following properties: [id](#id), [type](#type), [source](#source)

+A Specific Resource _MUST_ have the following properties: [type](#type), [source](#source)

A Specific Resource _SHOULD_ have the following properties: [selector](#selector)

-A Specific Resource _MAY_ have the following properties: [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

+A Specific Resource _MAY_ have the following properties: [id](#id), [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

{: .note} #### Textual Body @@ -390,11 +390,10 @@ A Specific Resource _MAY_ have the following properties: [position](#position), A Textual Body is an embedded resource within an Annotation that carries, as the name suggests, a text as the body of the Annotation. It is defined by the Web Annotation Data Model, and this specification defines a new property for `position` that allows it to be positioned within a Container. -A Textual Body _MUST_ have an HTTP(S) URI given in `id`. This allows for it to be addressed by other parts of the model, such as Content State Annotations. __Properties__
-A Textual Body _MUST_ have the following properties: [id](#id), [type](#type), [value](#value)

-A Specific Resource _MAY_ have the following properties: [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [format](#format), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

+A Textual Body _MUST_ have the following properties: [type](#type), [value](#value)

+A Specific Resource _MAY_ have the following properties: [id](#id), [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [format](#format), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

{: .note} @@ -403,14 +402,15 @@ A Specific Resource _MAY_ have the following properties: [position](#position), > `"type": "Choice"` -A Choice is a Web Annotation construction that allows one entry from a list to be selected for processing or display. This specification allows `behavior` and other properties to be added to a Choice to influence how it is processed. +A Choice is a Web Annotation construction that allows one entry from a list to be selected for processing or display. +The client may use any method to determine which item to select, including presenting the Choice to the user for a decision or using the properties of the items to make the decision. In the absence of any information, the client _SHOULD_ select the first item in the array and publishers _SHOULD_ list the items in order of preference. This specification allows `behavior` and other properties to be added to a Choice to influence how it is processed. -A Choice _MUST_ have an HTTP(S) URI given in `id`. It _SHOULD_ have a `label` in order to present the choice to the user, along with its items. This allows for it to be addressed by other parts of the model, such as Content State Annotations. +A Choice _SHOULD_ have a `label` in order to present the choice to the user, along with its items. __Properties__
-A Choice _MUST_ have the following properties: [id](#id), [type](#type), [items](#items)

+A Choice _MUST_ have the following properties: [type](#type), [items](#items)

A Choice _SHOULD_ have the following properties: [label](#label)

-A Choice _MAY_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [behavior](#behavior), and [seeAlso](#seeAlso).

+A Choice _MAY_ have the following properties: [id](#id), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [behavior](#behavior), and [seeAlso](#seeAlso).

{: .note} @@ -450,8 +450,8 @@ There are common use cases in which a point, rather than a range or area, is the If `instant` is not supplied, and the target resource has a `duration`, the selector is interpreted as targeting the entire duration. If `instant` is supplied, but no spatial point, the selector is interpreted as targeting the entire spatial aspect of the resource. __Properties__
-A Point Selector _MUST_ have the following properties: [id](#id), and [type](#type)

-A Point Selector _MAY_ have the following properties: [x](#x), [y](#y), [z](#z), and [instant](#instant).

+A Point Selector _MUST_ have the following properties: [type](#type)

+A Point Selector _MAY_ have the following properties: [id](#id), [x](#x), [y](#y), [z](#z), and [instant](#instant). {: .note} ```json @@ -476,7 +476,8 @@ Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimens The text representation is given in the `value` property of the selector. __Properties__
-A WKT Selector _MUST_ have the following properties: [id](#id), [type](#type), and [value](#value). +A WKT Selector _MUST_ have the following properties: [type](#type), and [value](#value).

+A WKT Selector _MAY_ have the following properties: [id](#id) {: .note} ```json @@ -495,7 +496,8 @@ A WKT Selector _MUST_ have the following properties: [id](#id), [type](#type), a Video content resources consist of both visual and audio content within the same bit-level representation. There are situations when it is useful to refer to only one aspect of the content – either the visual or the audio, but not both. For example, an Annotation might associate only the visual content of a video that has spoken English in the audio, and an audio file that has the translation of that content in Spanish. The Audio Content Selector selects all of the audio content from an A/V content resource, and may be further refined with subsequent selectors to select a segment of it. __Properties__
-An Audio Content Selector _MUST_ have the following properties: [id](#id), and [type](#type). +An Audio Content Selector _MUST_ have the following properties: [type](#type).

+An Audio Content Selector _MAY_ have the following properties: [id](#id) {: .note} ```json @@ -521,7 +523,8 @@ Similar to Audio Content Selectors, Visual Content Selectors select the visual a ``` __Properties__
-A Visual Content Selector _MUST_ have the following properties: [id](#id), and [type](#type). +A Visual Content Selector _MUST_ have the following properties: [type](#type).

+A Visual Content Selector _MAY_ have the following properties: [id](#id) {: .note} @@ -533,6 +536,7 @@ More interactive content resources, such as 3D models, may have animations or si __Properties__
An Animation Selector _MUST_ have the following properties: [id](#id), [type](#type), and [value](#value). +An Animation Selector _MAY_ have the following properties: [id](#id) {: .note} ```json @@ -1028,6 +1032,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 90, and * A SpotLight _SHOULD_ have the `angle` property.
Clients _SHOULD_ process the `angle` property on SpotLights. +{% include api/code_header.html %} ```json "angle": 15.0 ``` @@ -1078,6 +1083,7 @@ The value _MUST_ be string, which defines an RGB color. It SHOULD be a hex value Clients _SHOULD_ render `backgroundColor` on any resource type. * Other resources _MUST NOT_ have the `backgroundColor` property. +{% include api/code_header.html %} ```json-doc { "backgroundColor": "#FFFFFF" } ``` @@ -1140,6 +1146,11 @@ TODO: Address https://github.com/IIIF/api/issues/2318 { "behavior": [ "auto-advance", "individuals" ] } ``` +### body +{: #body} + + + ### canonical {: #canonical} @@ -1329,17 +1340,20 @@ Please note that this specification has stricter requirements about the JSON pat ] } ``` + ### id {: #id} -The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Canvases, which _MUST_ have their own URI without a fragment. +The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Canvases, which _MUST_ have their own URI without a fragment. -The value _MUST_ be a string, and the value _MUST_ be an HTTP(S) URI for resources defined in this specification. If the resource is retrievable via HTTP(S), then the URI _MUST_ be the URI at which it is published. External resources, such as profiles, _MAY_ have non-HTTP(S) URIs defined by other communities. +The value _MUST_ be a string, and the value _MUST_ be an absolute HTTP(S) URI for resource classes defined or described in this specification. If the resource is retrievable via HTTP(S), then the URI _MUST_ be the URI at which it is published. External resources, such as profiles, _MAY_ have non-HTTP(S) URIs defined by other communities. -The existence of an HTTP(S) URI in the `id` property does not mean that the URI will always be dereferenceable. If the resource with the `id` property is [embedded][prezi30-terminology], it _MAY_ also be dereferenceable. If the resource is referenced (again, see the [terminology section][prezi30-terminology] for an explanation of "referenced"), it _MUST_ be dereferenceable. The [definitions of the Resources][prezi30-resource-structure] give further guidance. +The existence of an HTTP(S) URI in the `id` property does not mean that the URI will always be dereferenceable. If the resource with the `id` property is embedded, it _MAY_ also be dereferenceable. If the resource is referenced, it _MUST_ be dereferenceable. - * All resource types _MUST_ have the `id` property.
+ * Collections, Collection Pages, Manifests, Timelines, Canvases, Scenes, Annotations, Annotation Pages, Annotation Collections, Ranges, Content Resources, and Services _MUST_ have the `id` property.
Clients _MAY_ render `id` on any resource type, and _SHOULD_ render `id` on Collections, Manifests and Canvases. + * All other resources _MAY_ have the `id` property.
+ Clients _MAY_ render `id` on any resource type. {% include api/code_header.html %} ``` json-doc @@ -1349,9 +1363,15 @@ The existence of an HTTP(S) URI in the `id` property does not mean that the URI ### instant {: #instant} -A number (floating point) giving the time of the point in seconds, relative to the duration of the source resource +A floating point number giving the time of the point in seconds from the beginning of the temporal resource. For example, an `instant` value of 4.5 means the exact point 4.5 seconds from the beginning of the resource. -FIXME: fix +* PointSelector _MAY_ have the `instant` property.
+ Clients _SHOULD_ process `instant`. + +{% include api/code_header.html %} +``` json-doc +{ "instant": 4.5 } +``` ### intensity @@ -1549,7 +1569,7 @@ The value _MUST_ be a JSON object, conforming to either a reference to an Annota * A SpotLight or a DirectionalLight _SHOULD_ have the `lookAt` property.
* A SpotSound _SHOULD_ have the `lookAt` property. - +{% include api/code_header.html %} ```json "lookAt": { "type": "PointSelector", @@ -1558,6 +1578,7 @@ The value _MUST_ be a JSON object, conforming to either a reference to an Annota "z": -10 } ``` + ### metadata {: #metadata} @@ -1587,6 +1608,7 @@ Clients _SHOULD_ display the entries in the order provided. Clients _SHOULD_ exp ] } ``` + ### navDate {: #navDate} @@ -1611,6 +1633,7 @@ The value _MUST_ be an [XSD dateTime literal][org-w3c-xsd-datetime]. The value _ ``` json-doc { "navDate": "2010-01-01T00:00:00Z" } ``` + ### navPlace {: #navPlace} @@ -2219,6 +2242,11 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert { "supplementary": { "id": "https://example.org/iiif/1/annos/1", "type": "AnnotationCollection" } } ``` +### target +{: #target} + +... + ### temporalScale {: #temporalScale} From 135a33c4b78079879f42aaf05ce3069dd666da1e Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 10:31:02 +0100 Subject: [PATCH 111/192] Movie example --- source/presentation/4.0/index.md | 63 ++++++++++++++------------------ 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 179ef5e57..883f679c4 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -621,7 +621,6 @@ This example is a Manifest with two Timelines, each of which represent a tempora } ] }, - "items": [ { "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1", @@ -683,9 +682,11 @@ This example is a Manifest with two Timelines, each of which represent a tempora "id": "https://example.org/iiif/presentation/examples/external-anno.json", "type": "AnnotationPage", } - } + ] +} ``` + ```json { "@context": "http://iiif.io/api/presentation/3/context.json", @@ -703,9 +704,10 @@ This example is a Manifest with two Timelines, each of which represent a tempora "format": "text/plain", "value": "Hast du etwas Zeit für mich?" }, - "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#instant=3.5" + "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#t=3.5,6.8" } - ] + ], + // (annotations for the rest of the song lines) } ``` @@ -724,7 +726,7 @@ Properties: [duration](#model/duration), [format](#model/format), [language](#mo ## Use Case 4: Movie with subtitles -This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, the `timeMode` property ..., and `placeholderContainer` that provides a poster image to show in place of the video file before the user initiates playback. +This example is a Manifest with one Canvas that represents the temporal extent of the movie (the Canvas `duration`) and its aspect ratio (given by the `width` and `height` of the Canvas). The example demonstrates the use of a `Choice` annotation body to give two alternative versions of the movie, indicated by their `label` and `fileSize` properties as well as `height` and `width`. Subtitles are provided by an annotation that links to a VTT file. The motivation of this annotation is `supplementing` and the `provides` property of this annotation indicates what accessibility feature it provides, in this case the term `subtitles`. The `timeMode` property in this case is redundant as `trim` is the default value. The Canvas has a `placeholderContainer` that provides a poster image to show in place of the video file before the user initiates playback. ```json { @@ -736,8 +738,8 @@ This example is a Manifest with one Canvas that represents the temporal extent o { "id": "https://example.org/iiif/presentation/examples/manifest-with-movie/canvas", "type": "Canvas", - "height": 360, - "width": 480, + "height": 1080, + "width": 1440, "duration": 3600, "timeMode": "trim", "placeholderContainer": { @@ -780,20 +782,24 @@ This example is a Manifest with one Canvas that represents the temporal extent o "type": "Choice", "items": [ { - "id": "https://example.org/video/movie.mp4", + "id": "https://example.org/video/movie-low.mp4", "type": "Video", + "label": { "en": ["Low resolution (360 MB)" ]}, "height": 360, "width": 480, - "duration": 3599.68, - "format": "video/mp4" + "duration": 3600, + "format": "video/mp4", + "fileSize": 360553219 }, { - "id": "https://example.org/video/movie.flv", + "id": "https://example.org/video/movie-hi.mp4", "type": "Video", - "height": 360, - "width": 480, - "duration": 3600.8, - "format": "video/flv" + "label": { "en": ["High resolution (1.3 GB)" ]}, + "height": 1080, + "width": 1440, + "duration": 3600, + "format": "video/mp4", + "fileSize": 1345876231 } ] }, @@ -815,6 +821,7 @@ This example is a Manifest with one Canvas that represents the temporal extent o "id": "https://example.org/text/subtitles.vtt", "type": "Text", "format": "text/vtt", + "provides": [ "subtitles" ], "label": { "en": [ "Subtitles in WebVTT format" @@ -832,28 +839,13 @@ This example is a Manifest with one Canvas that represents the temporal extent o } ``` -``` -Canvas -duration, behavior=auto-advance, format, Choice of video 720p, 4K? (forward ref), timeMode, placeholderContainer -``` - -{ - Canvas - duration: 3600 - movie.mp4 - duration: 3599.68 - movie.flv - duration: 3600.8 - -} - -Sometimes, two different formats derived from the same source may have slightly different durations, perhaps a few milliseconds out. What to do... - > **Key Points** -* +* The decision about which item in the `Choice` to play by default is client dependent. In the absence of any other decision process the client should play the first item. In this specific example, the user might make the decision after reading the `label`, or the client might make the decision based on the `fileSize` property and an assessment of the user's available bandwidth. However, the client may have no way of determining why the publisher has offered the choices, and should not prevent the user from making the choice. The cookbook demonstrates several uses of `Choice` for common use cases. +* Slop {: .note} + !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties __Definitions__
@@ -870,7 +862,7 @@ Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). -## Example: Static 3D Model of a Spacesuit +## Use Case 5: Simple 3D Model This example is a Manifest with a single Scene, with a single model of a space suit painted at the Scene's origin. @@ -899,7 +891,8 @@ backgroundColor: #000 point selector for positioning -## Example: 3D Model of a Chessboard +## Use Case 6: Complex Scene + Chessboard is a Canvas with image more than one model From c07e06511e9f5e5d086748aec3a918d53e25f496 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 02:47:39 -0700 Subject: [PATCH 112/192] update use case class and property lists --- source/presentation/4.0/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 883f679c4..64bb264e6 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -443,8 +443,8 @@ The example demonstrates the use of the common descriptive properties `label` fo !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties __Definitions__
-Classes: [Manifest](#model/Manifest), ...

-Properties: [id](#model/id), [type](#type), [label](#label), [lookAt](#lookAt), [near](#near), and [far](#far) +Classes: [Manifest](#model/Manifest), [Canvas](#model/Canvas), [AnnotationPage](#model/AnnotationPage), [Annotation](#model/Annotation)

+Properties: [id](#model/id), [type](#type), [label](#label), [metadata](#metadata), [summary](#summary), [rights](#rights), [homepage](#homepage), [thumbnail](#thumbnail), and [provider](#provider) {: .note} @@ -574,7 +574,7 @@ This example is a Manifest with multiple Canvases, each of which represents a pa !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties __Definitions__
-Classes: [Manifest](#model/Manifest), ...

+Classes: [Manifest](#model/Manifest), [Canvas](#model/Canvas)

Properties: [behavior](#model/behavior), [viewingDirection](#model/viewingDirection), [start](#model/start), [rendering](#model/rendering), [requiredStatement](#model/requiredStatement) {: .note} @@ -719,7 +719,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties __Definitions__
-Classes: [Manifest](#model/Manifest), ...

+Classes: [Manifest](#model/Manifest), [Timeline](#model/Timeline),[TextualBody](#model/TextualBody)

Properties: [duration](#model/duration), [format](#model/format), [language](#model/language), [behavior](#model/behavior), [annotations](#model/annotations), [accompanyingContainer](#model/accompanyingContainer) {: .note} @@ -849,8 +849,8 @@ This example is a Manifest with one Canvas that represents the temporal extent o !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties __Definitions__
-Classes: [Manifest](#model/Manifest), ...

-Properties: [duration](#model/duration), [format](#model/format), [timeMode](#model/timeMode), [behavior](#model/behavior), [placeholderContainer](#model/placeholderContainer) +Classes: [Manifest](#model/Manifest), [Canvas](#model/Canvas), [Choice](#model/Choice)

+Properties: [fileSize](#model/fileSize), [format](#model/format), [provides](#model/provides), [timeMode](#model/timeMode), [behavior](#model/behavior), [placeholderContainer](#model/placeholderContainer) {: .note} # 3D From b4f9e08c424b22dc216762c823b724e3d56e150d Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 10:54:47 +0100 Subject: [PATCH 113/192] Scene key points --- source/presentation/4.0/index.md | 57 +++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 883f679c4..7a8e8343e 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -867,21 +867,57 @@ The positive y axis points upwards, the positive x axis points to the right, and This example is a Manifest with a single Scene, with a single model of a space suit painted at the Scene's origin. -The model also has its own local coordinate space, which may be scaled differently from the Scene's coordinate space. -Unlike when you paint a resource into a Canvas where it fills the space, instead targeting the Scene is equivalent to having a point selector that targets the origin. +```jsonc +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/3d/model_origin.json", + "type": "Manifest", + "label": { "en": ["Single Model"] }, + "summary": { "en": ["Viewer should render the model at the scene origin, and then viewer should add default lighting and camera"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["A Scene"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb", + "type": "Model", + "format": "model/gltf-binary" + }, + "target": "https://example.org/iiif/scene1/page/p1/1" + } + ] + } + ] + } + ] +} +``` +> +**Key Points** +* As this Scene only has one resource in it (the model), the client must provide lighting and a default camera. +* In this simplest use case, the Painting Annotation targets the whole Scene rather than a specific point. The client places the model's origin at the Scene's origin. This is in contrast to the _bounded_ Containers `Canvas` and `Timeline`, where the painted resource fills the Container completely. -```jsonc +* this is equivalent to having a point selector that targets the origin. +* The model also has its own local coordinate space, which may be scaled differently from the Scene's coordinate space. +{: .note} + + +## Use Case 6: Complex Scene -manifest - scene - annotationpage - annotation - model -``` model @@ -891,9 +927,6 @@ backgroundColor: #000 point selector for positioning -## Use Case 6: Complex Scene - - Chessboard is a Canvas with image more than one model transforms for scale and rotation From 5d409c3d454ba4c3ba8e4f2cbe8b9a50a2ef911d Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 11:51:15 +0100 Subject: [PATCH 114/192] use case 5a img --- source/assets/images/p4/use-case-5a.png | Bin 0 -> 38863 bytes source/presentation/4.0/index.md | 136 ++++++++++++++++++++++-- 2 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 source/assets/images/p4/use-case-5a.png diff --git a/source/assets/images/p4/use-case-5a.png b/source/assets/images/p4/use-case-5a.png new file mode 100644 index 0000000000000000000000000000000000000000..e00fd7e91a783ce186372857bde122332266e6aa GIT binary patch literal 38863 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 R8;OPnY-C|rcl%-d{{bAML#zM* literal 0 HcmV?d00001 diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 1fc9d5663..7e83b9b3c 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -864,11 +864,9 @@ The positive y axis points upwards, the positive x axis points to the right, and ## Use Case 5: Simple 3D Model - This example is a Manifest with a single Scene, with a single model of a space suit painted at the Scene's origin. - - +> PNG of Scene ```jsonc { @@ -910,12 +908,138 @@ This example is a Manifest with a single Scene, with a single model of a space s **Key Points** * As this Scene only has one resource in it (the model), the client must provide lighting and a default camera. * In this simplest use case, the Painting Annotation targets the whole Scene rather than a specific point. The client places the model's origin at the Scene's origin. This is in contrast to the _bounded_ Containers `Canvas` and `Timeline`, where the painted resource fills the Container completely. +{: .note} + + +## Use Case 5a: Simple 3D Model in Configured Scene + +This example adds a Light and a Camera to the previous example, and places the model at a specific point rather than at the default origin position. The Light is green and has a position, but has its default orientation of looking along the negative-y axis as no rotation has been specified. The Camera has a position and is pointing at the model's origin via the `lookAt` property. The Scene has a background color. + +> PNG of Scene - lurid green light half-illuminating the astronaut. + +Use case 5a + + +```jsonc + { + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/3d/model_origin.json", + "type": "Manifest", + "label": { "en": ["Single Model with light and Camera"] }, + "summary": { "en": ["Viewer should render the model at (-1,0,1), add the light, and base the viewport on the provided camera"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["A Scene"] }, + "backgroundColor": "#FF00FE", + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb", + "type": "Model", + "format": "model/gltf-binary" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": 1.0, + "z": 1.0 + } + ] + } + }, + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": {"en": ["Perspective Camera 1"]}, + "lookAt": { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation" + } + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, + "y": 6.0, + "z": 10.0 + } + ] + } + }, + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/3d/lights/1", + "type": "SpotLight", + "label": {"en": ["Spot Light 1"]}, + "angle": 90.0, + "color": "#A0FFA0" + }, + "target": { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": 0.0, + "y": 3.0, + "z": 1.0 + } + ] + } + } + ] + } + ] + } + ] +} +``` -* this is equivalent to having a point selector that targets the origin. -* The model also has its own local coordinate space, which may be scaled differently from the Scene's coordinate space. +> +**Key Points** +* This example uses some of the Scene-Specific resources introduced in the next section. +* A Point Selector explicitly places the model in the Scene via the Painting Annotation's `target` property. In the previous example, there was an implicit Point Selector placing the model at (0,0,0) because no explicit Point Selector was provided. +* The provided Light should replace any default lighting the client might have. {: .note} + ## Use Case 6: Complex Scene @@ -1479,7 +1603,7 @@ partOf - -# Content State +# Content State and toggles A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: From 795218a4880e4946d5a8e808cb6e0aab09dd8ad5 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 12:05:31 +0100 Subject: [PATCH 115/192] near far fov --- source/presentation/4.0/index.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 7e83b9b3c..9db742358 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -913,7 +913,7 @@ This example is a Manifest with a single Scene, with a single model of a space s ## Use Case 5a: Simple 3D Model in Configured Scene -This example adds a Light and a Camera to the previous example, and places the model at a specific point rather than at the default origin position. The Light is green and has a position, but has its default orientation of looking along the negative-y axis as no rotation has been specified. The Camera has a position and is pointing at the model's origin via the `lookAt` property. The Scene has a background color. +This example adds a Light and a Camera to the previous example, and places the model at a specific point rather than at the default origin position. The Light is green and has a position, but has its default orientation of looking along the negative-y axis as no rotation has been specified. The Camera has a position and is pointing at the model's origin via the `lookAt` property. The Camera has a `fieldOfView` of 50. The `near` and `far` properties are included to ensure the model falls within the camera's range (although unnecessary in a simple Scene like this). The Scene has a background color. > PNG of Scene - lurid green light half-illuminating the astronaut. @@ -976,7 +976,10 @@ This example adds a Light and a Camera to the previous example, and places the m "lookAt": { "id": "https://example.org/iiif/3d/anno1", "type": "Annotation" - } + }, + "near": 1, + "far": 100, + "fieldOfView": 50 }, "target": { "type": "SpecificResource", From 8e79314adc78ab8da9546e8a1e0e253bc55c0f84 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 6 Jun 2025 12:10:49 +0100 Subject: [PATCH 116/192] near, far, angle --- source/presentation/4.0/model.md | 54 +++++++++++++++++--------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 2cd75396f..ddc312db9 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -423,6 +423,8 @@ Content Resources _MUST_ have an HTTP(s) given in `id`. It _MUST_ be able to be If the Content Resource is an Image, and a IIIF Image service is available for it, then the `id` property of the Content Resource _MAY_ be a complete URI to any particular representation supported by the Image Service, such as `https://example.org/image1/full/1000,/0/default.jpg`, but _MUST NOT_ be just the URI of the Image Service. The Image _SHOULD_ have the service referenced from it using the `service` property. +If the Content Resource is a 3d Model, then regardless of the file format, it is treated as being within an infinitely large three dimensional space with an origin (0 on all three axes). + If there is a need to distinguish between Content Resources, then the resource _SHOULD_ have the `label` property. Containers _MAY_ be treated as content resources for the purposes of annotating on to other Containers. In this situation, the Container _MAY_ be [embedded][prezi30-terminology] within the Annotation, be a reference within the same Manifest, or require dereferencing to obtain its description. @@ -565,8 +567,8 @@ The Image API Selector has properties following the parameters from the API, and {: .api-table} __Properties__
-A IIIF Image API Selector _MUST_ have the following properties: [id](#id), [type](#type).

-A IIIF Image API Selector _MAY_ have the following properties: [region](#region), [size](#size), [rotation](#rotation), [quality](#quality), [format](#format). +A IIIF Image API Selector _MUST_ have the following properties: [type](#type).

+A IIIF Image API Selector _MAY_ have the following properties: [id](#id), [region](#region), [size](#size), [rotation](#rotation), [quality](#quality), [format](#format). {: .note} ```json @@ -598,7 +600,7 @@ A Range _MAY_ have the following properties: [start](#start), [supplementary](#s ### Scene Components {: #scene-components} -The following classes are only usable within Scenes. +The following classes are typically used within Scenes. They might have utility in other contexts, however those uses have not been defined in this specification. #### Cameras {: #Camera} @@ -608,8 +610,8 @@ A Camera provides a view of a region of a Scene's space from a particular positi If either the position or direction is not specified, then the position defaults to the origin of the Scene, and the direction defaults to pointing along the z axis towards negative infinity. __Properties__
-All Cameras _MUST_ have the following properties: [id](#id), and [type](#type).

-All Cameras _MAY_ have the following properties: [label](#label), [lookAt](#lookAt), [near](#near), and [far](#far) +All Cameras _MUST_ have the following properties: [type](#type).

+All Cameras _MAY_ have the following properties: [id](#id), [label](#label), [lookAt](#lookAt), [near](#near), and [far](#far) {: .note} @@ -668,9 +670,9 @@ This specification does not define other aspects of Lights, such as the rate of The specification defines four types of Light, below. __Properties__
-All Lights _MUST_ have the following properties: [id](#id), and [type](#type).

+All Lights _MUST_ have the following properties: [type](#type).

All Lights _SHOULD_ have the following properties: [color](#color), and [intensity](#intensity).

-All Lights _MAY_ have the following properties: [label](#label). +All Lights _MAY_ have the following properties: [id](#id), and [label](#label). {: .note} @@ -768,9 +770,9 @@ As the audio content must come from an audio resource, the Audio Emitter classes Volume is given relative to the input audio content's volume, and thus a volume of 1.0 is the volume as provided, 0.5 is half the volume, and 2.0 is double the volume. __Properties__
-All Audio Emitters _MUST_ have the following properties: [id](#id), [type](#type) and [source](#source).

+All Audio Emitters _MUST_ have the following properties: [type](#type) and [source](#source).

All Audio Emitters _SHOULD_ have the following properties: [volume](#volume).

-All Audio Emitters _MAY_ have the following properties: [label](#label). +All Audio Emitters _MAY_ have the following properties: [id](#id) and [label](#label). {: .note} ##### Ambient Audio @@ -851,8 +853,8 @@ Spot Audio Emitters _MAY_ have the following additional properties: [lookAt](#lo An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into any subsequent coordinate space. __Properties__
-All Transforms _MUST_ have the following properties: [id](#id), [type](#type).

-All Transforms _MAY_ have the following properties: [label](#label), [x](#x), [y](#y), and [z](#z). +All Transforms _MUST_ have the following properties: [type](#type).

+All Transforms _MAY_ have the following properties: [id](#id), [label](#label), [x](#x), [y](#y), and [z](#z). {: .note} ##### Rotate Transform @@ -917,9 +919,9 @@ An Agent represents a person or organization, typically referenced with the `pro The Agent is not intended to be used as a primary identifier for the person or organization, nor to provide structured metadata, but instead to ensure that the information to be rendered to the user can be kept together in the situation when there are multiple agents being referenced. __Properties__
-An Agent _MUST_ have the following properties: [id](#id), [type](#type), and [label](#label).

-An Agent _SHOULD_ have the following properties: [homepage](#homepage), and [logo](#logo)

. -An Agent _MAY_ have the following properties: [seeAlso](#seeAlso), and [summary](#summary). +An Agent _MUST_ have the following properties: [type](#type) and [label](#label).

+An Agent _SHOULD_ have the following properties: [homepage](#homepage) and [logo](#logo)

. +An Agent _MAY_ have the following properties: [id](#id), [seeAlso](#seeAlso) and [summary](#summary). {: .note} {% include api/code_header.html %} @@ -973,8 +975,8 @@ Services will also have specific requirements as to additional properties based A UnitValue expresses a quantity through a numerical value and associated unit of measurement. The value of `unit` _MUST_ be drawn from the list of possible units, or a registered extension. __Properties__
-A Unit Value _MUST_ have the following properties: [id](#id), [type](#type), [value](#value), and [unit](#unit).

-A Unit Value _MAY_ have the following properties: [label](#label). +A Unit Value _MUST_ have the following properties: [type](#type), [value](#value), and [unit](#unit).

+A Unit Value _MAY_ have the following properties: [id](#id) and [label](#label). {: .note} {% include api/code_header.html %} @@ -1025,12 +1027,14 @@ The value of `accompanyingContainer` _MUST_ be a JSON object with the `id` and ` ### angle {: #angle} -!!! warning "Need more info" +The `angle` property is used with SpotLights and Spot Audio Emitters to define the radius of the cone of emitted light or sound. Note that the `fieldOfView` property is defined as the entire field of view, not half (as might be inferred from `angle` using radius). The value _MUST_ be a floating point number greater than 0 and less than 90, and is measure in degrees. If this property is not specified, then the default value is client-dependent. * A SpotLight _SHOULD_ have the `angle` property.
Clients _SHOULD_ process the `angle` property on SpotLights. +* A Spot Audio Emitter _SHOULD_ have the `angle` property.
+ Clients _SHOULD_ process the `angle` property on Spot Audio Emitters. {% include api/code_header.html %} ```json @@ -1215,7 +1219,7 @@ _On Annotation, a list of strings drawn from table_ ### far {: #far} -This property gives the distance from the camera after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. +This property gives the distance along the axis of the camera's orientation after which objects are no longer visible. Objects further from the camera than the `far` distance cannot be seen. The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be greater than the value for `near` of the same Camera. If this property is not specified, then the default value is client-dependent. @@ -1229,9 +1233,7 @@ The value is a non-negative floating point number, in the coordinate space of th ### fieldOfView {: #fieldOfView} -The angle which a PerspectiveCamera can "see". - -!!! warning "Need more info" +The vertical projection angle from the top plane to the bottom plane of the camera's field of view, specified in degrees. The value _MUST_ be a floating point number greater than 0 and less than 180, and is measured in degrees. If this property is not specified, then the default value is client-dependent. @@ -1350,6 +1352,8 @@ The value _MUST_ be a string, and the value _MUST_ be an absolute HTTP(S) URI fo The existence of an HTTP(S) URI in the `id` property does not mean that the URI will always be dereferenceable. If the resource with the `id` property is embedded, it _MAY_ also be dereferenceable. If the resource is referenced, it _MUST_ be dereferenceable. +If a publisher wishes for a resource be able to be referenced, such as in an Annotation, then the resource _MUST_ have an `id` property. + * Collections, Collection Pages, Manifests, Timelines, Canvases, Scenes, Annotations, Annotation Pages, Annotation Collections, Ranges, Content Resources, and Services _MUST_ have the `id` property.
Clients _MAY_ render `id` on any resource type, and _SHOULD_ render `id` on Collections, Manifests and Canvases. * All other resources _MAY_ have the `id` property.
@@ -1554,7 +1558,6 @@ The value of this property _MUST_ be an array of JSON objects, each of which _MU ### lookAt {: #lookAt} -_Summary here_ It is useful to be able to rotate a light or camera or audio resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. @@ -1567,7 +1570,7 @@ The value _MUST_ be a JSON object, conforming to either a reference to an Annota * A Camera _MAY_ have the `lookAt` property.
Clients _SHOULD_ process the `lookAt` property on Cameras. * A SpotLight or a DirectionalLight _SHOULD_ have the `lookAt` property.
-* A SpotSound _SHOULD_ have the `lookAt` property. +* A SpotAudio _SHOULD_ have the `lookAt` property. {% include api/code_header.html %} ```json @@ -1682,7 +1685,7 @@ The value of the property _MUST_ be a [GeoJSON Feature Collection] [link] contai ### near {: #near} -This property gives the distance from the camera from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. +This property gives the distance along the cameria's axis of orientation from which objects are visible. Objects closer to the camera than the `near` distance cannot be seen. The value is a non-negative floating point number, in the coordinate space of the Scene in which the Camera is positioned. The value _MUST_ be less than the value for `far` for the same Camera. If this property is not specified, then the default value is client-dependent. @@ -2110,6 +2113,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. +To assert a `spatialScale` for a Content Resource, the resource _MUST_ first be painted into a Container and the `spatialScale` is asserted on that Container. For example, a 3d model would be painted into a Scene, and then `spatialScale` is asserted on the Scene. {% include api/code_header.html %} ``` json-doc @@ -2128,7 +2132,6 @@ A single UnitValue that defines a real-world scale factor for the coordinate uni * A Scene _MAY_ have the `spatialScale` property.
Clients _SHOULD_ process `spatialScale` on a Scene. - ### start {: #start} @@ -2252,6 +2255,7 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert A single UnitValue that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `value` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. +To assert a `temporalScale` for a Content Resource, the resource _MUST_ first be painted into a Container with a `duration` and the `temporalScale` is asserted on that Container. For example, an Audio file is painted into a Timeline, and then `temporalScale` is asserted on the Timeline. {% include api/code_header.html %} ``` json-doc From 162ca89672e577a972f0b20ca9d5a6989c7eb31c Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 6 Jun 2025 12:12:59 +0100 Subject: [PATCH 117/192] horizontal angle --- source/presentation/4.0/model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index ddc312db9..b75f3b859 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1233,7 +1233,7 @@ The value is a non-negative floating point number, in the coordinate space of th ### fieldOfView {: #fieldOfView} -The vertical projection angle from the top plane to the bottom plane of the camera's field of view, specified in degrees. +The vertical projection angle from the top plane to the bottom plane of the camera's field of view, specified in degrees. The horizontal projection angle is dependent on the aspect ratio of the client's viewport. The value _MUST_ be a floating point number greater than 0 and less than 180, and is measured in degrees. If this property is not specified, then the default value is client-dependent. From 2d809dad9348c5b6a5d13d2185e017c7f7529251 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 04:26:40 -0700 Subject: [PATCH 118/192] use case 5. 5a definitions --- source/presentation/4.0/index.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 9db742358..112333720 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1041,7 +1041,10 @@ This example adds a Light and a Camera to the previous example, and places the m * The provided Light should replace any default lighting the client might have. {: .note} - +__Definitions__
+Classes: [Manifest](#model/Manifest), [Scene](#model/Scene), [Model](#model/Model), [SpecificResource](#model/SpecificResource), [PointSelector](#model/PointSelector), [PerspectiveCamera](#model/PerspectiveCamera), [SpotLight](#model/SpotLight)

+Properties: [backgroundColor](#model/backgroundColor), [lookAt](#model/lookAt), [near](#model/near), [far](#model/far), [feildOfView](#model/fieldOfView), [angle](#model/angle), [color](#model/color) +{: .note} ## Use Case 6: Complex Scene From 6aa204854e6bd823b02bf87f0b63c2aebb0e9d04 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 6 Jun 2025 13:41:44 +0100 Subject: [PATCH 119/192] updates --- source/presentation/4.0/model.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index b75f3b859..893ae6729 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -605,7 +605,7 @@ The following classes are typically used within Scenes. They might have utility #### Cameras {: #Camera} -A Camera provides a view of a region of a Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the Camera to render that region. The size and aspect ratio of the viewport is client and device dependent. +A Camera provides a view of a region of a Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the Camera to render that region. The size and aspect ratio of the viewport is client and device dependent. The first Camera defined in a Scene without the `hidden` behavior is the default Camera. If either the position or direction is not specified, then the position defaults to the origin of the Scene, and the direction defaults to pointing along the z axis towards negative infinity. @@ -645,6 +645,8 @@ A Perspective Camera mimics the way the human eye sees, in that objects further The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region in the `fieldOfView` property. +drawing of a geometrical frustrum truncated by near and far distances + __Properties__
Perspective Cameras _SHOULD_ have the following additional properties: [fieldOfView](#fieldOfView). {: .note} @@ -663,7 +665,7 @@ Perspective Cameras _SHOULD_ have the following additional properties: [fieldOfV #### Lights {: #Light} -It is necessary for there to be a Light within a Scene that illuminates the objects. If no Light is provided by the Scene's description, then the client _MUST_ add a Light. +It is necessary for there to be a Light within a Scene that illuminates the objects. If no Light is provided by the Scene's description, then the client _MUST_ provide default lighting. This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. @@ -763,7 +765,7 @@ Spot Lights _MAY_ have the following additional properties: [lookAt](#lookAt) #### Audio Emitters {: #AudioEmitters} -Positional audio is supported through the use of Audio Emitter resources annotated into Scenes, in the same way that light is emitted from the various subclasses of Light. +Audio is supported through the use of Audio Emitter resources annotated into Scenes, in the same way that light is emitted from the various subclasses of Light. As the audio content must come from an audio resource, the Audio Emitter classes are subclasses of SpecificResource. Note that the `source` of the Audio could be a Timeline, or could be further constrained with additional specifiers as to start point, end point or other transformations. @@ -850,7 +852,7 @@ Spot Audio Emitters _MAY_ have the following additional properties: [lookAt](#lo #### Transforms {: #Transforms} -An operation to transform a 3D resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into any subsequent coordinate space. +An operation to apply a transformation to a resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into any subsequent coordinate space. __Properties__
All Transforms _MUST_ have the following properties: [type](#type).

From 60f07e5c34694ad862ecf21f976c084f0495b24d Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 13:41:52 +0100 Subject: [PATCH 120/192] latest changes --- source/presentation/4.0/index.md | 81 +++----------------------------- 1 file changed, 7 insertions(+), 74 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 9db742358..06ed031c5 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -915,8 +915,6 @@ This example is a Manifest with a single Scene, with a single model of a space s This example adds a Light and a Camera to the previous example, and places the model at a specific point rather than at the default origin position. The Light is green and has a position, but has its default orientation of looking along the negative-y axis as no rotation has been specified. The Camera has a position and is pointing at the model's origin via the `lookAt` property. The Camera has a `fieldOfView` of 50. The `near` and `far` properties are included to ensure the model falls within the camera's range (although unnecessary in a simple Scene like this). The Scene has a background color. -> PNG of Scene - lurid green light half-illuminating the astronaut. - Use case 5a @@ -1046,14 +1044,6 @@ This example adds a Light and a Camera to the previous example, and places the m ## Use Case 6: Complex Scene - -model -light Ambient color -camera (put it in the right place looking -Z) near, far, fieldOfView, lookAt (note that Orthographic w/ viewHeight possible) -backgroundColor: #000 -point selector for positioning - - Chessboard is a Canvas with image more than one model transforms for scale and rotation @@ -1276,82 +1266,25 @@ Todo add example A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. -This specification defines two types of Camera: - -| Class | Description | -| ------------------- | ------------ | -| `PerspectiveCamera` | `PerspectiveCamera` mimics the way the human eye sees, in that objects further from the camera are smaller | -| `OrthographicCamera` | `OrthographicCamera` removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera | - -Cameras are positioned within the Scene facing in a specified direction. Both position and direction are defined through the Annotation which adds the Camera to the Scene, described below in the sections on [Painting Annotations][], [Transforms][], and [Relative Rotation][]. - -If either the position or direction is not specified, then the position defaults to the origin, and facing direction defaults to pointing along the z axis towards negative infinity. - - -The region of the Scene's space that is observable by the camera is bounded by two planes orthogonal to the direction the camera is facing, given in the `near` and `far` properties, and a vertical projection angle that provides the top and bottom planes of the region. - -The `near` property defines the minimum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything nearer to the camera than this distance will not be viewed. Conversely, the `far` property defines a maximum distance from the camera at which something in the space must exist in order to be viewed by the camera. Anything further away will not be viewed. - -For PerspectiveCameras, the vertical projection angle is specificed using the full angular extent in degrees from the top plane to the bottom plane using the `fieldOfView` property. The `fieldOfView` angle MUST be greater than 0 and less than 180. For OrthographicCameras, the vertical projection is always parallel and thus not defined. - -If any of these properties are not specified explicitly, they default to the choice of the client implementation. - -drawing of a geometrical frustrum truncated by near and far distances - -The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client MUST provide a default Camera. The type, properties and position of this default camera are client-dependent. - -```json -{ - "id": "https://example.org/iiif/camera/1", - "type": "PerspectiveCamera", - "near": 1.0, - "far": 100.0, - "fieldOfView": 45.0 -} -``` - +There are two types of Camera, `PerspectiveCamera` and `OrthographicCamera`. The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client provides a default Camera. The type, properties and position of this default camera are client-dependent. ### Light -This specification defines four types of Light: - -| Class | Description | -| ----- | ------------ | -| `AmbientLight` | AmbientLight evenly illuminates all objects in the scene, and does not have a direction or position. | -| `DirectionalLight` | DirectionalLight emits in a specific direction as if it is infinitely far away and the rays produced from it are all parallel. It does not have a specific position. | -| `PointLight` | PointLight emits from a single point within the scene in all directions. | -| `SpotLight` | SpotLight emits a cone of light from a single point in a given direction. | - -Lights defined in this specification have a `color` and an `intensity`. The color is given as an RGB value, such as "#FFFFFF" for white. The intensity is the strength or brightness of the light, and described using a `Value` construct. - -SpotLight has an additional property of `angle`, specified in degrees, which is the angle from the direction that the Light is facing to the outside extent of the cone. - -diagram of cone geometry showing how the angle of the cone is defined +There are four types of Light: AmbientLight, DirectionalLight, PointLight and SpotLight. They have a `color` and an `intensity`. SpotLight has an additional property of `angle` that determines the spread of its light cone. -Lights that require a position and/or direction have these through the Annotation which associates them with the Scene, described below in the sections on [Painting Annotations][] and [Transforms][]. +If the Scene has no Lights, then the client provides its own lighting as it sees fit. - If a Light does not have an explicit direction, then the default is in the negative y direction (downwards). - If a Light does not have an explicit position in the coordinate space, then the default is at the origin. - -This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. - -If there are no Lights present within the Scene, then the viewer MUST add at least one Light. The types and properties of Lights added in this way are client-dependent. - -```json -{ - "id": "https://example.org/iiif/light/1", - "type": "AmbientLight", - "color": "#FFFFFF", - "intensity": {"type": "Value", "value": 0.6, "unit": "relativeUnit"} -} -``` +### Audio Emitters +There are three types of Audio emitter: AmbientAudio, PointAudio and SpotAudio. They have a `source` (an audio Content Resource) and a `volume`. ### Transforms +A Transform is a property + The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. This specification defines a new class of manipulations for SpecificResources called a `Transform`, with three specific sub-classes. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. From 3840769f95b099df2614fe93801fb6bb462483f3 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Fri, 6 Jun 2025 15:13:06 +0100 Subject: [PATCH 121/192] exclude --- source/presentation/4.0/model.md | 41 ++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 893ae6729..c395e79e3 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -852,7 +852,7 @@ Spot Audio Emitters _MAY_ have the following additional properties: [lookAt](#lo #### Transforms {: #Transforms} -An operation to apply a transformation to a resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. Transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into any subsequent coordinate space. +An operation to apply a transformation to a resource. Transforms are specified by the [transform](#transform) property on a Specific Resource. In the context of Scenes, transforms are carried out on a resource in the implicit or explicit local coordinate space of the resource, and are performed prior to painting that resource into any subsequent coordinate space. __Properties__
All Transforms _MUST_ have the following properties: [type](#type).

@@ -959,12 +959,27 @@ An Agent _MAY_ have the following properties: [id](#id), [seeAlso](#seeAlso) and > `"type": "Service"` -A Service is a software application outside of the Manifest that a client might interact with to gain additional information or functionality for the resource that is associated with the Service. The IIIF Image API is an example of a Service, as are the Auth API services. Known types of Service are registered in the Service Registry. +A Service is an external software application that a client might interact with to gain additional information or functionality for the resource that is associated with the Service. The IIIF Image API is an example of a Service, as are the Auth API services. Known types of Service are registered in the Service Registry. + +For cross-version consistency, this specification defines the following values for the `type` or `@type` property for backwards compatibility with other IIIF APIs. Future versions of these APIs will define their own types. These `type` values are necessary extensions for compatibility of the older versions. + +| Value | Specification | +| -------------------- | ------------- | +| ImageService1 | [Image API version 1][image11] | +| ImageService2 | [Image API version 2][image21] | +| SearchService1 | [Search API version 1][search1] | +| AutoCompleteService1 | [Search API version 1][search1-autocomplete] | +| AuthCookieService1 | [Authentication API version 1][auth1-cookie-service] | +| AuthTokenService1 | [Authentication API version 1][auth1-token-service] | +| AuthLogoutService1 | [Authentication API version 1][auth1-logout-service] | +{: .api-table #table-service-types} + +Implementations _SHOULD_ be prepared to recognize the `@id` and `@type` property names used by older specifications, as well as `id` and `type`. Note that the `@context` key _SHOULD NOT_ be present within the `service`, but instead included at the beginning of the document. __Properties__
A Service _MUST_ have the following properties: [id](#id), and [type](#type).

A Service _SHOULD_ have the following properties: [label](#label), [profile](#profile).

-A Service _MAY_ have the following properties: [service](#service).

+A Service _MAY_ have the following properties: [service](#service), `@id` and `@type`.

Services will also have specific requirements as to additional properties based on the type of service. {: .note} @@ -1200,19 +1215,19 @@ The value _MUST_ be a positive floating point number. ### exclude {: #exclude} -_Summary here_ - -Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. - - -_On Annotation, a list of strings drawn from table_ +Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type or functionality should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. | Value | Description | |------------|-------------| -| Audio | | -| Animations | | -| Cameras | | -| Lights | | +| Audio | Exclude all sound from resources, including audio tracks, audio emitters, and audio from video | +| Animations | Exclude all definitions of animations from resources | +| Cameras | Exclude all cameras from resources | +| Lights | Exclude all lights from resources | + +The value of `exclude` is an array of strings, each of which is one of the values listed above. If the `exclude` property is not specified, then no resources are excluded. + +* An Annotation _MAY_ have the `exclude` property. + Clients _SHOULD_ process the `exclude` property. ```json "exclude": [ "Audio", "Lights", "Cameras", "Animations" ] From 2dd441e0e7fb602275b46cd462da120734419350 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 15:13:29 +0100 Subject: [PATCH 122/192] Nesting section --- source/presentation/4.0/index.md | 154 ++++++++--------------------- source/presentation/4.0/scratch.md | 6 +- 2 files changed, 48 insertions(+), 112 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 06ed031c5..308f75b68 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -227,6 +227,8 @@ Scenes may also have the `duration` property in the same manner as Timelines. } ``` +Scenes can have time-based and image content in them as well as 3D content. See model for how to do this. + [👀 Model Documentation](model/#containers) @@ -256,7 +258,7 @@ In addition to the required properties `id` and `type`, other commonly used prop ### Containers as Content Resources -Containers may also be treated as Content Resources and painted into other Containers. This allows composition of content, such as painting a Canvas bearing a Video into a Scene, or painting a 3D model along with its associated Lights into an encompassing Scene. +Containers may also be treated as Content Resources and painted into other Containers. This allows composition of content, such as painting a Canvas bearing a Video into a Scene, or painting a 3D model along with its associated Lights into an encompassing Scene. This capability is described further in [nesting](#nesting). ### Referencing Parts of Resources @@ -324,6 +326,45 @@ The fragment example above can be expressed using a Specific Resource: ``` +## Supporting Resources + +Constructs from the domain of 3D graphics are expressed in IIIF as Resources. They are associated with Scenes via Painting Annotations in the same manner as Content Resources. They aid in or enhance the rendering of Content Resources, especially in Scenes. + +### Cameras + +A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. + +There are two types of Camera, `PerspectiveCamera` and `OrthographicCamera`. The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client provides a default Camera. The type, properties and position of this default camera are client-dependent. + + +### Lights + +There are four types of Light: AmbientLight, DirectionalLight, PointLight and SpotLight. They have a `color` and an `intensity`. SpotLight has an additional property of `angle` that determines the spread of its light cone. + +If the Scene has no Lights, then the client provides its own lighting as it sees fit. + + +### Audio Emitters + +There are three types of Audio emitter: AmbientAudio, PointAudio and SpotAudio. They have a `source` (an audio Content Resource) and a `volume`. + +### Transforms + +When painting resources into Scenes, it is often necessary to resize, rotate or move them relative to the coordinate space of the Scene. These operations are specified using three Transforms: ScaleTransform, RotateTransform and TranslateTransform. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. + +Transforms are added to a SpecificResource using the `transform` property, and there may be more than one applied when adding a model to a Scene. Different orders of the same set of transforms can have different results, so attention must be paid when creating the array and when processing it. + +### Agent + +Any resource can have a `provider` property which a client can display to the user. This typically tells the user who the publisher is and how they might be contacted. The value of this property is an [Agent](model/#agent). + +### Service + +A Service is a software application that a client might interact with to gain additional information or functionality. The IIIF Image API is an example of a Service. + +### Unit Value + +To express a numerical measure in some particular unit, we use a UnitValue resource that has `value` and `unit` properties. For example a Scene coordinate system might be in meters. # Image Content @@ -1260,117 +1301,8 @@ Todo add example -## Scene-Specific Resources - -### Camera - -A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. - -There are two types of Camera, `PerspectiveCamera` and `OrthographicCamera`. The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client provides a default Camera. The type, properties and position of this default camera are client-dependent. - - -### Light - -There are four types of Light: AmbientLight, DirectionalLight, PointLight and SpotLight. They have a `color` and an `intensity`. SpotLight has an additional property of `angle` that determines the spread of its light cone. - -If the Scene has no Lights, then the client provides its own lighting as it sees fit. - - -### Audio Emitters - -There are three types of Audio emitter: AmbientAudio, PointAudio and SpotAudio. They have a `source` (an audio Content Resource) and a `volume`. - - -### Transforms - -A Transform is a property - -The Annotation with a Selector on the target can paint a resource at a point other than the origin, however it will be at its initial scale and rotation, which may not be appropriate for the scene that is being constructed. - -This specification defines a new class of manipulations for SpecificResources called a `Transform`, with three specific sub-classes. Each Transform has three properties, `x`, `y` and `z` which determine how the Transform affects that axis in the local coordinate space. - - -| Class | Description | -| --------------- | ------------ | -| ScaleTransform | A ScaleTransform applies a multiplier to one or more axes in the local coordinate space. A point that was at 3.5, after applying a ScaleTransform of 2.0 would then be at 7.0. If an axis value is not specified, then it is not changed, resulting in a default of 1.0 | -| RotateTransform | A RotateTransform rotates the local coordinate space around the given axis in a counter-clockwise direction around the axis itself (e.g. around a pivot point of 0 on the axis). A point that was at x=1,y=1 and was rotated 90 degrees around the x axis would be at x=1,y=0,z=1. If an axis value is not specified, then it is not changed, resulting in a default of 0.0 | -| TranslateTransform | A TranslateTransform moves all of the objects in the local coordinate space the given distance along the axis. A point that was at x=1.0, after applying a TranslateTransform of x=1.0 would be at x=2.0. If an axis value is not specified then it is not changed, resulting in a default of 0.0 | - -Transforms are added to a SpecificResource using the `transform` property. The value of the property is an array, which determines the order in which the transforms are to be applied. The resulting state of the first transform is the input state for the second transform, and so on. Different orders of the same set of transforms can have different results, so attention must be paid when creating the array and when processing it. - -The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. - -Transforms are only used in the Presentation API when the SpecificResource is the `body` of the Annotation, and are applied before the resource is painted into the scene at the point given in the `target`. - -```json -{ - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "transform": [ - { - "type": "RotateTransform", - "x": 0.0, - "y": 180.0, - "z": 0.0 - }, - { - "type": "TranslateTransform", - "x": 1.0, - "y": 0.0, - "z": 0.0 - } - ] -} -``` - - -### Relative Rotation - -It is useful to be able to rotate a light or camera resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container. - -If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene. - -This rotation happens after the resource has been added to the Scene, and thus after any transforms have taken place in the local coordinate space. - -```json -"lookAt": { - "type": "PointSelector", - "x": 3, - "y": 0, - "z": -10 -} -``` - - -### Excluding - -Just as a Scene may contain multiple Annotations with model, light, and camera resources, a single 3D model file may contain a collection of 3D resources, including model geometry, assemblages of lights, and/or multiple cameras, with some of these potentially manipulated by animations. When painting Scenes or models that themselves may contain groups of resources within a single Scene, it may not always be appropriate to include all possible cameras, lights, or other resources, and it may be desirable to opt not to import some of these resources. This is accomplished through the Annotation property `exclude`, which prevents the import of audio, lights, cameras, or animations from a particular Scene or model prior to the Annotation being painted into a Scene. When `exclude` is used, the excluded resource type should not be loaded into the Scene, and it is not possible to reactivate or turn on these excluded resources after loading. - -Painting a Scene into another while excluding import of several types of resources: -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "exclude": ["Audio", "Lights", "Cameras", "Animations"], - "body": { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - }, - "target": "https://example.org/iiif/scene2" -} -``` - - - - - - -### Nesting +# Nesting (more about Containers as Content Resources) A Canvas can be painted into a Scene as an Annotation, but the 2D nature of Canvases requires special consideration due to important differences between Canvases and Scenes. A Canvas describes a bounded 2D space with finite `height` and `width` measured in pixels with a pixel origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of arbitrary coordinate units and a coordinate origin at the center of the space. It is important to note that in many cases the pixel scale used by a Canvas or a 2D image content resource will not be in proportion to the desired 3D coordinate unit scale in a Scene. diff --git a/source/presentation/4.0/scratch.md b/source/presentation/4.0/scratch.md index 273543e6d..8afb569b1 100644 --- a/source/presentation/4.0/scratch.md +++ b/source/presentation/4.0/scratch.md @@ -6,4 +6,8 @@ The second Container is a Canvas, representing a 2D surface. In this case the Ca The third Container is a Scene. Unlike a Canvas, it is not a bounded spatial extent, but may be a bounded temporal extent if it has the optional duration property. It still establishes a coordinate space (x, y, z) but doesn't need any spatial properties to do so as it is always the same, infinite unbounded space. The Annotation paints the astronaut model into the Scene. As no further qualification is given, the astronaut model is placed at the (0,0,0) origin of the Scene. Later examples will show how to control the lighting and camera position(s) and properties, but this is not required; a IIIF viewer is expected to supply ambient light and a default camera position in the absence of specific values. -This requires careful consideration of the URI schemes for `id` properties of Containers and their Manifests to ensure they remain referenceable in the future. \ No newline at end of file +This requires careful consideration of the URI schemes for `id` properties of Containers and their Manifests to ensure they remain referenceable in the future. + + +use this in an example: +The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. From cfb691f0f38b95cbdc52ea0cf7a82ccf187774bc Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 07:14:47 -0700 Subject: [PATCH 123/192] periodical example --- source/presentation/4.0/index.md | 168 +++++++++++++++++++++++++++---- 1 file changed, 150 insertions(+), 18 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 06ed031c5..858c26f75 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -443,7 +443,7 @@ The example demonstrates the use of the common descriptive properties `label` fo !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties __Definitions__
-Classes: [Manifest](#model/Manifest), [Canvas](#model/Canvas), [AnnotationPage](#model/AnnotationPage), [Annotation](#model/Annotation)

+Classes: [Manifest](#model/Manifest), [Canvas](#model/Canvas), [AnnotationPage](#model/AnnotationPage), [Annotation](#model/Annotation), [Agent](#model/Agent)

Properties: [id](#model/id), [type](#type), [label](#label), [metadata](#metadata), [summary](#summary), [rights](#rights), [homepage](#homepage), [thumbnail](#thumbnail), and [provider](#provider) {: .note} @@ -1414,7 +1414,7 @@ When a Scene is nested into another Scene, the `backgroundColor` of the Scene to ## Choice of Alternative Resources -Example: Multi-spectral Images with Comments +## Use Case : Multi-spectral Images with Comments ## Embedded Content @@ -1483,38 +1483,170 @@ IIIF Ranges are used to represent structure _WITHIN_ a Manifest beyond the defau :eyes: -## Example: Periodical +## Use Case : Periodical -This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. Each of these year Collections in turn has one Manifest for each daily issue of the newspaper. +This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection using the `behavior` "multi-part" for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections, also using the "multi-part" behavior, each representing a year's worth of issues. Each of these year Collections in turn has one Manifest for each daily issue of the newspaper. Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections which may be spread across multiple columns and pages. -Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each story's Range links to an Annotation Collection that provides the text of the story via the `supplementary` property. +Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. + ``` demonstrates navDate, navPlace, structures (Ranges), supplementary, Collections ... ``` +IIIF Collection with `behavior:multi-part` that contains the individual `multi-part` Collections for each year/volume +```json +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/periodical/collection.json", + "type": "Collection", + "label": { "en": [ "The Tombstone Epitaph (1880-1920)" ] }, + "behavior": [ "multi-part" ], + "navPlace": { + "id": "https://example.org/iiif/periodical/collection/place/1", + "type": "FeatureCollection", + "features": [ + { + "id": "https://example.org/iiif/periodical/collection/feature/1", + "type": "Feature", + "properties": { + "label": { "en": ["Tombstone, Cochise County, Arizona"] } + }, + "geometry": { + "type": "Point", + "coordinates": [31.715940, −110.064827] + } + } + ] + }, + "items": [ + { + "id": "https://example.org/iiif/periodical/multi-part-collection/v1.json", + "type": "Collection", + "label": { "en": [ "The Tombstone Epitaph, 1880" ] } + }, + { + "id": "https://example.org/iiif/periodical/multi-part-collection/v2.json", + "type": "Collection", + "label": { "en": [ "The Tombstone Epitaph, 1881" ] } + }, + // Additional multi-part collections for each year/volume + ] +} +``` +IIIF Collection with `behavior:multi-part` for the second volume (1881), with individual Manifests for each issue. + +```json +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/periodical/multi-part-collection/v1.json", + "type": "Collection", + "label": { "en": [ "The Tombstone Epitaph, 1881" ] }, + "behavior": [ "multi-part" ], + "items": [ + // Previous issues + { + "id": "https://example.org/iiif/periodical/multi-part-collection/issue1.json", + "type": "Manifest", + "label": { "en": [ "October 27, 1881" ] } + }, + // Subsequent issues + ] +} +``` +Manifest for the October 27, 1881 issue, with Ranges for table of contents. ```json -"navPlace": { - "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature-collection/1", - "type": "FeatureCollection", - "features": [ +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/periodical/multi-part-collection/issue1.json", + "type": "Manifest", + "label": { "en": [ "The Tombstone Epitaph, October 27, 1881" ] }, + "behavior": [ "paged" ], + "items": [ { - "id": "https://iiif.io/api/cookbook/recipe/0318-navPlace-navDate/feature/1", - "type": "Feature", - "properties": { - "label": { "en": ["Castel Sant'Angelo, Rome"] } - }, - "geometry": { - "type": "Point", - "coordinates": [12.4663, 41.9031] - } + "id": "https://example.org/iiif/periodical/multi-part-collection/canvas/c1", + "type": "Canvas", + "label": { "en": [ "Page 1" ] }, + "height": 4613, + "width": 3204, + "items": [ + { + "id": "https://example.org/iiif/periodical/multi-part-collection/page/p1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/periodical/multi-part-collection/annotation/a1", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://example.org/image/page1.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + }, + "target": "https://example.org/iiif/periodical/multi-part-collection/canvas/c1" + } + ] + } + ] + }, + { + "id": "https://example.org/iiif/periodical/multi-part-collection/canvas/c2", + "type": "Canvas", + "label": { "en": [ "Page 2" ] }, + "height": 4613, + "width": 3204, + "items": [ + { + "id": "https://example.org/iiif/periodical/multi-part-collection/page/p2", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/periodical/multi-part-collection/annotation/a2", + "type": "Annotation", + "motivation": [ "painting" ], + "body": { + "id": "https://example.org/image/page2.jpg", + "type": "Image", + "format": "image/jpeg", + "height": 4613, + "width": 3204, + }, + "target": "https://example.org/iiif/periodical/multi-part-collection/canvas/c2" + } + ] + } + ] + }, + // Additional Canvases + ], + "structures": [ + { + "id": "https://example.org/iiif/periodical/multi-part-collection/range/r0", + "type": "Range", + "label": { "en": [ "October 27, 1881" ] }, + "items": [ + { + "id": "https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/range/r1", + "type": "Range", + "label": { "en": [ "Yesterday's Tragedy: Three Men Hurled Into Eternity In the Duration of a Moment" ] }, + "items": [ + { + "id": "https://example.org/iiif/periodical/multi-part-collection/canvas/c1", + "type": "Canvas" + }, + // Additional contents + ] + } + ] } ] } From 0078469a242f6bf45fbde7d500606c719744d773 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 07:24:15 -0700 Subject: [PATCH 124/192] add navDate to periodical use case --- source/presentation/4.0/index.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 5e2a54113..176961415 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1433,7 +1433,7 @@ Each Manifest has a `navDate` property that could be used to plot the issues on demonstrates navDate, navPlace, structures (Ranges), supplementary, Collections ... ``` -IIIF Collection with `behavior:multi-part` that contains the individual `multi-part` Collections for each year/volume +IIIF Collection with `behavior` "multi-part" that contains the individual "multi-part" Collections for each year/volume. ```json { @@ -1474,7 +1474,7 @@ IIIF Collection with `behavior:multi-part` that contains the individual `multi-p ] } ``` -IIIF Collection with `behavior:multi-part` for the second volume (1881), with individual Manifests for each issue. +IIIF Collection with `behavior` "multi-part" for the second volume (1881), with individual Manifests for each issue. ```json { @@ -1504,6 +1504,7 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents. "type": "Manifest", "label": { "en": [ "The Tombstone Epitaph, October 27, 1881" ] }, "behavior": [ "paged" ], + "navDate": "1881-10-27T00:00:00+00:00", "items": [ { "id": "https://example.org/iiif/periodical/multi-part-collection/canvas/c1", @@ -1570,7 +1571,7 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents. "label": { "en": [ "October 27, 1881" ] }, "items": [ { - "id": "https://iiif.io/api/cookbook/recipe/0031-bound-multivolume/range/r1", + "id": "https://example.org/iiif/periodical/multi-part-collection/range/r1", "type": "Range", "label": { "en": [ "Yesterday's Tragedy: Three Men Hurled Into Eternity In the Duration of a Moment" ] }, "items": [ From a7d7776d3b85cae57f08214663271db10315f2f7 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 07:33:42 -0700 Subject: [PATCH 125/192] add classes and properties to periodical use case --- source/presentation/4.0/index.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 176961415..092165b2c 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1428,12 +1428,7 @@ The top level Collection has a `navPlace` property that could be used on a "News Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. - -``` -demonstrates navDate, navPlace, structures (Ranges), supplementary, Collections -... -``` -IIIF Collection with `behavior` "multi-part" that contains the individual "multi-part" Collections for each year/volume. +IIIF Collection with `behavior` "multi-part" that contains the individual "multi-part" Collections for each year/volume: ```json { @@ -1587,7 +1582,10 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents. ] } ``` - +__Definitions__
+Classes: [Collection](#model/Collection), [Range](#model/Range), [AnnotationCollection](#model/AnnotationCollection)

+Properties: [behavior](#model/behavior), [navPlace](#model/navPlace), [navDate](#model/navDate), [structure](#model/structures) +{: .note} thumbnail-nav sequence From 80ddb8475d39cabe7d0f7820eeb380670164540d Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 16:28:20 +0100 Subject: [PATCH 126/192] very WIP toggles --- source/presentation/4.0/index.md | 168 ++++++++++++++++++++++++++++- source/presentation/4.0/scratch.md | 24 +++++ 2 files changed, 191 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 095b2bea6..5f53b1289 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1977,12 +1977,50 @@ The activating annotation is provided in a Container's `annotations` property. I } ``` + + +```json +{ + "items": [ + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "A label for the activation may be provided as a TextualBody" + } + ], + "target": { + "source": { + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", + "type": "Annotation" + }, + "scope": { + "type": "Annotation", + "motivation": ["contentState"], + "target": { + // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene", + "backgroundColor": "#FF99AA" + } + } + } + } + ] +} +``` + // Can you put activating annotations in `manifest.annotations`? They would work there too, you have all the information. ### Triggering a named animation in a model +> toggles: anno supplies the label. This anno's `toggles` property lists id of an activating anno that activates the animation. + Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. This pattern is similar to the above, except that: @@ -2028,7 +2066,133 @@ This pattern is similar to the above, except that: "type": "AnnotationPage", "items": [ { - "id": "https://example.org/iiif/3d/anno2", + "id": "https://example.org/iiif/3d/box-opening-activating-anno", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "Click the box to open the lid" + } + ], + "target": [ + { + "type": "SpecificResource", + "source": "https://example.org/iiif/3d/painting-anno-for-music-box", + "selector": [ + { + "type": "AnimationSelector", + "value": "open-the-lid" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +``` + +> Toggles example + +```json +{ + "id": "https://example.org/iiif/3d/activating-animation.json", + "type": "Manifest", + "label": { "en": ["Music Box with lid that opens as an internal animation"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/scene-with-activation-animation", + "type": "Scene", + "label": { "en": ["A Scene Containing a Music Box"] }, + "items": [ + { + "id": "https://example.org/iiif/scene-with-activation-animation/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-music-box", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + }, + "toggles": [ + // Clicking the box opens the lid + "https://example.org/iiif/3d/activating-anno-for-music-box" + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/activation-labelling-anno", + "type": "Annotation", + "motivation": ["commenting-maybe"], + "body": [ + { + "type": "TextualBody", + "value": "Click me to open the lid of the box" + } + ], + "toggles": [ + // clicking the 'Click me' opens the lid + "https://example.org/iiif/3d/activating-anno-for-music-box" + ], + "target": [ + "https://example.org/iiif/3d/painting-anno-for-music-box" + ] + }, + { + "id": "https://example.org/iiif/3d/activating-anno-for-music-box", + "type": "Annotation", + "motivation": ["activating"], + "body": [ + { + "type": "TextualBody", + "value": "Click me to open the lid of the box" + } + ], + "target": { + "type": "SpecificResource", + "source": "https://example.org/iiif/3d/painting-anno-for-music-box", + "selector": [ + { + "type": "AnimationSelector", + "value": "open-the-lid" + } + ], + "refinedBy": [ + // fragment time selector + ] + } + } + ] + } + ] + } + + + + + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/box-opening-activating-anno", "type": "Annotation", "motivation": ["activating"], "body": [ @@ -2058,6 +2222,8 @@ This pattern is similar to the above, except that: } ] } + + ``` // TODO diff --git a/source/presentation/4.0/scratch.md b/source/presentation/4.0/scratch.md index 8afb569b1..4091dccf7 100644 --- a/source/presentation/4.0/scratch.md +++ b/source/presentation/4.0/scratch.md @@ -11,3 +11,27 @@ This requires careful consideration of the URI schemes for `id` properties of Co use this in an example: The point around which RotateTransform rotates the space is the origin. This "pivot point" cannot be changed directly, but instead a TranslateTransform can be used to move the desired pivot point to the be at the origin, then the RotateTransform applied. + + + + + "body": [ + { + "type": "TextualBody", + "value": "A label for the activation may be provided as a TextualBody" + }, + { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/scene-with-activation", + "type": "Scene" + }, + "transform": [ + { + "type": "PropertyTransform", + "propertyName": "backgroundColor", + "propertyValue": "#FF99AA" + } + ] + } + ], \ No newline at end of file From c3ced33c67736aa5a8a1c49c5fb79d2d91550040 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 08:28:36 -0700 Subject: [PATCH 127/192] add supplementary to periodical use case --- source/presentation/4.0/index.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 092165b2c..8e4307011 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1420,13 +1420,9 @@ IIIF Ranges are used to represent structure _WITHIN_ a Manifest beyond the defau ## Use Case : Periodical -This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection using the `behavior` "multi-part" for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections, also using the "multi-part" behavior, each representing a year's worth of issues. Each of these year Collections in turn has one Manifest for each daily issue of the newspaper. +This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. The parent Collection and each of its child Collections use the `behavior` "multi-part" to signal that the Collections and their Manifests are part of a logical whole or contguous set. Each of the year Collections has one Manifest for each issue of the newspaper. -Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections which may be spread across multiple columns and pages. - -The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each story's Range links to an Annotation Collection that provides the text of the story via the `supplementary` property. - -Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. +The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections, which may be spread across multiple columns and pages. Each story's Range includes the `supplementary` property to link to an Annotation Collection that provides the text of the story. IIIF Collection with `behavior` "multi-part" that contains the individual "multi-part" Collections for each year/volume: @@ -1569,6 +1565,7 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents. "id": "https://example.org/iiif/periodical/multi-part-collection/range/r1", "type": "Range", "label": { "en": [ "Yesterday's Tragedy: Three Men Hurled Into Eternity In the Duration of a Moment" ] }, + "supplementary": { "id": "https://example.org/iiif/full-text-anno-collection", "type": "AnnotationCollection" }, "items": [ { "id": "https://example.org/iiif/periodical/multi-part-collection/canvas/c1", @@ -1582,6 +1579,12 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents. ] } ``` + +> +**Key Points** +* +{: .note} + __Definitions__
Classes: [Collection](#model/Collection), [Range](#model/Range), [AnnotationCollection](#model/AnnotationCollection)

Properties: [behavior](#model/behavior), [navPlace](#model/navPlace), [navDate](#model/navDate), [structure](#model/structures) From f317be4927c30b86f42cb078d5e6232f0f252dfb Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 08:29:27 -0700 Subject: [PATCH 128/192] add supplementary to periodical use case --- source/presentation/4.0/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 8e4307011..b5207e4db 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1587,7 +1587,7 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents. __Definitions__
Classes: [Collection](#model/Collection), [Range](#model/Range), [AnnotationCollection](#model/AnnotationCollection)

-Properties: [behavior](#model/behavior), [navPlace](#model/navPlace), [navDate](#model/navDate), [structure](#model/structures) +Properties: [behavior](#model/behavior), [navPlace](#model/navPlace), [navDate](#model/navDate), [structure](#model/structures), [supplementary](#model/supplementary) {: .note} thumbnail-nav From 9e260e409247ef252892f66494ad21536e5df8ff Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Fri, 6 Jun 2025 08:33:24 -0700 Subject: [PATCH 129/192] fix periodical section typo --- source/presentation/4.0/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 8462ac1bd..65bd92298 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1420,7 +1420,7 @@ IIIF Ranges are used to represent structure _WITHIN_ a Manifest beyond the defau ## Use Case : Periodical -This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. The parent Collection and each of its child Collections use the `behavior` "multi-part" to signal that the Collections and their Manifests are part of a logical whole or contguous set. Each of the year Collections has one Manifest for each issue of the newspaper. +This example demonstrates the use of IIIF Collections to group Manifests into a hierarchy. In this case, there is a Collection for a publishing run of the _The Tombstone Epitaph_ from 1880 to 1920. This contains 41 child Collections each representing a year's worth of issues. The parent Collection and each of its child Collections use the `behavior` "multi-part" to signal that the Collections and their Manifests are part of a logical whole or contiguous set. Each of the year Collections has one Manifest for each issue of the newspaper. The top level Collection has a `navPlace` property that could be used on a "Newspapers of America" map to allow users to view newspapers by location. Each Manifest has a `navDate` property that could be used to plot the issues on a calendar-style user interface. Within each Manifest, the `structures` property provides Ranges which are used to identify individual sections of the Newspaper, and individual stories within the sections, which may be spread across multiple columns and pages. Each story's Range includes the `supplementary` property to link to an Annotation Collection that provides the text of the story. From 8c904407c2d9fdbab0018fd9c47b492e2d2cfc85 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Fri, 6 Jun 2025 16:53:04 +0100 Subject: [PATCH 130/192] interactionMode on Camera (maybe) --- source/presentation/4.0/model.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index c395e79e3..79858e833 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1427,6 +1427,10 @@ For interaction modes that involve a Camera orbiting around a target point, the The value _MUST_ be an array of strings. +> TODO: Undecided whether this is Camera and/or Container + +* A Camera _MAY_ have the `interactionMode` property.
+ Clients _SHOULD_ process `interactionMode` on a Camera. * A Container _MAY_ have the `interactionMode` property.
Clients _SHOULD_ process `interactionMode` on a Container. * Other types of resource _MUST NOT_ have the `interactionMode` property.
From 506f426fc1e1e0666ac7577ebdf332c7778bc1c0 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 28 Oct 2025 11:38:19 +0000 Subject: [PATCH 131/192] rewrite of content state approach --- source/presentation/4.0/index.md | 694 ++++++++++++++----------------- source/presentation/4.0/model.md | 2 +- 2 files changed, 309 insertions(+), 387 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 65bd92298..ca01ce798 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -883,7 +883,7 @@ This example is a Manifest with one Canvas that represents the temporal extent o > **Key Points** * The decision about which item in the `Choice` to play by default is client dependent. In the absence of any other decision process the client should play the first item. In this specific example, the user might make the decision after reading the `label`, or the client might make the decision based on the `fileSize` property and an assessment of the user's available bandwidth. However, the client may have no way of determining why the publisher has offered the choices, and should not prevent the user from making the choice. The cookbook demonstrates several uses of `Choice` for common use cases. -* Slop +* Slop - impl note - don't interpret **very** minor discrepancies between `duration` on the different Choices and the Container `duration` as an instruction to stretch or compress the audio/video stream to match the Container duration. No real way to quantify this, just _be sensible_. {: .note} @@ -902,6 +902,7 @@ Scenes have infinite height (y axis), width (x axis) and depth (z axis), where 0 The positive y axis points upwards, the positive x axis points to the right, and the positive z axis points forwards (a [right-handed cartesian coordinate system](https://en.wikipedia.org/wiki/Right-hand_rule)). +(image of coordinate system here) ## Use Case 5: Simple 3D Model @@ -1088,31 +1089,29 @@ Properties: [backgroundColor](#model/backgroundColor), [lookAt](#model/lookAt), ## Use Case 6: Complex Scene -Chessboard is a Canvas with image -more than one model -transforms for scale and rotation -Scene in Scene -Exclude -interactionMode +**Chessboard is a Canvas with image (not a 3D chessboard)** +A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. +**more than one model** +**transforms for scale and rotation** +This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). +**Scene in Scene** +**Exclude** +**interactionMode** -## Merge the below into the examples or into model -This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). -``` -``` -A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. +## Merge the below into the examples or into model As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. @@ -1341,26 +1340,49 @@ When a Scene is nested into another Scene, the `backgroundColor` of the Scene to # Annotations +In the examples so far, Annotations have been used to associate the images, audio and other Content Resources with their Containers for presentation. IIIF uses the same W3C standard for the perhaps more familiar _annotation_ concepts of commenting, tagging, describing and so on. Annotations can carry textual transcriptions or translations of the content, discussion about the content and any other linking between resources. +Whereas annotations that associate content resources with Containers are included in the `items` property of the Container, all other types of Annotation are referenced from the `annotations` property. Containers, Manifests, Collections and Ranges can all have this property, linking to relevant annotations. As with the `items` property, annotations are grouped into one or more AnnotationPage resources. These are usually external references. -## Comment Annotations +``` +Manifest + items + Canvas + annotations + AnnotationPage + items + Annotation +``` +## Comment Annotations +### A comment about a segment of music -## Choice of Alternative Resources +(targets Timeline) +"Here begins the development of the second theme" -## Use Case : Multi-spectral Images with Comments +### A comment about a face in a painting +(targets Canvas) +"This might be so-and-so" -## Embedded Content +### A comment about something in a Model -e.g., painting TextualBody on Canvas +(targets Scene) +Look at this scratch in the helmet Todo: This is mostly copy-pasted from properties, is it needed here? It is important to be able to position the textual body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. The positioning of the textual body in a container is accomplished through the `position` property, which has as a value a Specific Resource identifying the targeted container as the source and a selector defining how the textual body should be positioned in the targeted container. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. +## Choice of Alternative Resources + +## Use Case 7: Multi-spectral Images with Comments +(same as cookbook example?) +## Embedded Content + +e.g., painting TextualBody on Canvas ## Non Rectangular Segments @@ -1381,15 +1403,12 @@ Move to SpecificResource Move to SpecificResource - - ## Annotation Page "Overlapping elements with a larger z-index cover those with a smaller one." link to https://developer.mozilla.org/en-US/docs/Web/CSS/z-index - ## Annotation Collection deal with this: @@ -1398,12 +1417,6 @@ https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e use totalItems? https://iiif.io/api/discovery/1.0/#totalitems - - - - - - # Navigation ## Collection @@ -1608,7 +1621,9 @@ partOf - -# Content State and toggles +# Content State + +(this + model doc should relieve Content State spec of modelling concerns and leave it entirely about protocol) A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: @@ -1731,6 +1746,8 @@ The mechanisms for passing Content State into a client, and exporting a Content ## Load a particular view of some resource and modify it +⚠ what are we doing with this? Do we still allow it? It's a good use case... + In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: ```json @@ -1757,6 +1774,10 @@ In the previous usage, the fragment of IIIF carried by the annotation with the m As well as adding resources not present in the referred-to resource, the Content State can also remove parts of the referred-to resource from the user's view by applying the behavior `hidden` to them: +⚠⚠⚠⚠ + +now we are entering the danger zone + ```jsonc { // What does this actually look like? I want to load bnf_chateauroux example but HIDE the illumination @@ -1770,15 +1791,16 @@ As well as adding resources not present in the referred-to resource, the Content TODO: what is the processing algorithm for applying incoming `hidden` ? -When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest. +~When a Content State annotation carries a Scene, a view might be initialized from a Content State that introduces an additional Camera that shows the user the point of interest.~ -## Modify the Container in a particular context +# Interactivity and Storytelling -The techniques in the previous example are also used within a published IIIF Manifest to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. The `scope` property indicates to the client that the Content State provides valuable context for displaying some aspect of a Scene or other Container. In the case of a commenting annotation, this means that the Content State should be loaded when the commenting annotation is selected or otherwise highlighted. +Sometimes it is necessary to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. +A narrative might comprise a set (an AnnotationPage) of `commenting` annotations that target different parts of the Container, for example a guided tour of a painting or a map. For a Canvas or Timeline it is usually sufficient to leave the interactivity to the client; the fact that comments target different extents implies the client must offer some affordance for those comments (typically the user can click each one), and in response the client will move the current play point of the Timeline to the commenting annotation target, or pan and zoom the viewport to show the relevant part of an image. For 3D this may not be enough; a particular comment only make sense from a certain viewpoint (i.e., Camera), or different steps of the story require different Lights to be active. -Consider a Scene with two models, and two `commenting` annotations: +Consider a Scene with two models, two `commenting` annotations, and a camera. We really only want the camera to be used when the user is looking at the Mandibular tooth, by default and at other times we don't need a specific camera, we can let them explore freely. ```jsonc { @@ -1807,6 +1829,40 @@ Consider a Scene with two models, and two `commenting` annotations: // SpecificResource with PointSelector } }, + { + "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera", + "type": "Annotation", + "motivation": ["painting"], + "behavior": ["hidden"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, + "fieldOfView": 50.0, + "near": 0.10, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + }, { "id": "https://example.org/iiif/3d/anno2", "type": "Annotation", @@ -1830,7 +1886,7 @@ Consider a Scene with two models, and two `commenting` annotations: "type": "AnnotationPage", "items": [ { - "id": "https://example.org/iiif/3d/anno7", + "id": "https://example.org/iiif/3d/commenting-anno-for-mandibular-tooth", "type": "Annotation", "motivation": ["commenting"], "bodyValue": "Mandibular tooth", @@ -1839,7 +1895,7 @@ Consider a Scene with two models, and two `commenting` annotations: } }, { - "id": "https://example.org/iiif/3d/anno5", + "id": "https://example.org/iiif/3d/commenting-anno-for-right-pterygoid-hamulus", "type": "Annotation", "motivation": ["commenting"], "bodyValue": "Right pterygoid hamulus", @@ -1855,315 +1911,198 @@ Consider a Scene with two models, and two `commenting` annotations: In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. -In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. It may be useful to light the Scene differently in different contexts. - -In the same way an incoming Content State can modify a Scene as it initializes the client, so can a Content State attached to each (non-`painting`) annotation target modify the Scene as the user moves between different annotations. - -The `scope` property of an annotation `target` provides _contextual_ Content State - the viewer should modify the Scene by applying the Content State carried by the `scope` property _only when the user is in the context of that annotation_. - -Taking the first commenting annotation from the above example and adding a `scope` property, whose value is an annotation with the motivation `contentState`, we can introduce a new Camera specifically for this particular annotation, so that when the user selects this comment, the client will switch the view to this camera. This example also changes the background color of the Scene: - -```jsonc -{ - "id": "https://example.org/iiif/3d/anno7", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Mandibular tooth", - "target": { - - // SpecificResource with PointSelector - // "type": "SpecificResource", - // "source": ... the Scene... - // "selector": ... a point ... - - "scope": { // a modification to the Scene, only in the context of this annotation - - "id": "https://example.org/iiif/3d/anno4", - "type": "Annotation", - "motivation": ["contentState"], - "target": { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "backgroundColor": "yellow", - "items": [ - { - "id": "https://example.org/iiif/3d/anno8", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/3d/cameras/1", - "type": "PerspectiveCamera", - "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, - "fieldOfView": 50.0, - "near": 0.10, - "far": 2000.0 - } - ] - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.0, "y": 0.15, "z": 0.75 - } - ] - } - } - ] - } - } - } -} -``` - -In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of `scope` allows a precise storytelling experience to be specified, including: - - - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) - - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest - - hiding parts of the Scene for a step - - introducing additional models at a particular step - - (and many more!) - -Use of `scope` is permitted in annotations on any Container type, not just Scenes. For example, a 2D narrative around a Canvas might show or hide different `painting` annotations at each step. - - +In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. In this case we only want that camera to be used for looking at the Mandibular tooth. For now, it has been given the behavior `hidden`. +## Activating Annotations +Annotations with the motivation `activating` are referred to as _activating_ annotations, and are used to link a resource that triggers an action with the resource(s) to change, enable or disable. In the above case the `target` of the activating annotation could be one of the commenting annotations, for which a user might click a corresponding UI element. In other scenarios the `target` could be the painting annotation of a 3D model, or an annotation that targets part of a model, or a region of a Canvas, or a point or segment of a Timeline, or any other annotation that a user could interact with (in whatever manner) to trigger an event. The `body` of the annotation is the resource that is then activated - for example, a Camera which then becomes the active viewport. +`target` variations -## The `sequence` behavior - -// Is this right? Language... +- user "walks into a room" +- AV scrub bar reaches time t1 +- user interacts with a model +- user touches a face in a painting -While all AnnotationPage `items` are inherently ordered, an Annotation Page with the behavior `sequence` is explicitly a narrative, and clients should prevent (dissuade) users from jumping about. The presence of `sequence` affects the way a client should interpret the `reset` property described below. +We can add an additional `activating` annotation to the existing annotations, to connect them to the resources activated. -## Content States on Manifests +Activating annotations are provided in a Container's `annotations` property. They can be mixed in with the commenting (or other interactive annotations) they target, or they can be in a separate AnnotationPage. The client should evaluate all the activating annotations it can find. -When an annotation with the motivation `contentState` is provided via the `annotations` property of a Manifest, rather than contextually via `scope`, it is assumed to be generally available for selection by the user at any time. A client may present such as annotations as a menu of views, allowing arbitrary jumping into any Scene (or Canvas or Timeline) from any other point. +> recommend they are inline in the manifest? -// Is there some overlap here with Range? +> use cases for loading in new pages of annos later - activate the French translations -## Processing Content States in Scopes: reset -When a Content State is applied to a Container such as a Scene, it is assumed to be a "diff" - for example if 3 cameras and 4 lights are already present in the Scene, and a Content State asserts a single new Camera, the default behavior is to add this fourth Camera to the Scene and leave the existing resources as they are. - -The client should reset the Container to its original state before applying the diff operation. However, for narratives that cumulatively build a Scene this may lead to excessively verbose Manifests. When moving through the items of an Annotation page with the behavior `linear-nav`, the Container is not reset and the diff is cumulative; modifications from one `scope` persist into the next. This can be overridden for an individual annotation with the behavior `reset`: - -`linear-nav` does not inherit, but `reset` does. `reset` is the default behavior for AnnotationPage and Annotation. - -```json -{ - // a story, but we reset the Scene for each content state - "type": "AnnotationPage", - "behavior": ["linear-nav"], - "items": [ - - ] -} -``` - -```json +```jsonc { - // a story, but the application of content-state is cumulative - // what if you go backwards? - // What if other content states have been applied before you start the story? - // **** Is linear-nav implicitly reset on the first anno? - // Should all anno pages reset the Scene - no because I might send you a view with a content state - "type": "AnnotationPage", - "behavior": ["linear-nav", "no-reset"], // no-reset is a behavior for the annos not the page - "items": [ - + "id": "https://example.org/iiif/3d/anno9", + "type": "Annotation", + "motivation": ["activating"], + "target": [ + { + "id": "https://example.org/iiif/3d/commenting-anno-for-mandibular-tooth", + "type": "Annotation" + } + ], + "body": [ + { + "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera", + "type": "Annotation" + } ] } ``` -```jsonc -[ - { - "id": "https://.../step-1", - "type": "Annotation", - "motivation": ["contentState"] - // if you really want to ensure that any ad-hoc applied content states are wiped out, - // then put an explicit reset here. But usually, we can start the nav by applying - // the content state in the scope to the Scene without worrying that someone has - // modified the Scene already. - }, - // .... - +The pattern is similar to that for hotspot linking (ref) - { - "id": "https://.../step-20", - "type": "Annotation", - "motivation": ["contentState"] - // inherit no-reset - }, - - - { - // However, this particular step (step 37) needs to reset the Scene to the initial state. - "id": "https://.../step-37", - "type": "Annotation", - "motivation": ["contentState"], - "behavior": ["reset"] - } -] -``` +In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of activating annotations allows a precise storytelling experience to be specified, including: -behavior: `linear-nav` -- cannot jump around only one step forward/back - -client _MUST_ support forward nav and _MAY_ support backward nav - -If you go backwards from step n in a linear-nav, **and** you have applied one or more content states during the linear-nav, the client _MAY_ reset the whole Scene to default condition and then replay the linear-nav up to step n-1. (client doesn't have to maintain infinite undo history) + - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) + - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest + - hiding models in the Scene at a particular step + - showing additional models at a particular step +As in the above example, all the other annotations referred to by the activating annotations `target` and `body` properties are already present in the Scene from the beginning. Initially, many of them may have the behavior `hidden`, invisible until activated. -Before applying the content state to the Scene, the client should reset the Scene to its original state as provided by the Manifest. +The `body` is anything that is can be activated: -// I am assuming reset is always true except in `linear-nav` - otherwise it's completely unpredictable!! or is it... arbitrary navigation, state provided by initialization content states, etc... +- Camera: if "hidden" the behavior is removed, and (crucially) this Camera becomes the viewport. +- AnimationSelector: A named animation within a model is played. +- (anything else yet?) -## Contribute additional information permanently -Rerum inbox scenario - should be covered in CS2 protocol +## Showing and hiding resources -## activating - animation and interactions +An activating annotation has two additional optional properties: -Annotations with the motivation `activating` are referred to as _activating_ annotations. +* `enables`: For each annotation in the value, remove the 'hidden' behavior if it has it. +* `disables`: For each annotation in the value, add the 'hidden' behavior if it does not have it. -There are two uses of `activating` annotations: +Hidden resources cannot be active or activated. If the values are the `id` properties of painting resources that paint models, they are hidden or made visible. If Lights, they are turned on. -### Triggering a content state +### Example: a light switch -An activating annotation links a Painting Annotation to a content state. When a user interacts with the Painting Annotation - whether through clicking it, tapping it, or other client-specific behaviors - the linked content state should be processed to modify the Scene or other Container, as in the previous examples. The Painting Annotation is the target of the activating annotation, and the content state is the body value. Only one content state may be specified in the body array, but the body array may include a `TextualBody` to provide a label for the interaction. The pattern is the same as for the `linking` motivation, but rather than the client opening a new browser window on the resource specified in the `body`, it applies the modification provided by the Content State. +* Initially, a model of a light switch is painted into the Scene. A PointLight is also painted, but with the `behavior` "hidden", which means it is inactive (i.e., off). A commenting annotation with the text "Click the switch to turn the light on or off" targets the light switch. An activating annotation targets the commenting annotation, so that user interaction with the commenting annotation will trigger the activating annotation. This activating annotation has no `body`, but it does have `enables` with values that are the `id` properties of the painting annotation for the light switch model, and the activating annotation that turns the light off. It also has a `disables` with the value of its own `id` - i.e., it disables _itself_. A further activating annotation has the opposite effect. Initially this has the `behavior` "hidden" - which means it is inactive. It also targets the commenting annotation, but has no effect while hidden. +* When the user interacts with the light switch model, the client processes any activating annotations that target it and are not hidden. In this case, the first activating annotation is triggered because while both target the switch, only the first is not hidden. This activation `enables` the light (i.e., removing its "hidden" `behavior` and therefore turning it on) and the other activating annotation, and `disables` itself. +* If the user clicks the light again, the client again processes any activating annotations that target it and are not hidden. This time the second annotation is the active one - and it `disables` the light (turning it off) and itself, and enables the first activating annotation again. +* Subsequent clicks simply alternate between these two states, indefinitely. -The activating annotation is provided in a Container's `annotations` property. In this (contrived for brevity) example, if the user clicks the mandible model, the Scene background changes color: ```jsonc { - "id": "https://example.org/iiif/3d/activating.json", - "type": "Manifest", - "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/scene-with-activation", - "type": "Scene", - "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, - "items": [ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/manifest/switch", + "type": "Manifest", + "label": { "en": [ "Light switch" ] }, + "items": [ { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/painting-anno-for-mandible", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/activators", - "type": "AnnotationPage", - "items": [ + "id": "https://example.org/iiif/scene/switch/scene-1", + "type": "Scene", + "items": [ { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["activating"], - "body": [ - { - "type": "TextualBody", - "value": "A label for the activation may be provided as a TextualBody" - }, - { - // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply - "id": "https://example.org/iiif/scene1/scene-with-activation", - "type": "Scene", - "backgroundColor": "#FF99AA" - } - ], - "target": { - "id": "https://example.org/iiif/3d/painting-anno-for-mandible", - "type": "Annotation" - } + "id": "https://example.org/iiif/scene/switch/scene-1/painting-annotation-pages/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/painting-annotation/lightswitch-1", + "type": "Annotation", + "motivation": ["painting"], + "label": { + "en": ["A light switch"] + }, + "body": { + "id": "https://example.org/iiif/model/models/lightswitch.gltf", + "type": "Model" + }, + "target": "https://example.org/iiif/scene/switch/scene-1" + }, + { + "id": "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/scene/switch/scene-1/lights/4/body", + "type": "PointLight" + }, + "target": { + "type": "SpecificResource", + "source": "https://example.org/iiif/scene/switch/scene-1", + "selector": [ + { + "type": "PointSelector", + "x": 5, "y": 5, "z": 5 + } + ] + }, + "behavior": ["hidden"] + } + ] } - ] - } - ] - } - ] - } - ] -} -``` - - - -```json -{ - "items": [ - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["activating"], - "body": [ - { - "type": "TextualBody", - "value": "A label for the activation may be provided as a TextualBody" - } - ], - "target": { - "source": { - "id": "https://example.org/iiif/3d/painting-anno-for-mandible", - "type": "Annotation" - }, - "scope": { - "type": "Annotation", - "motivation": ["contentState"], - "target": { - // A body where the type is a IIIF Resource (eg Scene) is the Content State to apply - "id": "https://example.org/iiif/scene1/scene-with-activation", - "type": "Scene", - "backgroundColor": "#FF99AA" - } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene/switch/scene-1/annos/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/switch-comment-0", + "type": "Annotation", + "motivation": [ + "commenting" + ], + "body": { + "type": "TextualBody", + "value": "Click the switch to turn the light on or off" + }, + "target": "https://example.org/iiif/painting-annotation/lightswitch-1" + }, + { + "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2", + "type": "Annotation", + "motivation": [ + "activating" + ], + "target": "https://example.org/iiif/painting-annotation/lightswitch-1", + "disables": [ + "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2" + ], + "enables": [ + "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3", + "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4" + ] + }, + { + "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3", + "type": "Annotation", + "motivation": [ + "activating" + ], + "target": "https://example.org/iiif/painting-annotation/lightswitch-1", + "disables": [ + "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3", + "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4" + ], + "enables": [ + "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2" + ], + "behavior": ["hidden"] + } + ] + } + ] } - } - } - ] + ] } ``` -// Can you put activating annotations in `manifest.annotations`? They would work there too, you have all the information. - - - ### Triggering a named animation in a model -> toggles: anno supplies the label. This anno's `toggles` property lists id of an activating anno that activates the animation. - Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. -This pattern is similar to the above, except that: - - - There is no Content State in the `body`, but there _MUST_ be a TextualBody to label the interaction. (?? must?) - - The `target` selects a _named animation_ in the model. The `target` MUST be a SpecificResource, where the `source` is the Painting Annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. - - The format of the `value` string is implementation-specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. +This pattern is also achieved with activating annotations, except that the body of the activating annotation references a _named animation_ in the model. The `body` MUST be a SpecificResource, where the `source` is the Painting Annotation that paints the model, and the `selector` is of type `AnimationSelector` with the `value` being a string that corresponds to the animation in the model. +The format of the `value` string is implementation-specific, and will depend on how different 3D formats support addressing of animations within models. The same model can be painted multiple times into the scene, and you might want to activate only one model's animation, thus we need to refer to the annotation that paints the model, not the model directly. ```jsonc @@ -2200,9 +2139,9 @@ This pattern is similar to the above, except that: "type": "AnnotationPage", "items": [ { - "id": "https://example.org/iiif/3d/box-opening-activating-anno", + "id": "https://example.org/iiif/3d/box-opening-commenting-anno", "type": "Annotation", - "motivation": ["activating"], + "motivation": ["commenting"], "body": [ { "type": "TextualBody", @@ -2210,13 +2149,30 @@ This pattern is similar to the above, except that: } ], "target": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-music-box", + "type": "Annotation" + } + ] + } + { + "id": "https://example.org/iiif/3d/box-opening-activating-anno", + "type": "Annotation", + "motivation": ["activating"], + "target": [ + { + "id": "https://example.org/iiif/3d/box-opening-commenting-anno", + "type": "Annotation" + } + ], + "body": [ { "type": "SpecificResource", "source": "https://example.org/iiif/3d/painting-anno-for-music-box", "selector": [ { - "type": "AnimationSelector", - "value": "open-the-lid" + "type": "AnimationSelector", + "value": "open-the-lid" } ] } @@ -2232,38 +2188,46 @@ This pattern is similar to the above, except that: } ``` -> Toggles example -```json +### Modifying resource properties + +Many Scene interaction use cases can be accomplished using the `enables` and `disables` properties to toggle the `"behavior": ["hidden"]`, and/or using activating annotations with bodies that can be _activated_: the examples above show a Camera and then an Animation being activated. Models in the Scene can also be shown and hidden via these properties. + +> when to use enables and when to use the `body` of the activating anno - are they equivalent for, say, a hidden model: enable it, activate it - interchangeable? + +For some interactions it is necessary to do more than show or hide or "activate" resources, by changing just `"behavior": ["hidden"]`. Other properties can also be changed via the JSON Patch mechanism. + +> **This is a clear distinction like level0, level1 - a client can simply choose not to support arbitrary patching.** + +> Be clear that you still need to have all the patchable resources present from the start, you can't pull them in later. + +In the following simple example, the background color of the Scene is changed: + + +```jsonc { - "id": "https://example.org/iiif/3d/activating-animation.json", + "id": "https://example.org/iiif/3d/property-change.json", "type": "Manifest", - "label": { "en": ["Music Box with lid that opens as an internal animation"] }, + "label": { "en": ["Whale Mandible"] }, "items": [ { - "id": "https://example.org/iiif/scene1/scene-with-activation-animation", + "id": "https://example.org/iiif/scene1/scene-with-color-change", "type": "Scene", - "label": { "en": ["A Scene Containing a Music Box"] }, + "label": { "en": ["A Scene Containing a Whale Mandible"] }, "items": [ { - "id": "https://example.org/iiif/scene-with-activation-animation/page/p1/1", + "id": "https://example.org/iiif/scene1/page/p1/1", "type": "AnnotationPage", "items": [ { - "id": "https://example.org/iiif/3d/painting-anno-for-music-box", + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", "type": "Annotation", "motivation": ["painting"], "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/music-box.glb", + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", "type": "Model" }, - "target": { - // SpecificResource with PointSelector - }, - "toggles": [ - // Clicking the box opens the lid - "https://example.org/iiif/3d/activating-anno-for-music-box" - ] + "target": "https://example.org/iiif/scene1/scene-with-color-change" } ], "annotations": [ @@ -2272,77 +2236,41 @@ This pattern is similar to the above, except that: "type": "AnnotationPage", "items": [ { - "id": "https://example.org/iiif/3d/activation-labelling-anno", + "id": "https://example.org/iiif/3d/color-change-commenting-anno", "type": "Annotation", - "motivation": ["commenting-maybe"], + "motivation": ["commenting"], "body": [ { "type": "TextualBody", - "value": "Click me to open the lid of the box" + "value": "Change the background color" } ], - "toggles": [ - // clicking the 'Click me' opens the lid - "https://example.org/iiif/3d/activating-anno-for-music-box" - ], - "target": [ - "https://example.org/iiif/3d/painting-anno-for-music-box" - ] - }, - { - "id": "https://example.org/iiif/3d/activating-anno-for-music-box", - "type": "Annotation", - "motivation": ["activating"], - "body": [ + "target": [ { - "type": "TextualBody", - "value": "Click me to open the lid of the box" + "id": "https://example.org/iiif/3d/painting-anno-for-mandible", // or the Scene? + "type": "Annotation" } - ], - "target": { - "type": "SpecificResource", - "source": "https://example.org/iiif/3d/painting-anno-for-music-box", - "selector": [ - { - "type": "AnimationSelector", - "value": "open-the-lid" - } - ], - "refinedBy": [ - // fragment time selector - ] - } + ] } - ] - } - ] - } - - - - - { - "id": "https://example.org/iiif/scene1/page/activators", - "type": "AnnotationPage", - "items": [ { - "id": "https://example.org/iiif/3d/box-opening-activating-anno", + "id": "https://example.org/iiif/3d/color-change-activating-anno", "type": "Annotation", "motivation": ["activating"], - "body": [ + "target": [ { - "type": "TextualBody", - "value": "Click the box to open the lid" + "id": "https://example.org/iiif/3d/color-change-commenting-anno", + "type": "Annotation" } ], - "target": [ + "body": [ { - "type": "SpecificResource", - "source": "https://example.org/iiif/3d/painting-anno-for-music-box", - "selector": [ + "type": "JSONPatch", + "patchTarget": "https://example.org/iiif/scene1/scene-with-color-change", + "value": [ { - "type": "AnimationSelector", - "value": "open-the-lid" + "op": "replace", + "path": "/backgroundColor", + "value": "#FF99AA" } ] } @@ -2356,28 +2284,22 @@ This pattern is similar to the above, except that: } ] } - - ``` -// TODO - -activating to apply a content state and activating to trigger a named animation - use of body and target... what if we want to click a painting anno to trigger the animation? -Can we ADD that to the target, alongside the SpecificResource with the AnimationSelector? - -if the `target` is an AnimationSelector, then the `body` can ONLY be TextualBody (or list of TextualBody)? - -There is a more general rule here! - -## reset - -See above... +## The `sequence` behavior +While all AnnotationPage `items` are inherently ordered, an Annotation Page with the `behavior` "sequence" is explicitly a narrative, and clients should prevent (dissuade) users from jumping about - the annotations, and the effects of them _activating_ other contents of the Container, are intended to be experienced in order and individually. Normally, a client might display all the comments in an AnnotationPage in a sidebar so they are all visible in the UI, but for an AnnotationPage with `behavior` "sequence" only show the currently active annotation text, and next and previous UI. +## Chains of activation +Chaining together activating annotations can then allow the implementation of, at least: +* Specific camera position to look at an Annotation +* Multi-step linear stories +* Animations, including as part of stories without disrupting the flow, and looping animations (they activate themselves) +* Interactive components such as light switches (enable/disable a light), jukeboxes (enable/disable Audio Emitter) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 79858e833..a3e56086a 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1155,7 +1155,7 @@ TODO: Address https://github.com/IIIF/api/issues/2318 | `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Containers listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| | `thumbnail-nav`{: style="white-space:nowrap;"} | Valid only on Ranges. Ranges that have this behavior _MAY_ be used by the client to present an alternative navigation or overview based on thumbnails, such as regular keyframes along a timeline for a video, or sections of a long scroll. Clients _SHOULD NOT_ use them to generate a conventional table of contents. Child Ranges of a Range with this behavior _MUST_ have a suitable `thumbnail` property. Disjoint with `sequence` and `no-nav`.| | `no-nav` | Valid only on Ranges. Ranges that have this behavior _MUST NOT_ be displayed to the user in a navigation hierarchy. This allows for Ranges to be present that capture unnamed regions with no interesting content, such as the set of blank pages at the beginning of a book, or dead air between parts of a performance, that are still part of the Manifest but do not need to be navigated to directly. Disjoint with `sequence` and `thumbnail-nav`.| -| `linear-nav` | FIXME: ... | +| `linear-nav` | FIXME: Obsolete? use `sequence`, now valid for AnnotationPage as well as Range | | | **Miscellaneous Behaviors** | | `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources, Lights, Cameras and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | | `reset` | Valid on Annotations with a scope property. FIXME: ... | From ea0df9c1b2909267156224e195b0c2c96a97f96b Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 28 Oct 2025 12:11:49 +0000 Subject: [PATCH 132/192] more reorganisation of p4 intro --- source/presentation/4.0/index.md | 116 ++++++++++++++++--------------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index ca01ce798..0de2002a2 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1088,32 +1088,60 @@ Properties: [backgroundColor](#model/backgroundColor), [lookAt](#model/lookAt), ## Use Case 6: Complex Scene +Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). -**Chessboard is a Canvas with image (not a 3D chessboard)** - -A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. - -**more than one model** - -**transforms for scale and rotation** -This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). - -**Scene in Scene** +Example Annotation that positions a model at a point within a Scene: -**Exclude** +```json +{ + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/assets/model1.glb", + "type": "Model" + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": -1.0, + "y": 0.0, + "z": 1.0 + } + ] + } +} +``` -**interactionMode** +Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. +Example Annotation that comments on a 3D polygon within a Scene: +``` +Todo add example +``` +### Chessboard is a Canvas with image (not a 3D chessboard) +A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. +### More than one model +**transforms for scale and rotation** +This (no units for scale) allows arbitrarily scaled models to be used, including very small or very large, without needing to deal with very small or very large values. If there is a correspondence to a physical scale, then this can be asserted using the physical dimensions pattern(fwd-ref-to-phys-dims). -## Merge the below into the examples or into model +### Scene in Scene -As with other containers in IIIF, Annotations are used to target the Scene to place content such as 3d models into the scene. Annotations are also used to add lights and cameras. A Scene can have multiple models, lights, cameras and other resources, allowing them to be grouped together. Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. +Scenes and other IIIF containers, such as Canvases, may also be embedded within Scenes, as described below in the nesting section [fwd-ref-to-nesting]. ```json { @@ -1143,7 +1171,7 @@ A simple example painting one Scene into another: } ``` - +### More on Point and Fragment Selectors A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). @@ -1230,6 +1258,13 @@ An Annotation may target a specific point in time using a PointSelector's `insta } ``` +**Give example of refinedBy ? e.g. WktSelector + Instant** + + +### Exclude + +### Time mode + The Annotation's [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) can be used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. @@ -1238,7 +1273,15 @@ It is an error to select a temporal region of a Scene that does not have a `dura An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. -Audio and 3D +### interactionMode + + + + + + + +## Audio and 3D AmbientAudio (everywhere) @@ -1256,50 +1299,9 @@ hidden on audio = inaudible All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. -Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). - -Example Annotation that positions a model at a point within a Scene: - -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": 0.0, - "z": 1.0 - } - ] - } -} -``` - -Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. - - -Example Annotation that comments on a 3D polygon within a Scene: -``` -Todo add example -``` -## Give example of refinedBy ? e.g. WktSelector + Instant From 195ff1ed24911507d2300137fb7d533c54a29c18 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 28 Oct 2025 15:29:19 +0000 Subject: [PATCH 133/192] operationd in JSONPatch --- source/presentation/4.0/index.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 0de2002a2..94f99089a 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -2199,6 +2199,20 @@ Many Scene interaction use cases can be accomplished using the `enables` and `di For some interactions it is necessary to do more than show or hide or "activate" resources, by changing just `"behavior": ["hidden"]`. Other properties can also be changed via the JSON Patch mechanism. +```jsonc +{ + "type": "JSONPatch", + "patchTarget": "https://example.org/iiif/scene1/scene-with-color-change", // the Scene + "operations": [ + { + "op": "replace", + "path": "/backgroundColor", // path to the property being changed. + "value": "#FF99AA" + } + ] +} +``` + > **This is a clear distinction like level0, level1 - a client can simply choose not to support arbitrary patching.** > Be clear that you still need to have all the patchable resources present from the start, you can't pull them in later. @@ -2268,7 +2282,7 @@ In the following simple example, the background color of the Scene is changed: { "type": "JSONPatch", "patchTarget": "https://example.org/iiif/scene1/scene-with-color-change", - "value": [ + "operations": [ { "op": "replace", "path": "/backgroundColor", From 1a9326129d0bdece4d22c5bea964cfbc9cea2662 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 28 Oct 2025 17:14:04 +0000 Subject: [PATCH 134/192] style expt --- source/presentation/4.0/index.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 94f99089a..e080ffac2 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -35,6 +35,12 @@ hero: image: '' --- + + # Status of this Document {:.no_toc} __This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} @@ -2197,7 +2203,7 @@ Many Scene interaction use cases can be accomplished using the `enables` and `di > when to use enables and when to use the `body` of the activating anno - are they equivalent for, say, a hidden model: enable it, activate it - interchangeable? -For some interactions it is necessary to do more than show or hide or "activate" resources, by changing just `"behavior": ["hidden"]`. Other properties can also be changed via the JSON Patch mechanism. +For some interactions it is necessary to do more than show or hide or "activate" resources, by changing just `"behavior": ["hidden"]`. Other properties can also be changed via the [JSON Patch](link) mechanism. ```jsonc { From 50988fe04ff2c7e1330d11905282ae1d29f01cdf Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 28 Oct 2025 17:14:25 +0000 Subject: [PATCH 135/192] style expt --- source/presentation/4.0/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index e080ffac2..a6ddcff88 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -36,7 +36,7 @@ hero: --- From 0ccc805514b2c6c0d9864fbad967a210e86e4b6a Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 28 Oct 2025 17:20:35 +0000 Subject: [PATCH 136/192] style expt --- source/presentation/4.0/index.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index a6ddcff88..196dd13b1 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -36,9 +36,17 @@ hero: --- # Status of this Document From a182c219a773a5fab54b2df858e21af320172ff4 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Tue, 28 Oct 2025 17:27:09 +0000 Subject: [PATCH 137/192] style expt --- source/presentation/4.0/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 196dd13b1..376d6f88b 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -36,10 +36,14 @@ hero: --- + + ## Introduction {: #introduction} -The IIIF Presentation API is backed by a standards-based data model inspired by both earlier tree structured representations of cultural heritage objects, as well as linked data approaches with the same goal. It comprises four main types of resource: Structural (such as Collections, Manifests, and Ranges), Presentational Containers (Canvas, Scene and Timeline), Linking (Annotations), and Content (the images, texts, audio, video and models to be displayed). -The model intentionaly does not include any semantic or descriptive relationships or properties such as the author of a book or the place where a statue was sculpted; it is solely for presenting content in a structured fashion to human users. +The IIIF Presentation API is backed by a standards-based data model inspired by both earlier tree structured representations of cultural heritage objects, as well as linked data approaches with the same goal. It comprises four main types of resource: Structural (such as Collections, Manifests, and Ranges), Presentational Containers (Canvas, Scene and Timeline), Linking (Annotations), and Content (the images, texts, audio, video and models to be displayed). In addition to these, the model includes supporting classes such as Agents, and extensions to the standards for IIIF specific use cases, such as Transforms for manipulating 3d models within a Scene. + +The Presentation API data model intentionally does not include any semantic or descriptive relationships or properties, such as the author of a book or the place where a statue was sculpted; it is solely for presenting content in a structured fashion to human users. ### Terminology From 4b019b66b2b4782cc4dfd0b540ce8aa8d30ac42a Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Tue, 28 Oct 2025 12:46:52 -0700 Subject: [PATCH 148/192] update intro and use case list --- source/presentation/4.0/index.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 4051e38d2..3bafeb84f 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -74,25 +74,24 @@ __Previous Version:__ [3.0][prezi30] The purpose of the IIIF Presentation API specification is to provide a [model](model) and JSON serialization format of that model. -It provides a document format - the IIIF Manifest - for cultural heritage organizations (and anyone else) to present objects in a standardized, interoperable fashion. This allows compatible software such as viewers and annotation tools to load and present complex digital objects on the web from thousands of different providers. +It provides a document format---the IIIF Manifest---for cultural heritage organizations (and anyone else) to present objects in a standardized, interoperable way. This allows compatible software such as viewers and annotation tools to load and present complex digital objects on the web from thousands of different providers. **If you have existing images, audio, video and models on the web, you can easily provide IIIF Manifests for them by publishing the appropriate JSON documents.** -The IIIF Presentation API is concerned with enabling user experiences - providing enough information to present objects in compatible software, and leaving the meaning of the objects to external descriptive metadata standards. +The IIIF Presentation API is concerned with enabling user experiences---providing enough information to present objects in compatible software, and leaving the meaning of the objects to external descriptive metadata standards. -This document acts as an introduction to the specification through a set of typical (but non-exhaustive) use cases. The model [model](model) document provides the formal specification of the terms used in this introduction. +This document acts as an introduction to the specification through a set of typical (but non-exhaustive) use cases. The [Presentation API 4.0 Properties](model) document provides the formal specification of the model and terms used in this introduction. ## IIIF Use cases 1. **Artwork** - a Manifest that represents a painting, comprising a single image and accompanying display information. 2. **Book** - a Manifest that represents a digitized bound volume made up many separate images in order. The IIIF model provides structural elements to indicate the chapters. The text of the book is made available in machine-readable form as Web Annotations. -3. **45 Single** - a Manifest that represents the digitized audio from the two sides of a vinyl 7 inch record. -4. **Movie** - a Manifest that represents the digitized video of a film. A transcript of the audio is provided as Web Annotations, and additional machine-readable files provide subtitles and captions. -5. **Simple 3D Model** - a Manifest that publishes a single 3D model. -6. **Complex Scene** - a Manifest that publishes a complex 3D scene comprising multiple models, lights and cameras. -7. **Periodical** - a IIIF Collection that provides multiple child Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements. +3. **Periodical** - a IIIF Collection that provides multiple child Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements. +4. **45 Single** - a Manifest that represents the digitized audio from the two sides of a vinyl 7 inch record. +5. **Movie** - a Manifest that represents the digitized video of a film. A transcript of the audio is provided as Web Annotations, and additional machine-readable files provide subtitles and captions. +6. **Simple 3D Model** - a Manifest that publishes a single 3D model. +7. **Complex Scene** - a Manifest that publishes a complex 3D scene comprising multiple models, lights and cameras. 8. **Storytelling in 3D** - a Manifest that defines a sequence of states in a complex scene for the purposes of guiding a user through a particular experience. -9. **Manuscript** - (integration) These use case were chosen as a broad sample to introduce IIIF concepts. Many more use cases are provided as recipes in the [IIIF Cookbook](link). From c7ad79b3de2d25e13009c1121093700abcb7d76f Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Tue, 28 Oct 2025 15:36:21 -0500 Subject: [PATCH 149/192] Add use case for complex 3D scene 1 --- source/presentation/4.0/index.md | 192 +++++++++++++++++++++++++++---- 1 file changed, 167 insertions(+), 25 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 634925340..44a78c053 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -49,8 +49,8 @@ pre.highlight code { font-size:1.4rem } -.highlight .s2 { - color: #a0f0f0 +.highlight .s2 { + color: #a0f0f0 } @@ -660,12 +660,12 @@ IIIF Collection with `behavior` "multi-part" that contains the individual "multi { "id": "https://example.org/iiif/periodical/multi-part-collection/v1.json", "type": "Collection", - "label": { "en": [ "The Tombstone Epitaph, 1880" ] } + "label": { "en": [ "The Tombstone Epitaph, 1880" ] } }, { "id": "https://example.org/iiif/periodical/multi-part-collection/v2.json", "type": "Collection", - "label": { "en": [ "The Tombstone Epitaph, 1881" ] } + "label": { "en": [ "The Tombstone Epitaph, 1881" ] } }, // Additional multi-part collections for each year/volume ] @@ -788,7 +788,7 @@ Manifest for the October 27, 1881 issue, with Ranges for table of contents. > **Key Points** -* +* {: .note} __Definitions__
@@ -905,7 +905,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "type": "AnnotationPage", } ] -} +} ``` @@ -929,7 +929,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora "target": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#t=3.5,6.8" } ], - // (annotations for the rest of the song lines) + // (annotations for the rest of the song lines) } ``` @@ -1088,7 +1088,7 @@ The positive y axis points upwards, the positive x axis points to the right, and ## 3D Supporting Resources -Constructs from the domain of 3D graphics are expressed in IIIF as Resources. They are associated with Scenes via Painting Annotations in the same manner as Content Resources. They aid in or enhance the rendering of Content Resources, especially in Scenes. +Constructs from the domain of 3D graphics are expressed in IIIF as Resources. They are associated with Scenes via Painting Annotations in the same manner as Content Resources. They aid in or enhance the rendering of Content Resources, especially in Scenes. ### Cameras @@ -1166,7 +1166,7 @@ This example is a Manifest with a single Scene, with a single model of a space s ## Use Case 5a: Simple 3D Model in Configured Scene -This example adds a Light and a Camera to the previous example, and places the model at a specific point rather than at the default origin position. +This example adds a Light and a Camera to the previous example, and places the model at a specific point rather than at the default origin position. Annotations may use a type of Selector called a `PointSelector` to align the Annotation to a point within the Scene that is not the Scene's origin. PointSelectors have three spatial properties, `x`, `y` and `z` which give the value on that axis. They also have a temporal property `instant` which can be used if the Scene has a duration, which gives the temporal point in seconds from the start of the duration, the use of which is defined in the [section on Scenes with Durations](). @@ -1219,7 +1219,7 @@ The Light is green and has a position, but has its default orientation of lookin } ] } - }, + }, { "id": "https://example.org/iiif/3d/anno2", "type": "Annotation", @@ -1303,25 +1303,167 @@ Properties: [backgroundColor](#model/backgroundColor), [lookAt](#model/lookAt), ## Use Case 6: Complex Scene -Example Annotation that comments on a 3D polygon within a Scene: +This example is a Manifest with a single Scene with multiple models painted into the Scene at specific positions with transforms applied. It represents a collection of chess game pieces with multiple pawns and a single queen. The example demonstrates painting multiple models into a Scene, including one Content Resource being painted into a Scene multiple times. Transforms and Point Selectors are used to establish position and scale for Annotations. Some external web resources referenced as Content Resources may include elements such as lights or audio that are undesirable within a Manifest, and the `exclude` property is used to prevent these from being rendered. The property `interactionMode` is used to guide clients in how to best guide or limit user interaction with rendered content. +```jsonc +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/3d/model_origin.json", + "type": "Manifest", + "label": { "en": ["Use Case 6: Complex Scene"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["Chess Game Pieces"] }, + "interactionMode": ["hemisphere-orbit"], + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/pawn.glb", + "label": {"en": ["Pawn 1"]}, + "type": "Model", + "format": "model/gltf-binary" + }, + "target": { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + ] + } + }, + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/pawn.glb", + "label": {"en": ["Pawn 2 tipped over"]}, + "type": "Model", + "format": "model/gltf-binary" + } + ], + "transform": [ + { + "type": "RotateTransform", + "x": 0.0, + "y": 0.0, + "z": -90.0 + }, + { + "type": "Translate Transform", + "x": 0.0, + "y": 1.0, + "z": 0.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": 2.0, + "y": 0.0, + "z": 3.0 + } + ] + } + }, + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "exclude": ["Audio", "Lights"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/queen.glb", + "label": {"en": ["Queen"]}, + "type": "Model", + "format": "model/gltf-binary" + } + ], + "transform": [ + { + "type": "ScaleTransform", + "x": 1.5, + "y": 1.5, + "z": 1.5 + }, + ] + }, + "target": { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": 1.0, + "y": 0.0, + "z": 2.0 + } + ] + } + } + ] + } + ] + } + ] +} ``` -Todo add example -``` - -### Chessboard is a Canvas with image (not a 3D chessboard) -A Scene or a Canvas may be treated as a content resource, referenced or described within the `body` of an Annotation. As with models and other resources, the Annotation is associated with a Scene into which the Scene or Canvas is to be nested through an Annotation `target`. The content resource Scene will be placed within the `target` Scene by aligning the coordinate origins of the two scenes. Alternately, Scene Annotations may use `PointSelector` to place the origin of the resource Scene at a specified coordinate within the `target` Scene. +> +**Key Points** +* Each Annotation is painted into the Scene at a different point via Point Selectors. +* The second Annotation represents a pawn game piece that is tipped over, and Transforms are used to achieve this. RotateTransform is used to tip the pawn over and TranslateTransform is used to align the bottom of the pawn with the coordinate origin's XY plane. +* The third Annotation represents a queen game piece that is scaled to be larger than the pawns using ScaleTransform. +* The `exclude` property instructs clients not to import or render any external audio or light content present in the Content Resource for the queen game piece. +* The `interactionMode` property instructs clients that, if possible, user interactions relating to orbiting the scene should be restricted to a hemisphere. +{: .note} -### More than one model +__Definitions__
+Classes: [Manifest](#model/Manifest), [Scene](#model/Scene), [Model](#model/Model), [SpecificResource](#model/SpecificResource), [PointSelector](#model/PointSelector), [RotateTransform](#model/RotateTransform), [TranslateTransform](#model/TranslateTransform), [ScaleTransform](#model/ScaleTransform)

+Properties: [exclude](#model/exclude), [interactionMode](#model/interactionMode) +{: .note} -### Transforms for scale and rotation + ## Use Case 7: Another Complex Scene @@ -1472,7 +1614,7 @@ A Canvas in a Scene has a specific forward face and a backward face. By default, A `PointSelector` can be used to modify the point at which the Canvas will be painted, by establishing a new point to align with the top-left corner of the Canvas instead of the Scene coordinate origin. Transforms can also be used to modify Canvas rotation, scale, or translation. - + ## Annotation Collection -deal with this: (use in example) -https://github.com/IIIF/api/pull/2304/files#diff-cc70f02818f6bed2b14dfbf8bf3206e0825047951c8e83ad56fc73e489f82ac4R1757 +Annotation Collections represent groupings of Annotation Pages that should be managed as a single whole, regardless of which Container or resource they target. This allows, for example, all of the Annotations that make up a particular translation of the text of a book to be collected together. A client might then present a user interface that allows all of the Annotations in an Annotation Collection to be displayed or hidden according to the user’s preference. -use totalItems? https://iiif.io/api/discovery/1.0/#totalitems +For Annotation Collections with many Annotations, there will be many pages. The Annotation Collection refers to the first and last page, and then the pages refer to the previous and next pages in the ordered list. Each page is part of the Annotation Collection. +```json +{ + "id": "https://example.org/iiif/book1/annocoll/transcription", + "type": "AnnotationCollection", + "label": {"en": ["Diplomatic Transcription"]}, + "total": 112, + "first": { "id": "https://example.org/iiif/book1/annopage/l1", "type": "AnnotationPage" }, + "last": { "id": "https://example.org/iiif/book1/annopage/l112", "type": "AnnotationPage" } +} +``` +```jsonc +{ + "id": "https://example.org/iiif/book1/annopage/l2", + "type": "AnnotationPage", + "prev": "https://example.org/iiif/book1/annopage/l1", + "next": "https://example.org/iiif/book1/annopage/l3", + "items": [ + { + "id": "https://example.org/iiif/book1/annopage/l2/a1", + "type": "Annotation" + // ... + }, + { + "id": "https://example.org/iiif/book1/annopage/l2/a2", + "type": "Annotation" + // ... + } + ], + "partOf": { + "id": "https://example.org/iiif/book1/annocoll/transcription", + "type": "AnnotationCollection", + } +} +``` + ## Comment Annotations -> (examples are just the anno) +Commentary can be associated with a Timeline, Canvas, or Scene via Annotations with a `commenting` motivation. ### A comment about a segment of music -(targets Timeline) -"Here begins the development of the second theme" + + +This is an example of a commenting annotation that targets two-minute segment of a muscial performance. + +```json +{ + "id": "https://example.org/iiif/presentation/examples/commenting/anno/1", + "type": "Annotation", + "motivation": "commenting", + "body": { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/1/theme2", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "The second theme of the concerto is introduced." + }, + "target": "https://example.org/iiif/presentation/examples/commenting/timeline/t1#t=38.0,158.0" + } +``` + ### A comment about a face in a painting From c0f8b5b249319e4fdfab23fe81f5df757c6a88cd Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Tue, 28 Oct 2025 17:29:05 -0400 Subject: [PATCH 151/192] next draft --- source/presentation/4.0/index.md | 48 ++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index ce4202057..5a256c597 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1583,10 +1583,12 @@ For Annotation Collections with many Annotations, there will be many pages. The // ... } ], - "partOf": { - "id": "https://example.org/iiif/book1/annocoll/transcription", - "type": "AnnotationCollection", - } + "partOf": [ + { + "id": "https://example.org/iiif/book1/annocoll/transcription", + "type": "AnnotationCollection", + } + ] } ``` @@ -1621,18 +1623,40 @@ This is an example of a commenting annotation that targets two-minute segment of } ``` - ### A comment about a face in a painting -(is this a full use case?) - -(targets Canvas) -"This might be so-and-so" +A comment on a Canvas can target a non-rectangular area. This example uses a `SvgSelector` to comment on a painting. -(Uses Non Rectangular Segments - SvgSelector) - -Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region with the Scene that is not the Scene's origin. WktSelectors have a single property, `value`, which is a string conforming to a WKT Linestring, LineStringZ, Polygon, or PolygonZ list of 2D or 3D coordinate points. Whether and how a region defined by a WktSelector may be translated to a single 2D or 3D coordinate point, for targeting or other purposes, is client-dependent. +```json +{ + "id": "https://example.org/iiif/presentation/examples/commenting/anno/2", + "type": "Annotation", + "motivation": "commenting", + "body": { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/2/person2", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "Note the expressive eyes of the subject of this painting." + }, + "target": { + "type": "SpecificResource", + "source": { + "id": "https://example.org/iiif/presentation/examples/commenting/canvas/2", + "type": "Canvas" + }, + "selector": [ + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno2/selector2", + "type": "SvgSelector", + "value": " ... " + } + ] + } +} +``` +Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region within a Canvas or Scene. ### A comment about something in a Model From dc416a171e241999e5e693dde5ba261d28c0a0ad Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Tue, 28 Oct 2025 17:36:29 -0400 Subject: [PATCH 152/192] fix spaces, minor edit --- source/presentation/4.0/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 5a256c597..7fcf13efb 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1542,10 +1542,10 @@ Manifest ## Annotation Page -Annotation Pages are used to group Annotations. In cases where many annotations are present, such as when transcription, translation, and commentary are associated with a manuscript, it can be useful to separate these annotations into groups that may facilitate improved user interactions in a client. - -Each Annotation Page can be embedded or externally referenced. Clients should process the Annotation Pages and their items in the order given in the Container. Publishers may choose to expedite the processing of embedded Annotation Pages by ordering them before external pages, which will need to be dereferenced by the client. Order can be significant, however. Painting annotations are assigned an ascending [z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) from the first painting annotation encountered. Annotations with a higher z-index will render in front of those with a lower z-index when displayed on a Canvas. +Annotation Pages are used to group Annotations. In cases where many annotations are present, such as when transcription, translation, and commentary are associated with a manuscript, it can be useful to separate these annotations into groups that can facilitate improved user interactions in a client. +Each Annotation Page can be embedded or externally referenced. Clients should process the Annotation Pages and their items in the order given in the Container. Publishers may choose to expedite the processing of embedded Annotation Pages by ordering them before external pages, which will need to be dereferenced by the client. Order can be significant, however. Painting annotations are assigned an ascending [z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) from the first painting annotation encountered. Annotations with a higher z-index will render in front of those with a lower z-index when displayed on a Canvas. + ## Annotation Collection @@ -1599,13 +1599,13 @@ https://github.com/IIIF/api/issues/2118 ## Comment Annotations -Commentary can be associated with a Timeline, Canvas, or Scene via Annotations with a `commenting` motivation. +Commentary can be associated with a Timeline, Canvas, or Scene via Annotations with a `commenting` motivation. ### A comment about a segment of music -This is an example of a commenting annotation that targets two-minute segment of a muscial performance. +This is an example of a commenting annotation that targets two-minute segment of a muscial performance. ```json { @@ -1656,7 +1656,7 @@ A comment on a Canvas can target a non-rectangular area. This example uses a `S } ``` -Annotations may alternately use a type of Selector called a `WktSelector` to align the Annotation to a region within a Canvas or Scene. +Annotations may alternately use a different type of Selector, called a `WktSelector`, to align the Annotation to a target region within a Canvas or Scene. ### A comment about something in a Model From 6cce0ed5c72b93850dd4714e7ce1488b8af48a8c Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Tue, 28 Oct 2025 17:42:07 -0400 Subject: [PATCH 153/192] Clarify question --- source/presentation/4.0/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 7fcf13efb..1294e1b25 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1545,7 +1545,7 @@ Manifest Annotation Pages are used to group Annotations. In cases where many annotations are present, such as when transcription, translation, and commentary are associated with a manuscript, it can be useful to separate these annotations into groups that can facilitate improved user interactions in a client. Each Annotation Page can be embedded or externally referenced. Clients should process the Annotation Pages and their items in the order given in the Container. Publishers may choose to expedite the processing of embedded Annotation Pages by ordering them before external pages, which will need to be dereferenced by the client. Order can be significant, however. Painting annotations are assigned an ascending [z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) from the first painting annotation encountered. Annotations with a higher z-index will render in front of those with a lower z-index when displayed on a Canvas. - + ## Annotation Collection From f01510af439209d433e6a33f10ea33fb3ba30043 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 28 Oct 2025 17:47:03 -0400 Subject: [PATCH 154/192] Updates --- source/presentation/4.0/model.md | 204 +++++++++++++++++++++++++------ 1 file changed, 164 insertions(+), 40 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 088b24ae3..e99f8abaa 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -84,7 +84,7 @@ The Presentation API data model intentionally does not include any semantic or d ## Technical Considerations {: #json-considerations} -This section describes features applicable to all of the Presentation API content. +This section describes features applicable to all of the classes, properties and affordances of the Presentation API. ### Terminology {: #terminology} @@ -178,7 +178,7 @@ Clients _SHOULD_ allow only `a`, `b`, `br`, `div`, `i`, `img`, `p`, `small`, `sp { "summary": { "en": [ "

Short summary of the resource.

" ] } } ``` -### JSON Description Availability +### Resource Availability on the Web JSON descriptions _SHOULD_ be embedded within the JSON of parent resources, and _MAY_ also be available via separate requests from the HTTP(S) URI given in the resource's `id` property. Links to Content Resources _MUST_ be given as a JSON object with the `id` and `type` properties and _SHOULD_ have `format` or `profile` to give a hint as to what sort of resource is being referred to. @@ -203,7 +203,7 @@ The following sub-sections define the classes used in the IIIF Presentation Data The name of each class is given at the top of its definition below. The exact string _MUST_ be used as the value of `type` in the JSON for the class. __Properties__
-All resources _MUST_ have the following properties: [id](#id), and [type](#type). +All resources _MUST_ have the following property: [type](#type). {: .note} ### Collection @@ -399,9 +399,9 @@ A Specific Resource is a resource in the context of an Annotation. They are used A Specific Resource _MUST_ have an HTTP(S) URI given in `id`. This allows for it to be addressed by other parts of the model, such as Content State Annotations. __Properties__
-A Specific Resource _MUST_ have the following properties: [type](#type), [source](#source)

+A Specific Resource _MUST_ have the following properties: [id](#id), [type](#type), [source](#source)

A Specific Resource _SHOULD_ have the following properties: [selector](#selector)

-A Specific Resource _MAY_ have the following properties: [id](#id), [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

+A Specific Resource _MAY_ have the following properties: [position](#position), [transform](#transform), [scope](#scope), [styleClass](#styleClass), [height](#height), [width](#width), [duration](#duration), [language](#language), [label](#label), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

{: .note} #### Textual Body @@ -496,10 +496,10 @@ A Point Selector _MAY_ have the following properties: [id](#id), [x](#x), [y](#y Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MULTIPOLYGON. Additional types, such as CIRCULARSTRING may also be supported. -The text representation is given in the `value` property of the selector. +The text representation is given in the `wktLiteral` property of the selector. __Properties__
-A WKT Selector _MUST_ have the following properties: [type](#type), and [value](#value).

+A WKT Selector _MUST_ have the following properties: [type](#type), and [wktLiteral](#wktLiteral).

A WKT Selector _MAY_ have the following properties: [id](#id) {: .note} @@ -507,7 +507,7 @@ A WKT Selector _MAY_ have the following properties: [id](#id) { "id": "https://example.org/selectors/2", "type": "WktSelector", - "value": "POLYGON Z (0 0 0, 10 0.5 3.2 10 5.0 0, 0 0 0)" + "wktLiteral": "POLYGON Z (0 0 0, 10 0.5 3.2 10 5.0 0, 0 0 0)" } ``` @@ -585,7 +585,10 @@ The Image API Selector has properties following the parameters from the API, and | rotation | "0" | The string to put in the rotation parameter of the URI. Note that this must be a string in order to allow mirroring, for example "!90". | | quality | "default" | The string to put in the quality parameter of the URI. | | format | "jpg" | The string to put in the format parameter of the URI. Note that the '.' character is not part of the format, just the URI syntax. | + + __Properties__
A IIIF Image API Selector _MUST_ have the following properties: [type](#type).

@@ -1082,7 +1085,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 90, and ### annotations {: #annotations} -An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Canvas. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource or part of it. +An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Container. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource, part of it. or some resource within its `items` hierarchy. The value _MUST_ be an array of JSON objects. Each item _MUST_ have at least the `id` and `type` properties. @@ -1151,8 +1154,6 @@ The value _MUST_ be an array of strings. Clients _SHOULD_ process `behavior` on any resource type. -!!! Could continuous stitch together Timelines? - TODO: Address https://github.com/IIIF/api/issues/2318 | Value | Description | @@ -1191,11 +1192,41 @@ TODO: Address https://github.com/IIIF/api/issues/2318 ### body {: #body} +The list of bodies of an Annotation. As there _MAY_ be more than one body, the value _MUST_ be an array, even though the W3C specification does not require this. The resources listed in `body` can be instances of `TextualBody`, `SpecificResource`, core Structural Resources, or Content Resources. + +Some Annotations do not have bodies at all. For example a highlighting annotation only needs to visually highlight the region targeted. Note that use of the W3C `bodyValue` property is prohibited in IIIF, and the `TextualBody` class _MUST_ be used instead. + +For more information about Annotation bodies, see the [W3C Annotation Model](https://www.w3.org/TR/annotation-model/#bodies-and-targets). +The value _MUST_ be an array of JSON objects. + +* An Annotation _SHOULD_ have the `body` property.
+ Clients _MUST_ process the `body` property on Annotations. + +{% include api/code_header.html %} +``` json-doc +{ "body": [ {"type": "TextualBody", "value": "Great!"} ] } +``` ### canonical {: #canonical} +The URI that SHOULD be used to track the resource's identity, regardless of where it is made accessible or its `id` property. The canonical URI can then be used as the target for annotations, regardless of the URI from which it was retrieved. If this property is set, then clients _MUST NOT_ change or delete it. Clients _MUST NOT_ assign a canonical URI if one is not present, as the resource might already have one assigned by a different system but it was not included in the representation received. Any reference to the `canonical` URI _MUST_ be treated as a reference to this resource. + +As the W3C model allows the property to be used on bodies and targets, and any resource _MAY_ be a body or target of an Annotation, this property _MAY_ be used on any resource in the IIIF specifications. + +For more information about `canonical`, see the [W3C Annotation Model](https://www.w3.org/TR/annotation-model/#other-identities). + +The value _MUST_ be a string, and the value must be an absolute HTTP(S) URI. + +* Any resource _MAY_ have the `canonical` property. + Clients _MAY_ process the `canonical` property on any resource. + +{% include api/code_header.html %} +``` json-doc +{ "canonical": "https://example.org/annotations/123569" } +``` + ### color {: #color} @@ -1298,12 +1329,14 @@ The value _MUST_ be a positive integer. ### first {: #first} -This property references the first Annotation Page within an Annotation Collection. +This property references the first Annotation Page within an Annotation Collection, or the first CollectionPage within a Collection. Note that Collections will only have the `first` property if there is a large number of items, more than could conveniently be included in a single page. -The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _MUST_ be the HTTP(S) URI of the referenced Annotation Page. The value of `type` _MUST_ be `AnnotationPage`. +The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _MUST_ be the HTTP(S) URI of the referenced Annotation or Collection Page. The value of `type` _MUST_ be `AnnotationPage` or `CollectionPage`. * A non-empty AnnotationCollection _MUST_ have the `first` property.
Clients _MUST_ process the `first` property on an AnnotationCollection. +* A non-empty Collection _MAY_ have the `first` property.
+ Clients _MUST_ process the `first` property on a Collection. {% include api/code_header.html %} ``` json-doc @@ -1319,21 +1352,33 @@ The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _M ### format {: #format} -The specific media type (often called a MIME type) for a content resource, for example `image/jpeg`. This is important for distinguishing different formats of the same overall type of resource, such as distinguishing text in XML from plain text. +For Content resources, the `format` property records the specific media type (often called a MIME type) for a content resource, for example `image/jpeg`. This is important for distinguishing different formats of the same overall type of resource, such as distinguishing text in XML from plain text. The value of the property should thus be the same as the value of the `Content-Type` header returned when the URI of the Content Resource is dereferenced. -Note that this is different to the `formats` property in the [Image API][image-api], which gives the extension to use within that API. It would be inappropriate to use in this case, as `format` can be used with any content resource, not just images. +For the IIIF Image API Selector class however, the value of `format` is the parameter to use in the Image API URL construction, and thus to request a jpeg image, the value would be `jpg` instead. -The value _MUST_ be a string, and it _SHOULD_ be the value of the `Content-Type` header returned when the resource is dereferenced. +The value _MUST_ be a string, and _SHOULD_ either be a valid media type or an image extension format valid for the IIIF Image Api. * A content resource _SHOULD_ have the `format` property.
Clients _MAY_ render the `format` of any content resource. + * A IIIF Image API Selector class _SHOULD_ have the `format` property.
+ Clients _MUST_ process the `format` property on a IIIF Image API Selector. * Other types of resource _MUST NOT_ have the `format` property.
Clients _SHOULD_ ignore `format` on other types of resource. + +For a Content Resource: {% include api/code_header.html %} ``` json-doc { "format": "application/xml" } ``` + +For a IIIF Image API Selector: +{% include api/code_header.html %} +``` json-doc +{ "format": "jpg" } +``` + + ### height {: #height} @@ -1360,7 +1405,7 @@ A web page that is about the object represented by the resource that has the `ho The value of this property _MUST_ be an array of JSON objects, each of which _MUST_ have the `id`, `type`, and `label` properties, _SHOULD_ have a `format` property, and _MAY_ have the `language` property. * Any resource type _MAY_ have the `homepage` property.
- Clients _SHOULD_ render `homepage` on a Collection, Manifest or Canvas, and _MAY_ render `homepage` on other types of resource. + Clients _SHOULD_ render `homepage` on a Collection, Manifest or Container, and _MAY_ render `homepage` on other types of resource. __Model Alignment__
Please note that this specification has stricter requirements about the JSON pattern used for the `homepage` property than the [Web Annotation Data Model][org-w3c-webanno]. The IIIF requirements are compatible, but the home page of an Agent found might have only a URI, or might be a JSON object with other properties. See the section on [collisions between contexts][prezi30-context-collisions] for more information. @@ -1384,7 +1429,7 @@ Please note that this specification has stricter requirements about the JSON pat ### id {: #id} -The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Canvases, which _MUST_ have their own URI without a fragment. +The URI that identifies the resource. If the resource is only available embedded within another resource (see the [terminology section][prezi30-terminology] for an explanation of "embedded"), such as a Range within a Manifest, then the URI _MAY_ be the URI of the embedding resource with a unique fragment on the end. This is not true for Containers, which _MUST_ have their own URI without a fragment. The value _MUST_ be a string, and the value _MUST_ be an absolute HTTP(S) URI for resource classes defined or described in this specification. If the resource is retrievable via HTTP(S), then the URI _MUST_ be the URI at which it is published. External resources, such as profiles, _MAY_ have non-HTTP(S) URIs defined by other communities. @@ -1393,7 +1438,7 @@ The existence of an HTTP(S) URI in the `id` property does not mean that the URI If a publisher wishes for a resource be able to be referenced, such as in an Annotation, then the resource _MUST_ have an `id` property. * Collections, Collection Pages, Manifests, Timelines, Canvases, Scenes, Annotations, Annotation Pages, Annotation Collections, Ranges, Content Resources, and Services _MUST_ have the `id` property.
- Clients _MAY_ render `id` on any resource type, and _SHOULD_ render `id` on Collections, Manifests and Canvases. + Clients _MAY_ render `id` on any resource type, and _SHOULD_ render `id` on Collections, Manifests and Containers. * All other resources _MAY_ have the `id` property.
Clients _MAY_ render `id` on any resource type. @@ -1479,10 +1524,10 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and * A Collection _MUST_ have the `items` property. Each item _MUST_ be either a Collection or a Manifest.
Clients _MUST_ process `items` on a Collection. - * A Manifest _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Canvas.
+ * A Manifest _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Container.
Clients _MUST_ process `items` on a Manifest. - * A Canvas _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation Page.
- Clients _MUST_ process `items` on a Canvas. + * A Container _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation Page.
+ Clients _MUST_ process `items` on a Container. * An Annotation Page _SHOULD_ have the `items` property with at least one item. Each item _MUST_ be an Annotation.
Clients _MUST_ process `items` on an Annotation Page. * A Range _MUST_ have the `items` property with at least one item. Each item _MUST_ be a Range, a Canvas or a Specific Resource where the source is a Canvas.
@@ -1552,12 +1597,14 @@ The value _MUST_ be an array of strings. Each item in the array _MUST_ be a vali ### last {: #last} -This property references the last Annotation Page within an Annotation Collection. +This property references the last Annotation Page within an Annotation Collection, or last Collection Page within a Collection. -The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _MUST_ be the HTTP(S) URI of the referenced Annotation Page. The value of `type` _MUST_ be `AnnotationPage`. +The value _MUST_ be a JSON object with `id` and `type` properties. The `id` _MUST_ be the HTTP(S) URI of the referenced Annotation or Collection Page. The value of `type` _MUST_ be `AnnotationPage` or `CollectionPage`. * A non-empty AnnotationCollection _SHOULD_ have the `last` property.
Clients _SHOULD_ process the `last` property on an AnnotationCollection. +* A non-empty Collection _MAY_ have the `last` property.
+ Clients _MAY_ process the `last` property on a Collection. {% include api/code_header.html %} ``` json-doc @@ -1741,12 +1788,12 @@ The value is a non-negative floating point number, in the coordinate space of th ### next {: #next} -A reference from an Annotation Page to the following Annotation Page within an Annotation Collection. +A reference from an Annotation Page to the following Annotation Page within an Annotation Collection, or from a Collection Page to the following Collection Page. -The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the following Annotation Page. The value of the `type` property must be the string `AnnotationPage`. +The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the following Annotation or Collection Page. The value of the `type` property must be the string `AnnotationPage` or `CollectionPage`. -* An AnnotationPage _MUST_ have the `next` property, unless it is the last page in the AnnotationCollection.
- Clients _MUST_ processs the `next` property on an AnnotationPage. +* An AnnotationPage _MUST_ have the `next` property, unless it is the last page in the AnnotationCollection or Collection.
+ Clients _MUST_ processs the `next` property on an AnnotationPage or CollectionPage. {% include api/code_header.html %} ``` json-doc @@ -1839,12 +1886,14 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe ### prev {: #prev} -A reference from an Annotation Page to the preceding Annotation Page within an Annotation Collection. +A reference from an Annotation Page to the preceding Annotation Page within an Annotation Collection, or from a Collection Page to the preceding Collection Page. -The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the preceding Annotation Page. The value of the `type` property must be the string `AnnotationPage`. +The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the preceding Annotation or Collection Page. The value of the `type` property must be the string `AnnotationPage` or `CollectionPage`. * An AnnotationPage _SHOULD_ have the `prev` property, unless it is the first page in the AnnotationCollection.
Clients _SHOULD_ processs the `prev` property on an AnnotationPage. +* A CollectionPage _SHOULD_ have the `prev` property, unless it is the first page in the Collection.
+ Clients _SHOULD_ processs the `prev` property on a CollectionPage. {% include api/code_header.html %} ``` json-doc @@ -1872,6 +1921,7 @@ The value _MUST_ be a string, either taken from the [profiles registry][registry ``` json-doc { "profile": "https://example.org/profile/statuary" } ``` + ### provider {: #provider} @@ -1965,6 +2015,38 @@ Note that the majority of the values have been selected from [accessibility feat { "provides": [ "closedCaption" ] } ``` +### quality +{: #quality} + +The value of the quality parameter in the IIIF Image API URL structure, as recorded in an Image API Selector. + +* The IIIF Image API Selector _MAY_ have the `quality` property with exactly one value.
+ Clients _MUST_ process the `quality` property on a IIIF Image API Selector. +* Other types of resource _MUST NOT_ have the `quality` property.
+ Clients _MUST_ ignore the `quality` property on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "quality": "default" } +``` + + +### region +{: #region} + +The value of the region parameter in the IIIF Image API URL structure, as recorded in an Image API Selector. + +* The IIIF Image API Selector _MAY_ have the `region` property with exactly one value.
+ Clients _MUST_ process the `region` property on a IIIF Image API Selector. +* Other types of resource _MUST NOT_ have the `region` property.
+ Clients _MUST_ ignore the `region` property on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "region": "full" } +``` + + ### rendering {: #rendering} @@ -2030,6 +2112,22 @@ __Machine actionable URIs and links for users__
The machine actionable URIs for both Creative Commons licenses and RightsStatements.org right statements are `http` URIs. In both cases, human readable descriptions are available from equivalent `https` URIs. Clients may wish to rewrite links presented to users to use these equivalent `https` URIs. {: .note} + +### rotation +{: #rotation} + +The value of the rotation parameter in the IIIF Image API URL structure, as recorded in an Image API Selector. Note well that the value _MUST_ be a string, not a number, in order to allow for the "!" character which indicates a mirror image. + +* The IIIF Image API Selector _MAY_ have the `rotation` property with exactly one value.
+ Clients _MUST_ process the `rotation` property on a IIIF Image API Selector. +* Other types of resource _MUST NOT_ have the `rotation` property.
+ Clients _MUST_ ignore the `rotation` property on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "rotation": "0" } +``` + ### seeAlso {: #seeAlso} @@ -2146,14 +2244,33 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re } ``` +### size +{: #size} + +The value of the size parameter in the IIIF Image API URL structure, as recorded in an Image API Selector. + +* The IIIF Image API Selector _MAY_ have the `size` property with exactly one value.
+ Clients _MUST_ process the `size` property on a IIIF Image API Selector. +* Other types of resource _MUST NOT_ have the `size` property.
+ Clients _MUST_ ignore the `size` property on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "size": "max" } +``` + ### source {: #source} +SpecificResource + +FIXME: import from WADM + ### spatialScale {: #spatialScale} -A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `value` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. +A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `quantity` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. To assert a `spatialScale` for a Content Resource, the resource _MUST_ first be painted into a Container and the `spatialScale` is asserted on that Container. For example, a 3d model would be painted into a Scene, and then `spatialScale` is asserted on the Scene. @@ -2163,7 +2280,7 @@ To assert a `spatialScale` for a Content Resource, the resource _MUST_ first be "type": "Scene", "spatialScale": { "type": "UnitValue", - "value": 22.0, + "quantity": 22.0, "unit": "m" } } @@ -2177,11 +2294,11 @@ To assert a `spatialScale` for a Content Resource, the resource _MUST_ first be ### start {: #start} -A Canvas, or part of a Canvas, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Canvas is handled in the same way that Ranges reference parts of Canvases by using either a Canvas URI, a Canvas URI with a fragment in the URI, or a SpecificResource with a Selector. This property allows the client to begin with the first Canvas that contains interesting content rather than requiring the user to manually navigate to find it. +A Container, or part of a Container, which the client _SHOULD_ show on initialization for the resource that has the `start` property. The reference to part of a Container is handled in the same way that Ranges reference parts of Containers by using either its URI, a URI with a fragment specifier, or a SpecificResource with a Selector. This property allows the client to begin with the first Container that contains interesting content rather than requiring the user to manually navigate to find it. -If the resource with the `start` property is a Collection, then the Canvas (or SpecificResource) _MUST_ have the `partOf` property refering to the Manifest that it is part of, such that the client can retrieve it. +If the resource with the `start` property is a Collection, then the Container (or SpecificResource) _MUST_ have the `partOf` property referring to the Manifest that it is part of, such that the client can retrieve it. -The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` properties. The object _MUST_ be either a Canvas (as in the first example below), or a Specific Resource with a Selector and a `source` property where the value is a Canvas (as in the second example below). +The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` properties. The object _MUST_ be either a Container (as in the first example below), or a Specific Resource with a Selector and a `source` property where the value is a Canvas (as in the second example below). * A Collection _MAY_ have the `start` property.
Clients _SHOULD_ process `start` on a Collection. @@ -2215,6 +2332,7 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert ### startIndex {: #startIndex} +FIXME ### structures @@ -2245,9 +2363,12 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ### styleClass {: #styleClass} +FIXME: Import from WADM + ### stylesheet {: #stylesheet} +FIXME: Import from WADM ### summary {: #summary} @@ -2290,12 +2411,14 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert ### target {: #target} -... +FIXME: Import from WADM + + ### temporalScale {: #temporalScale} -A single UnitValue that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `value` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. +A single UnitValue that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `quantity` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. To assert a `temporalScale` for a Content Resource, the resource _MUST_ first be painted into a Container with a `duration` and the `temporalScale` is asserted on that Container. For example, an Audio file is painted into a Timeline, and then `temporalScale` is asserted on the Timeline. @@ -2305,7 +2428,7 @@ To assert a `temporalScale` for a Content Resource, the resource _MUST_ first be "type": "Canvas", "temporalScale": { "type": "UnitValue", - "value": 1000, + "quantity": 1000, "unit": "s" } } @@ -2375,7 +2498,7 @@ The value _MUST_ be a string. ``` -### total +### total (totalItems) {: #total} For compatability with ActivityStreams and the Change Discovery API, clients _SHOULD_ also accept `totalItems` as the name of this property. @@ -2393,6 +2516,7 @@ The value of this property _MUST_ be a non-negative integer. { "total": 1701 } ``` + ### transform {: #transform} @@ -2494,7 +2618,7 @@ FIXME: string value! ### via - +FIXME: import from WADM ### viewingDirection From 3f85037966538be85b5841ee15593f7fa7cece83 Mon Sep 17 00:00:00 2001 From: Dawn Childress Date: Tue, 28 Oct 2025 15:45:32 -0700 Subject: [PATCH 155/192] update image image use cases and add service --- source/presentation/4.0/index.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 3bafeb84f..c12d8c164 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -367,7 +367,7 @@ This example is a Manifest with one Canvas, representing an artwork. The content The unit integer coordinates of the Canvas (12000 x 9000) are not the same as the pixel dimensions of the JPEG image (4000 x 3000), but they are proportional - the Canvas has a 4:3 landscape aspect ratio, and so does the JPEG image.The `target` property of the Annotation is the Canvas `id`, unqualified by any particular region; this is taken to mean the content (the image) should fill the Canvas completely. As the Canvas and the image are the same aspect ratio, no distortion will occur. This approach allows the current image to be replaced by a higher resolution image in future, on the same Canvas. The Canvas dimensions establish a coordinate system for _painting annotations_ and other kinds of annotation that link content with the Canvas; they are not pixels of images. -The example demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, and `provider` to give information about the publisher of the Manifest. +The example demonstrates the use of the common descriptive properties `label` for the title of the artwork, `metadata` for additional information to display to the user, `summary` for a brief description of the artwork, `rights` to assert a rights statement or license from a controlled vocabulary, `homepage` to link to the artwork's specific web page, `thumbnail` to provide a small image to stand for the Manifest, `provider` to give information about the publisher of the Manifest, and finally, `service` to specify a IIIF Image API service that provides features such as deep zooming, derivative generation, image fragment referencing, rotation, and more. ```jsonc { @@ -447,14 +447,15 @@ The example demonstrates the use of the common descriptive properties `label` fo "type": "Annotation", "motivation": [ "painting" ], "body": { - "id": "https://iiif.io/api/presentation/example-content-resources/image/painting.jpg", + "id": "https://iiif.io/api/presentation/example/image/painting/full/max/0/default.jpg", "type": "Image", "format": "image/jpeg", "width": 4000, "height": 3000, "service": [ { - "id": "https://iiif.io/api/image/efjfpewjfpewjfoiewjf", + "id": "https://iiif.io/api/presentation/example/image/painting", + "profile": "level1", "type": "imageService3", // etc } @@ -480,20 +481,20 @@ The example demonstrates the use of the common descriptive properties `label` fo * The `metadata` label and value pairs are for display to the user rather than for machines to interpret. * The `rights` property is always a single string value which is a URI. * Any resource can have a `provider` property which a client can display to the user. This typically tells the user who the publisher is and how they might be contacted. The value of this property is an [Agent](model/#agent). -* A Service is a software application that a client might interact with to gain additional information or functionality. The IIIF Image API in this example ia a Service, which provides deep zoom functionality. Images in IIIF do not have to have Image Services - the following examples don't. +* The `service` property speficifies a software application that a client might interact with to gain additional information or functionality, in this case, the IIIF Image API. Images in IIIF do not require an Image Service---we have included one here as an example, but do not include a service in the following image examples for brevity. {: .note} !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties __Definitions__
Classes: [Manifest](#model/Manifest), [Canvas](#model/Canvas), [AnnotationPage](#model/AnnotationPage), [Annotation](#model/Annotation), [Agent](#model/Agent)

-Properties: [id](#model/id), [type](#type), [label](#label), [metadata](#metadata), [summary](#summary), [rights](#rights), [homepage](#homepage), [thumbnail](#thumbnail), and [provider](#provider) +Properties: [id](#model/id), [type](#model/type), [label](#model/label), [metadata](#modle/metadata), [summary](#modle/summary), [rights](#model/rights), [homepage](#model/homepage), [thumbnail](#model/thumbnail), [provider](#model/provider), and [service](#model/Service) {: .note} ## Use Case 2: Book -This example is a Manifest with multiple Canvases, each of which represents a page of a book. It demonstrates the use of the `behavior` property to indicate to a client that the object is _paged_: this helps a client generate the correct user experience. The `viewingDirection` property indicates that the book is read left-to-right. In this case, the property is redundant as `left-to-right` is the default value. The Manifest has a `rendering` property linking to a PDF representation; typically a client would offer this as a download or "view as" option. The `start` property is used to tell a client to initialize the view on a particular Canvas, useful if the digitized work contains a large amount of irrelevant front matter or blank pages. The `requiredStatement` is a message that a client MUST show to the user when presenting the Manifest. +This example is a Manifest with multiple Canvases, each of which represents a page of a book. It demonstrates the use of the `behavior` property to indicate to a client that the object is _paged_---this helps a client generate the correct user experience. The `viewingDirection` property indicates that the book is read left-to-right. In this case, the property is redundant as `left-to-right` is the default value. The Manifest has a `rendering` property linking to a PDF representation; typically a client would offer this as a download or "view as" option. The `start` property is used to tell a client to initialize the view on a particular Canvas, useful if the digitized work contains a large amount of irrelevant front matter or blank pages. The `requiredStatement` is a message that a client MUST show to the user when presenting the Manifest. ```json { @@ -611,7 +612,7 @@ This example is a Manifest with multiple Canvases, each of which represents a pa > **Key Points** -* Recommend using Canvas labels when more than one Canvas... +* Canvas labels are not required, but are recommend when a Manifest has more than one Canvas in order to provide visual labels for each Canvas for navigation within the IIIF client UI. {: .note} !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties From 6f0c3ae5c23d91626449e49e069bde8ae33a87bb Mon Sep 17 00:00:00 2001 From: "Mixter,Jeff" Date: Tue, 28 Oct 2025 22:25:11 -0400 Subject: [PATCH 156/192] udpated the values section of Model document --- .idea/.gitignore | 3 ++ .idea/api.iml | 12 ++++++ .idea/codeStyles/codeStyleConfig.xml | 5 +++ .../inspectionProfiles/profiles_settings.xml | 6 +++ .idea/misc.xml | 7 ++++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 6 +++ source/presentation/4.0/model.md | 39 +++++++++++++++---- 8 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/api.iml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..26d33521a --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/api.iml b/.idea/api.iml new file mode 100644 index 000000000..5ed0139f2 --- /dev/null +++ b/.idea/api.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..a55e7a179 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 000000000..105ce2da2 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..812ab5a68 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..d50cf45ff --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 331123f03..9dccc0233 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2450,26 +2450,49 @@ FIXME: possible values are 'm' and 's' and 'relative'. Is relative always 0-1.0 ### value -within metadata: +the `value` property is used as a language mapped key value pair where the langauge key string is always an array. -{label: value: {"en": ["foo"]}} +```json +{ + "label": + "value": { + "en": ["foo"] + } +} +``` +TODO: if we are happy with the new value property names we need to update references in the rest of the Model doc and Index doc -### value (UnitValue) +### quantity -The `value` property of a UnitValue represents the numerical component of a quantity. +The `quantity` property of a UnitValue represents the numerical component of a `UnitValue`. The value _MUST_ be a floating point number. * A UnitValue _MUST_ have the `value` property. -`"value": 0.1234123` +`"quantity": 0.1234123` + +### wktLiteral -FIXME: use scoped context for UnitValue to change the meaning of `value` +the `wktLiteral` property of a WktSelector is a string for representing space in vector geometry. a `wktLiteral` of a WktSelector _MUST_ be a valid structured Well-Known Text (WKT) string. -### value (WktSelector, TextualBody) +`"wktLiteral": "POLYGON Z ((0 1 0, 0 0 0, 1 0 0, 1 1 0))"` -FIXME: string value! +### value (TextualBody) +a `value` of a TextualBody follows the Web Annotation data model and _MUST NOT_ be a language mapped string. Instead the string value and the language of the string are represeted by separate properties. + +```json +{ + "body": { + "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", + "type": "TextualBody", + "value": "Koto with a cover being carried", + "language": "en", + "format": "text/plain" + } +} +``` ### via From 6e041930dc852856950d21bd963c48468fb30826 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Tue, 28 Oct 2025 22:27:11 -0400 Subject: [PATCH 157/192] Updates, mostly from WADM --- source/presentation/4.0/model.md | 108 ++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 31 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index e99f8abaa..dee453ace 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -196,6 +196,34 @@ JSON descriptions _SHOULD_ be embedded within the JSON of parent resources, and } ``` +### JSON-LD Contexts and Extensions +{: #json-ld-contexts-and-extensions} + +The top level resource in the response _MUST_ have the `@context` property, and it _SHOULD_ appear as the very first key/value pair of the JSON representation. This tells Linked Data processors how to interpret the document. The IIIF Presentation API context, below, _MUST_ occur once per response in the top-most resource, and thus _MUST NOT_ appear within [embedded][prezi30-terminology] resources. For example, when embedding a Canvas within a Manifest, the Canvas will not have the `@context` property. + +The value of the `@context` property _MUST_ be either the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` or a JSON array with the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` as the last item. Further contexts, such as those for local or [registered extensions][registry], _MUST_ be added at the beginning of the array. + +{% include api/code_header.html %} +``` json-doc +{ + "@context": "http://iiif.io/api/presentation/{{ page.major }}/context.json" +} +``` + +Any additional properties beyond those defined in this specification or the Web Annotation Data Model _SHOULD_ be mapped to RDF predicates using further context documents. These extensions _SHOULD_ be added to the top level `@context` property, and _MUST_ be added before the above context. The JSON-LD 1.1 functionality of predicate specific context definitions, known as [scoped contexts][org-w3c-json-ld-scoped-contexts], _MUST_ be used to minimize cross-extension collisions. Extensions intended for community use _SHOULD_ be [registered in the extensions registry][registry], but registration is not mandatory. + +{% include api/code_header.html %} +``` json-doc +{ + "@context": [ + "http://example.org/extension/context.json", + "http://iiif.io/api/presentation/{{ page.major }}/context.json" + ] +} +``` + +The JSON representation _MUST NOT_ include the `@graph` key at the top level. This key might be created when serializing directly from RDF data using the JSON-LD 1.0 compaction algorithm. Instead, JSON-LD framing and/or custom code should be used to ensure the structure of the document is as defined by this specification. + ## Classes The following sub-sections define the classes used in the IIIF Presentation Data Model. Only the semantics and core structural requirements are defined within this section, along with any deviations from other specifications that the classes might be drawn from. The descriptions do not define how the classes are used together, which is done in the Presentation API Overview. @@ -462,6 +490,22 @@ A Content Resource _MAY_ have the following properties: [height](#height), [widt The Web Annotation Data Model defines several Selectors, which describe how to find a specific segment of that resource to be used. As noted, the nature of Selectors are dependent on the type of resources that they select out of, and the methods needed for those descriptions will vary. The Selectors from the Web Annotation Data Model and other sources can be used within the IIIF Data Model. This specification defines additional Selector classes for use. +#### FragmentSelector +{: #FragmentSelector} + +> `"type": "FragmentSelector"` + +FIXME: import from WADM + + +#### SvgSelector +{: #SvgSelector} + +> `"type": "SvgSelector"` + + +FIXME: import from WADM + #### Point Selector {: #PointSelector} @@ -1174,14 +1218,15 @@ TODO: Address https://github.com/IIIF/api/issues/2318 | `multi-part` | Valid only on Collections. Collections that have this behavior consist of multiple Manifests or Collections which together form part of a logical whole or a contiguous set, such as multi-volume books or a set of journal issues. Clients might render these Collections as a table of contents rather than with thumbnails, or provide viewing interfaces that can easily advance from one member to the next. Disjoint with `together`.| | `together` | Valid only on Collections. A client _SHOULD_ present all of the child Manifests to the user at once in a separate viewing area with its own controls. Clients _SHOULD_ catch attempts to create too many viewing areas. This behavior _SHOULD NOT_ be interpreted as applying to the members of any child resources. Disjoint with `multi-part`.| | | **Navigation Behaviors** | -| `sequence` | Valid only on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest. Ranges that have this behavior represent different orderings of the Containers listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. Disjoint with `thumbnail-nav` and `no-nav`.| +| `sequence` | Valid on Ranges, where the Range is [referenced][prezi30-terminology] in the `structures` property of a Manifest, and Annotation Collection Pages. Ranges that have this behavior represent different orderings of the Containers listed in the `items` property of the Manifest, and user interfaces that interact with this order _SHOULD_ use the order within the selected Range, rather than the default order of `items`. On an Annotation Collection Page, this behavior indicates that the Annotations within the Page are ... + +FIXME: do we define the processing model here? + +Disjoint with `thumbnail-nav` and `no-nav`.| | `thumbnail-nav`{: style="white-space:nowrap;"} | Valid only on Ranges. Ranges that have this behavior _MAY_ be used by the client to present an alternative navigation or overview based on thumbnails, such as regular keyframes along a timeline for a video, or sections of a long scroll. Clients _SHOULD NOT_ use them to generate a conventional table of contents. Child Ranges of a Range with this behavior _MUST_ have a suitable `thumbnail` property. Disjoint with `sequence` and `no-nav`.| | `no-nav` | Valid only on Ranges. Ranges that have this behavior _MUST NOT_ be displayed to the user in a navigation hierarchy. This allows for Ranges to be present that capture unnamed regions with no interesting content, such as the set of blank pages at the beginning of a book, or dead air between parts of a performance, that are still part of the Manifest but do not need to be navigated to directly. Disjoint with `sequence` and `thumbnail-nav`.| -| `linear-nav` | FIXME: Obsolete? use `sequence`, now valid for AnnotationPage as well as Range | | | **Miscellaneous Behaviors** | | `hidden` | Valid on Annotation Collections, Annotation Pages, Annotations, Specific Resources, Lights, Cameras and Choices. If this behavior is provided, then the client _SHOULD NOT_ render the resource by default, but allow the user to turn it on and off. This behavior does not inherit, as it is not valid on Collections, Manifests, Ranges or Canvases. | -| `reset` | Valid on Annotations with a scope property. FIXME: ... | -| `no-reset` | Valid on Annotations with a scope property. FIXME: ... | {: .api-table #table-behavior} {% include api/code_header.html %} @@ -2030,6 +2075,14 @@ The value of the quality parameter in the IIIF Image API URL structure, as recor { "quality": "default" } ``` +### refinedBy +{: #refinedBy} + +FIXME: import from WADM + + + + ### region {: #region} @@ -2089,6 +2142,21 @@ The value of the property _MUST_ be a JSON object, that has the `label` and `val } } ``` + +### resets +{: #resets} + +FIXME: write this + + +{% include api/code_header.html %} +``` json-doc +{ + "resets": [] +} +``` + + ### rights {: #rights} @@ -2618,7 +2686,11 @@ FIXME: string value! ### via -FIXME: import from WADM +The `via` property of a resource _MAY_ be used to indicate the URI that is the source from which the current resource was obtained. The `via` URI _MUST_ be different from the URI in `id`, but _MAY_ be the same as the URI in `canonical` if it is present. Recording `via` allows servers to provide access to modified versions of other resources, while still providing the provenance of the resource. + + +FIXME: finish + ### viewingDirection @@ -2730,33 +2802,7 @@ Additional motivations may be added to the Annotation to further clarify the int ## JSON-LD and Extensions {: #json-ld-and-extensions} -### JSON-LD Contexts and Extensions -{: #json-ld-contexts-and-extensions} -The top level resource in the response _MUST_ have the `@context` property, and it _SHOULD_ appear as the very first key/value pair of the JSON representation. This tells Linked Data processors how to interpret the document. The IIIF Presentation API context, below, _MUST_ occur once per response in the top-most resource, and thus _MUST NOT_ appear within [embedded][prezi30-terminology] resources. For example, when embedding a Canvas within a Manifest, the Canvas will not have the `@context` property. - -The value of the `@context` property _MUST_ be either the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` or a JSON array with the URI `http://iiif.io/api/presentation/{{ page.major }}/context.json` as the last item. Further contexts, such as those for local or [registered extensions][registry], _MUST_ be added at the beginning of the array. - -{% include api/code_header.html %} -``` json-doc -{ - "@context": "http://iiif.io/api/presentation/{{ page.major }}/context.json" -} -``` - -Any additional properties beyond those defined in this specification or the Web Annotation Data Model _SHOULD_ be mapped to RDF predicates using further context documents. These extensions _SHOULD_ be added to the top level `@context` property, and _MUST_ be added before the above context. The JSON-LD 1.1 functionality of predicate specific context definitions, known as [scoped contexts][org-w3c-json-ld-scoped-contexts], _MUST_ be used to minimize cross-extension collisions. Extensions intended for community use _SHOULD_ be [registered in the extensions registry][registry], but registration is not mandatory. - -{% include api/code_header.html %} -``` json-doc -{ - "@context": [ - "http://example.org/extension/context.json", - "http://iiif.io/api/presentation/{{ page.major }}/context.json" - ] -} -``` - -The JSON representation _MUST NOT_ include the `@graph` key at the top level. This key might be created when serializing directly from RDF data using the JSON-LD 1.0 compaction algorithm. Instead, JSON-LD framing and/or custom code should be used to ensure the structure of the document is as defined by this specification. ### Term Collisions between Contexts {: #term-collisions-between-contexts} From 816986ac77d8a8f08f625283da39c51e8486c7ea Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 29 Oct 2025 11:02:16 +0000 Subject: [PATCH 158/192] a few typos from yesterday --- source/presentation/4.0/index.md | 8 ++++---- source/presentation/4.0/model.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 50a50755a..cd86f3bd7 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -456,7 +456,7 @@ The example demonstrates the use of the common descriptive properties `label` fo { "id": "https://iiif.io/api/presentation/example/image/painting", "profile": "level1", - "type": "imageService3", + "type": "ImageService3", // etc } ] @@ -481,7 +481,7 @@ The example demonstrates the use of the common descriptive properties `label` fo * The `metadata` label and value pairs are for display to the user rather than for machines to interpret. * The `rights` property is always a single string value which is a URI. * Any resource can have a `provider` property which a client can display to the user. This typically tells the user who the publisher is and how they might be contacted. The value of this property is an [Agent](model/#agent). -* The `service` property speficifies a software application that a client might interact with to gain additional information or functionality, in this case, the IIIF Image API. Images in IIIF do not require an Image Service---we have included one here as an example, but do not include a service in the following image examples for brevity. +* The `service` property specifies a software application that a client might interact with to gain additional information or functionality, in this case, the IIIF Image API. Images in IIIF do not require an Image Service---we have included one here as an example, but do not include a service in the following image examples for brevity. {: .note} !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties @@ -612,7 +612,7 @@ This example is a Manifest with multiple Canvases, each of which represents a pa > **Key Points** -* Canvas labels are not required, but are recommend when a Manifest has more than one Canvas in order to provide visual labels for each Canvas for navigation within the IIIF client UI. +* Canvas labels are not required, but are recommended when a Manifest has more than one Canvas in order to provide visual labels for each Canvas for navigation within the IIIF client UI. {: .note} !!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties @@ -1623,7 +1623,7 @@ Example placing top-left at (0, 1, 0); bottom-left at (0, 0, 0); bottom-right at "selector": [ { "type": "WktSelector", - "value": "POLYGON Z ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" + "wktLiteral": "POLYGON Z ((0 1 0, 0 0 0, 1 0 0, 1 1 0))" } ] ``` diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index dee453ace..5d0bc1307 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -82,7 +82,7 @@ The Presentation API data model intentionally does not include any semantic or d ## Technical Considerations -{: #json-considerations} +{: #technical-considerations} This section describes features applicable to all of the classes, properties and affordances of the Presentation API. @@ -1129,7 +1129,7 @@ The value _MUST_ be a floating point number greater than 0 and less than 90, and ### annotations {: #annotations} -An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Container. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource, part of it. or some resource within its `items` hierarchy. +An ordered list of Annotation Pages that contain commentary or other Annotations about this resource, separate from the Annotations that are used to paint content on to a Container. The `motivation` of the Annotations _MUST NOT_ be `painting`, and the target of the Annotations _MUST_ include this resource, or part of it, or some resource within its `items` hierarchy. The value _MUST_ be an array of JSON objects. Each item _MUST_ have at least the `id` and `type` properties. From 7b263b67b36334aa53feeec13a38003156c9fd15 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 29 Oct 2025 08:36:10 -0400 Subject: [PATCH 159/192] motivation should be array --- source/presentation/4.0/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index cd86f3bd7..e1e7b66a7 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -829,7 +829,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora { "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/c1/image", "type": "Annotation", - "motivation": "painting", + "motivation": [ "painting" ], "body": { "id": "https://example.org/presentation/example-content-resources/image/cover.jpg", "type": "Image", @@ -918,7 +918,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora { "id": "https://example.org/iiif/presentation/examples/external-anno/a1", "type": "Annotation", - "motivation": "supplementing", + "motivation": [ "supplementing" ], "body": { "id": "https://example.org/presentation/example-content-resources/lyrics1.txt", "type": "TextualBody", @@ -1753,7 +1753,7 @@ This is an example of a commenting annotation that targets two-minute segment of { "id": "https://example.org/iiif/presentation/examples/commenting/anno/1", "type": "Annotation", - "motivation": "commenting", + "motivation": [ "commenting" ], "body": { "id": "https://example.org/iiif/presentation/examples/commenting/anno/1/theme2", "type": "TextualBody", @@ -1773,7 +1773,7 @@ A comment on a Canvas can target a non-rectangular area. This example uses a `S { "id": "https://example.org/iiif/presentation/examples/commenting/anno/2", "type": "Annotation", - "motivation": "commenting", + "motivation": [ "commenting" ], "body": { "id": "https://example.org/iiif/presentation/examples/commenting/anno/2/person2", "type": "TextualBody", From 3e5ee620659f7b57f924d66ee4df7d696c575e4e Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 29 Oct 2025 12:42:55 +0000 Subject: [PATCH 160/192] More activating anno earlier, leave storytelling for later --- source/presentation/4.0/index.md | 765 +++++++++++++++---------------- 1 file changed, 381 insertions(+), 384 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index cd86f3bd7..b04d8bf26 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1814,334 +1814,38 @@ It is important to be able to position the textual body of an annotation within ## Linking Annotations +An Annotation with the motivation `linking` is used to create links between resources, both within the Manifest or to external content on the web, including other IIIF resources. Examples include linking to the continuation of an article in a digitized newspaper in a different Canvas, or to an external web page that describes the diagram in the Canvas. A client typically renders the links as clickable "Hotspots" - but can offer whatever accessible affordance as appropriate. The user experience of whether the linked resource is opened in a new tab, new window or by replacing the current view is up to the implementation. -Simple hotspot linking example - ----- - -## Activating Annotations - -Lightweight intro here - -Timeline example - reach point in timeline, do something -enables and disables? - -Can we use light switch example here - in 2D? - -Moving books? - tab moves something revealing something else -click to fold out and fold back - - - -# Integration - -seeAlso, service(s), extensions -mention search, image api, auth - -profile for seeAlso - -partOf - - - - - - -# Content State - -(this + model doc should relieve Content State spec of modelling concerns and leave it entirely about protocol) - -A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: - -A "bare" Manifest URI: - -``` -https://example.org/manifests/1 -``` - -A reference to a Manifest: - -```json -{ - "id": "https://example.org/manifests/1", - "type": "Manifest" -} -``` - -A region of a Canvas within a Manifest: - -```json -{ - "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", - "type": "Canvas", - "partOf": { - "id": "https://example.org/manifests/1", - "type": "Manifest" - } -} -``` - -Two versions of a painting from different publishers: - -```json -[ - { - "id": "https://gallery-1.org/iiif/sunflowers/canvas1", - "type": "Canvas", - "partOf": [ - { - "id": "https://gallery-1.org/iiif/sunflowers", - "type": "Manifest" - } - ] - }, - { - "id": "https://gallery-2.org/collection/sunflowers/c1", - "type": "Canvas", - "partOf": [ - { - "id": "https://gallery-2.org/collection/sunflowers", - "type": "Manifest" - } - ] - } -] -``` - -A Scene with a Camera at a particular point: - - -```json -{ - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "items": [ - { - "id": "https://example.org/iiif/3d/anno8", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/3d/cameras/1", - "type": "PerspectiveCamera", - "label": { - "en": [ - "Perspective Camera Pointed At Front of Cranium and Mandible" - ] - }, - "fieldOfView": 50.0, - "near": 0.1, - "far": 2000.0 - } - ] - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.0, "y": 0.15, "z": 0.75 - } - ] - } - } - ] -} -``` - -The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). - -Annotations with the motivation `contentState` are referred to as _content state_ annotations. - -Content States are used for the following applications: - -## Load a particular view of a resource or group of resources - -In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. - -The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the Content State Protocol API 2.0 specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. - - -## Load a particular view of some resource and modify it - -⚠ what are we doing with this? Do we still allow it? It's a good use case... - -In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: - -What to do about activating annos in the introduced content? - -```json -{ - "id": "https://example.org/import/3", - "type": "Annotation", - "motivation": "contentState", - "target": { - "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", - "type": "Canvas", - "partOf": { - "id": "https://example.org/manifests/nook12", - "type": "Manifest" - }, - "annotations": [ - { - "id": "https://my-annotation-store.org/user4532/notes-on-book12/p1", - "type": "AnnotationPage" - } - ] - } -} -``` - - -# Interactivity and Storytelling - -Sometimes it is necessary to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. - -A narrative might comprise a set (an AnnotationPage) of `commenting` annotations that target different parts of the Container, for example a guided tour of a painting or a map. For a Canvas or Timeline it is usually sufficient to leave the interactivity to the client; the fact that comments target different extents implies the client must offer some affordance for those comments (typically the user can click each one), and in response the client will move the current play point of the Timeline to the commenting annotation target, or pan and zoom the viewport to show the relevant part of an image. For 3D this may not be enough; a particular comment may only make sense from a certain viewpoint (i.e., Camera), or different steps of the story require different Lights to be active. - - -## 3D Comments with Cameras - -Consider a Scene with two models, two `commenting` annotations, and a camera. We really only want the camera to be used when the user is looking at the Mandibular tooth, by default and at other times we don't need a specific camera, we can let them explore freely. +The resource the user should be taken to is the `body` of the annotation, and the region of the Container that the user clicks or otherwise activates to follow the link is the `target`: ```jsonc { - "id": "https://example.org/iiif/3d/whale_comment_scope_content_state.json", - "type": "Manifest", - "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, - "items": [ + "id": "https://example.com/annotation/p0002-link", + "type": "Annotation", + "motivation": "linking", + "body": [ { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "Scene", - "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, - "items": [ - { - "id": "https://example.org/iiif/scene1/page/p1/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - }, - { - "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera", - "type": "Annotation", - "motivation": ["painting"], - "behavior": ["hidden"], - "body": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/3d/cameras/1", - "type": "PerspectiveCamera", - "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, - "fieldOfView": 50.0, - "near": 0.10, - "far": 2000.0 - } - ] - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": 0.0, "y": 0.15, "z": 0.75 - } - ] - } - }, - { - "id": "https://example.org/iiif/3d/anno2", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", - "type": "Model" - }, - "target": { - // SpecificResource with PointSelector - } - } - ] - } - ] + "id": "https://example.com/website1", + "type": "Text" } ], - "annotations": [ - { - "id": "https://example.org/iiif/scene1/page/p1/annotations/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/commenting-anno-for-mandibular-tooth", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Mandibular tooth", - "target": { - // SpecificResource with PointSelector - } - }, - { - "id": "https://example.org/iiif/3d/commenting-anno-for-right-pterygoid-hamulus", - "type": "Annotation", - "motivation": ["commenting"], - "bodyValue": "Right pterygoid hamulus", - "target": { - // SpecificResource with PointSelector - } - } - ] - } - ] + "target": "https://example.com/canvas/p1#xywh=265,661,1260,1239" } ``` -In that form, the user is left to interpret the commenting annotations and explore the Scene. The client will render a UI that presents the two commenting annotation in some form and allow the user to navigate between them. The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. - -In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. In this case we only want that camera to be used for looking at the Mandibular tooth. For now, it has been given the behavior `hidden`. ## Activating Annotations -Annotations with the motivation `activating` are referred to as _activating_ annotations, and are used to link a resource that triggers an action with the resource(s) to change, enable or disable. In the above case the `target` of the activating annotation could be one of the commenting annotations, for which a user might click a corresponding UI element. In other scenarios the `target` could be the painting annotation of a 3D model, or an annotation that targets part of a model, or a region of a Canvas, or a point or segment of a Timeline, or any other annotation that a user could interact with (in whatever manner) to trigger an event. The `body` of the annotation is the resource that is then activated - for example, a Camera which then becomes the active viewport. - -`target` variations +Sometimes it is necessary to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ (ref) and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. -- user "walks into a room" -- AV scrub bar reaches time t1 -- user interacts with a model -- user touches a face in a painting +Annotations with the motivation `activating` are referred to as _activating_ annotations, and are used to link a resource that triggers an action with the resource(s) to change, enable or disable. The `target` of the activating annotation could be a commenting annotation, for which a user might click a corresponding UI element. In other scenarios the `target` could be the painting annotation of a 3D model, or an annotation that targets part of a model, or a region of a Canvas, or a point or segment of a Timeline, or any other annotation that a user could interact with (in whatever manner) to trigger an event. Even a region of space in a Scene or an extent of time in a Container with `duration` could be the `target`, so that when the user "enters" that region or extent, something happens. The `body` of the annotation is the resource that is then activated: -We can add an additional `activating` annotation to the existing annotations, to connect them to the resources activated. +- a Camera: if "hidden" the behavior is removed, and this Camera becomes the viewport. +- AnimationSelector: A named animation within a model is played (fwd ref) +- (anything else yet?) Activating annotations are provided in a Container's `annotations` property. They can be mixed in with the commenting (or other interactive annotations) they target, or they can be in a separate AnnotationPage. The client should evaluate all the activating annotations it can find. -> recommend they are inline in the manifest? - -> use cases for loading in new pages of annos later - activate the French translations - - ```jsonc { "id": "https://example.org/iiif/3d/anno9", @@ -2155,48 +1859,22 @@ Activating annotations are provided in a Container's `annotations` property. The ], "body": [ { - "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera", + "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera-to-view-tooth", "type": "Annotation" } ] } ``` -The pattern is similar to that for linking (ref) - -In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of activating annotations allows a precise storytelling experience to be specified, including: - - - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) - - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest - - hiding models in the Scene at a particular step - - showing additional models at a particular step - -As in the above example, all the other annotations referred to by the activating annotations `target` and `body` properties are already present in the Scene from the beginning. Initially, many of them may have the behavior `hidden`, invisible until activated. - - -The `body` is anything that is can be activated: - -- Camera: if "hidden" the behavior is removed, and (crucially) this Camera becomes the viewport. -- AnimationSelector: A named animation within a model is played. -- (anything else yet?) - -## Showing and hiding resources +### Showing and hiding resources An activating annotation has two additional optional properties: * `enables`: For each annotation in the value, remove the 'hidden' behavior if it has it. * `disables`: For each annotation in the value, add the 'hidden' behavior if it does not have it. -Hidden resources cannot be active or activated. If the values are the `id` properties of painting resources that paint models, they are hidden or made visible. If Lights, they are turned on. - -### Example: a light switch - -* Initially, a model of a light switch is painted into the Scene. A PointLight is also painted, but with the `behavior` "hidden", which means it is inactive (i.e., off). A commenting annotation with the text "Click the switch to turn the light on or off" targets the light switch. An activating annotation targets the commenting annotation, so that user interaction with the commenting annotation will trigger the activating annotation. This activating annotation has no `body`, but it does have `enables` with values that are the `id` properties of the painting annotation for the light switch model, and the activating annotation that turns the light off. It also has a `disables` with the value of its own `id` - i.e., it disables _itself_. A further activating annotation has the opposite effect. Initially this has the `behavior` "hidden" - which means it is inactive. It also targets the commenting annotation, but has no effect while hidden. -* When the user interacts with the light switch model, the client processes any activating annotations that target it and are not hidden. In this case, the first activating annotation is triggered because while both target the switch, only the first is not hidden. This activation `enables` the light (i.e., removing its "hidden" `behavior` and therefore turning it on) and the other activating annotation, and `disables` itself. -* If the user clicks the light again, the client again processes any activating annotations that target it and are not hidden. This time the second annotation is the active one - and it `disables` the light (turning it off) and itself, and enables the first activating annotation again. -* Subsequent clicks simply alternate between these two states, indefinitely. - +Hidden resources cannot be active or activated. If the values are the `id` properties of painting resources that paint models, they are hidden or made visible. If Lights, they are turned on. The following example demonstrates a light switch that can be toggled on and off. ```jsonc { @@ -2305,6 +1983,12 @@ Hidden resources cannot be active or activated. If the values are the `id` prope } ``` +* Initially, a model of a light switch is painted into the Scene. A PointLight is also painted, but with the `behavior` "hidden", which means it is inactive (i.e., off). A commenting annotation with the text "Click the switch to turn the light on or off" targets the light switch. An activating annotation targets the commenting annotation, so that user interaction with the commenting annotation will trigger the activating annotation. This activating annotation has no `body`, but it does have `enables` with values that are the `id` properties of the painting annotation for the light switch model, and the activating annotation that turns the light off. It also has a `disables` with the value of its own `id` - i.e., it disables _itself_. A further activating annotation has the opposite effect. Initially this has the `behavior` "hidden" - which means it is inactive. It also targets the commenting annotation, but has no effect while hidden. +* When the user interacts with the light switch model, the client processes any activating annotations that target it and are not hidden. In this case, the first activating annotation is triggered because while both target the switch, only the first is not hidden. This activation `enables` the light (i.e., removing its "hidden" `behavior` and therefore turning it on) and the other activating annotation, and `disables` itself. +* If the user clicks the light again, the client again processes any activating annotations that target it and are not hidden. This time the second annotation is the active one - and it `disables` the light (turning it off) and itself, and enables the first activating annotation again. +* Subsequent clicks simply alternate between these two states, indefinitely. + + ### Triggering a named animation in a model Sometimes a model file has inbuilt animations. While a description of these is outside the scope of IIIF, because it is 3D-implementation-specific, as long as there is a way to refer to a model's animation(s) by name, we can connect the animation to IIIF resources. @@ -2342,52 +2026,179 @@ The format of the `value` string is implementation-specific, and will depend on } } ], - "annotations": [ + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/activators", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/box-opening-commenting-anno", + "type": "Annotation", + "motivation": ["commenting"], + "body": [ + { + "type": "TextualBody", + "value": "Click the box to open the lid" + } + ], + "target": [ + { + "id": "https://example.org/iiif/3d/painting-anno-for-music-box", + "type": "Annotation" + } + ] + } + { + "id": "https://example.org/iiif/3d/box-opening-activating-anno", + "type": "Annotation", + "motivation": ["activating"], + "target": [ + { + "id": "https://example.org/iiif/3d/box-opening-commenting-anno", + "type": "Annotation" + } + ], + "body": [ + { + "type": "SpecificResource", + "source": "https://example.org/iiif/3d/painting-anno-for-music-box", + "selector": [ + { + "type": "AnimationSelector", + "value": "open-the-lid" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +``` +### 3D Comments with Cameras + +In many complex 3D Scenes, it may not be clear what or how to look at a particular point of interest even when the commenting annotation targets a particular point. The view may be occluded by parts of the model, or other models in the Scene. In the following example, the user can explore the Scene freely, but when they select a particular comment, a specific Camera that was previously hidden (unavailable to the user) is activated, moving the user (i.e., setting the viewport) to a chosen position suitable for looking at the point of interest: + +```jsonc +{ + "id": "https://example.org/iiif/3d/whale_comment_scope_content_state.json", + "type": "Manifest", + "label": { "en": ["Whale Cranium and Mandible with Dynamic Commenting Annotations and Custom Per-Anno Views"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["A Scene Containing a Whale Cranium and Mandible"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_mandible.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera-to-view-tooth", + "type": "Annotation", + "motivation": ["painting"], + "behavior": ["hidden"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": {"en": ["Perspective Camera Pointed At Front of Cranium and Mandible"]}, + "fieldOfView": 50.0, + "near": 0.10, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + }, + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb", + "type": "Model" + }, + "target": { + // SpecificResource with PointSelector + } + } + ] + } + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene1/page/p1/annotations/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/3d/commenting-anno-for-mandibular-tooth", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Mandibular tooth", + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/commenting-anno-for-right-pterygoid-hamulus", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "Right pterygoid hamulus", + "target": { + // SpecificResource with PointSelector + } + }, + { + "id": "https://example.org/iiif/3d/anno9", + "type": "Annotation", + "motivation": ["activating"], + "target": [ + { + "id": "https://example.org/iiif/3d/commenting-anno-for-mandibular-tooth", + "type": "Annotation" + } + ], + "body": [ { - "id": "https://example.org/iiif/scene1/page/activators", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/3d/box-opening-commenting-anno", - "type": "Annotation", - "motivation": ["commenting"], - "body": [ - { - "type": "TextualBody", - "value": "Click the box to open the lid" - } - ], - "target": [ - { - "id": "https://example.org/iiif/3d/painting-anno-for-music-box", - "type": "Annotation" - } - ] - } - { - "id": "https://example.org/iiif/3d/box-opening-activating-anno", - "type": "Annotation", - "motivation": ["activating"], - "target": [ - { - "id": "https://example.org/iiif/3d/box-opening-commenting-anno", - "type": "Annotation" - } - ], - "body": [ - { - "type": "SpecificResource", - "source": "https://example.org/iiif/3d/painting-anno-for-music-box", - "selector": [ - { - "type": "AnimationSelector", - "value": "open-the-lid" - } - ] - } - ] - } - ] + "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera-to-view-tooth", + "type": "Annotation" } ] } @@ -2397,6 +2208,8 @@ The format of the `value` string is implementation-specific, and will depend on } ``` +The client will render a UI that presents the two commenting annotations in some form and allows the user to navigate between them. An active Camera is not provided (while there is a Camera in the Scene it has `behavior` "hidden", i.e., it is inactive: not usable). The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. In either case the above example instructs the client to activate the Camera when the user interacts with the comment. The user is free to move away but any interaction with that comment will bring them back to the specific viewpoint. (forward ref to chains of activation example) + ### Modifying resource properties @@ -2509,6 +2322,187 @@ In the following simple example, the background color of the Scene is changed: } ``` +# Integration + +seeAlso, service(s), extensions +mention search, image api, auth + +profile for seeAlso + +partOf - + + + + + +# Content State + +(this + model doc should relieve Content State spec of modelling concerns and leave it entirely about protocol) + +A Content State is simply any valid IIIF Presentation Resource, or part of a Presentation resource. The following are all Content States that describe a "fragment" of IIIF: + +A "bare" Manifest URI: + +``` +https://example.org/manifests/1 +``` + +A reference to a Manifest: + +```json +{ + "id": "https://example.org/manifests/1", + "type": "Manifest" +} +``` + +A region of a Canvas within a Manifest: + +```json +{ + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/1", + "type": "Manifest" + } +} +``` + +Two versions of a painting from different publishers: + +```json +[ + { + "id": "https://gallery-1.org/iiif/sunflowers/canvas1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-1.org/iiif/sunflowers", + "type": "Manifest" + } + ] + }, + { + "id": "https://gallery-2.org/collection/sunflowers/c1", + "type": "Canvas", + "partOf": [ + { + "id": "https://gallery-2.org/collection/sunflowers", + "type": "Manifest" + } + ] + } +] +``` + +A Scene with a Camera at a particular point: + + +```json +{ + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "items": [ + { + "id": "https://example.org/iiif/3d/anno8", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/3d/cameras/1", + "type": "PerspectiveCamera", + "label": { + "en": [ + "Perspective Camera Pointed At Front of Cranium and Mandible" + ] + }, + "fieldOfView": 50.0, + "near": 0.1, + "far": 2000.0 + } + ] + }, + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.0, "y": 0.15, "z": 0.75 + } + ] + } + } + ] +} +``` + +The term _Content State_ is used for any arbitrary fragments of IIIF such as the above when they are used in the particular ways defined by this specification. A Content State is **usually** carried by the `target` of an annotation with the motivation `contentState`, or `body` of an annotation with the motivation `activating`, but in some scenarios may be transferred between client applications without an enclosing annotation, as a "bare" URI (see Content State 2.0 specification). + +Annotations with the motivation `contentState` are referred to as _content state_ annotations. + +Content States are used for the following applications: + +## Load a particular view of a resource or group of resources + +In this usage, an annotation with the motivation `contentState` is passed to a client to initialize it with a particular view of a resource. Almost all IIIF Clients initialize from the very simplest form of Content State - a Manifest URI. A more complex Content State might target a particular region of a particular canvas within a Manifest, as in the second example above. A client initialized from such a Content State would load the Manifest, show the particular Canvas, and perhaps zoom in on the target region. + +The mechanisms for passing Content State into a client, and exporting a Content State from a client, are given in the Content State Protocol API 2.0 specification, which describes the scenarios in which a URI, or Content State not carried by an annotation, should be interpreted by a Client as a Content State. + + +## Load a particular view of some resource and modify it + +⚠ what are we doing with this? Do we still allow it? It's a good use case... + +In the previous usage, the fragment of IIIF carried by the annotation with the motivation `contentState` provides enough information for a Client to load a resource and show it. This fragment can also carry additional IIIF Presentation API resources not shown in the referred-to resource. For example, in the following example the Content State carries additional annotations not present in the original published Manifest. A client initializing from this Content State would show these additional annotations to the user: + +What to do about activating annos in the introduced content? + +```json +{ + "id": "https://example.org/import/3", + "type": "Annotation", + "motivation": "contentState", + "target": { + "id": "https://example.org/canvases/aabb#xywh=4500,1266,600,600", + "type": "Canvas", + "partOf": { + "id": "https://example.org/manifests/nook12", + "type": "Manifest" + }, + "annotations": [ + { + "id": "https://my-annotation-store.org/user4532/notes-on-book12/p1", + "type": "AnnotationPage" + } + ] + } +} +``` + + +# Interactivity, Guided Viewing and Storytelling + + +A narrative might comprise an AnnotationPage of `commenting` annotations that target different parts of the Container, for example a guided tour of a painting or a map. For a Canvas or Timeline it is usually sufficient to leave the interactivity to the client; the fact that comments target different extents implies the client must offer some affordance for those comments (typically the user can click each one), and in response the client will move the current play point of the Timeline to the commenting annotation target, or pan and zoom the viewport to show the relevant part of an image. For 3D this may not be enough; a particular comment may only make sense from a certain viewpoint (i.e., Camera), or different steps of the story require different Lights to be active. + +In a storytelling or exhibition scenario, the non-painting `annotations` might be carrying informative text, or even rich HTML bodies. They can be considered to be _steps_ in the story. The use of activating annotations (back ref) allows a precise storytelling experience to be specified, including: + + - providing a specific viewpoint for each step of the narrative (or even a choice of viewpoints) + - modifying the lighting of the Scene for each step, for example shining a spotlight on a point of interest + - hiding models in the Scene at a particular step + - showing additional models at a particular step + +All the annotations referred to by the activating annotations' `target` and `body` properties are already present in the Scene from the beginning. Initially, many of them may have the behavior `hidden`, invisible until activated. + ## The `sequence` behavior @@ -2525,6 +2519,9 @@ Chaining together activating annotations can then allow the implementation of, a * Interactive components such as light switches (enable/disable a light), jukeboxes (enable/disable Audio Emitter) +## Storytelling example + +Something really cool that brings a lot of things together! # Conveying Physical Dimensions From 00f7630cd0955d94edd1f55c16b8a674e17ac3ed Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 29 Oct 2025 12:43:50 +0000 Subject: [PATCH 161/192] More activating anno earlier, leave storytelling for later --- source/presentation/4.0/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index b04d8bf26..66073fcca 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -2521,7 +2521,8 @@ Chaining together activating annotations can then allow the implementation of, a ## Storytelling example -Something really cool that brings a lot of things together! +* Something really cool that brings a lot of things together! +* Use JSONPatch to move a model too. # Conveying Physical Dimensions From ffe8893cec44ff8071f90b607559767b95a095fe Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 29 Oct 2025 09:10:40 -0400 Subject: [PATCH 162/192] Apply to all annotations that are rendered. --- source/presentation/4.0/index.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index e1e7b66a7..032ea7b1a 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1686,9 +1686,7 @@ Manifest Annotation Pages are used to group Annotations. In cases where many annotations are present, such as when transcription, translation, and commentary are associated with a manuscript, it can be useful to separate these annotations into groups that can facilitate improved user interactions in a client. -Each Annotation Page can be embedded or externally referenced. Clients should process the Annotation Pages and their items in the order given in the Container. Publishers may choose to expedite the processing of embedded Annotation Pages by ordering them before external pages, which will need to be dereferenced by the client. Order can be significant, however. Painting annotations are assigned an ascending [z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) from the first painting annotation encountered. Annotations with a higher z-index will render in front of those with a lower z-index when displayed on a Canvas. - - +Each Annotation Page can be embedded or externally referenced. Clients should process the Annotation Pages and their items in the order given in the Container. Publishers may choose to expedite the processing of embedded Annotation Pages by ordering them before external pages, which will need to be dereferenced by the client. Order can be significant, however. Annotations are assigned an ascending [z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) from the first annotation encountered. Annotations with a higher z-index will render in front of those with a lower z-index when displayed on a Canvas. ## Annotation Collection From bec514d560c65d44c10d0ed76a1e80bb6c893137 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 09:16:36 -0400 Subject: [PATCH 163/192] Allow total on Collections --- source/presentation/4.0/model.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 5d0bc1307..4607752fe 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2578,6 +2578,8 @@ The value of this property _MUST_ be a non-negative integer. * An AnnotationCollection _SHOULD_ have the `total` property.
Clients _SHOULD_ process the `total` property on an AnnotationCollection. +* A Collection with Collection Pages _SHOULD_ have the `total` property.
+ Clients _SHOULD_ process the `total` property on a Collection. {% include api/code_header.html %} ``` json-doc From 5e4e3be6699841da1447f812e448eda0506c9f2a Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 09:22:16 -0400 Subject: [PATCH 164/192] `source` --- source/presentation/4.0/model.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 4607752fe..18a1705c3 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2317,7 +2317,7 @@ The value _MUST_ be an array of JSON objects. Each object _MUST_ be a service re The value of the size parameter in the IIIF Image API URL structure, as recorded in an Image API Selector. -* The IIIF Image API Selector _MAY_ have the `size` property with exactly one value.
+* A IIIF Image API Selector _MAY_ have the `size` property with exactly one value.
Clients _MUST_ process the `size` property on a IIIF Image API Selector. * Other types of resource _MUST NOT_ have the `size` property.
Clients _MUST_ ignore the `size` property on other types of resource. @@ -2330,9 +2330,21 @@ The value of the size parameter in the IIIF Image API URL structure, as recorded ### source {: #source} -SpecificResource +The `source` property refers to the URI of the resource that the Specific Resource is a more constrained version or representation of. -FIXME: import from WADM +For more information about source and Specific Resources, see the [W3C Annotation Model](For more information about Annotation bodies, see the [W3C Annotation Model](https://www.w3.org/TR/annotation-model/#bodies-and-targets). + +The value _MUST_ be a string, and the value _MUST_ be a URI. + +* A SpecificResource _MUST_ have the `source` property with exactly one value.
+ Clients _MUST_ process the `source` property on a SpecificResource. +* Other types of resource _MUST NOT_ have the `source` property.
+ Clients _MUST_ ignore the `source` property on other types of resource. + +{% include api/code_header.html %} +``` json-doc +{ "source": "https://example.org/museum/images/1" } +``` ### spatialScale From 7d72d3b7a284907fe34c4886fe05470a5a09c264 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 29 Oct 2025 13:26:20 +0000 Subject: [PATCH 165/192] add .idea to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ca4b5a24c..ff449984d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ Gemfile.lock vendor .vscode +.idea From 87565a16f7e30070b6d056ba4cfe3568cf14adaf Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 29 Oct 2025 13:28:24 +0000 Subject: [PATCH 166/192] remove .idea folder from PR --- .idea/.gitignore | 3 --- .idea/api.iml | 12 ------------ .idea/codeStyles/codeStyleConfig.xml | 5 ----- .idea/inspectionProfiles/profiles_settings.xml | 6 ------ .idea/misc.xml | 7 ------- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 7 files changed, 47 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/api.iml delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d33521a..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/api.iml b/.idea/api.iml deleted file mode 100644 index 5ed0139f2..000000000 --- a/.idea/api.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a179..000000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2da2..000000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 812ab5a68..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index d50cf45ff..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfb..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From c85c6d4a3f4289e80d6de821bc37a85ff24edf1a Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 09:33:35 -0400 Subject: [PATCH 167/192] Import refinedBy --- source/presentation/4.0/model.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 18a1705c3..314ea01e3 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2078,10 +2078,19 @@ The value of the quality parameter in the IIIF Image API URL structure, as recor ### refinedBy {: #refinedBy} -FIXME: import from WADM +The `refinedBy` property allows Selectors to be chained together to incrementally select more specific aspects of the resource given in `source` on the Specific Resource. The first selector on a Specific Resource describes how to select part of the main resource, and a subsequent selector in `refinedBy` then describes how to further select part of that part. This can be used, for example, to extract a rectangular region with a `FragmentSelector` and then further refine that region with an `SvgSelector` or `WktSelector`. + +For more information about `refinedBy`, please see the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). +The value of the `refinedBy` property _MUST_ be a JSON Object, which _MUST_ describe a Selector. +* A Selector _MAY_ have the `refinedBy` property with exactly one value.
+ Clients _SHOULD_ process the `refinedBy` property on Selectors. +{% include api/code_header.html %} +``` json-doc +{ "refinedBy": { "type": "WktSelector", "wktLiteral": "POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))" } } +``` ### region From 299ea73a85ee5bff9c0d747b6afca604c840cc47 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 09:55:30 -0400 Subject: [PATCH 168/192] Fragment and Svg Selectors --- source/presentation/4.0/model.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 314ea01e3..a71132101 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -495,7 +495,14 @@ The Web Annotation Data Model defines several Selectors, which describe how to f > `"type": "FragmentSelector"` -FIXME: import from WADM +Fragment Selectors use the fragment part of the URI specification to define a selection mechanism for parts of resources. The definition of the representation's media type specifies the structure of the value of the fragment. This is commonly used in IIIF to include the media fragment syntax of `xywh=,,,` to define a 2 dimension region. + +For more information about Fragment Selectors, see the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#fragment-selector). + +__Properties__
+A Fragment Selector _MUST_ have the following properties: [type](#type), and [value](#value)

+A Fragment Selector _MAY_ have the following properties: [id](#id) and [conformsTo](#conformsTo).

+{: .note} #### SvgSelector @@ -503,8 +510,14 @@ FIXME: import from WADM > `"type": "SvgSelector"` +SVG Selectors use the [SVG specification](https://www.w3.org/TR/SVG11/) to define a non-rectangular part of a resource. This allows for polygons, circles and multiple shapes to be used to highlight or otherwise select regions of images or other 2 dimensional resources. -FIXME: import from WADM +For more information about SVG Selectors, see the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#svg-selector). + +__Properties__
+An SVG Selector _MUST_ have the following properties: [type](#type), and [value](#value).

+A Fragment Selector _MAY_ have the following properties: [id](#id).

+{: .note} #### Point Selector From 3e4123b19753a5182e072b0c20bcb98d16513720 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 29 Oct 2025 12:06:39 -0400 Subject: [PATCH 169/192] First draft --- source/presentation/4.0/index.md | 63 ++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 3662c3942..5173a618e 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1798,10 +1798,67 @@ A comment on a Canvas can target a non-rectangular area. This example uses a `S Annotations may alternately use a different type of Selector, called a `WktSelector`, to align the Annotation to a target region within a Canvas or Scene. -### A comment about something in a Model +### A comment about 3D sculpture + +A commenting annotation can also reference a Content Resource, such as a Model, within a Scene. This is accomplished by targeting the annotation that paints the resource into the Scene. In this example, the commenting annotation targets an annotation that paints a model of a portrait bust into a scene. + +```jsonc +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/manifest/commenting/manifest/3", + "type": "Manifest", + "label": { "en": [ "1st Centry Roman portrait bust with comment" ] }, + "items": [ + { + "id": "https://example.org/iiif/scene/commenting/scene3", + "type": "Scene", + "items": [ + { + "id": "https://example.org/iiif/scene/commenting/scene3/painting-annotation-pages/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/scene/commenting/scene3/sculpture", + "type": "Annotation", + "motivation": [ "painting"] , + "label": { + "en": [ "A 1st century Roman portait bust." ] + }, + "body": { + "id": "https://example.org/iiif/scene/commenting/models/portait.gltf", + "type": "Model" + }, + "target": "https://example.org/iiif/scene/commenting/scene3" + } + ] + } + ] + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/scene/commenting/scene3/commenting-annotation-pages/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/3", + "type": "Annotation", + "motivation": [ "commenting" ], + "body": { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "This marble portrait exemplifies the veristic tradition that dominated Roman Republican portraiture and persisted into the early Imperial period." + }, + "target": "https://example.org/iiif/scene/commenting/scene3/sculpture" + } + ] + } + ] +} +``` -(targets Scene) -Look at this scratch in the helmet > Todo: This is mostly copy-pasted from properties, is it needed here? Use in above example. From 8e3ef71595651cc71cfda795faf8fffa58a804f8 Mon Sep 17 00:00:00 2001 From: tomcrane Date: Wed, 29 Oct 2025 16:11:36 +0000 Subject: [PATCH 170/192] Elaborate on how activating anno bodies behave --- source/presentation/4.0/index.md | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 3662c3942..782194bb5 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1094,7 +1094,7 @@ Constructs from the domain of 3D graphics are expressed in IIIF as Resources. Th A Camera provides a view of a region of the Scene's space from a particular position within the Scene; the client constructs a viewport into the Scene and uses the view of one or more Cameras to render that region. The size and aspect ratio of the viewport is client and device dependent. -There are two types of Camera, `PerspectiveCamera` and `OrthographicCamera`. The first Camera defined and not hidden in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client provides a default Camera. The type, properties and position of this default camera are client-dependent. +There are two types of Camera, `PerspectiveCamera` and `OrthographicCamera`. The first Camera defined and not [hidden](model#behavior) in a Scene is the default Camera used to display Scene contents. If the Scene does not have any Cameras defined within it, then the client provides a default Camera. The type, properties and position of this default camera are client-dependent. ### Lights @@ -1834,13 +1834,18 @@ The resource the user should be taken to is the `body` of the annotation, and th ## Activating Annotations -Sometimes it is necessary to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for _storytelling_ (ref) and other narrative applications beyond simply conveying a static Digital Object into a viewer and leaving subsequent interactions entirely in the control of the user. +Sometimes it is necessary to modify the contents of a Container in the contexts of different annotations on that Container. This technique allows IIIF to be used for exhibitions, storytelling (fwd ref) and other interactive applications beyond simply conveying a set of static resources in a Container. -Annotations with the motivation `activating` are referred to as _activating_ annotations, and are used to link a resource that triggers an action with the resource(s) to change, enable or disable. The `target` of the activating annotation could be a commenting annotation, for which a user might click a corresponding UI element. In other scenarios the `target` could be the painting annotation of a 3D model, or an annotation that targets part of a model, or a region of a Canvas, or a point or segment of a Timeline, or any other annotation that a user could interact with (in whatever manner) to trigger an event. Even a region of space in a Scene or an extent of time in a Container with `duration` could be the `target`, so that when the user "enters" that region or extent, something happens. The `body` of the annotation is the resource that is then activated: +Annotations with the motivation `activating` are referred to as _activating_ annotations, and are used to link a resource that triggers an action with the resource(s) to change, enable or disable. The `target` of the activating annotation could be a commenting annotation, for which a user might click a corresponding UI element. In other scenarios the `target` could be the painting annotation of a 3D model, or an annotation that targets part of a model, or a region of a Canvas, or a point or segment of a Timeline, or any other annotation that a user could interact with (in whatever manner) to trigger an event. Even a volume of space in a Scene or an extent of time in a Container with `duration` could be the `target`, so that when the user "enters" that region or extent, something happens. -- a Camera: if "hidden" the behavior is removed, and this Camera becomes the viewport. -- AnimationSelector: A named animation within a model is played (fwd ref) -- (anything else yet?) +The `body` of the annotation is then activated. This has different processing requirements depending on what the body is: + +* If the body is a reference to a Painting Annotation: + * if the annotation has the `behavior` "hidden", then remove "hidden" from the `behavior`. + * if the annotation paints a Camera, make that Camera the active Camera (i.e., make this the viewport) (see [ref]). +* If the body is a SpecificResource with a `selector` property with the type "AnimationSelector", play the animation named by the `value` property of the Selector. (see [ref]). +* If the body has the `type` "JSONPatch", apply the patch operations listed in `operations` to the resource identified by `patchTarget`. (see [ref]). +* Processing for other body types can be found in the [IIIF Cookbook][ref] Activating annotations are provided in a Container's `annotations` property. They can be mixed in with the commenting (or other interactive annotations) they target, or they can be in a separate AnnotationPage. The client should evaluate all the activating annotations it can find. @@ -1869,10 +1874,14 @@ Activating annotations are provided in a Container's `annotations` property. The An activating annotation has two additional optional properties: -* `enables`: For each annotation in the value, remove the 'hidden' behavior if it has it. -* `disables`: For each annotation in the value, add the 'hidden' behavior if it does not have it. +* `enables`: For each Annotation or AnnotationPage in the value, remove the 'hidden' behavior if it has it. +* `disables`: For each Annotation or AnnotationPage in the value, add the 'hidden' behavior if it does not have it. + +If the values are the `id` properties of painting annotations that paint models, `enables` makes them visible and `disables` hides them. If they paint Lights, `enables` turns them on and `disables` turns them off. + +Referencing a Painting Annotation as the `body` of an activating annotation implicitly enables it, as if it had been listed in `enables`. The inverse is not always true - for example, referencing a Camera in `enables` removes the "hidden" `behavior` and therefore allows it to be included in the client's evaluation of what the default camera is, but does not perform the additional action of changing the viewport to that Camera. For Lights and Models in a Scene, the two are equivalent because no _additional_ processing behavior is provided by this specification. -Hidden resources cannot be active or activated. If the values are the `id` properties of painting resources that paint models, they are hidden or made visible. If Lights, they are turned on. The following example demonstrates a light switch that can be toggled on and off. +For many use cases, the activating annotations don't need bodies. The following example demonstrates a light switch that can be toggled on and off: ```jsonc { From 209ec488e7389c05b4d262665f89cdc0f658b6a6 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 29 Oct 2025 12:27:19 -0400 Subject: [PATCH 171/192] Next draft --- source/presentation/4.0/index.md | 34 +++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 5173a618e..829019c3b 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1859,12 +1859,40 @@ A commenting annotation can also reference a Content Resource, such as a Model, } ``` +In some cases it is desirable to influence the client's positioning of the commenting annotation when rendered. This may be done to ensure that the annotation does not hide key visual elements or to ensure that the annotation itself is not obscured by resources painted in the container, such as 3D models. In these cases, the `position` property may be used to define the position where a TextualBody should be rendered. The following example shows a `position` that places the annotation at a specific coordinate within the Scene. The position is a `SpecificResource` that requires a `source` and `selector`. -> Todo: This is mostly copy-pasted from properties, is it needed here? Use in above example. +```jsonc + "body": { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "This marble portrait exemplifies the veristic tradition that dominated Roman Republican portraiture and persisted into the early Imperial period.", + "position": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene/commenting/scene3", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "x": 0.75, + "y": 1.5, + "z": 0.1 + } + ] + } + } +``` -It is important to be able to position the textual body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. The positioning of the textual body in a container is accomplished through the `position` property, which has as a value a Specific Resource identifying the targeted container as the source and a selector defining how the textual body should be positioned in the targeted container. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. + ## Linking Annotations From c8079bf51c46d09766fba3526f4bedb2948b7706 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 29 Oct 2025 12:31:11 -0400 Subject: [PATCH 172/192] Collapse examples to one --- source/presentation/4.0/index.md | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 829019c3b..c008c423e 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1802,6 +1802,8 @@ Annotations may alternately use a different type of Selector, called a `WktSelec A commenting annotation can also reference a Content Resource, such as a Model, within a Scene. This is accomplished by targeting the annotation that paints the resource into the Scene. In this example, the commenting annotation targets an annotation that paints a model of a portrait bust into a scene. +In some cases it is desirable to influence the client's positioning of the commenting annotation when rendered. This may be done to ensure that the annotation does not hide key visual elements or to ensure that the annotation itself is not obscured by resources painted in the container, such as 3D models. In these cases, the `position` property may be used to define the position where a TextualBody should be rendered. The example shows a `position` that places the annotation at a specific coordinate within the Scene. The position is a `SpecificResource` that requires a `source` and `selector`. + ```jsonc { "@context": "http://iiif.io/api/presentation/4/context.json", @@ -1844,24 +1846,6 @@ A commenting annotation can also reference a Content Resource, such as a Model, "id": "https://example.org/iiif/presentation/examples/commenting/anno/3", "type": "Annotation", "motivation": [ "commenting" ], - "body": { - "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", - "type": "TextualBody", - "language": "en", - "format": "text/plain", - "value": "This marble portrait exemplifies the veristic tradition that dominated Roman Republican portraiture and persisted into the early Imperial period." - }, - "target": "https://example.org/iiif/scene/commenting/scene3/sculpture" - } - ] - } - ] -} -``` - -In some cases it is desirable to influence the client's positioning of the commenting annotation when rendered. This may be done to ensure that the annotation does not hide key visual elements or to ensure that the annotation itself is not obscured by resources painted in the container, such as 3D models. In these cases, the `position` property may be used to define the position where a TextualBody should be rendered. The following example shows a `position` that places the annotation at a specific coordinate within the Scene. The position is a `SpecificResource` that requires a `source` and `selector`. - -```jsonc "body": { "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", "type": "TextualBody", @@ -1885,7 +1869,13 @@ In some cases it is desirable to influence the client's positioning of the comme } ] } - } + }, + "target": "https://example.org/iiif/scene/commenting/scene3/sculpture" + } + ] + } + ] +} ``` DSiR_gI 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 z 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%0AIpWBqF?TpI0E?Lr=X#H| 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
l)mF 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 rZ!G3h(DBB`vuF4A6II#k5Sl>Z< z%FNWo$HhqQtb~hQ&qqbAM8ty&q$$|4yhQnB%syH78)U@Jmn7aRUYD`OpVx2b`%>40 zSXhPKeExk;$RjMQ0me2h$50BP<%UrondINjm|L3eB9*h>r8jjxxLxlp~H<|Tz_h;we=6sEE* zzp;e$5OUDp!IL?aBv$$Gt^zII$KM!dbTeuz%Mcf0DE3IYZISrm2yx{vMS$ViYz1X2 zNDWs@AzBwo54MqLH!+`}H!v6DMp1%;L@NBl^Cw_?!MZ1B1hF%zlJ0Gg`~8@yZNkHU z0{$(PvD}IqSO^qhLd^C%Hs{X{rbb0Yjd5Gw+?je-XzK0e6}afuDdY%KE4ek>5M|)i z+CNQZA!kmDJ;!&HWWTzrJ~r|vzZrKQ3i`exXG!UvZ;ZaWU9iDF*bdzI4$M~0eBndd zG}NDOhFAcv>sf<_P(jS*InI;($Ahdx{&oZnRm7Ik>fuPDQ!&_ZP%gj;dZK|E@#d{` zc!b}LI!=}plZ%P%(^SkSE{VfJtze(d0AE(~%B)G;IJv2yj#-Av_2INNC?3rWG4WewSFCP_*IThA}zt*5D{IrJNq_toe*UuFRZe8U1tq}JVGzfoUO z?5)Y5HBLp{b7o2|>?E`NSK>!a98e6;F$T9uBPL1#oXfS$eTo{1bqoP-{K$#&@X{UI znK}vP03b^~YOx%vn35?3oly-j#S|!PrM-?eDO{&R1^5-`=OoErdl1^AJXPBo)ohy4 zklsmEOOV5X_240_%{ngwrj}cMLkvAmJ=N0l@!$};C-e4te1S<`ambGT$L7S37t}Xv zuH1j>0~&l;F$#uU?W8I4*EhTjc?WGz(?Gk}@6bHVc_-3r3P6`lym=6U+&_Plp<8!h z3kR;hF>VyOvZo}Vx+w?xKDUEg(CId7#-%o$`4xuKa8tun=^OsZ<93br!SYzPYN|aL zt%{w9a&>HVf@S)s#%9~~&=w(Ft8xk!H>>!7i5>5dCXc$(8EdFz*q5ZAq>l9}*V9E1 zNP})0z?4wWO;s+@d~_s{IIGz>Dz-(1zd1azH=2@q{%%I+Axn&_9#%izILUWV)2N9wq0>K{932 z4uM^^h4kv5f}Kx_LQjwv909@B05LWH9YC`XRXvink0TZ)w_}5pWvB+*<7UC&I2KFQ z(>1r}cO5o60yORxGcN9E9-Jd7Dd#Kel5`}y>oepx7Hj*+W^Jv)`*E}ynhrf+kscsf z`|U18g7AD|a)|#X8aX=;07N(3|BRD)@p%;8wMBP71U#WW+@4|YN>LOi)z7N<( zCpmW5{fMeN8`D0Kz~=;wKAzV<#9R$(A`H%e?Wh?0A#@<7e`5${!ivcK45!@1@gbOl zI*&1>PuepK1h>ihEGvrfS_GI`BvwT|o;MlMW3CZ@TBG^~(0VIeiuU|lXGPS8$Y<4e zzR6aN(hy`LMbW&&aMV=MfbtD|{R2$g2vt$H28S2Dog*j@uLLzm&3Y%3sH#P(dz2D` z$zb92DeG|ReoX_&=D(TmoR%dYvEKbp;l@92XEbDGgq*M=uoZn~KW+TG3HE^B(X(F8 zR0q}ronzl66+NLYUpgx2R8ATaqg1>~I@3wUd!OrdxLwJEd-tPx7O!urToV8)P!ci$ zXQ#C`C@Q$rW{o_M0?(my? zu2}OP>T_F94Oljs8?Kjay(dJ~{_y>;r6kMuXKk;P1g76NY zK5CZs>lHxjgfAfKe0QX`zBG2j_VF&WR$eipUK7@_$wtDnGF%@VmRRvQgWq+y{{ z__YyjZD(FrZ67L6x~I)S_ze~){9a?f((6l7z%~`)7j2!$`EPgImWHZE#pq+K23jvG zjTit;NZ%neUL0TlM>gPU9KRcp7*C+I8S{Phs*{KE!>Cc86{Fq`i?yciU&`UpM7kvs zkuhJR(?=9MPUZYV-2e#dt%#&ai_N~^Ke>_Ih_hIZd*x2^9e_D*Q0K!XmEWpW1{8*c7ZNsf;G_QrFD%(h#;&XCioDhtQe!02`RP5iqp_0gFOnmv+^B5tq3X@q zS{e2E9PXvKUI0^9{M?O$4-&tRL3jb)#;0#t>1c|mW3bw2w^83Ghw*?C zYjC0SXM1Mbya03d&B1};4P5cWz`-WBn+7SQ4SH5u_QaR>4?x+etr4J1;jEm7)Z#*$ zD^?2w?0riBp^-eUqIj&ZY5%L$$Ofg~Pr%0zx++p>*gRA$g9+8_l*EG$;~XDB8Ak`nm0Pa2(P9fWO~BB#|Jf5l7UVQL{xMhC&6Kl=ri&>6}oUQhjp1lZnZbss|EmAG2ZvDYs0rnAPiWa(B#yz5^{F?-Z>NgP~}y`Do`M z-b#@D-5Tlj`~>`BjxT3&PlFH7*tSGHZEU2trfBIvRM|e_HByZwaa03p_FmlQfiJlk z2i#aOn(E((xD4eSUQZmr`UYElEoQfBjGfs)q=s3NBRCS7(T$GgToicmah-6K5!v|& zAH9&-#BH25h(7J!anal5@DBeC>vJssazE0@i%DK2JyFYo0dvOE6fOdq;%KdzS+AtbG78J z4*Jj+9eDY`m=z-ky9F~j%B50|tRg9)`$6+JNiN>`gT9Q{py}oQ)O}>Jk9-8$_tyae zZxbw{tzEpS@l+=8&llj}66f21@7v9!JNS|U14{`Hi8%_&kU*sBnC$&n>9un+d z;5VJ7jh3S>*k^YE!nVxuIP$&ErverNvYvqi=NzD2$%?v!cJSKd^eJ)OJzBECk{i^N zau4&V(KbSLOWBP_`qpFv`V6}h&HaRw@Y7=3@iS{6y?X?f2TZ`@%d+T?$XA!4S6NnM zfyZ)m!wg)qp=+7B4E0|7=Dh^hv0lkEnJWgh35z|p8~&=sBaN_0)SHXyc1~scAk*Y_ zhB0RTftMqjD=pc3>j@j}J~7JkMf03|Asamr%wF$M z0Vsx?4ZDr?WlYbLb^SGi7&!3F_Hb!mU+P5UyetE5|A+&^uEZs2T=jLPtxNDXnY@*DcCB4v8O+>1JIqlkRwnhI!@$9~B^; z-+K3&5)kX=*V4zPS0t8y52T37=1Nq~TZOSBou1>@@0GI*R09tn6vwP@uepk2v4N=z+b z5E`?X$vrZdguDVhbqk|h1NjC-y9WoqAei#k1#0=;y>r6Q_Z}Ji5jGImw|XpoJi+ff zhB5IjFK)%GUx2J`|9mcBX)X~uP#+$?bwAq1gGWkL;wVKCPi$w5!K*F7D8MXKl0Ko2 zHR$245Nv3akrnG~FQ<5(U{3KZOJi>iE!hN@IGIsnu=JQnH?Og1B@()I$)ZPl7_cu1 zl2MJ{KaNY1pYeAnPE+YYpo6t#(^L`-u64G zg=zf=Sj6zk{^!mEBm^S@ECmFJVW>VQ=eFxA*FitYSMFB8Ge)8qUSYHWZJ}GCqF$@V zfjjwoICHX~(N=wxa!oSj+8aakxy5El9a`P-(1^TvY$Z4m@kOjIG^`}Af&a5mEwPSZ zrn>w&3#Q}Ex5yTlnsKV%QLOfsLzO`=)+2c zUXsRloC2}ynqO#^J~Ayd2ZUIO9$g&#xl6ZdU2>%7Y`-`|_vt)KcljV6v70#;LWo>EI{}6iNk7mJY-#Z8zmVW^1sM=zZpdEiT4s*B z#d$l8XV+D#1hUGS-kO)|q(c-O>0> z$OHz_m}3HQ*UqmwjsG{S0Zhz0@^aQ2D&4*uKbtCMn7 zdey;lXyAN(;-_~54XCFTS7p#$n+%Zpu9VQi=)(3sRLjl;bHbhoP?+Ha(`BVi%)>9P zvk%o9a^+nO+ z15Ya(=rarSdE(e681_)uUYj2gH^PWf2TLLAsX)avY&>{e++~Llo$eBrNcVC}jwth>Zq3GD@z&SahS_LkpY&CS;8p(unakDk zX{H8S{oIUTd!*?(WwjVK#g4}T2|Og)g02zH=W|Mqps=Hs&q$p&sK3Np+0I+D8F64j znBGZjsloj=4c%3_e{W&*cI~p3{w`6@P;W)EFZW*^U7ediRK4Um>Ocz3NNS8LKU(J( zzWJ%SB!iV_?VhYU)Uw1Q7$rjo`>Q4gH{Bh$w`va5FZ!cBJ6?@Io z@H5-e#8ZOZ&o2Gy=yZ0aUaR|M<<4O`x6}mST1zWV4N(l^{HJeOdBqS+#)uEOR$;+O z9lcpMQaL$u88#z}>xWHFU)J#pIM4$g@Pq5zJYwTdu{pvEe|pSkQ-esS?)$ifQ?m^7 z-r#6b?PWx7zLTIuq&cvLG_Gg2__=3pwMQx{7tG)FZ^$om`1P~$wV-HVq%$N9F`Ml1 z36P%!AQWruz`i>A{*fWVzn~t!f=70Ec9YUetK|40px%L6+08Tlqy9TzJG>Q?D`7Vmb|#iFWukcaVN+L3<)xS)ZUk)UJjB9@y{h(|gJv z26L?e^xP2;i9Jw4KcG`fei+tsVB#AoQPXuSKv4~gSn0F1?|sJ4n|etk{`u^d5ZFPa zJ#vrjd`q|R1b0~SZwH1#o6&7Hv2S4Rn?51QGyt}H*l&iepEU`FOK=l4x5?u)MBk%N zvhM+=ShbuB9BpYXPSi&dhBTN zH#jxYo_E=dwTL9d`q@qwsH|+AJLqOUE z$bR7t`Q!ON%{{|^%_Ev&#JiLW=;SERdjV>Sz4)r|g>KkL?T2rWkfrOwz!THVE*Q@^ zSSU9bv}{LGxlAju=ml~}83_;bd`2Vyml(_yeJF9s+tQ*K!K-8Hf!u;m61^X~mmx3x zNFNa|5P-TY+MIt1y^YWon7}xoS>)3rt&pUcd}gD4^f7u#!8f?}b?2ExF1Wq5B|2wg zbt0uxFZ^?VHXaxJ^k*w@-|;vB7!ct0)OCBN4n$MDUsKdiUmzwaT?1IKQ+XD29$a_45l z)iT9qHH^2Y{2hso!A)@ualWfGCUPDxyosCl1xlQ!GW`+)(O8ZRIj`wq#F$grc1gEJ z^`pQ}fQ=R1*5uF;lQ`--zZXCk$L0yLECQ&!^}xqk2eom5A8IF!OO^)S)p`Zg4{h{t zK^qRxH&t$kR!_+;4`9ks9c_&L>gHqg=K1@&lOe$q%)!=NU)-RGX!!sn;}GGD*^PpU zUBJqp%C4!3nP5Ju^Q)_fmH$AtBGAs;&_*n-d!mDO0Y~u*Hh4pjIrI!fRx< z@jx?)M3-@mW#;!K*S&$z7kNUvi4X7qwRlo=7uLl{#q_NB&wadQJtXu23V6y2LxT-R z7AtI{#2lhpk~aU>Q#T@@!LjbJ<8?E z$Zmlt`cXcIIbu6nxf)N`FbsKgBr~uTlHPHO8@!s@hhkn|g8N#YSTX@tQ~*&||1?=M z`YE{qW6N3h^TE4 zxq%DJGo>y?E}Sog>doKS@_*E7?xVo z2_}R$%602h8{~WQfPMy1f3f^E_dBo4S@(kT<$SXz>-ugaF<3wgYphi32<6?rX!M7z zGRcS-)`d-Fu?RF;J^$_34Dnta?1&sX@7WLl$mz3P=DtmI2$oaH;!Qxt(5EJVpu0ci zo^JbJvZybvNG8^g_wb%G;{;-U=*P3k6=qWDJonq)UH^)0OaHH#uLQ!(6vx_NWNEa4oTyqoktO zRkxmO{FQ3ku&9tI)2qIAKrNQ=$G>|C6|0W&me^0tV9}GZ= zq&iWaNQ-_yKVS_@h?AEuV(%}&tBkR4yq@_6^55F6EK{8FamIZ5viWvKIme9xw)xv{ zx(#3~GMfWi8YVEK4^75lKWwn-2Vk8P`7T~>Ehjtbu?bOe%MGqk4U?1m;qHM~I|-8& z0QbRW3`cq_a34hPyNH`*#AWh>fM6?caS9!o)p3GKA`$kMKbJh0rAJ6|Hv-RtOTp4W zAH@^X3ke!rV+2U@S3W9OJS$8M+%0$$EfDs)((i)CBdIFS(dp65qX$$gPVIU296!9h zt(L!7+zjcd-4MB#R>`whmwy%yP{GNtMSR&C8&9lC{ACGzXx;Ma-a5+%f27d-YVOEN zuaqR2QsTVtXXGqm7q^`5lT5W&@9C=Fl(_Dx1vc z6C0q_L3^_IJIo&^0M0u<1Cgo_Y|^K_Tn??mRfOU_>Omx+ep6j0ZQp` z;T7DSQ_3TrBS>7~EiPp|w>WbGUT*amggzaDs&1r-Uv4`ynje`Vf;U=oG7wI2!5?M? z{LIRcXlHR@E;CZ^)wtotvXc9Xg=u42bcbAF5M z#~+yFQHvS;N2dg0a(T_*btMBOLwuG;ECbv0FF8kXK2Yi+2GX`72q1gie6-PToqUd6 z$FaS%$JgB=oKcIV@rF6yl{aa8K7ns9K`c zM3d!ornF6R@hyvyzw$e%ogjHO2T@?P;3p+Q(cx9f#mYwn%s9(0Zb5b?A>Z~h>NUf! zu*Us%_`-3GwDd;W;iZ(1*&i|phqU2e+3 zeXt6m83*6;4B^IR@EmMxf*?)wh(BPsy71w@ZH2_-+rpC!R~WUuz<2tcxeMSk|Jmtj zhi{X)NVPaYwZN0&6ExDk#VUg+uZ9~gwc7^O>wmm}+%Z5yOt3iR{sELuIU|}Os=~z? zHk-a(_k)&WK11;xmSE_17vke|yxJhk==^@e1})a6#tXAIEoOVVXu}h}`Y*;qUp2@X z=$%YJr#$7j44~iuQ4GBN63K-62aQwEWFmr@xo|2A)kd*)@V%3ExBcLoCNhMdwHORm zN)dXtNc!7x?E=PKW2?&L%|SitE?LNE16XBnasB5G8i_d+3}Z?Uo|H~pmc8zfESRTv z+HwxXBEAcu!}}1^dUA6d0Fpj}8xAszr+rc_G!kIM5EZMBs{)Kqa#10Jm1aUkiVpME z>se1AwXZkpoL@~#L%3D(UY@;Ir5C@n=l@c*?7EYNNzq-C$=D0j$|Gy>?=*xF=Eh#1#IF-oS1pE-!1&qrUX>D; ziq17z(gpx4S7j=+OA|o&BhguDy6(>fp@SjFryYlmz@yWo&Y>Yj*(VGad7F|M%*s~W zGu}fvEvhB0ZlnV}s5FHeBN@E9??%Djl2%&Ig4))AmyX|M(^>49Ir&ABAKodF`>ddaau#K~*%63k}`R7UQ* zmYFYB<>cRpjac!T4aJv4&Ga!md3J$IwCw+<5m-7zAHq73c!qk-Z^(vX8CUSm#e2*o=Dxt?&FVVR$+WQfIvJ`UTYf558Q*u8_-JU zUp*RRW7CrsSh#f$U~g_7pquFA8L2is1|acGi%L1V4A#?m3g>aP;l&k9Gk*}+UmARI zm!r^10=;1k;Yv&=UGiD`>whB$$ius@nSubf3BJDOgtwXJ*TkX0vJ_Z*n~-Cx!X482 z4#w+@snBU7P%+s%M=64vDGsfHmRfT&wblLl}DbCOgwk7Q~ z0$*6Wd5#vn<>>?H4-f!d0G#;KYU(x#^kuU7>8lAkXhqBg6fqoR5HQ=7q8#?e!0^>(F{$miSDoE8CDEI^knYV|TFqQB&CXBWZV{ z6*?fXCtI$|wT?WNOXtli zKX!m3IoDn}`LEH^Cgt}A5p|`fEr9!s0%RynI-O2!o)=>5!P2K|(fK1%A*Z1_T(H^k zS7p>VMjlZpx-C4GT|qM`_wqqhXy;;UU`pT=C$njIM|7=!!2B_-@32vKIBTx2KVBTKGjGMu5=ecrYHmYIy@F_KfGxU z?7Ff)L-6nS08ew+_&;WzFWRq;}{*$Y1+)`GIqUwz5?G0J9uf4gh19Kh!t%Kpi#1d3@Z;C9} zU};bKqF7_nx3rlj(?P~BjtZXE0Y*{y+Oty%^ebi3NPAn#X=(<{N1xXvcneVO00c325>VI1KzG_$4zgNmQZ44dE-h7p>#*ctWK8XZ3`z9y4BL zrnZ3>acXE5WNr?vEVvmW`fSGxkbdQ5;HC7(2x&UL0x+ZEUh*O(zws*vxo3HhxL~uv zIpO(<$`0jMIRpVR8yl6DQ-qzTFwLI7vJl_l410hHe*x@7`{^0pPD-A$oE%%IUCDr% zmUyYjbAtrY0HH@wy0_U&{RD=N%eFn8Z`z_YyXj)>hTwnlQG3OYm-Nr*E`0 z$4tJ9+tXm}v#RP*`hCq$&eF5GmvK4%=)vcX15~O-Cw2kI>~t83Nz7~VLqRc<@xc5+ z4YgA%)17x1!jMHWCI;T3hdu+0n-BU$;A->lbPevanq!w2xPCVsWo|ch>({$rcD!CB zx0Z5PoB`(BlOr4hKh!zf1|U4kHal^rwm)J1NCNO@+i5xo)Pw2V#)paz2Z(MV+c7tt zY=Vm_XN3)2-kTQFraX;Nn+QCm!p1%4^m~J^_i&J|bb*+`G&* zgZvv?dbNr#=+!knZl33*U}#KRWXF*hBQk?~@z9gRhJ$ z4+G)?mjIbJ?aJTDTL!cs6jXU1#+zrE(x)rHZF}S%*kY$$6!l+$$@g%nnKKt6Ob%DJ)6L zA<}(?VT&dZl>|cMS^AP~$oDzmH@wCdv{?%BER<{v0C2RqlDg1)?JeM8^VXYz}ejRqUj4qsoJ z6gBblM6PXF%TpZd-+}(qOd_wWi;SNriWQ>Dl%RojPLIwuztM!5P%HHaAh${4)5#x3 z^4f|pH?xE7XK2xM<(=3kBPs`rGalAxNa(wPbdW3ixk|TjqS~Jl7*}rjCGPM z8(D0pom*VL=4P%>S3Rg8cyKpYf>_;})0VG0wxJP??CHLy710%e1^n>8Rmb*q` z^lA@-+xYo!a6_UZ8&n=OQEnsisHcFQl&4a7QrCoGP<`dMJ15s*ZZCp`u?{H|}j^q@}4)vXc5J{YLs^})dC`k$%#uDP1s(~DnD$SJnlTSuEo@^1 zP^f0#K3s3$__anCcnqE90qGP4WhxKxZyV(vu<)zm{SiQrK=U;Pvm8&6bO@o+-O@nt zGMeyYjJ9yFSnUfFiEfHlTtA*ohc5Q72UNU3gksGUDkW+zBvK-&M5s+Yh3aQAZF_Sw z`D6c@)DOOUjlR5H-GRsZ)rtBTkCqgPu$Du0hwqoY{Bn4ssrzxfFVf=`b3!TC%oM}R z*0!^{7UBLq6Bf)9am}}4+TfZ&Sv#iw0y}O65T2)Pg87Ow4>UFdrU8(=#Bg-k1@)&y z3SnVjZv`ipo?ij8QIC*uk3wM1g^01qm?EMJ%e6Acyw_+ctj`Y!bdqK}pJ;#rw(3Cy z4prpa38vT?Hmc6CLZXQ-R9KJx@j=p#+sQXY^pCk+LLP|&ytW`iIJxH-5U>wD=vv>d zJCX`CW4$;&_HFl4evLtV=6`^YZ2@Skc{5->=$I0lCl1+If+R<9rdzXmq~K?I`7N-g zFVM`3&Dt-2IZ)Rt4lSJKiG_C+VV01Tl1YmW!Z4!;xrVmtynRj z&OXCiVQ!ehM4v{I<7YT5JQ@&->Rptd|j8FOYf_|s- znY5Q!vNqepuH-mPkLu1Qi;&fQ(kJ*Sx1azpS{m}S#w7wi!!jsXho7XIi)*FpqodS+ zUpGFLLu z2otx2`i!7o9u?Lh4ZMpX=)cR=SNw|oE&x3}`$Q?lfh}(1Z*IjHOE{ZL<0i*T8Z~_0 zBAbMn1ZHI_xJZ}=JHf?oA#7=QPMm)S`kIwg!iu)Pi~pq?z2NMkyjdZO5-ybQx(WM| zkA4|Z@=WX^EU5o=F=bUY&S@w3Zt<~pJZlU`NsRUphzIdfNo z<{e?c!%X(afYUJO^M~RTLQ|Oi8mB}T0O-_)D@NlwDYu19x@y(TmeA8)Y?QkR*fqA- z#4W{Xt4*a5|Jq+@t!u0*+%^Kr5w@IvQn@W7mHa+EO%J}KzPmW^%=M9`uWlS-XDzq* zP#%CBr6(NO<$Jy@kQ=dZ_Wqy8>n8l0{|Zr$`!_pn9T_l5Asp$`K(^Socx57+2U9VY zE6|$P3e2hYp-6)6?V_r7hnMRqc3TxMM#8cV7_S3y493@0l|`bO3HOd z99A++W~!C&gX;0?rqm#Eez*X0%obs5uDFYRdP(gO4}u;?4z#sDtl+iFB zM6+7sRgkbr5)Dw(hv$w=G-KB4=CtfMW}D;!%Z=-FFQl2`t2l}YBK`$GiQVs)6mAio z(sqC-yDqC3DJg;M6*kK>Wn^mv>Y<6M%N>AZn$|=0PvJa{BjAQEj&90tzXd?xp4GfFH@)X6R2%&Te zr{CrxXGCQ7X-dsTZE#%4?=OvQJl*RLu&P(-4LF#el7q6y76er@En@(+2T6XdEv|Gr zu}w-)+=X9oyE^RDyN~)V(4g}5TKkn{SF?^kjM){*fE5T+9-pzzE@jML_W}CM!Ex}{ zBG@(ZmR!fXVkv;gSz6S;nc9@xuvQ&WmZ6eH6ESByNF%tM;3YES?i~bF)VF zeXi2BS1ZMYyGqyW#_r}Xk9DDgW_!zJ(hD?qQ@%qWyigcNnjb&h8-pJ*S%o^ztpSIN zNe3t(qEErRI2Bc;ZW3)P4#PKWUua{uMZE!9d9CP*jSYw1ft|)(i0pm2$FN~blP3qM zzIs_ZK7-p5v_^ki1HI*$t=Ts4eaTE49PJ-@_BzJp(L-vpoI29GRUoYH_-eI#}b zzUKUj4pTlqk=T1E%pgR~UK&4z{edasZ)>^Bzo->*8SG@2KdJ13R_pn*2LS!tj4aA$$w@hL6H4V_Jymbwe4}iungKe&fswfnk(p z!NCReB*SI)#i#sr6`q=}{iGhu9oaZ+A!j|#i3dnUyB3O&_I@}010?V6nYD1ukH}n8 z24dcJ#xe0V+2X54Hr8NIxVdsiMIUsJoPZHT26*REKRN7!57v(H`3njQ$(@bWk0u=# z6ydj*i4qMzH5yL@A=EDbN<#Kb4#Jw2mS1?$z?)V|i8SU*VVDrn;TMQWj1 z$m}xqS~UcG))x*N-s-RhKJ34e7opTY$<2OfZ4Ana*M?Btnm`=>(?<^faL>;$#dumP z7;M8*&IXrvkH^)HPH)iooV{;HJHR=ES)`o2z6X+G#MxsY~{x}dep?vFz8Ak3BH zAbv<$d)1Yb)_wk?^bTv;s4fMzZC>(=p$c03Yi^Tc0Brv00X6Y3_43^fF;Ib6^ zWBCT2s22<->j>Nrk(^cRNc2Q1` zST(Zii&q|z2LjCOAtULVdkB$m%VHu)Hm$j%ALzmUY! zfX(*=rcq=+^RIt^o99J3C4Er*P&QJ0wyV&-FdW14Ub|hzpHOjSZV8xph7e`&l z`XqEw=A)n0Kwf)#L8p+D1AlCT)UJiF{}QIV+^mAO9(kg5Zr?$62iZdNEQaI+U*Ge1 zr=T@uPfrzuZ&Ss~?GTCgG7%W@;Ts~H%_~vK+gRroy zl(675i;hJjvFRH#fs_FatyRB7J)CgKo zfkZ?^3z)hy6_F88WXOn$h*lu71w$f3!j23HJ2E2# z$R;~^K77B=?-~Ed(Ie+@PTt&mU*oI?rILH`Nw#4c?9lM91u=)r4!A)LMks6y$0QN?-LD7_R|-lJr|)9h z+LCk!=CipjyB5AjP5ZyEqJ0T&i0Jgxu>xLEi2O9p`xNkmmPpo^wN|op-=oNK=-=m^ zx~DV|)3D7DmK`WF_2_Q+O)_|*3j_8n$TdnJCMcavC5~XXt!rF;7f?sihl2AZf(mep zXmP@y=bqv7Yg49WE9M?ko+MvKa4hxA7Qh}L=kC*A+|xEjDO*L)JUf?8C zpq4dKr~S*O#)l>6%Y)$6bY}(Gp=$AmrMhW1F#9CkL` zn^y9exTB9ebnwb#5r@~|q}1Oxleruhl6sK$CZG;7y(Xev1CSBguPO(=R+)SEAY{bC zKhinx>PDb*{oE&6S~M)1L5R@Byn-XRw%BQRz&7xO6xb1%M;GUax8tnB{K~_^+EFrv zj(IJud+NI5$ZNRsw4U=+#L4l)?~Vxm(mgVV z=PBPFdRmmPa6VUstp_7GP{(fDTvqDpcVQs6H+hL)A>!HP4f3PQj`iPuvD>A>I7|u( zk&aftryu%8-r!n*e#3Hy(f3QP-|nb@!>tW6?OlDR`z9|T@PrKr)qq@q1Ea6Xe|IQO zW~7rBEN>(9FfdTr8<8VDC`ozOCkD8hI+;CNpnSv<0X6z3rN>jX3mlU;r&#J?W3*M4 zYE|`&|1pRFs{UlBUySi2`bdA26!lcVmtrKlHGk9i^6vz`tTL(IkKjbQ{@!uznY)WE zO~zkn*$kP%t4|Ki`!^=R41(S~eCAS@_WQVV*%ysdLx=q4a=oX+()8**{3Hs*K62Eo!(lHjU=8g80kar|$~hciL+5j^oPU<|kuKh_b7zfyv^v z$K*Oh;@hV)rxO^<>gQx09M@PRYD8vIWs}lwjn~bqa@dTeas!3Zi@zD<$L5S{etxdUF zj+pPqooKF87izB2i{)^+2gZb6t_^&$=Cnil{JUg8njtjw6GLA$lWO@%kqMwfEq?7t#Xp4U zf9_fxO>yadyrdIr_C=Ciap1Q1fQ2ftJeB^=UA`346(7Bt0VuQlwCFZgaNW45*mKN? z;RMN$ebO!VT1HC*_dzsZtO+n4koSel#ONxHu4Tby&7h^UUqT)q}sY z8t~HY9zf&)w`Vs5Nc-bY$quDZH@UQA*PMa{?xZ+|RQg}x$<=B0fu}s4lm1(G08m~? z*jD@JZ#Co1HOuy*{p*L3-+i|F@&})V&$4#}DmP+~#+h~>>88LSGlcb{CQWa&1_qe@ z%3p(oqR=l)Mk#|b;shopC%0PB5YmK z0jwULRa}Ksn=4)^Qr@v2LzP4_)y4fuO?KTOx4-}P{?gxazKJdmqGR# z{sksfZtjR}*|Be?Va*nSMoBq~(27X8>f@7St-P-y(VTJw92}Lg+>v~tqH?KjnKD&{ zn|)V-9sU%7%Ol==iaF`~eSHeYZPJtw#r)P3eI3-(^P!7g{qzj~+xqgI>c2}5AYN## zULM*sapzRn58(CCO49Lq_%nAJqSQNqo+Gs&me0nB&O`*k%a9&Lx4?4A=1_%EEyzpO zFQ4d}0)DqTdsfEg3rue_iO3-XW&PToxE#N=5W<+LXsNmFBQ2^YdwNR4yOs~IIwTP+ z9{><_NCWca;Q_ZM6?&N|jOE0qq-34&8JS9Lg+lf7Y9&L|*R7oF~S$cT!2DsnzeoA-%Z*NQD zCHAiduGj6XeiJag*oyUA2M{tHr8-kPYNl`C;D>E%Q3uD#h6yB*`v(&HgFq#ArHiBb zfN%i3%{k+p_-W8{&Tz#Je1_94 zmMJVN8F)NyXSqR^T7A-@gw>e2*IzTyv=?|gV=1iCu`IYSjR<#8i%~RR!yxjkG-nZ* zPgI%$-X}LPnGP3wz1{TJflP{$AfcHXd}~+>d}F8+2|3dF{Lje-&AlU*j0h$I7#?3h zxT|3k^bf8&ArFACQ=bj*53lolKoD4efzoU?xt zeUe61z9Be;J?bA&Of)Q z=_C#Dod^E=&Mt)q5uHQlNwrF0gKm~Ej>P}=PZI#aHT;Vd?P=eMcQ$kY8N3c=<&(P} z;1lAf&6Aoemr1k0xl@mAiO-PJ4e)2!Gpu7J9icc^+_%-QRSRoz+g-vMj_SZU2D28j znupy-?^zh6iL#d2X}F1Or+FWlE^2w*W~0kDRfkVIoZJmotg+jrK1()pxkp6O0dt{Q z0CDHXh^djY?1%Q?$v~$B9sTlBIsOjX`kFs#RG%j!SfHAd09f^Vei~z!y!lt5-b3WT zYI*!%&Yc?S%yI?5BQ#jnyAj_I3E-W-RD;u`Cvkl-t?EFj?zBT0c_wlV=Eer#u?5G% z%hH?lFkh=#%_Y`JkFUTB-AQDT8@Nx@{$_3U$b@P*4n1T14{k#S*P^9Co+3I{PV&bz zf!+c94vXWGAGNo_EB`54%(IYaQlpNlI;u)7=GiX}Yq1XvR_o0aBJ#G0Yo0S!Y4xVoi1|&B zTumDS!xVp{D`hH&f1#cGQP6*^yNzb&5wf|Kz%2OjQyi4&ciXxfaGj&%bAj3`=N+un z+~}=7EjM0?i-GHvmp%+MB1iVh5!H}g6n#h+4)i;VycnMavgveC71>0?xU+w3** zemjk$p6X9~^FLVtUTlTy1Dofw{z~%!NVHq23;Hhi^i$cVRmHJ;B_LQsUDfl8ldPLB zUVUY{Z=&`r(Nt$fo2u-Ivh~P0#K14bm=P_u79k;=Fu9|w2o~(br07IgZ$Z7`@}qO4 zaD#*Pg-en3ptQUh7nN0Zo*N4#ixYrs@zUl+FFZ` zgd^FQ&{q2wV*m_``eqVy&%J??r%uVQ0ZAm*67=qBz^%CG@vdkzx`lN7mj`%HJ)>T|qy8B~Tws!NKjsrP$J|sdr`cHv8I$9Pl*_;kQh;VY zkXTYp>gmJGs!Ah#lRcBMRUe>8*~IE0M(fAU7%L)~F|4qj**<=~u{|j`WTGfQeA*f} zu{{C>2TS>}Sm{^{bBH*xB{l;&OkT)&9uQ4FFcu?JVC_-@CXbKnNU%Pgn#ZkP^LmTb zDm_F+YG!Md{W4!vVy(VJHc)3<7eo`3iW=jICRsTsguSbPJK;*w#Pk&s1yA}4lUoy%O1p(;~#J>%DDk>5JMg1cD+kGIS)290|olXp7gG;|oC0-V& zt^1*hIKMZZD|@PDg}mlwBlaq)&uCa*r+SgP^g>#<_O=#KW(rkj)bA0HjtkN_yyAkv6jU59l+};uhI&Db$S}xZ==(oCu(s&NbB;yU2#)yxX;C+FO@;%>s1cV=H`K(^Bn=aOQew)zrF;Xo`~wD5ChY zLG?(qSRwhGES0Fwsr}bse!liZWkxzBjQ?}mY%`fFBHf2vvs;Bw-Sf3WjFb*5y4sRR z$G7zrwT|>G*|wVLWh^{t<^Fvg&N}ct`xH1k4j8nPaaI%Z#n`QL%A&Ijml_+)val~`_2ucCb4jmpN z+ELz9g$s#&CR(o%=1z4x1s9_EwL3Tf!Kgl*24~5O5O1IC&14;^nj;-0f2nwM_@DU8 zHTy?e_O|sr<7EE)RsHoapETYCLZFwSPiU%{cNDFzxy??JPQ|iQ*j4c4(+4NOiS}V# zaYoNb{^&rh!Z{y%)xqnxyv1a(Txw;-xPqROSOGlXr^2FWCRcTS3>1QEjN8~dS+_yl z-ODXd`eUBg9VTLD^XD9R80l7mEp!?~jt6k&efuBPv_g$l>69+yrWqh#fVq<2@zbH- zEx{n6|3zj<+PB30k-9B*N@1M4ekp8P%H)euj8qOGI=vkV@p&G^d;|o$=vZZy}xf z2mypF)=s@Ll4-chfQc*cnnvJ{L8ZH-JENokRcJANJN?6gJT9tLUlKkyA-R>+@)pHt z!(3>&zbI4uGE&0atuu7|DMhMF3iA;F#^ zU=dgI9E&}&1@L~2ix{C9kxAr?+nZb^AM%miURrb>dl1*Z?KN(iR#$}r-qQFnqHt+Z z@C0*Y*M!0+<}77YZPvGl(nWaci@r&@x0b!IQZ|vT8o^4>G2yW#pRolgnZ)d8v%wMC z3i6jHL4s`SF0x;;O7KH9&;THlHo?R61C|%eFd2@XLu%=vf ze&x7p|9Zd9$fI{w-qf#}?5x>v->O<%qpS`fG`nslfT+jWm)q!zy6h7{m1I-`vaPQ! zcpv=|B82GzbyeJ{J2{}%3;(UYx`d_*8{ZfkWSTh;ZR2WL1!wZ}ufiS852oYN zs!nUNNWdr*BnrME9x(lnFrhkq?}-oPKf*-#BJ%s!fkQEQ0<+XBFEvpIrxpX1b{2I|GUKEBA{CId&J* zA;ESslijQ3lq=+}Cl(N?BwYSgWR5%E1L+{3XNZcSxvH2hRMmEUmM|;sqgVxcJ)&i4 zM_=M!ZyC2;A3lGd9FPb~Kq;b_3d4W9EyRI8fNosl9-{xC{wdkUfxi3A*I*x}@G){0 zFTuqn8TCCzjxAl@xZ{&cUJdZ^$~(|@M_o0c;~C}Ql$bx1ppB;7)Zr@%O6cLaknrns zqz_TwyIB4sfLk{Z75vH`5!MO@!5%}VBeH~B;2p`w#2x#<;(gJNj4vuA4LUBGu`yBdR@LqE5hG4Mq2`$sJFu)u*^5S}XxKtuS066WDJ#o%usHlzn z`B{yc!qucJb8I)|&=l7Oe80084$@HvADYUn50I{Eh7Mqg*a=%|H%cEp4`GqQZ&Dv7 z%B)^zyhWAnBpnY~@`5xc+x~|^d`N{nj)4J%1ex%6CD-docFcxLI_MFXO@ciom)Xw%0IHzBm<5iH4i)!y@#`>+YPgI;5ISclHu?~6;Is);xzAN_7*$WUm4A` z1avImfpkz4R)ty~8jm;kl}Pq5WheKW*1^N3rbf~)q7SV62eTzWzkH0n3gfHBr8L|7 z6t-#r2;87*=HmXDBQ!6lBiiEBJ(Dyms_d=*vTobEnk9cZ2FL#aI(?85tzMEdpnEmJ zOe(HHx8J5k!K!w9+s&MMGQ9oBW8v?-3Tv8XLe0zCuNEnb<`$%MubZ9revad}M#RD@ zdQKQ!pk`Uj$rjZIarRJE{&*2w!WCIa@^dsxJl~L81OL8OGk>A%`4?A3I6-RkdRdO$ ze}NCqw=5x)izz>4kDbci_-2f#jCt|8(hWYz4(p#=aB#jgs%Uu*3PD?tT1PG@Yi!$F zT|}SgpQB;znj_?Xr@H+9KOX^4>{TF1gdjkIb-|zfo?OptR^@b>%{4%J@6z&BrIf#wjSvgk#4BgnyMMGd% z8Z2X)QkwMSEfrnRDdog6P9I^sQkRqyLN}}{R3hu3Of||Mi88tn z^=>rz&_uh9cEAR=&82(FLo4g@Yd2dYU2>RS2s6<(#PPDil;TxA(WElF=k9Q2)tt3E zz3&kBEQ<*Jo#L{9tYyBEb8pAOCluMitni7~A=||H1vied; z4$A_$%SL+SGX9O<<#rwIzSpo}b#?GOjEh)1-x5?aRFFWN-RaVgqpE(NxaMc{mlj)a z+Pa9l5BDba|ISKhRA2glTr^2bgUZ?ixGx)V7V$msmBzz;!XIRVo%Ma}Oa8=T5f;nl z*y@k$Jd=6C4W9=5wgw$;D>y@Gn7`AY<^?0pzSQeAyys+?<7}Xn;Ev&&fYP)p=y@EZ zgJQ5n)#GGfB{9SNTo!qzU;b46IWdm#f&zRX+ds!6RA0n}P=|>R{esTUnFVBF z3>9!F9y|AR(!wt6E3R@t2WzN1=jH(j?5v&DLoq;ag;%L>=Lt~n%@rgFy zxFWo2PG@Kp?Lu_8IrArfxef&9qJ?OZ2%AtoK(;puDZJG+JJW0i@% znEA4PHk(m2)_og5{7Z+f9)rB|=( zc3aKkC^z7LRi1ARSQ2!F!|}_K96Z1icN39B-$&#xO;=N1C-oh--dmBu+%LCC`40A>j@w!rvWK}Ya|{>~?Jqfc76Y(F$;MztIb(}NFHL=4xhwJ{ox%fT);>VG9-jkg zz9r6sOdPCQ=JY`ZXwkAh+`FoNS^2 zXP8|2SD#%_{00n6P=hppyWI5{!PzCgf#?)&LJN% z;+)6GMG=4-=Nyn_(jfmPBX*)pMR)B_7g7g*a{%W{%KQ&Mj7PtmNM*cC@e-Z3oxh=J z;eXLg)w$`sjV~k$A2;2qw(XrnFd0`yyD9fqepr_Lsp5qLXfdhsW;;?gnC!!Zop~(5 z@Egea(oEhtBto5pxwAvL#<|}@=&=<(r<)h4ZPYbxde-fSduTkjSUM#&KBa2l>UmnlWU*t}z zwVyl^>76Xv`Opbh)ZHU%X1IJO-4#VGYk)!lkk4*h05neCw+0j8r3_#bvs}R zQZW&c%S!A@RZ6k#GE|NxmC#?f{CdWA*R8|lcVgchVV#bK4~L`8pg3b;3{fgLvh;7% zC3qp?@5@~qFMJV1{gC`&@4e^MfIQDieycXrjXnbCXxk2MOy9H9hgsVd5FHN7GjZlK z{{)zxAQzHLHko4!As*X;ssLuCxQ%~&sj-VpCtS?~+=l`$%^3A@VXtD)C=V51Ol)&i z9+CaFYDLZGa-r(o71(?X>`g#o^hf@wEx^CF%fTHWvfVukR+`9To~}_%#B6OeiuFY) zbV^fWz|D7XXZj__VH%ASu}|8nm+*f!i3m2gITN4jo&cX$ddz;E&1Qj~g)ia`*yJCiXGy6pZx3}B zM0a|LN<*eNp57@{eAIjqlQa>}wrAtzpUk9-zw@0aqeW$!9)~s21RS9b!Vm)PQsNNa z5%!p={|Kl%cwBM3K6LrOF_(@JRj}9FKY%_)>{ts=GShu64Z218bOS+EA=&Wy>+aji-&iEl@-#gU*k3A~L#OuN zc;}TFdez+SikIR^^XFAQL#WdsD+Wa3fp;E4h;GKJB!*e=?ZMTWAHEmBA8v^Hcf;I= z2}g~q-0kLN-C?5G)#R14EAINLM;Or0VtPZZ8 zl$5Fdf_tH#NZt4&-KgcnnFdQSw;cI~{*11sG+APW%fA@u92^y657@8a0c%=)fC2Fw z6DD#`UXxI?F(Fg(or1*p4W0h`{S~j=1GHP(#OvFTZ__~k#c`epS*w}cX%)aE_06){ zzx%+h=lR*J==dj;>m25VYb)hdm@*ctz4PN>pmG%kx!X+aAVj~)f1d=?FFR*qsyw=j zLYpyjuHl59Q;qD>rd1Wz`DGOn?BC=4t+k0Fo5c;!S9qB&DG7Lu zQdTj#HRqrB`XEj~F1fVsP-A_0Rfj96zG<1WO?7eRTs06ljj>cqvTJ^!pfxuT|4Keq zjWffGi5-mgXaX2goN73|m?iXN(XG#h#cGs&?_$Q_=MZq>B`EO2?+xVX!Ly}OD6)^J z;m)N%eaK%wK=0HcU|Yrqb)nSX?gP%m`zTrMTuFF6?7pp}H$D^Kos>mT$B^6F2jDG^ z8?X;koK1Ha1?&r6@hF;Y{jx$$-rgw_X436*y3GGhW(afBLAvSJhI-$;>%fgT_v%={ zdjDC0Z<$76+mMhT&8xCYiy3K;iC%_p>-8bRpI=whr|ClgIctDP`HaBqQ-;-E0fz6i z<)Fm)GW)rf{VI=u&CKOv!`p#s1gc0gYlJSREuqjen-fPahy+SI6rvFOkD)59V@1Aw zAJX>m%A_tbReohW69SJKWTNIB7F~pEXQ@lJ=V9pQkSnQnKz+n-*1_L5j(A3x%LHfB zma7msE26_Z2y6<4-BKUGZq)~AQd!Rz!Z`ys4>hwA2d{#Kw9}(#N1!$t#|IHhn6{X( zQ!kIx|8x$AT+e$?yL@xJD-Nhf%gUT}HKm3khJP@=Am(TN!bM_BjcIh;FVof!trhDq zMB_5>d$Fi~50qm7%IwcL$rbjW)Z;?y3B_Rp;x&t z;mKqEd8wH%aozrs1*JF7Xu+bt;^~yk!+A#HNBmSYebJXPCvlFl#^T=p$)hZ)V1TD* z!i`}7wYhc+f`HiweOB} zh0l&H*FevOD~a?&V^XoJ-z$;c6o{?z!2TSjF~SylN`gDGIJRPf{j`~~r7+~`)_Hwy zckzS$owz2QdYOl!;(pxu?egp6Tae!8woWvyzV2vq_CGwgS_c+e&?6s-zi(*EeXe$M z`L+$dQjR(R5webTLFZ}jJlb|hL=s0N>NaJZY&>@?tH#S<0xL!xd56m@9E;+uNs z@zSwl4zh2`*9?fZ2{X9-?rC)W{>7x&@$&QKzKdMMBfkXH7z0f+2R5vWMel;d0J+4z zt?4Cp#JPX>Qn5^b8cpiGAMfv`I_{Yy+4ehG|e8KE__}d$m@!_2@x^x33_tqs^5Tr=?M7EwtSx0*3 zPJY~Qhp8e|;{R1fJ&$GlfvMkx>WZiRWKv+_)I&rcI^vVLDDm2*uYqU6+vN|Hf7-u` z*{yxRq-jKiShMea#3egkU*Oy1N@Ab#5Bm5lhh<>31EKDtoPEhte#K?wEzh8|lF4_lsqpW97xv8L z_j~~>q5>~~)Y}~ZVtf7W!FBX(LxX1Rbzf4E%~(2V?8B+BiVuIfa`ILMo!k*`v@^1~ zB!3Dxv{wxSxrG~45eM`}$;kOTlIiup_D_15F%c7n{RQmpxcu9Ex~hnKXRK;1Xx2=3 zztWULjwoJ;uS0y-y}&ABO!kpAz($yQfG*izVr*Grh-+7+a3KTh?vd~9=jM-ReOuRF zoF6cQlX$GJ8<98aFo9wF(56@!gPN&G18hoykgD_+Gh8q<_X^(lT@m*mbwDXKdkubZ zYAl8xtoWoeeoWl}!3m1bPt=zX-yd8bjcfk;pqKdmcNU#S%C&(s6TuCtdzzs~D?`&3 z-4*NxomG4aV@gKqG>mRKPM%T$xE=}euXc9RGs$#9@lD!sEY6_S+P~%4%CvDDRTJe}6dRx1n24(am{qay?mcHkzZ~*38u?e^M2jv z+jx{Ivbb|U8A{!vSg2rjCAcE8Ir8NeAr(Ubp9Rr z?;c2SC$lX{yE$_^n(M_rjMoCrEy2e6nWwf2(G`aX_37*91{tYRmyhh7yafEkvQ3>Q z0G(t!Nj?+3S<21-KuWBUxM72Q^ibd__3_e*XNIeQp-E$H#^F3{ZmIn$lv%zV zJDA4rG_A4^AoMZ_l)RneP3LG@nlg(=V6- ziMQM1R-Y~VJbv561hLWJB0IHODYOdIb~J7po=(gLN~d5$}tvHD%WWsbgS(o@1ahAWauo1s}jD$XBjafoo{UV#tWcl)uL9m1zMHN!^O zdTvf%fNJaMk{$#A#zI%zMQLlDmhGn1X_BTbz>e7Elfve`D+@ki52h{$)FAJMZ9(2> zar&bq{QJzoznKoacAw#BnCvU({rge|?7ZMLa~}|4?+d`q1HT{fJuh%}d%jr(uAp=O zX(}2xL(0$;QRZ~7JHi&|>>}I^$YWx<$zQ>>kfv~uw<3*IBx4JK8($$uAn3rY9YJu; zpLv-PcKe4{jQnNb444)4`u`8i-o%r{6;gRWR~qT(h{(f4h|V4_O5`&J%E@!4ezky7@f(=!qq@fac;xx1>hYtI?g zJopN_9O~BvY-`*D75pE%r!3!qB?`&&B)KRKFEXd(1CuYq-?~j3G~ccr|MIK9tl*+7 zj%7&We=ff!`BidvS2@Z4{IaF*X0sYoFfx&lTO7XK?|j}a-Ame}mBNwo#v(*wCima7 zVl&GjS{B4`O{3EjJAK)^*q8v-SOR~a1Gs)UOJ`V~#J&>9JpjCwpC9`vwql5t%3p-1 zcR#v<|7?qQo>q=dsdf)`AkIsi-L7sO$Neq};jx2-X(Va#@&o4E@xb+#n`tEtv8#5{ z?MEoD1l9c@f}OU5?boX~%Y4%58_)N*0lLw-vinfw=Bz88De34z^>DlEu~4R$EZEgS zCGI?;ugXfaYSox$<&R|hFqpX6Cw&13Wo_Lx=O*ncMD(V4EHi7zVQ*h(IQ{wghR~D1 z4u;g#lXDB=!3Z~kZaASN{-mb*!QfcY>0?e#e{D_}~+VZG@MW11eJ<*oqoso&bNs2tD1sWZ%}y2nXyw zkd1h2>_RE)tDx_=p5#FSXvby@pj!C;2wg0aKWVu#FG298?x|_*Z~m z))p;-mUV1Au0xmVTW%2tjgSkOK<2Aq5xv~HifkNth*!xVMhU&R>$MYR0U!UtqIB)p*oHU|O2<_V&ZOGR68IHuv z=6ny4f5!>0?g=@SN2+a{O~}=4pjykG-vN|ayjaz=N*sVKFb5YGwUlWb&UcjABS_5N zMjA6#;SbqkPf)x_w?)4%9f3dGqxotfw)!zQBkiZ<_prW?Xa2F?#&MxfBvVt!XOmehGO&|8;(P}8Cg6QoS#u`!ZgjAt zzZLx%lc4E8mf?!)vD?&#{+4r%pbbQ60l$j;t2#uRdWv``#kj0l;zm|v_JwPg>Cm?u z>YQO&PGOFdf~f*#LPS==|F||%9EFc+{%bq*q|0vJYrR;o z$3MViJc=1K&aa(H8R=e2pEBWjxZq}rZHJBEF4VclUXKjew~5Dn6X%TJqqaXs;nV_e z?E%^vJklkpwCi2x6SN(vGdu5X2iga|>k>QOfqUA!Uk3=X*C#jgl=fY3e06*?%i*m% zW}^RW)d6*{ZdLBYm8AfirOBnU8&QdYE9(Gw-)Y-x;|C=V)~r~ar|8KLTI7HBHHHUh zs!B?R;TNES~@oA7mI&nt@VUJ zg8h%tLp9bAOV)pk_GOXnOfKqJFwzrP;EZP*`VR$a%MdT)`HPPMzt7?VXR?0`<%Q7sjCz|SHFL_=A)dS(5 zIN>5q)Lj(EA#Ha_*Ug9Fme;l%bA)TU9=cXA`=}F9&(Qt@BxaO&M7ZX3zp+&7 zCfl%}T>?^o44OfNov2#7UH{&o{~UXHb|VBg#04}4L%oD#r5m7HSw+%6{RMp82wd|z z27n?+xdwfF{O({m*O1{dtBYiqVj9dM!He8Y31rb}^jNd}*Iff{FiDYknws8n3RZmV z;Kkoka615)h~cO#m0<**K2cv5x?OcE?}F`Q?R_ZshxUad%qz0$k+E(%ki`l_#(ACt z)+BQo1_Tcy(mu*12!pWJ3On9E(sG5vV29r#hKbyBO5}r@MAc!4;@9{iBn5VeI9(86 zRd}oZ2Kx%og2?7IeCmBj)Gl_JrYx^19W@M{!|x6VZT^s=eJOEqMToDz5ECv}7Kq9g zbR_HQZHh)W!$KW9KlhoN2Z$=7~J7&@7)!);JZtWf@n_ss=i>%f74KO&{&G11dd_=2G}9pz>a%~%{id6klS-xhBK+J7*m%WaohS7+K_L(~9O zPfzpd7tI^8=JqRZAe6naoK&^T_)GZHo>>1EfT|asv|&XfFFJntF2NBFUc~%@*{%NzXYF-}=YL&; z;rCV5syiu18~R$p5rsNA{{;CI3chyxyT%p~OS!%I#Iz$=%s0u%xLy!VgWt9(mzUN- z9Z`6NR5@@bylS!r$kTWeZJ8?MXTXna0{D?L$WOVr`w%=>>uWkSaP!^h^6T+lkR~aBO|e0Of|y>=t>O@j#9qKpu1b$wc;pq{g_FzZgYWK|(*?@cFF$ zPAKz+d9rIl$R~$#YFJs!qFhFq_jQNCnrR~oBGZmNtvn=JSAV;%F!@tWUcXIi}8DeVYWhhtj-OXwzalxOIk3R@i zUG$N?i2hl@{h9tSRDCF;gy|}+Du!@Dz-M{={Pu}B0|4Gu`s*UcP)A0dvFfGchmbo_ z2EoW=gJ;#$3>KVO-1#I9WECmYg0hOZ{&m$`Tv!tk>*#KpEXYFOW_qLdX7i zF(fIUUX%dM1z7cai2_XO_&_BDv%B#jUKc~W?jT5ivYqE5ytU*Mc$~k|emn zsMEg|$-hM8DFDlj4Rzeo9~SdB*q^qDY>}Rtr)>21=7%?xsYcM)p8#xI zp$}1&0Dl{1;tG2UNgVzw!Q~m$p$0Y2iM2u)>EX6RrGmma;G*p33cAGmT1Q?OGb&g!CcWn(po4JhsC-6j{;>IuA;6_kO!-J!8 zfDl@l=8Hyx5A;UdBd6+yFE|LA-MeWI+#)liM9n&f^nE*lRjNRv^+Qe$6{m#gdq2g> z{N&fcI;nw7k?T)aU>VVu;J1HFa{%8MF)NMyM|=_Z#hV=DOnkPMBSjXrcMsssXzuIK zzWLv1$$WU;Xj#xY)Qn)IIh=IyPtbW5fV`j45&)_>l*IRLCyn zyh)7rvn8r1W$wPA#_#;Nku|gm8&sb%9^t`tDdi=c?4ZSsK3E`nZASK63k9e11xZve zYkD=Wh^ce-(_xT6)l?*=vVs>}BJ)2DpE^FEv%giZ9{v4^@wK^a{kU34;MP5Jim%M5 zgMepBb^vg%e}8>69|7Y7fwZ@jW%m)6{qaxH3v@)kd_7_=9DV0xC5Ql=z|Dm#hnRWW zrOH3)`^Vx>b^kkUu@DER*Lnq1;g`28qIkLz$v(l|@cofQoDn3rVnv*`gD0^7Hb2V& z>;_k6bDFf-1%khh6}C~x z#L42NM6BZ$yO)NBg7+zQ&AV7>$V7V@kd$p zwO5o((Y<L;5H$BvGgncy3t_4gr%6!HUG7C0kKAn4R@GhRII zGbvx1w?YnyWmBj(Z*9C;a)A`$W3kcM_DvwXO#3E>roLOZXy&#IkxyH{=62!Fqz;9u zss#;(gDW~Bdiwo}>9fLyFv+KR#tT#4JYp12FjkkoDntVSVsPl`QD9 zu))oy@{_IfL*xu?w6JUHv4szRV(JylBVf8df{BhArFie7mu2MCM5}-`zwjd$bID%p zU>1L*mmG58lzW%q=bBQjM?f#-wtrZ}X4+qU$NEc%{^vL@(h3Gj@#cOwJ!SULp{#T7 z;RYS5@4@fMiM9oujGQv#j<4@*yQv3>vggSQruP5Cqk^FyOIx{^>h9fOaoTEE^?KxH zOGBNxfNd+eN*=78B1(VlZLAe*OGG(or^^EH0k1+U23M_`jNb@2%bjB#`Ybw6j;|8< ziNbG)&&N%htW*zRt^BxyM?b)pS>?GvVr1jDTh(2yHm}uj#@eV|> zR?DwBc#vDy(-xvu&HcL8e(mV)wVQm*t+K9I|SnH8MTC59H< zC+8oybVgoIUsp~p10{*c6;G8n_ly;3Xz3MpH>rTuj2h8662qqcoZTX|6Qq{fO3PsF zfYS$X3vEFkQ4yRZW&^N-)eQ-*NML%{*OKlT{@ucppDp6UMo|6NyC zRIXa5i-fIm$<^hsbP~;0DJoZ%x-R6fbwXVZD^fE%R4R!K6&++(N$Ns#KF(GMIgMy? zIb|EeoVJ;rx8G}hzJL7u<;Kll-h02E&&T2Z+OZf4*|12rF5nM?O z%rU253NZSkQ)F_9VNg0fPA_%jv-HqMUcT(v@qozAe2&+I=_v)Vv{YvxoTt zapQLHNYZ16+7OEq^G z)^(3bixv1+P;kU7DH^5E-eqt{<_~9`zM1K+aNR3d9y_$pxPbrzFO^y=Bd6hy(TD6e zNy16n$hPT1hsF;~wv$O;6G@Sw=t#OZBZ)R;2aY&XqlG14Q;n*8u4AfgXN{SBCvK5? zlIXu+6Kd5`5?kz~Hk!%j%u9esV^4tOHkjmdLA7Ob$t z@v_4wq8nI;#u`N5*O8qR1-XxaVqfm$IcpO+FeQ1CPEXGDNt4$Qdn1!VW51Olk16jb-V0pWgKYW1I&7T^0d|s& zmhg7V!F^n5xVi|4NYSXes!p;U<3(q;V48u)=A*eY5p{6 z8@CO>`-&Ww6K{(k zp->77-~06HFaa+I#e_r5r);LWg&4f$cZ&%EyXNc`N|MdugiZnKNrXYU#H_WcvsD}C zKT->lPE9R!anVv`U&nvwa*a@GIMhG6V%po59^YgL{r34J9%W0cY*z)=j<8--Trtmb zZFbEw3nHx=wfF=?u*=xms2<)6qm;$>##XO98;kfB7Y^ERFH7K)l`c?cY$R`etB2&S zqT)W_P_;%`00F)F5T^pju2#B>NTQjd%NWCV@Y^c-q&gM5gxuzCJix-nGEsxGCJ`5^ zF$ov3wsfDiY&JF8uxZX#^tQJozh-LhT**>wV`^*VeQaMjh63^@{sHbBUvA=-m_yKb zsq`O|C?SAb3&Z-BzMS77-J+h}@4&p2Dl9&&*NzV}kpcYHkH z&jQDbOG;8_MRRVGrO?LBgPdRizn%M5Jxij=0Aa)+L zO>3%MpdyiVw#fbt+%x^ZTBBYVJt=TxV)NO>`Mg~0&PmmQz9CK?6gJIbP^eOv>dI4! z&nz!w*w+*!k+k)^g=E~z5Ayb?a) z?A3HNhE70OPWk?}qBxUre;bhqppiI=E|~9N1_ZNDp71kmU5=+OeUC8J9f=66Rr2S# ziNp16`+5|enzOk4YMepZZ;wB#!%#VjN7@(mA8tNK_OL?coB28#>5TLJjW(Q9d?A+4 zl`DG1MZ}7x2MczFwE?;oe7j29JAs@0sp^hCS${<#4%GLOz9?Y93n4X)u4tD}T4RZW zj*`_uIFVbh)E}&wiTuUJ`sYKTN!I*uOy8b033WOBR^b^rlqw&8W)3yOKA|A6M%h<1Z@R$@u#5ezDFEmW{!Qul zN$>OxR+#ze6RcSfI}h{$O(b?CekcqMYOJs{JPrXDJE(pEn1f_I;=-cmjz!xROo@nx zX6H$Py~Sd6vG(-PRU^3gaYZrX1h=FoGODQa^s=O0`!1J>G9C%7*M8u1oLA z!oQ@IVsp?V%OcK{N7#$D`76%_J9V!)#Vu6bZ}v5%0u>bKRWmz1Yqza%I=dD5mRDwx zx@gfF&m#x-|B1%DnbiE4IKByM+au~&-8TQGV#69Zq4``2V$fU>7mn68_xm+iOH!%z zS15N?KmH616xNry0vxFuEG;(OHgv|n+SAb`O{e_X05x*|kiQPRSymtZX@0MGLSGND zO#SU#Aj?7ggbkDF5S-b(^H+Y3&^#PUTOz2~{-0!HF%xDx4V5thXb$%673J7^3m3kF z@7UfQft5#OG~)9yc92or3iL?4J{VHKyQ;N<@>|b7_W>agiV@2j*Dq}$Szvn$M4u(? z$NpmiiGw~s|8L0q2#Dxs&}m8~thI^I-$94NIFw^Ef{O3@bH+(g*6KM1{g&bQ@d8PS*t+li=i zUp8IOOEo^tC~B(mpzLkS)k{NJ-@$(hW$iwfz|%(q2^YnE6*WdtuS&DTxF%U>69@9*014Yk;e>d;R!g8 zq<&%#+?8tRw=$63Npo$-1#hz{j;M?8kw!=I)QgPi`#$Mr_7rP1B?QIVUw)K>Pw%T`b0tCDYxlaF%ne z^6xjPFysM)zoo#J*=%!2kK$~-ATtCe{bFF!^HQVhqdbEduwMR(-MMVYACZs8EH#Ta z$u4gjVjp6ckbph!ta_MrZThQ2Ejd!VMmujIN-&pEyXQXUjp5iI9iUf&SRTE*DB3i@ z%6p_Z#q{b>O^mcVj~3jv`Ck}+;T%f022w-ut)kJMdkJc$9>@vzwI-$BvIiP%8Qn4$ zXfT+}Atk4^Tdxm-%n%86Kp-8ZTWU_VNPHuakcqfUflw<}oISD<@CZk4o4m%# zZ_}P-f+Y3Ht%o565x@K2Y=++H6MsSswMo=zg+16=Q0cgxT<*Jw>Q1kyCbzh&`|I-k z&0f6Vr7ynt&1yxe7&@}|Yp1p~@(FdcCizSPdhlh2b*oWdg|`@uz0SP-`2q?=sSyQ& zxZCEhiC~*LJn<~^{(w9LDfu)}Lem7yM0Qusn8aphV|e%nAKH)RNLxg4xsC0A1}wHB zPyECIQv<*xBByvhB`eVLDWJ`>!9zXndYo;(>4TYnbIc#AN6cfZ^KxCe*Y{VkqEV~S zv*dN!OH!?jbxm1k!o1tR*sFJ~sAKPkw*5`+0XGS(Z%l(Vw;q|Y*1zFd&+Pv7$BBwk z@|bN$hAAvTFodn35{pvQb-x48{@1!A9C&ii`LRJlv-N!4GeSj2c6n9+$|@~<5(R#L zIYqO=O<%j8qBXB}&o?s;*P5a%(%jc?6gbr4qEIEWYmG(ETOvotL#ogdm$iigyGEB= zHCR-D%ksBA>P@Qkysb3L!Yh9ek!X(P=A>JWmWt|j+JndackI;TQHAZ1o&R-Eu;kro zWTu@uKSOh#PU~xWuVJ81D(yV^)&!}-%bKAD&CGN-@#t?*|H=KO`fd1)tRLK5ApiRF zyu=L9tAMEnr$F~`$!JR3Bh<+pnC(m-?8u!C`~~EHD4AEM-`6d%(v*s30;Vbw3pRKc zR?(lg{{aaPb<~E>_3Hdfqibn$c^`}5OWw}r?O$Y^9nFR>`(1^N+BIr@`|$py??j!B z@n(;y%6&Z{Re#kyq|{u#fYcJomF*Lct0@GR{BHOch|u6~ayhGj zaUW9Rq3-;2u9h5xdcXYg#*Cr{D&t0whn*5fg~GCN#%Xvbri3v`zSXc$TTeRUPvy=97Dp>@4vpReE+sie*bokSUCAxre^l zy&-Mdy|L*fI9MLHpLBOxXJ8kdyzm%Lkbi&~Y%QOQchmCQiv4 z3MI>2c3**bjLq-bP;{%+R9{J*NU&yZcTt7O$0Ofu%-F$kfr}Cn9^H2yE$RrlXiV%J zc|ZALZhtJKM>r!&F?fP2DREv>W%z8~jmgi|)LR0&i=C#gx&bVrH(S+wyn{W+na#1+ ze>Y1|DB!R9hY3=Q_wjvxqV$Eqi^K6&xq;Xr9eb>L}% zuN+&bNaZ>EapJr{SLa>3BhSQ87{k{-Z>s7RTu)bQLNP-+u(7wzT;;8Upra6N#p` z0CWEDRr9L?mm8n5bUX;jErCf?j=C}IG0MEVPNohX+U4>k6#1nNSW+f7(hs!NiyN_@k8C6L}iK)vf4o7SO%(^+12noyjrlbI@62(IOw z0tyIFb>|ydj2X#GiftVroFD^~6`G*Y>L7Z=NJvqH-G!u4A4y;RFje5oEW=MpcOsP; zi#HZG?8o-UJu4$EcTy({^i>^-$V4|RoEfn=G^kr3{~a_)X{dL$)Q_qQ3m*A~;(x#q zEzzneq zV0+uU*KAt1)rAAu0)V94Z1{IHYtd3{KG<&qJK9OVmAHc=qEvNclIqM~uFrA!)56tr zkLuT;<)?be7eI44=S0h}5G2JLlEKFW;;-zJXy?1xe^3$P7bUnSMznNOS*Oqtg`vAu z4bb{4FX-f79?MeRQIyWMfD>MPpITP=eApKW)?q;C@O?tCeerw;04J&t3sVrY`(tZW z2d|X(KKokC&P0z}{VuugzAda&Lmj~A(Tr>h;Br-Tvzva#b7;IceOE%N*kYt zTu+09hBMlX7C}UAKj;}t&;k%M#7P{}4LRRks^Gi!^(pODj0C=aBfl^@TU<+hhJ-+w!(Q}YE4*79o2H+=M$(Z>)q+{ z@oZ`)>H9i^SxK9#dS}gjZgXYq70=TCL%H+oA@ut5A9jhdZvsDVlk^$q

FR6%t%W zUL;x3YMyrO9RT~_w*0!~Ep<<%b07J@Y!9)NB92_0TJ}l{oE8(4Y4Q!Q?XFmG;or67 zm?d5%tq1dl&-#rO=LpzxS?Kxwj6eqQz3pjv_{b$De)26YbCV#|xl#2m7VQCXN5FgG zpmK!iQ72f&tK7WCU@-#I(%zy>n1sWynd5EvzQEwMRv4bDr~@nS^eILs2~M`+TO0?6 zzb)g0C09e4S9cKWyLnXINZ9tV``RyWRM#F-hLiKL)e(##4lz=-l*goTyr^ihz3{$1 zCM4~Wpe^FGZRuTW;3!Jd+>O{4_%yB56IgW7*yGd1Ua>RKn+kVsNzv%H}mWHJ}sVaG|*inDY%)geu+ihfK|NJi9&Mo3)E{i>O#Pu3n{cX1qV*cia;D^Cl2B z9aF_=T}%FQn>~ChyLNcKdUswqaJlyt*&VhV}`Y?d(_^X>nt_HhFn z`xXrM_tR9J@o!3y>{#E zT$A^_FOy|~X!$aTe@b26;Edlfr{hiXRLd3vbNsAiPHZ2&k2$CJ%Sd-A!J9zfXCngK zFtO_Sb^_T7Hd;0D7yi-`5DD6u{2h|tl8Ag#bJnxI7@32fRP>2!Vzzpio)Q<4@?{oJ zN@hzw6Z+!HW@bt9y7)Kxh(HSA^iSZg?}AGQ=k^(a@BUkz)wWO1&X~u0>5Qdqt4|o= z#4sS?!)$$JOBdD&rwS-tnsiIgr zB`w=7@x0M+Py_D7f!qJ5F$d*Pv&*O;&H6(i6IP8sj5%}1wwd%qEQwhYU=+~Ryblxc;n=hNe;U&3%CZ~2sf|tJ+wj4C#;V?m>Z|K? zZSI)Oz29;bd}Z?G;EIvY^ywY^-5&e%F!WviKs3YspJF$*Xk#`cl`mJSBMZKn(Nd0H+4Uq=pk9(;G;^v(YV+C)bp literal 0 HcmV?d00001 diff --git a/source/assets/images/p4/whale-default-camera.png b/source/assets/images/p4/whale-default-camera.png new file mode 100644 index 0000000000000000000000000000000000000000..1e31ba235d616122b3b8658bd1cc3d02e8f1d0e1 GIT binary patch literal 1021263 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 z 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

    SuJ0l6;2Te|&v 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�!`wf5{)?Lo2e(p zW$aO!6PA?V?^ZLV0?nqTNXEv>Uz^ghV(|BkCC7)7`qhM(05ebrKFDDzP=*5CT)ULT zcAe2{1J=bm0GH>GrKeS;S0J7)C2bPCU>NC(wvuAsto3pj=Si61S+2wNyWScZxO;&9jC}|aN_=PeShRoPh z0meCQn?W7pINPKb(qL?C?ZMX_8>~>Z5aA7H>e5{;?mm)*vf|(Ry0~&ZEFZ_ayoPnHs+n*N_Lb z%&s8o%+K6om#5MVMN+lU;^l}`FZj3%uHi5|aHXpYfgjYeSVi-&{es++{7{`1-Xlur zig}y#Y7096fISxcVcONw=_|Ua*?Ji*Y1b<>q5XeZ0AfW%EO5pQoH6iuOzkrfp*1cB z7lzfMSnOB)>j>~Uj2z&r09gRYU>M{jjRoowhZ^vpTEw; zq?+}4o=LxCOIi7#CRe2FNz1tSCpwfzMOEmsP9vd}_kMuU;42M4t^t^-3iO0-&dXeq zpLB^o1SqpcingKmj0y#000gZt7EdKHGc+!|ca5rfg!1$7FhQ1VYfxFo~(4jow9WDPx;Kr%ZpWQx>o@E?iLOlFzqOKBcd z6N4Xh%b5!q{h|F3x{q^TDzsFpa_#C{%$HB8n3wx&m0aF?ZIy7ZwVanrY^*Lpq=AbX zZQWFKpvefP?BMUq6+Wy7XZbFIBbRAp4!>zUp3$1Ee93grPm;9NrLtHr3-GRBZnfas zOQ5-<$~Hvn`6C?E0z{jZRjGrL-O>`@Zqht&o{TY0i z=gB=pW%7d4uZ}15@x#8^=tM9>MrZnKE($w*d84)Jc2}pkQtub;Rj+0>u|~s|q*}H! zgHg$(@OR3A9PB!FnN#|GMqK2=fmHCrAE?UfngmbwC!6jW*mH@bBZgIjbD?4CsoNYQ zVuB2XiA74ST?*%qhpfF4ihY^L0?(+84Q;5jBb#gOBN{xO^6XOkM^0(C{e~bh>J+Ke?n#0lz4wtP+2d0gtKSj+i_`oUNB z_Q+8=onGM`f#D6SyP3YS~ViS0p4@m;!uRnB)%w60w zH$k>OvAaC12<>1W3t{U}t3CYD7b?GD7ggKA!L|+?esL|cq@u=roJm~2mq@ua?;_S2 z#|3%C1(iZtPA9T5 z;KRi+b{&mfbFV+nLtW@kB|0Bw`2{xiEYnqGn;Xu12F_u%HW$l3Tr%U*RT9eVV1<`( zT}szWxt&#J$sOs|J@-AZ@fnu0^6oi~q|_@qpkiO+A^`7~B{BL-T1%+i(C-Rwy)$ePc|ZBeB>H zlaF5>ALa4hZV6_GbpCxlX20dYMzVCIL2Y}D!DSeD-W{*{b5TIeF( z{!Hl66(He6q!0wWX$os(aKUz8o&1(uogrKP;oV43Z%LKyNJD!!I&KcGja#G9Yln#I z^A3h~0&O7sQ4e`@NEzshYY95bpZiB39iS#7NXdyRVtR>+|2+#R z&_q&vP3_%nIPdG#J=Vb6Hmk9f_D7r4equ!8K@}B@l!|hi@zIpHV)Jj{k?60j+Z&AUFJ0%(VlM&aLmif3C}iJhTf3aawo!DkrL7C)tE z(VDxY9X!Nr^xA^vf57xq`P9V+BY9--<`=5j{f}LGG*sSLceh8I*Kb91gd99aN2#Z5Mp`&4PX*?`9>{lX{2ei2lyH#qdXWkx}XWzwT>0Z(3=T%ss^_(w*4!_j zI9WV|YJ$JDT7G2X;LTug*jKjwvS5|;=EFtE=x+a|Hs8bxiWFM;uS1|Ubx%FT&^Hpi zu^3!>?>u_@cVJG!*X)lRjqFi{ku=ocT$7IpV$@DHmVt(BC#qA)cb{e- zj~9{=f7kY@<)lvN?u)-D_p7t=b!xcaZT$VZeTHJ1Q!fF)CpK11|B8pU3&KxjMPc>G z*`ugjDHUfO<)~p2&93Jzk79u7V`r(2`=up7@LuG@k68CV9xZPK%%&Nz?le+{h%Kjt z5@hmZOtb#h7|&;-Sj|lmCTB1ETCTarC3&6FSR46&OJ9}RYQ}+AGd!|c6SlEq;=R30 zYR6+|IkH9K^nOPIL#Ep#PMaCND9#OI)=}13Jp*{kB4!I2WidAg1US5S$eTCA(ANw~ZX zbk5gCW4?Y9(-l`PjToPxAQ%)7^_y;}^_`lHQ-1i#O<5$%!H#iTnd?Ua4bu;GL>l`y zwl*?ee`+gxRz&LW1$Di`yhollm7<-l#DL>+!wczk1l)DQ8-B35ft?MC zvget{VwdFE>B-NY_W!7tA^Dpl=>82J1e@N}$_n3hubn*)^k_XY^)H)p@jI2u3m~kU zDF$X|hq26FD;nO10^xJ7*|{HbS6;8_Xw7iVNuWyI(WFMPEzd1H44@NS^v4EAf^Bvu zTmM`G(1!2)aaL8poygL?pA7omeo~qx$%@F&7!9`$ePV=*Z?F4MqRF{gJFm-io~ii@ z2Y3bls$FK4*Yy(9u}r&oAPAJvF+Zz|oP@|uN@W5DACAQy5A}<*>Y-Q&@WW#Nn;=QN z9x6j#?GVSAY%~4ex_GqLH+?vk-3ue^i(!bMYX^aM_uH~NQWh(-vJuVa?pXwM6%^ib zfp3YF$9k9dUTrA{IpGjDqs!CDC?;>Rt5Lws_Mv0PHFK9P!NR4QTpVh^oDO4d&HZw1$qzK^2xN@r46ng%|K64Hx->mn2E@>5 zX%2$wXO&kKhkQjNuU=?0MCpsH-Ru1zABF9Wbu`Lpc0W0CBO;A#T=qJ1yJWSi_U$?= z>Ir#fbG{{-R{Z$)$ZOEs!zjsS9ic}FHY#*eeNzSO!xagXoK#wG6`fko?*}BYvynp9 zq9H}!f|6(@ogZdCR<#|$ja`q>OQLp(YV5NCSUNemL!L9G_Pt(Q{c36 z@rDijFEiI&SIFgvP|f>J@lEahXM*Hvg~vjDRP;+UHo$Lm!v7Raz9I!w_m{rhmZFQJ z5CYz0u#u|y=Z)wOOIH+M)ogKwI#8rd>mRzbqOya`S`=KnIR2*nnqwuECwwtv0WGBm z!Jd3pkASS_9ksazHGYbYjt*33%ml}YDPiAaXr+yN_h4 zZwTm55n`D2PWmQ{?|sTcNDpkTMNLZPji99p!!iHA;gWZAR{ZYoW0+EeaxEv=WC~K7 z^+ysTp7(y1>jo%TEHOlWN2Puu%f zH>;P%88BwslojuLu25vcO`A~Nbi}otvxEtM5Lu+^K^a*P*MOLRG$&4bU)-Wp{~_Ps znbIQR=9i+Xeu)YBP7M8(ozb~Jzq8bW^W{mZ*906w&6o;YWL*~D>qxbtmmCK1 zUzw!Vr4KdbRqnn*%3UjGmxDYn<(Lc_h(wb^3b2lk8DW5}e&Kqyz9@u@{cVCt>v&{O zE}ji@xIp4hU3t$A$WsL;9>+dQ9ZY&Z%hf3-(mEo$X`N@o*TtHk0?u#}C5d8o3#f=a z;41(>T3H`zmolq+?)&6Nud_o;@Q;lgzUp%ae?|K9x1}#$uV#Q_f@lZIg{=OBN`8v4 zOhUBAvN*@H8NICU){x6V`$f*ghu^G|f83Xut|y&VB#V&=flYJwAGv3<=++g`-~O;$ zV&7_J`L&^iA==~CyvaLI7 zyRy9)gIq=#C(E7?G~U>jjOD`XO3BK&gP+jAmEg0uGeTqTj|4VgYsSCy6X1~hgzpu; z|H#8zDqGa2s-CQ>IJZEcu{hlPqsf#RY`JUx+Sk<16l9LP*h9Z615a9+4@@6SU!P#m z_&xM&iV?CA_2mTni^hkoYO;YOP%aL8<;#LfoT;C7>EBs(&IS<}AIc>?S=`(TfqJQj z?8RTUOgdW(T;oIiWf#hCz5t*d?~_RVp1t5Tfrez34au6@Eo_qnnboqGy1)b7oV)z+ zcYTjnr1=woC41EfpmBTmn9-^J+0g`d_f>Avj~(ABTqC=AtSM5nBip3VbBr|UuwTQca&gG~3JUe`?kuS`&d z;LVO3b`e?_76?Th%7ZG^oYNaGn^te$4|oP1(Gy-x^I$oTmgTac@v0y^Jjfc?+;Nso z#;uik?=BnoYo@$p^({BrmLXgr0sFoAdpMzcVzr#@NHD=EV!A-M>9B14zYbBB&b6gT z>f*W)ck-4WnwfHiM8tx=ETCS~0Q^bNHLcHYz%%3;Ron>QWUF)v2Sc>Ch<595l2F;# ztZylj!ciFQumz$G2EgB8Zo0J;CHaxJcE-rRYEUP7?~%tsgK7GbU!Q0h+t;~x z=jml1Rqx>&+ru*bQ|r6XRjp@tC-Oom1n*&(66h`M?+FxWTv&4}cKWGDG&#JHua!^h zr23>nqT~@=zOIpr_`|dJjL;E#*QoE0pum&N&}Uw&Wiokma<+9pii7|O>~)ZFQM!&@ zHKzPt?f0JVhbw5c{lh(=(C*%@L_{mR+Egp zwk3@}=Pkj?4rXx7Cq`LaL{_t-R2;m;tarGDqt65Q^OVWEr#*%>-De4sy1T}*g~>F4 zjw=c;L@cO$t|Pr^dJ=ez|22nE83Zds7FOPH0@H;2CK%`=81HXQEU@2~I~`uYvVOZ^ zkc$BaCl)bhGEB3Rc9CTAAAb+50W_;Ab|;*U(y=9ela;2U3OM{JeA-Ro6Fnx{m(3uVPWvaoZ|ABdK{k9_!c*XVo~So)K{Cu0h7LWu($|~JG8z} z=JM@xZE12}D^$e|X=}NuQTmonW((^ChLImBw|1I-`Whhb*SWF!HS-5x1Uvb5E@0 zy^%A|WUhc!upU_rZWz$0L<4vq$PtU!8dWQ&1C=wzDamp~@P#h(n+GwGbT58@h5~kU zVIH|LvkYow`AjrNw&g4yV{g7&WIoD>22-f`^wSpVxb=zg)S2o@mNLIol@$~anp6|| zh(0;*3K&SbvY(a^xkc4z@cE&1FXtm3-G&XJu(v{9`P8}b02We>q{)bL1+5GT?V4mk zE1h_ewQ!AAt`(Tm>!FTeJ|x`h?p>Dk;+m*a-^|XFo=j=EZ3}j_2_YO*Jeu$fhj1L0iQUN!| zhb=*ecBNJEFRRdL)cyS~6n&p-Q?>-odH%!08t?hOH@aYK)+x}W;)XlYEYxZvEgN#e z8Q)DAdSw;IEYGD9fW>4ffy&FWlU)~r{YQN1H`Tny=`JI`TbmE`D=JYd@HU9c|0yfz z)bT?bg$)+t>H`#-uYqI#ZMHl0&ZZ++P!Y;24G{FTt<>fZcr>!Fb$sqzL|>~=Rh6=X zCEFFTN(hGQ8o-#M4qCi|{B5pWG(1aXa@pm-{tfWw@?mz_ z(tsV*cs($a+dU*JONzg~<99fk`uO^tss(ri@T?`QCrQ%nSNM#p#nU4R{uK$@rh@Ptztm>@-%8j6J zcsO-Rxi^g1Smh_*`shR%ZT@Gl{1Z+zo&bEt}BL*Zz3l&_mwWJ-BU^t3LBm5$9T|PG8pht1b5l znk4Htz+M8>%TMn+I}@*OJyvxieYQ~l__4wIBs)XU72@&mDBCa}HeT{Kr;vfas@dy@ zP^4Ar+g9nfGDiT9qQxAOg)YJ0=n}@%vKe=u)4}hnJWE0Fp3Qj*uw|@tR8NOp)_Jen z=|Y>4udU07ro5gy%!c-vwzcgKXZ}ia=JxB8Dy!SVOZxxd9-medFuC=3A1t|rZd|BG zbm!&rN&Bexuyo86XeonppByh6viRB0+T`tys7v*8weBjY2K=!?iLKFFb-KQsm3J)@WS$SwMY4`v5K*p1BYW)0Z2|vcslMolJWHG zyRc%aQtq@D{UU5bMjmSCYtqlbVzpl@aq8Va!M$v%MH{U#)nQ2pSI(h}ei<}x>6EbM zn5SDoouFTqLn>SQtvP zWF2e6!ZAV5xCY&{(&`r5AvOV87H+#u71hDf9LJp(2PNt`tw31uErB%#<%O} zSYml-jo{IS1kAnnGg0=5#ZhW}*?0igGB!=*#`uoymPZ*^?%yBtAl@c)rDzZVe%;LJ{ z%y`}90bXtC9rAA!%vRyx4g2<}+ueoRVfQN#kOCX7Qpdfu@J;yNR_@a;_Olc7- z1ee?`<&@ZVuK!XckD0o{hlT_%XgRP7T#B19{&7BR{xRUQRntv4s*9gP*SYAkj=H0j z0GerL&VutB*HF`oX-$0VGi878LF7T$w2@diz5*a zFgwC$8d&^vO(y&R;x1q8jIB98&q&W65>_3Cv?ly=Ld*&SVA8D_%A8Xs{=*allc$5L z#_ZFCA5}Zw8uCsx+uUdEz{1sdTe7`zjVeomo!Fq4QwN)6NaOj@Xv$&sH1A=gcVX`r zt`fscWsh?!Srb=Vtw=kQX|#CVDgJ~K^a9^Sh;JeHS@e1XyK9X%!K*ocgoUI(Yu)~u zPB2jS#sqrBwtF`!2wDLonVa8Hky2yO=vOn^1xix%!a5%2T!CdH7;FBE@&4t}aMiI@J)%!eO;)0A0Kb!5(49KSZosYLn zr~B1kV>vFVT-q=F#9U9)z8kjiTqV2SN^HXI5!lr4?btKSL#9t_f)18ROZIS;bB zZ4>hWQRQuw%D3YOyvJO4es@W@lHKP3QVWRaRuq6A`FiiboZCT^q$UP02m{M)P_ z?Z#hmdTSL_<=63IP2OpkmGWox(73xJUaYVo=xVb5$(?=Q0)`H)ZYx$herXb>fWHvt zAbT{a(2D#|M4)cbixlXM8UL+UQ4(Wz6G^KalFQhYa7ALeO*s%$ZdaTiSnFn2=JKG+ zcC+IXk>{E)P%g{RQ~f2k52+vV*O(Fe81MrnK;E27$xl+o#MpmSJyQv`sRy|#*>w&& zuh*0l-Y5b5S|?IT=U4Mf%~q@#qsQ|}K@R;Q*#<z$)d8$F~XDeNB-SN8Q0;SqEeNt z6$YC8T)tE+>pV3!c&@p_bj^7n?NaL+*g1H73&d14n0)y0a=tPmGp7%iGc54 z&C?G~zgzgA8eH@qA&f*3aSj$c2%nFC~+i}p?BebKhi8Q!7^Q1r*fK8J4J>z|5 zn9dE;*8IgQzy2-2DvnZqj0qHmu>w?G1$$WFj`TaE@raxC>_m6xTt3ajk}j8d1QQER zf68&vW$4|S$o;nKseZ}F{8wUu>JZjqmd4nLO6#AP9Vyv;Lth#5S&I4pw#k!2$#0}t z8wAzlZZUcYV>~>T)p7t7JseGr8$e+uQn0A=2U^HFuQKPeK%t=dR=sAW~0&kS~R z1AC2eyqRJJIhPMW-LvYv_;kv!v> zySx-97cP4Qyga@g{GaUx6Rp}XVE)n{SD12DcL`x4PNKTNV7A77qf)UYKwu2ok5}iA z88NnhwgVxwHq0@h&}^EgK4#uaS?#+7Bf2K4aQke*L$76WPT94$YG*gqQLR2;JaxK( zd-~khp+ky)x;^qW>+%I|wd&AH5^#fDHD?eUNcEDK!1XRmo2Xz8pSa&ysV4AZK1gZ;3;pGjZh+Gco8RQ zXx8FO1*4M_Vd<>oq8*9sZ?+kYV{ca`3t0NP8ZyvBN>4CTLoIP*<67hge#>{eO2-?) zyYHeTYaRelqrP&syHhgv*xJj~VYCx#p-;M*1%h-Gm|iIv|IKL9UT+nZyiMKWt0H;R z#}RkPo79pi{kC|I2|)Ws-{euQ`F&D=F#C(00q`1%xQ|LZuD1z1V7ZNa5LOZvomaRQ z#{tRzOvSmYK9cvSL%&amudZsp7(0{)Tz^~TVMCOL%39?eGOQ!L+raUphrNs_wgz{F zbcu^1yVtP|-I@k_OWJD>zLh_Zp@(FCd8XRHK&crf*`x2Lo;(n5X!@Dy5D{RZAtE=(L+4iT>bA>-v5-Oa= zG2p9y$)kivK|RBiufFCM#dLiui|3#Sg$R-aB&o|N(9@A9ura% zR96N0w~o48dzX}HG<8_2F%JCC%>A>L#Mc+(DJIaLyi7J4iO#t|h8HUjMs9vus5h-^ zJv8_y_wO4sTQ5pyu65LNi57m4Z=O(a%k^eBJ4b1grd%a6X*V|kQU|mB zS!BLijCO*v-I^|mXqv)VrtS?qR7WH^8+o{U<9{u&6g$E8-2U^^2z0rM3pUzGw$gR% zRW;hlLT^e^>Vpi>Hy)`H<-G_n`@@bC0P-?5tCE0kdkiB`*RWJb>yDZt+yVj1?(4fo!a&U{(6O$ATNO_jgDNYP zd`swhv<__aMYQ>4(SkjRlp+|C5wZ5rYj+JY*O?t%_|8d@?Jtc8k zO>KVti}{1AkTw5L0Y-?p^YgT>1Mr~sG!jLvb54{=%%MLAx|~IZ!3Jn0x}-8|G5Z9PtuC(+Gr4H>6cB9i!p%|6!K!Xmosk6O;mo>^Jqp*Dsu75v$9j z+o>M9F`P-I@>fXCO|Qt!A>YiZVM2=QeOk*BWUW~hVOrjJ4yvt7Vev1*2{ao5Z7Obr zoIUt}5xA19bmXWD7{5Fb!Rv+ZoeSMWcZ36~pcYadn;C(o6-0Lr;?xvdf4CjtLiul^ z)42($7{Te5sWlHi(HtJD_()ouEc~0}??{ro zzzP`Elw@_EQcF|B;9|~#gAYkG0vf}OO|EAv`}p>$+ti&jJvZ)ca{N(tw0BkOQIyMP zku&?dKKDkVx+aJ-I1E_qTsq>En!(Ci4~);_;Qm=X>;Tp%WdDT&w`W%H1sP^okCpw zi^E*zrr*5J`*2V07Hl-m)rHEEOA}ie`VJYxSrZlB|ke$DJmV&-0ss4QpbC z`_?OPWAA1%Wpw%;yeW0M!;1o2y_`H+|2Cm2LoGw}up{`x%(i!-hgi`FnNdS+QSl!Y z*TP~8@VJ5fR}ChuP8Z)6)49UWIxMkq8Zi~S_reaxSUzCi?F6fOM^m1DvfS-88;cDr zbY+3PnX$-2IP5oyi~qYb!C1QS{PL50i9>vjwSdTU7p5X4X}Tr!8ZL* zJ_Y2b?IWCncs`o*>5Nndxc#$Mx$VG@A9Rd7s7zxP!O%PLegkqgpz#Flhi}$WnYMy8 z8u;AZpV9AFYSor>uA4kCj~D=`yODVxnJ_tlHT+Uw-hDdHPynJi;Ao+2z~eV`omnfi z!EZiTJ}n4(FWSq#{g#auldJdR?SSwPXe`{98+!hPUR;pvkXIt%AppEN&F;0cA6k3+#Pv4X}Wi4DzW zh0Z=Q0irII+a3)bK1tH#h1u?GrO3p+7Xg~{7X%S>99C?}h9zcs3N5S_XM-zzHveC! zhO4&30bx!?!S$^V;q`+Ds4S#>6bcTQafw?%?V^5RpYOC=XaDwuXJIn+N2^d3usQ)R zre)|-^|JW&O*Zzwp@Mw@SWZLf*C1zIL()02OBRv+Hz)4H2d zRZ%Z));*32m^QSP0jX6f>$XxtSDsc}bt9#~L);uw6&pC+)__d};gpW6URf^mIouGE zkyFs*P9kY^UiDT_A>=JV|u7 zrKXuT*;^05YUz{knWjJ7H{jbbu&Q-J(gzrJ5Mpg!f8Hs57d9+i z;y_J*n%0t9Qx*psw${`E(EosV=)!Uf$&k1FOIGJj$_&*p+OtlvIjcZvbe7* z1=fx@3Q~)3d?>4&1TL_Hbf)mEUkw4a#D_TL@0RNNkl76{NwUZXK8{ZJJp)pAf&RKC~FuIBXEke!>5aDFd)d(S_tx$^Y*HriDnIT%qmtYjrn%+ zI{am~lviWnAbo7IhdWH9yJS^gyQYn|Jws3`0;7=tn)=%v8A`FYW!e6(#2;z=ZRBKP-0U?wxlJqL_c~` ze0jr*=#>L@$L)H!Etv*9v!and82tv-7RQLBV&73-+q>A;X{cUQz@}<6N>^;6`(LWI zN78$+Ksyi6yb*b2THgu~ty|CE7~$_$4Srt2xxC&qxb+NB7@E9m30jMOI<|G+`7g*! zB~s;;ba&H;wfA2MZ-b~z{MNrpvFSh-(dIzrmeWAA?#)91$jdPSzE4Cin&S@c*9}43 z2L8xK#SR#Z-E5_v@~(%rv2sSg4F-Aj0)r!CXr{z;Kzu*LipTN*J zw(Hi{(!W_c!clTQrtD5jn=r?7*v&zaDdqu!-Zz5oe5`Ak1eS$fJ9si4i%)@DL#=hfm3<`=Wsa=7|lPnUbd@9^vmA7>4WN7g1{20v*w8ki&X zU&=)JEoJH4{QP4_zSo@`-~kC)%&tNmqBy0E)|jWg%>5+)Q||=M)UX^7Qr%v1mpU&E zOe4mno;EfdGy(#LSN+XQ4v2$*?H<@)gk5*(d8UW=ARJ7AfTN#J@CFQ1c#N|F{Rr(W z5J3S|`OwvLql|v~dumSRT6-A!;jHC(WO-r+V*ZL1G`k^o5r;3&ho!RZe`%2MX(26(dRBKbuB=0i3bn3!4Mn*d((l=xHb9? zo`CC|YXCt^#2R>w3NjO?_pG$gj`swoOI~L3w$asmuvhL}DWNUsej|tWeNxW@Y)zc7AvE0|>}g%?Mmw6mF$v$d%rLz3FNmBd z^KW;ezF4Gyg)T7>)P>2SK9enU84Dg^FxwFNgz z6N0$uQkwG#nHS2{FVFC5LKKbJz>1#Vw}`y^MG;iU-po(am}{WmVE__sK1ng&RULd# z51z0G0Wwuc?ImD|=%vhuEKJ_ia*aq#qxFi5;*iFjNtVCiY59Gk)n$n0^^R%5){vfd zH9vZQv#k5tgd1*4Tj0;Q?T~aeNfB$zNHLPS_1){ApOPdKZN9DzH2n$=!mGU#%aF9x zD$;F)DBc6A-M8Ym*Zo3@`VufDXamCLCCldOo~xG1+3sa6mn5E!#oeQOe(s@s&V#;$$O}^$F ziGF`FGiMtk(>u{4@p0hmtwQa`DRrDWKOY9_B-9aeM#E}B-XYUm@m~D(R2wT zXJ44I8wv|5K7P@^u3{pV@8Oa%T67M20}Jcx(5T6d2RtSH@m}*1Iq_)$`?kS43_7^P6nEX_c&d2L(@R!vgT`DyT?z_|)!tAj} z>(72MB(m0h(}*h$>g3C_-=%&_8r3Op##f;9`;~HcYy+2Eyce5$Yd6}1bcpJ=TL`S^ zGuPW*`JpeL#~9|b^u-wusOt}(lXOYS` ze+ufwKg`wzY7C}*&JcB++>Z@zXOf)$6jbN$YN3;KRljV*dOCq~Uhw{9#|G$2zBs|^ z*SL;suev@-G5GJ4i@kl|=Ydc0Xp@)6E06{(2*59y7DnOI5yxz+vuhRTGpzLR^zeZW ze2mq<&}ni1++jf`TL9JS9n|t0#td126LjV_O<3PO%=nI3wot|E`GeI)x%4yt(}^+p z)}iHj*~c1hkZK0q^p#OH$~@XwjelEXZySZSCN{tKBW&UK z8a1?|lG{a>58tFQZPpk4o7`!(3N!b|Im#THd@&zcDLv~E;-sThSa=&iV1@!BrFSw| z>lZ{ojP)U_f50h@p487Snt(Ru3#=7R<}TuTKY^ytNzD>o z+T6^|88uXi3ckw;OvEp;Rd5@^8+)s;@Ugl?7^P*a&yCibSjyLbq=v=YvEB81hI*+N zu}HtRqHQQ-X=>m;+z$`9?(C4jXWneV4_#`gjn>Eg_i+Y_{F>`GYRlbVDOeAZ%5q|| zY&tBFJB~DDsrpf*WKGjMAGq;8Qy_*u$N?8>jw6b#xWtWw1I6%1LN`Z;-n%>bhym5# zRL^p2S&bC4k&iH>dPi2mU#SO!-1KM-Aiwx7PUHAZK0mFZ*Tlt%?Iwi0TVQw{%j^eD z&0*tDn-rOJ65e4sZo2>ruN>k zMXgY3@7R$LF%p6&zvnsL_x~LEBgb)Hx$g5i&(GOFtNd9ctXGvedSn2ibvl0Y4$-bC^IwqqC&Q|q9+zCSYZwP3eiKXZ+0xgiq@Pz3_LTX!zdd+m=(jJ9 z;6RSmc740t3MP;-O+p)4&35t>q}aVm?Q)O1D2Rv-btiI>ZAj^a|5b#UuHWiR{bh1g z_z^B_j?!bIGZ>1Se9QkT%lhFiv451f&440VTASWD19oJ{4l^QIFF6;`#Dy7%5|-~L zM~Ie$`Y8%@@@~+W|BTmJAhFbHN^015;Nd7ss%P!Sya#5<928WC{gkA?<8ZN*+FDUJ zi~C(Cc&5Q6_@&lel`;8aA`e4TeO)wK5c!0Jh;91htyb~9Ee4JSBWI99$BfEfl zB>C^p?p1}f?mRFWtytsRr&Kxe>7uMiX$fX_*v}Yt@_(rkfI$zoNWQWaS4S^pidUmT}waL7Tuiza+JT2H8LLs!PKG~`*U zqQD-_QdWiff%ea}G5IgmeNdB5ouB@Bn^Aeue_o{_gA|k_FX>O)r&tqJ`I_inXg3s> zC=S~abAOlH_O7;$N7<*6yd#meOC<597bDi1~$Pu z_N4|X+`hWp5z<@&(JA?q;{HDwp8;Fgofq!xW1Vm6lyJQkI8r_2>B_-1jUfLI9SHH4f(|rg{Hvb}*fri^>02 zjP%yo$gsLBnzR(8n+i^&0G?QvcS;3a`pQ?Sx&qKzvH|EtduVOW)Xm1;+dNJa6$k3_ zdFYB~^~A}?FL;RXCa=LIUf7)ca6X%dBl70Yn}tw6)qVdzcG`!-`M)B-VHe$)#l+^r z7OQetARLs=P%BG0gJGiZOF)mBg^1Yiodj)}R3FT3)efJ>uy$jolhhmy0WPE z68vl;d$rB3mbx&M-HyvC&4Xr$CQ|j*8IJIhU=^Ey_%h_@K$e&E#wK9%U2eCi#?d_A zZglkkNbd9oL-FsrZoglZ>eD=xZ?U!eH<@yBW@)^m#l{hRV;Ai%5*f#Tk%u3YMaRvC z7A$Kh^J8Y<78mdn1_O~_>#s)Kjn?8uPe#~5Z``h^$VjYDwhdBIU1}zy?Vs8llhY&p zC25)#*l>V<=)ER8 z#3Y+{p+;3zMu{C2BjVCH)ZBh6(Q1<}e`e3=OuXzf@9(6wDKoD3B+D>K?blWVXrQl} z;ePq63Vb8nkf!CwamG`%j9F7-zTyG5$$!2nkc_`JtRb(pX#16ckH_~g%jjj+#xs-6 z->36A6-pQQlyp3MAk(}*T5lrors4y*r-leD5ON@J;@ZtVP!AgkoMflPq@u~5(s&fW zP72sh(m}uF%2C-yQ?g!|{ja-ut)mo^6a@QiFMn)D1bioPnScCg_191#3+=pK)35Q! zuI!*$yQ~n|()hUj@i08E5k|M;p1G!(;d(MEZ{-vwfaM99=4^9y9Q!;R#u;^IO-X_q zs}Hwm=^LTcQSPJMIuIGID%#MxA1_AguA*IWAWNfErycrA6`&cH&bkFrwK?+Azok4rU%tI&pU5WML!(|mqjlf~?%-3$il*zAGqb8Uf zr-R$mGuT_^vLjz~^>Oe3#$`N8qLeg3pLWEX(7#NSEls003#6me9cHKV zKYf`MMy(MP%&rZzCGbYDPs`p{XWcf8zi%QQAD~dAy`?^XZ|q8y?I4$*Z zjp(R;a)wQ!_kiTaR!>k(Os>Ye6{uK!u0e|coFeB(_p|)Xzy$f`y^qgL?FXk(O>*8n ziP^DryD|ZL5(0Z3N&ZPX3aEFaA5?%IR5gaosJ=A%8P_PMgoPaD0ozvB){r z_#U`?R|YfGBJE`@+x8A8-u;i9-QqrzF7k?h4c}DK|$NZ(YnEhzUK>* z!j^{wSw1V@scwI^VZWI}oaFZt%bMHQ8;d~4)KOx*l}@tH-{2kO&iS=1zh~W;=JC{Z z=%x&Ljnde?qbZmTPXK65baEGy_EpXvgvynds#%87`+iu3E@Q&M8g@Nr0YIm~7a=#U z;I$C`v}Ju*GZv1mx46W6<Eb>Vb~AAt=!aQQl`qWZGn?J0>0Yjj zaX&m`zJi$ZuJCzZBU<5VAWOaV!L7BQn?rk(Htxs4{|kac$$C(XJ=4+ap&E;peO+{^4=%Kc?l++BbZN;;hUzVE4}$%XO`z^MiKoXFQ$hIpI9&M=J0>y2bA0 z_rBPEwte%3Z+4j7&_?wEn24fPVOM-*e5dG*ae2ydZqTwXm>4uG%h~yfmQz*fZl75F zRhGfvG0Us?43X?GMN3+}#Dvi~AQ%E_JObR`w0KZ2ZERv8WC_ktv%)BY7nJfhQEULot=~qgda^6j7 zd|gV;nWj2n(@U};dwRkUz*N2s&lqv!NjAH;_UaG&mtI0TCmG4IL`VkdpNFPmr<@%{ zcGLr(w~4!ZEu%rt|BUMu5pc2S53xS9Ce4)p(Eb0h0AjUk^w1;G!wz!(%l+=@iEFk+ zE@K^vlK?%X!J&o1UUIm=(T|kj_$8sFh!>H3V(CI!&B*Z9e~*WT%84q}uutCQ70}Uy zP<}1?nrdTFRp@r1%Roi5_cQp^Ux80lMtt!_zu;g4S4Nhkhbz7laO~yW*9hi)E8GAl zveZs~vZr57Z=($@A@t|tW1IMSO^er9awGnuBtu+9nyw^kG*Fp9Tk1K(`5?vjewK?b zstZ)N+45%(Lg;6vnCCw%Gx!ir2+>+e()w^}DgqYyATg9J9yVgvsHd2XxtAmUPfVDC-3;Fx3SVqtz%n-b~5ARhm}ngu$1x zd}_aluR^^S>==z_z)Oj%?uJg~C=HpM&gSk)F&7DaSoFHFL81X;>&pKdn%R&*Up(2y zP0s9pVMG&Li+pog{`%hJY6) z=+j&l-P2AyhFE-D+w3d{q;Nx{mE&4#@)4OV5&+iPnfkFd5UpiM0JgK@)~CL=^L_<~_%8MBy+zKuE1J0V zJ0=DmcN2FuBUzB0pmVu_{F_DCCm@-ChS#UY8Wfzmp!qt~E5vv;@6{-9xKT&fs#Y8t zWPa$z1++*mk~6zL?wD&}w5WDkGIfEvwt<{6_;@1_XJ0d!JyKM0e*J3}IM;R_gdlj# zP*6I-c}wi?y&~tBcOP=<4TISvsidhKSEawdnP%;|o z=FQ*Tb$X_#Esgr|)?<#b_7?5uA7q{MCXcU*t8Gds=sb1v5nR@#u-PizUNcxD%WLw90s zuwi|p?s5M>kth}@%Rg&Abd7Y4V78yk8weMst=t-3Ef`oJ2_urCxrU6a^d`*C^Mj*? zx(y=}6!f?IgmpW%7$R*+^xEG~;+Arv|(W|_a`B4%H z>gLw0=X${v%?Qnd-yr>3zvp~J*4)_&ET;G4vXKWX3V|O7*~lWiS;~Yzr3KFrZc{9W z0q*ltH~PD?0tyYdISL#v-_p+Oe4&* z6v%|^c-@h(<{{E#@Z>iE{Y1_~-eg#~QPjS|jnR$F)fbm@td?SHrC8a76rH4~$E0Y%u`>A9z#)t>Wfdx9YR2S_Q-`utQPOaDqT^&v?}Tz~{S1#xD(K zS_hgFrEucYigpsR_>3nWyGi{&9Q*Tn2fLnpytej}}oW-p+iVK;qT%{%=};p5^EzeVZQV3n+X#C zwuNB3Mg=}y0+!$^B2lm}lr&-+#@~JH2RCgVLu*>%?z5N&7#%xw(RLPE`rZ2T&Y3gt z+w>vV0+IBI*6!)Tv;K4$-xc}`<%|nufAU`q5K$G(*LM>zS!*ojUQ~nKDV3s zFq3}5K_Dd-VF|uD?Tj+(r!O)x3RWc2+5>+`n6}elb_9a&HKe1;CvCoyqVqcF&F4@Q z5=?App0(x6TM8g+kfapT;1-MLn~R8aZkQqynDqxKEZ`~64Z8sSzRcYQXPHNogbbS& z{e|V;r{`Wm;z7jX#w0lCK`XZ-kY^6;qw#ZYBZxAsKYH&7PF} zkg|WeTR+}?3Ytw5etBNdUlWNP@};g@5PqTeLgS=K+`q|^>v4E>^Eo#Coo29WXK7wT z?pf4zb{GewNFz5-$H9~_g;RCp7(FIQ8Q*06h*XT0NbXX-7&HiC9V{m>$?+8W?rGr4 zj-HK7qepiI%$QYqBiU2O#VPF*y%7$p#Vym4Qi?^Ja%J)4hZg&~@Gx1;q1E ziNyzOOD=grA2&1w>lnKveMz&1m4;PPmh%60bbfw5z@KGG6moX_R#_%=h-IPfn&`7 z1B~8)H)~|vSiN5-P7OX8>URN3)WXKvrip;6n?>6p*E1oaxG`N^;;z29qNE=wm%}k1 z?<4LFk6ciuFso|;NrK~5_6?{l^+Gwmu{!~?<(fcCpM=U~`)Im#_%+neG~2f^fF2L0 z^~F1Q_(pec&hhs2kB~smZNT1a9u{};iM4q`?z4S|joY)^r%=dGICvXe?%j3Q<172` zwps?bTrMrI<=aywH&+{o37*t0e~F(2vA00f+~RwS^qg9kZXF0eEEsncQ1?EhbHVWV zC>wNqg*A4Zcv>3_UCSBHlk>#gz-+G3ZWKL}%M~Fz=iS}l$>ls%{L*PJren*v4V*oX zTotZq{{iX0+^^p@56~@NzjGikzYJ_6|7y9e@0eiUQ#9FeNKyr>8_%0K5%yTkYAo9I za+8pCa(BVCxCLYi%n*#}S2}^yK`&{rAJP8B(aU+y8=2FV?9CyqXaDO$lP?#u$gY)Q zIbqn#Y`?u5Sj!%E_A&DXwk}=|+X>i8T$a4lf1#{#Wkv9va*RQh3FIC7Z)CUbyniL~)0NidP=a$yal+tU?XcfF zl%f66Uv~d@ZsNCf_F#a)1$hadWqv|F%{%2MXbI>t7HDBXy;r^mKZ)~~3;8%yjuk)f zlb7e&o~@Xn+BumJSW7m{pw_QM`ZFc|Hl2v+%DaSk^<6^a`gtL3rqfYX2kq1%S^n`m_NgM)K&PPKwHp4X& z+5rNkN2^s3VPKzHR0!E?HWj9i&N@+bU?C7 zcLn18>s>T3d&q6(RNDcKFJmBX{sn&*LM`rk?9D5f#&^|q&!@baW5`cE-}xtd2C^x@ z`o1`IhH*HzU09~0Oi-ccH&Hg}_mfX_v}9a9hx9)Vtaf|A3jP{Ldc@{3Eyn-A{nZa{ z4S7(_pW@cdGO2feqf@~>tc_leAKa4)9*L1{ek`VF-~|61x%@~2PMW=Mm@g9BnQry& zy;9G9>LUMm@4A=BX~x%X8t13%T9AqS2gBiimlUu1{A~M;l79?_#2!h#E0fBRo`SwIkH-#tE@x~0%wjLh>m1tqbKjcVC`5{dXkrmf z`|K!ib)PkGAB?OCmZp4B@(|b&Ec%EIl_uVEdWb^yT<_e8E!geW6%HRU5!8R-$>#0$c@L3+{a*96|~&VCs8nYQ=NV4r+NbDeWyJ> zocPX*YW%d#YdxW9^`&Ii$eQB1A3R_le0RKDPdlfJm2xPpt)%PG>Q?*mNMcxOEEbhH zD&k$)#AKnVxF}wtiU4u1=x+t=)C1@xkWj3DJ+TR1+v^5%Avc_iVZ74op1r)l z4vG*AzRV+O;v>tEsol&6Qu#nTSr#mq^~&~8rz2?O_xh^LMMFq5wDWJ;M=2a-upZQZ zEZ?T9DZH9s_y?bqrYXBe5l(jMlD!azY%qnl5pqs~aLc;5;2`Ob0Q9y!!k|9!G`!F%LKJL*eK>ZwEp!o~t$>zye|x$&vWl zR^n+N0ZrFrj_fqE|3(2a5WE-IL2Jp;E3GpncQ&Q83c+)ekhCEv+RpXs?sYiu!aig! z(Tm9-aIE(3s@7Nj78cUl`P+uoxPZ-J09ULPm7As?DKLzJlX@Q_V!O1SKNPoI@VwXJ zz;&a>>xHj946^MR+#=SFBB~eU-7g>NkFQ&}Xt5YP)!f*0kQp~pCEYp2LoUm2lBD|emh#sp|; z&=sq^XotrH`N5uhI=*|8 zIaJ6mfzb7|r%$^5>Z@;7^s={t5bDW}U93R#SZu_N#TWK0rBKYEqPS;3Uhm-0|J_vb0`)kRZ@ ztXl7DYL#+6lX`NClmg*%wQikQt|e7$*KPQ{OiZ=L?=%-V*C(0Dzu&STwx^@WgOk1K z99$|^E}s$Ar?x5U?&LSfjdJFF7aR|%C~`9lHqznP4H-qLl6}<46;H$$mC1WU$A1yI zr^&sv89~^GiKKHVOO+=j2I*s@FQ1Xk4B2K={`}-n*8%u6Nq#u4r~m81(_&(Q8NCn_ zKl!*306WbC9$vW+txjLriaR=h(RKNX?suiY}iM8D)6hDAE@%me( zuhD}8b8}FM=HZ`YD6ajLM#PTArp!-7X3kk1ycZePfj?W@0GES@@+gddr`KsT{1S38 zvk!?XSGE#bzjBYFdWjKY{?XUQPT5^GP)r{(eOr_FOg7ya(sJg$$WKboseZ#bP#l(Y z@q#b_!0bkptU+yCh~Kenfw^}3a~gS&ZfNZvx=+^NCE ziv2bZad%W!u{ zzVb9uAn1=p?X<-E$fdP89QkP*c@bF1pR@;@cVFW4{Hs%!7xB-L208Y42$!X5<$=N0 zV4Gc+f630dF@;+>Gzdpyu|SV~cX)VS1;up4UZW5H?s*QMQ=#`R3&y-q&(g?)I&(-ogU*lbXC; zC^U@n{3DC#3|4ea)NRh*9d~~6ao*m>eX-*Fs4;*4c7p=^ixFC3QC-ivMd~pOl^D-+ zAt0rXW>gODo`p3F{SsTN!b)GnHO&NL;y+ z<8zE&)2~amslp9#9zAx%Ps2Dy2{T8`=Y6&3$PpS!G-rfG&b~Q^EE(zzd}ER$CxN00 zWlRq{N}lHs6}}zaGT_xWsnZ(uFe~A6$V38*55$Qac|#*z)kGG*uxZ}o^dYZfoIDB( z53JpPXp2~>CwMTkzTTJai%@wJ5 zr~FQ%J@MNhc;Iqv88Iz`H5z}*85fYDM8Am1`o(y>0dvqwJZpj})$7LjKhmSWL3U@c z7upkNhd%u_0OULS(z?qx%{+^gUh7tUA!#o&_01+OvXEl~oAz}wPj1GAO0wx_rExXz zj~%*P@F6CX?9Yo{l{#d@QP1&a(W*GMPM)*b_bDl;JeuO+_-ftrbuk2Qm)~YikT1Bi z)J7pw_h{Ef0zSvL+;I~iza!4P`Q>7lAgrgU4d zey-3`v6QaNHs)t2Cl1K$_un)6j5n^a3hK&mlumm3Qm&xk4}0kfZgtH`V@Wz)>UjOGYVrZbOb=i3h?}A$wKeyMxPFiGm;%>2q`X+$?%2_&2aMwb+$|Q?= zfqJ3btzkx$f51ho9!r@cBru^9kdo+r=f2*lgafA!Khq1Q>OexLwkQH8HOLzj1yWMt z-JP$zL!Lbjeg!gh7N9eL54dH z*%5i&<4a+gnH7w@Ra9kF_09l|c2ops1B6-HN>~bXtB+MG^&1AbR?OV zGDw-nv9|1ct?zP-=m9%+wIv?Pn#zQ92_rt0(A+vto}*0tDxqcAD`(y{XQ&_4C?97Q zbB&gzho80LTgP&YRBtnUmwMs=6fYKhw@2h?W-_}Q-5A{baws~N>itr=0q@PlnM%8DZC$RB9 zhdL=mMb&()MPb5!x($l0$*S^4TW*mNTeTEl{MV7!*gl%~@2gV()7vTe$wn57jmc5S z)i$Fg3*^LYKKL|6-YUfSmS@rN&ABU~`Dm$_38c$Sb98n6y)l zRRsU%vi@UuwmNO+Avz=7{cQL2iWlUzAp$5pxw*>B>k%2OS;^Vcj2{b( zvxMev(w5=TDmL4=)gS{{)-kOCtT`T#>GMd!K$-g_`rJVP{VQ`aeL&#z&9EEpd!plZ zZKarD(>tY&Lxks}Cbd|Z7UU7&E#!x=(^w#WS-Kh4*7_uHlL;rzbQ=Cx?L{#LgVxTSi2<5{!SYMRlxEs&v+vSH~R3OsRkr5b#uGtRgB{1*05 z|7(Wn*)mQY{SfFJ7is^R^i@?|JKLixsVkA;1l0G2*cgy#&DjocRN>w3G+_U|*hz}W zb%5V1$rXy^#p~6T_g0lq=jtyFG-^D>QC1Hh0ob{(8$x}!{i<7gdnpfJKcNmOtOsU= zzwpjxcc9L_!H7_GY2*_HH*w{@cj4IFXI)x+F774Zt{6H^tSj1bYO7ya z>86>{O&%QG-hbrV^=&DF_M04e?&E|BUm_cInu%@}$Ngmv{^^ch<-%tibZ33v0>Yg)V^u0&~`l{>uPxruKz1Rlbsx z4X7l%12e!hP)apgPIoDIg|T@iW-M&U_}a&>?$3$x-lf*|$;}(-6Vht021|7X7KEc3 zT}@6dofYO#B5*L{sGqC*zN3ndPOJs=!DVg0D>}DRp~2F)FGU)Y6S{@1Oi!o_ftXFr zKRD}82L|lLqv27vc>@f&YPzEAir|-jqHBK!FnD(e=n-7^Lxa3e-qd0Z5xZmWI7wcP zT%J0)nIMuLp0O!4-2P*|jl8L!WWD`kX`o%>VZNGG=a|tdx|Si14vz1O53>1Tr(S_@ zgWDkED*lmv>KL55NYJEp#BEBp0gN43TIqV+^YAKyHmnoSxKmZDOBy1+)|H37YC3UU z4`PMGE=N7`nw_&Q6T5|{i0`T{&wom;7@C~Z+zvPYyG_K(UTEe);MVhg>zUY2Owc3w zZxjDdh8SC1PD?V?Txsk1haKMfyzNsVW*Locn`jrRb_wb^jStCc)H?ZkhR>NqFE)ug0uS4Y52X~wjW7w>LYyA{vPzf3V(FXYpKCBjbg-HHv;o+Xguuq zniKiVSo42XBA8$u=0cXyZATlh?jWY+_K`sBA--s%UZIFhXV!kldg!RDrFQtz{b7h- z-kw{9?yzsMtZQRZciC|5o(P7%Hc~znFvvXTgcWjQSIq+L2|@$BuHpm}*Uo$ok|5V- z!0Xn#op;O$^JiVmLgT#@!KJ&E*U?g2FuS?&J}7LiC9ukJRd|jogv}>+45cgq`2(Xm z|98?To@fAFN1amx<7MI00d0d*0%Q3fJj~XHAeKZ_M=vjZ(O5~0U;LiCqDJ^Kra*Pu z|27Ix5|X4hSK!|6e@lLDr8SDB@{prg$?3#p%-eKj$)B)O$a%=YqVZh@a#x`>!SXDz zQZ#YzkIV|S-nj5kwp}gFgY6(n7E^)iH0tw7+`Kelt_QS1G%+uP3?10@ID2VS-?7O0 zsVT7V>2?Q>`Ba;~KN;apFxk=myA$B6tomWC#CHO*)CjpRv`b7$o?fp74mUj-mM&v| z;r1$YK&Zq=l%w-^s<<0){=P%{WDdN=b*iArdSKS```L-jcol>WMTHm}Lkv8Mg_kZytW&!=oad6QpmqXjw~Gb~GwnJKpK^ zfJyZfG~m%s^n1#Rie@S&H2GC;);?{k8|I{&JbohAt1ikd;vYOyH|J{w=wBgOu=Pl; z+g4NcVyRJX5{t^Cc?9h4R@IE3i>N9{=GU)MW<4DX*ks(!h8_@Cr`o$jZJ*8_zgKZ& zRpBS7etgRk$MT zNONNQ_H*aF-%AY-;y62g@NxIBljB*?0M(EPAC}`NfMmbxuLUFQ-64tl7P? z;@(oiNA2Hh;_jwNA0NyMAK6D2*+j7>K`x(oorcyFd>=S?Uw67DC(~&Uz&QBc_U|AU zoFJW^ZfItg*4*ur>-@XqloDNonbCbsMe(c0@WXl^4=kZf+{)unVx@3e|G1a7Np?FW zsZ_q@sGs}51OQCWBCkV!e6HMZw!$UDnBm33l76`W_OAht;eEmf?Hyog$N3W?wI z{89@yNF;`Rm?wC-CuZSVCdvXmuPvifg$_*Sq%$;~i~(CGL?4SBB7g6qy<#kr<53!S zEnZcSvJ%}_G;KOC*y$=J=+*h_;6@{U%-z{C82Y}}& z63@){E@K(1 z(sNwUb?5mhuyt??&R@;|GeCSNYg~Cgf9ql?kGQ_&?ZS3qH6|HC{MK2oxh&ul}a*A~&vQ%K-mwMg{IDR-0d^J4?_(s9it&_g%{RPDz8#Z;zSp&>Z$q z1p!=c)|6RxzRU>Mc*IcOtNHwR*0e*Sw{qyQ`3D-WFyQsv#A+BpbVu%^)1RHYWDpuf z4ogz6qqztc;C+oX5LM9P>3{5E_vN}e6E|l1Zit=JS7{I&BGSQ2IW51Y9(OlRAll2B zov)QOdmjQF{*ZWBbOwAl1{wUP9+yk_eIcp0K8XY)MTcEn4_S@N?G+!cVQ|dGE;(V?idQ`eL?|bw!z0-FvMCBfsEC1@pc^GvI zEYMkXl2ib=>a&H|l}kug?RAX{k07iFx_sHE$k*_Q^;&DJDb%U+p;%PlCF>zXGTcer zmX3qG?%`IRB+Bk`n6Y;B_FGC_kQd1~rR{8@f{$)Y^d-p_l>JhE39;6ydvlt1c3NU= zYoo4%dFA6M$T>B%RZNsgG-z}(Hk~ga%Hm_LMkw9y1WaaWiHPu7Way-yb?_<`I4!Zq zh@BO(bbfqEMN;$fvrraNoF;WMIw~_a$TTfs@?kuugALQB*54E}lSjvG_eEP$NCz?C z^$&CQfB$V)ey13>Sk!)0E!aC26eX^b{G|%A9Kg%fsv@YZvaggY+!j>4t@c^-?5Y0( zRl|E({mLsUhyh3;^}gIBL3YmQYL-*lWEJKCrWk5*3^>djg>8{*V$-LhxxaJKF!06dzI+`2YY@!0hTfDfnG*^gv%ofSEMQ9@%8@3h^xlL~u+8R*)z zpr}m~tC{$pNS@Z{I7ZjweN)8~ObK2BUr9~n^~9-}=addxZu>uJkOHSXmOz70UgUEK z_PV{}#ZG3lSW{frXUh#0mL@bB6-0lEmuS>F20gp4@=GWJV46mmA!kKUx_@8O*W|D5 z^OJsMSiypx2dF%=QO`?no6G8O&zfJ|q$D8^y1Spo`ecBS>RkF?TUfql8F`M6g=XJdEs&VK40cUgF;ETL$sZE-y2MQ4DyHi$2NLXBV9k@ zKe?VHiiBIwyP3g#R+dUbCzYqs&!QqF64knjWXhSnnTY&9$ZTv_vwf{x60q#x^)GX| z_hsf|4eKA`UaE#>8Epk|9~|4*8l3Zf3Y*mYv#(1vZ*tSBc>Po`j?v*}dph|I&sXk+ zn>~6cETL4xH^-(VZDzP}aMbR(n%5nez+&2VkE(cyv%Mt_zGSy)33pW&@PV(UvJh6c zz$G<1#oxLK$62Fm9{_3y<%6SP-eoD`yk1+ZiESJkzRCdho_1{3eZ$j6nlGT0VBgE( zY)G@I9-@Id|DuzqxCfD#q!Ullx9(}bt}l4fum)+flzG;SjxW-97Q`;8@|9+$_Z!sb zoMd1({t$zyQHn0f7dTwJe)1vljc^d=NyyP+qoEA5ucKjJ(0`MB%wgQja&!>fGcg6( z8(6v4{Td4S3kAgNiql1ebzEG0BeqH)Lw+J%3ve*xo{foE^>13=Vvcld%ncCUPt-m- zB@me)!9EL|FwE*h+W&b`K&S2zEVM!pSlW8^J;gZBmr}1os;ixA@~XOv(B)h>pCd74*)Nx*X9dN;%Hhue_|Qiqs7b*70sH?X@wiXmL0t8@NdFf5S2@e$TTuMwIRh}JEA(Ui1=o4dI>_J5 zGyW!)On=*=k!D6!PQ=siKE$&q_x%6R^d9bPKi>a-ty)F3ec42*y-HiuRz=lp)u`Q~ z_O95X)T&MGO|5FhUa|L%y~T*Vf`||izx4C|egA=6&s@2#lk+_1e%yyz4k+h#_=TmF zvEO;Sb7-wR)g-~2edZ-K8*{Cc{@_RH0-y%71dH+8k1aAW5yg1)6BoRy`b`m${%#S4@==W5K7qR-AIEVatX>oE@^J95Irbu?Z zf54^RpGvdXmA*Sy!u%@O3o7g75G@mz$A*|G2Mb%Ysw#sAytPzg9UX1qi;&IYtqTYIFta7o&r=IfQ!n-y^nds*MFr+7mc4$ryBVmn$_7>`;Y z1=${|$DocAGKxx_O>>zW+?a4}!|Q(O6Pfs5a9O7t%?tbWNceN|5mSTs!{4z7R&Fub z7Q}YK0=ufWH+WaG(^AuLF!hL%vGap#yg}oz)m!khdrL8i=`@0}Fq@U$XNQgCd@Spz zBJxXSY@C%Un>3k+TmdQD+8r(^<1Do0v=Y%)a7-}0I4 zFCx{SuxZhZmUjHbw1JB|tM$jnoappX!H9L{HkPaR>GG%JXw;m!fi!~X96i}fEw{N; zA$3){I+_=%Yo0b`?h}cduS(s5j5gB)-rau=yW%N&5ZhLfp*_ETIVsVeuiOA%$yxDh zW|gkbbn&JK;JCLt}TpcyKOEXGm{=bs<7E3 z7?RGh`>rF$rA>9OdOV5z{bj#ZQn}x(85DUL8g+|fQVR-+hK^5NBEy5$Jg*G?)TiB( z>#xs;OB16F4e5M{r5SaT;&;jJc12Nf8yx-2rdFtYMG81bqi6g20nn!Dq0E&wvN{q8 z10*T|YB8?-Ln`}6v#N17-hdltu$`i3Ry^mQPZV+v23{sa#Yuhr{-Lq=d2NngQaL>( zjzesCv^!Q`K|UfZzu(PvB4A+cV(Vcn9j+_DbQQFL6(4HuJ{(l{|H3$-n#0%n!u5~H z=A%okWcd(4Tl1mi7k9Cy1(VOOLA`Mzgwio(k*?1u>_RwX2IJ0uiW#F4mpsq39ROnC zL5XVCEg4@Ff3K77iH`Tqk0@Sz^6kSGLsk2^P~-7*{OQr>1YoF7-ifCcc_&6aT4RE@ z?wm>t^Jb>eqNIGM_1&`}Twz0KN(Y`cOvb?(=~N7w)pd>>(sUDL3`F-BkA@OH;Uaw= zCw3ex<%{O@Xn&!m0yF8}%AD_HZ0=@A*ij3!0eTzh=L4Rub3~pJCfSI3TEu@MkX{%K zNMSFSDni2}VS1-Km3-nIN?(5QTE4SbW0@P=(Rk^yMmd+}$R8?$kf6H9vDtWGPhlR( zgH?k`WMZpE#%l;{BnxT2K5%nMq7B-^B!!Em_c8rlcoF=BA**ff!%^g-EtXMGjZC+? zDfRezI{(Yzh`#rXssgYk=eEIlrSiJ@ir-E{z5vUsOMk%MzI4+GxM9A*`REIMcwQ*Z zH;zst!E~TZ1Bfxz$+fGo(~#feJln3D4MbikBWdR1dDW{2z3~^mL(=YXO)e>w$%~9t zCw`kB$LGyI#?74Dt&=!!GJ*_^%yUsEsdz@@H0-h)GcO+qiuO?%^Oi?V!-0Re5o2&P zkn6;d(w=p_X%U-VVt0h7^xMZ|@VGU%_fcj^K_B$NJ)|p2q9wq!Epo#P(lnrX`B@(L z*0skn4+r4w$5#9{V0pkGwT;ZCKK0=FwoCT4hlOQDE)zJX;hQ-e{}4*$8`%L>HE~(2 zevTuIC3Ltnexp8k%^|9W<=;+q=U}QU%7^(%aIa>moKwm&mF+6iC1-r0j0fXiAK|90 zaiT9*42wu{4cd8e>}_G$l>kn$ml3X%S?_R$AvLl1ymUu>P`RnE{6J~(3Z;Bridrzl=7(7ZY!EDUvAVlht(@*(UBk@f zyH9)N!>L)PAy+w-O{h9>>%0iNV>C)gzCXYx`Y9V2t8A;WV*imC&xPx3$OPa@%&$mT zqZ-SX+B_Oa)awrn`-go?U~;S?S4HyI$m9ON!~QUiat!X~8j^b%nLF+kF5xM2wj(&8 zPy1^KuRMkYTn(Ea$F^U*ZO}yo`k}U5JiU&WM6zz!c;B;=mcQ|LYt6S<7)21Rdxsx7ucwV!XV>|x>_z@8UDKibAk@c-z`inljqE^K2Yad4~ zDh~J&k+akO(sg{}E))O#kEs-QlBws?e*+vR^&g+pe|@sO)rVDroAP;s@L>{Q#he8NA4LPBkR!`v&ini@o1! zXL+)FEoTMcT{s#D&LvsD*Tb#>zSO2Ls!{*0upbErlOz7n(f#K=W$_F)udwEW&be8+ z&c&8)fA1UUTP4}xaqYE=Y7rDx0-=7#TIex%at9Y($UO-oOx-mUJ&a*zN!-Odx3%}W z$J$1XYY!3?3StO8b`Qi~ScXdzxGL5e!)_+@^@R~8Ul#H08S0_nlr-4G|E@A7` z$CRg8`8RuXd79D_+9LHTXQ3wM5hdAIBg-d2N28BeVmfw(D7DNXz=aB0|480g_mz4* z0*ldMQ@@KnZ&R8s->36V)GcMp8WNUzL;O;dM{0=OuCYlveD;kj_zq=ykxdur>>OlS zayhQHiHFw4kdLN{iG6NxAZu2>e;+NQ^pSkk(IHt~rA8ePI#yKnjdgY!`29aJ4Qqy> z?FZ!zjrQknPvQkgV&{H93HywvE_KKm^|gYt2IQ?Rqn%3aSeYc+g`WhAW^L7^2W;4N zq%&~^nrrn~C3Dn~E5>SV$s7jgT1aWS#$OMRIMGsnvh?8ufvYT>o3D9Cg(ovC1)3>&Jd9byLic(824N}y3Asd-v<5n z`aaVu8wg*r67loEo?CHYJ05nA5cw|!rb7x=FMUJJHD6;cL*%iP+4io5*BiOmTx;Zr z`{8~_kOF>OWAm1wv*_UWzzT(6sbEfIRRXI}07XNZpZEh8!SY(^(HI#)Q5ikClqwDN zn0}MNz+A-bb5s6+6r{nw(NM0F_8O`3^so%(6}Z%|jV(~f!9)N>hLv(zkJ}Ple1AO8 zSt-%i-a2PYeEn(_A7v)FSruu|*lKNWGs4CAcuH4*?PS{9x}@R$GA^}WiTO^rz+3l88`zeTXZ0pTsR1A;w#pO*ktV%UV zBsc&!)|TWjHrKlY^$zq$n~Ib#BP4F7wQois-IfyV*sYz-`BRc{Oo6`klAZ%f;oMx` zdP1fj{A1Vuh4W456ZHyKV;cWrqvBcy=Qmkh01S`!zW>XX3@?++$^J44I+xN;2GC_t z48}0dCg*YEG~WQaE`L7x0OkJ|oS7V|B^G-$WL|o3)ijSyBi7w{p5xI^)f!{orVWM_ zNzi2CluvAi8KLw(>id&0tpj{3zCBwdCu$zDeX)V&4R(_!#!1pF#*8{#FV1QEu?dy; zdrJTw*khYveKA*JBdIg}dnKpgV*N<2KBp`iAA`9uyC_N~LJB{-Kp$tGXVMYZg2@p~O0>ECjyFkG82aW1~sXbTyPeYFbwEf4uPHBnN zDmJdkRCRJ>d|nZ7k*t$d{0ij@dsyuaV3wZDYhd-K7^7W=&ubBWLCc@pHW;X?FOL2B zO0+iSiTOK4VP;x|ZWRTP$I?Dg68rWT7_%~Ys>{OIlC9Gn!XQQF4b~A>qYEEKrAt@>eKr?f zIdi`hB7)*zRNv)zw-atQ7v>8*{Yqxd#Z+m*2efNNnU; z^@`)e#|$_A&z7>;{NbWTn;YNbmj_}xREs7KG}Y#I5xvQl37f=JJ_<=Y8G3gC1+E+} zUPLV>15`dl+h1n-@_sJ-;%DmAxFeTaTK@Qo_AT=2*R%Zh6gNuf&5|Hjj@##xzaQ5{ zG&D4vKdV&(=Q!zzSf>b+VR0C;Ha4=EsXD7-n^?zs-f5P(iosV251#Y&VTlQ$O(x5G z-&?K9=_wwy6l*3jKk8f^ei2B^)y!*{Ow;XUBGUY8SLCQto-m%hVrPDW1;nuSbbd?( z$`%v1Qqm$+=9E5snlhfmIS-vgZO4)gi{+zyt)N9Q;h7vFUI))vO?CJHy{omW087qDU}7&qXY(ACW~C_SQX@~c0g1+p!lSDK2nK){N#M#(`-w|4 z6m$yKOx78^*~EFQ=FL=&0gkue(l6_uA@-lu8Q|^!%(b@!D9s~84?Q==yR$^(y;s8Q z)+7LvpLgkAF+U{1eaLA#YqZ8b*Ymp(!;jYameWZ8fjLm$OQq42e>3%;&AtJDpx$jB zt*xoj7kzWavh7tV3V_HU&PWURXH{<|pVNsmmyvSBG%9(9IS$W{4^2n?G`bM(+Ic>V zZ+eGusO$NSOQoTIkWct~eQ?~V@f>vjY{z5vq8FJz);|aJZ;E<9ec64=a&3dd-c-Ws zRGE(FnU4<(Z+pmNFSD}sJHbVDhsFW8`g3v_ke0Kc*+8t!iBJbU1XbX%;O}1;%gjyP z%vuKYkCD$Y+@g=0sVzJ8zK9tkn7a*hHr1k1N{$YsYnWJ{i=iv?h~|9=3!s;~2Jui$WhFy~W20WGw^w z=G0|&OODl}Hbx6GGun~f1_!wp;A@_WLSMNMdK)YfKmE`snuvFz~`|9$Fv#VS?(?6?`o1{E^_?6+3Oy0nx3kND4yh!Y|C2a_62TjJ{w2DJ4Ja@npafqYX-oK3FqU2 zm_%us1nxO&AJ=HQJ^{MYd{sFyTX@={+&rHYX1RY?Jw1r6zU&Vu%r^dG-~jRP^m+(~ z++%u>eKn9jzj~r9@q>YMR}9C*=M-NQ+&7f$iNi7q>T{%PT|)JxZ;=%)7qh~AiT)jo z#i@@k#Kmnb`dnjQN`FTG#*WpEh&BSe_q%;n;ooGmn7XCE5)0NZc-x*D6xvEne(_Cv zP$!pfkevDKL3XCK$D<4enm-oUtMF0%-r09Q%>Inka#rhyoVyMli(WskGtt@torbWT zCrj3l2LCdj7T^Fs@o;!K&g`&J(m+0aKP@A8*;C_1^%JqaenINb-lP3$Z#cV2|n5n=Qud!;xHvXnQY+xL(F?kIbpErPl@-$Bu)%X04h1s_rq zcIKD@mFTrg!*Z|S#B(dRY2T~i*EdV0Ni;GZ=7x|7-|-==-d9oTV76bCqk^IUD?%Qi zzl*154Qy9$pY%Vu&3+T7pih=T5Dpa{Uu04hUY1dM-vX!}c4Wju+Of!}{zJ6*+)AGD zBStB1JQQ(HMgR`3+=#PzRm|GXPmI;(C`GG+uyg!PZL^Jis>Ij#Pf_6ZU%C&*(x@(L z&n+*X!JY5nYWI)j?Ks5Hmb(ca=O4g((n3yGFedr)h~*nyJP?;468F(v0}f$JZ#!37 zqe1@5QNG0bJV>3x^L;edz}tW6oe|`K%`o72K2vi~HeY*O)7(X|&WsI$8Mtb1A-&d8 z+w~eoB_C1VYHX$ZCQSOmrHfQeY^IEAPfA`6!M0B4x&^9?@d3=MCT8>wdfR6mSYMIL zkUC%t`~%a!Mz{L2^;F2p$0B{wpSH>OUV2x?d0ng&PNB6HX>)kAF2~yJmK?4(nhbVo zxQGLFUbl`ELXoHw`;Ty=NM?MAH@-YO{Nr`f`<+?I$tsG*(L~2ncxzhrxufN{<*T|g zap&DCra(%byH`A!NY_FqD2E-{2EU?9hC?LL0c z;bSDvuxNWwuXQbPy)Nz7DsyvAI;wLf>7Inehs|$1The%nkFt3zhX8Ij(_*vT<<>C{ zx)@26UkD(h6^)dLPpWf&BV*p@6L9-qj>c}$`FKFl9wyomBp7Rbp&Q6k_DE@|RZOKkCJ9F_$xm>(-VN9A(mR4tTC2$9tJtLY(4^hSE9f1qVI`>`* znz?`2#rMtc6vfDODqRsU*~KzdSC`CSS1F*bVwLgadNW~|#G|}L|9(2-M}GDIEDJPlO>?$SmS?}Pzk zS1kVg5@_p9mGL$yw(Pll|7YJKU z(JPQz=cf%ZBR_|YS5@1LWlvr6t?se;oL3!pd<&totvAg+oB2Y5{!GBI&f>vT&A|Df zx%O+U87IFyh3W7Y0iMtV8}W;nu@4*HX?!10a6HRJhZ(!zB7hE&Z{PEtS8wkQ|KVoI z_?mrgIcy>{;5+u3KG1!j&Fk||%1;6B{L|}PVuHPri7VdizBtQd_^T->TJrW|r;U?b z0u?MwrqflP%A6RyAXO{9zs*H-ILH_DUk19FSUbbAQvrnVg8$tyv-6Y>=eIO@ANMf$ zTBeqq`+1aDTkzAlvV58|lP`)Q)oF~a!nIF;*OtUHmMrns1*41@h2j^bX*k2Ks^D?S z^8``#+wU>OnSDPjlRCE-68nX&Y3kykHP9r+_#q|fnSKVfJknq*<>-&lcl57v^P-xW zse}TFnf>k`ZQZAoZCMUi3uBfO)2k6ui9fHY4oC}ag>4&WR8Q%qi_dkw)jt<4X2TSO zFU4;fr4AKHFzY=(Ey9k^Z9ZxK00gFGm4nNJM6j*lBLG~ya-hL+n;KFiCi5nr@_f4U zAuVVg?tiQ+ZO?qeInPrhI%Rzp{(h->^~M0ScypTC7R?m!s?OCxTGi``=9X~9z4NMa z#Q9zgX3I37yd;fN_iBHVe*Mpp^TE0j3(olU{>JkcfqpF2wO8X^dW(;!E4}1d4^^BqG8;jc}{wRAFlp{NaD=;@MDhn z(y&K$Ti_zn+b24)u#b6cRk;GNYUmL+8%91|2dgpIpc+Oj9%#mk-n*dUD~s#5!3Gre zrY;#>Y{RV8|D~0BJs(_EmsY3WSv_-{ViE0J@;TbIQ;WI?BQo-dk@$LEK<3m;XLj$y zb_8h;htGBfzfhR8de=`jrySJDqF6~E*J@>$MB>M4eLJ3keyR|-)YU=IVXA20vVuWp zI#l<%q0QMIPY2YIDaY^-i*EU3-aNfkNe}VWE;jWwwM;b|pjjz^4TW&;=wgWVOy=H! zk#t)14aM2!nP6z&#^{tS{&M0x&BYy~o+J)hZKw9=b;M00>zofB zv4eoFUD}s#&b4p9dZ{76#?Pxf5YKY2G`u!YmMcpXytIPL1$i`4j?0!ua^=cAiw%1# zrcdb77^X5QUa^9Zo+JfYKtIptoWM150&R2Z*OEL17!_)jM1&ExUJua7o8 zNocjdYRg=GVs&d;@$yy^rvwwjE(4G~ZhoYzW7z}Cjs$Om0Za9cbFsZElN0o>$3KAQg&`W)SyXKkPar&7X+nY-3_SiCV{X|jAm4TD zN1;PCnyY~D6ZDa^ZMEQ2?$u7)PJ^r2V54Y>+n<>yZHEz;H1~qr8>}*?(ix0xt-NxC z4Ea?h*gh#*M#T$<_3;)3_D5ZR7tOe1RYLORYp?d(W1`5f}(iM_SJ1$gZ@i#_|r7pkLZMd#qeGB2CUnJS$k41zuRK zu&nI!H|u{;#nK>vKmNjP%$oI1nmJDTe=QN`bbqrIzXz*ZWoK7G;Ck>d~jMn3|xn_+j?GtQmw ztSH|NnCxGCnETK$d|gM|Nm$o(tps=+L*93`NZqg4{_fS?mbYuJfS8s3+Vth=@V|#A zuwSeV*iQ0*mWJu$7`%~vid2PbSCeMy+0k7k^O-Bvc9JJEcY(wUzRsJW_g=W;&(o~! z9qBP+KN>uFT9MFG1X%i1T)dduwMApD;T3FfU!m~2rfy>VO;=&NO`er!YVONmKtO?p zNE#bM`O?GmNbNwi`tMi@T`@b==AUDxYF^kmp8x(5nBA^V_*rV$B~=UPrA<;nYWS zk*uWm_7BW&zfhcWZOy*3pa#c;Kgt-|i7>2LQc)C>p^@Ehw&!fOmaiyLhygTu=Fk?O zN4Smtn=V{NoxB`9!&l+YIm&I4xOn&fLksQTm^0}MY;&y7%uqis^TPWj6hsMKxmgk;EMi*27lNW)}>YKv_s~*r5;O6$_uBLo&4VR0ITn1If z-CB{9MPPILjyf4OFWOgtCPT`crak3_EZcGF);2;1SB;V}w>0UyJSDOIxDYilha1J@ zsVw{fakSK3e{T?iLN!+c7mzd~tsuX4I+Y&-F&5K{gYDdmhbP!D={70Hvci#wIa zsIJi5o~*vhJ4rs~Q2k=x06T8=Dl#<{eD3=+I<$Dj@3oRjBgE7NbcG8hM78CXB zyi&E;4+g$CO+_^Pf)B6yDiZWaYobSu@Tb>w0`aK7*IB;2G}BAm$?sq*mUN#>Sa`E6 zg_QG*TmIo%_vvmiK;0x2`&p#@kWR+uEao`bQUnO`LQGJ1I(;EUM8m;HP7;9kuZIhS zAtdD7Y#?~uu@c}$&M!B+l`}3Vi>u#5dr#L;a+IEmOI1v;Eanu#wVKaK*&#@nXn4Qg zi>+8n@f98QDG!9^v`|RuEe~C0fGP=Pj4QJ9RRyBr*HJNWTM^2Tn3R?~^56MBJ)3FJ z)$kUBU84HJouAjsRc8L`l$i49)?KZRsZBhwbqr^>pIDH2&i2cP`9@!f+uEIoPp$yU zrwQ`atRJjm`pgf5y-=Zy;X&(jP$LVb&TPMCye<3|=oXVFF?cj9d61o8;AtY<@0p`- zf&CpEKrd`EKHoZp2mF;Nj#tVZjQT4d%qM9xfLtA`OmUk7GYl?$!(jwuxr~Tzpa8#bXuTZs+Z~gN~{{nDV ziH2-<@UuN^IaRVl(~|K)&7YowQWcxt@&A72JaIFqw^EzmnU5q@REuqp9;iJ0+iNp9 zXOyTh6!x>yX6Pv_o-6h{K&awzwF#osfck~T{oslc_x`AP3yqekP^@5y3$2qHr&ahd zxg))4EhBK%8YA5x$EQHQ;cK3!ZGU*3HTGQf%RWz>AB~FZ%4yb9(39RnwzuZ*yAj5v z1u4_VXigqp-oKA`A3!!;O=+``@a(;Y16H56j{*Iz;8;KDRj#!{XR)MHvoMj>BsU6i z!@R*wo_m8ePZo*}qRp_vltx~EA0E_jA7>5+pNj7;v;EP3<$PAIXZx1*o1I?CaWACa zwb695bwwvs!*NDFkfZ6+w!w^us(BJUP2}zv0|~y}@JTk^T6k#`{tO>7TtD+^DhH!-+N#U~v)4%bMEu)j z&g@yf9S|MhqkUsehEDu>w|&KXr>=P1uGng?ABBf9pecqM)TjuIqqDD(cejtEQ2rsl zyvFp3c;?Hf=eqZ^@hnUSGQ3@A^c_Kz`J2}6nFiFgw?9MrTwpU^m|0)fg6yyN-Kdrq z9=y$J3=F&a_c@nSEV`}#`r6R!1ntLya}qCH;JB8oo~_cQOO$6@R*%oLF7B^eIP%Fp z`~7*&`#b$^T1ShSU72jqSe!OnzF?I^n_%vYv zpTU<{rJ-?os0>o^y6bY}nRaoZgf^f2-%u;u=g$exW8{B6?aBR3FC>ZCiE3-I zHXIBLXmF)#2ZRB9kGP!ip{tPMky{)HleD5MHKeQ#T&(hF^IMzXag<SwbA%+;Z_A{hLtR_|b=r(!SPf>OFK2 z36Y@Tl*scvUR9FT!>~Uhul$?1ycIg4Eg7KMvVT`~DemoMyB)sejL2J~Riqx{uJnC3cJ&e%89Id!4M)o^*I7#s*t$6mwfs7%`u*oq6k`;}xc8Pe?@TL0W zr`eT=>R7qW-9e>r#2j^L>xvf1zM$c&`%#@NPp}W$1xKnN`!klHsn(1AD2jpOBv}gf zeNzw{`}x|FC}5_9lQ;lx^)L6^JS`a&MsiaAB|d)M>#xd`7JDEmNcMnzGwnkP?aiW1 zi({ua$)4l-c;ELmiU79pZp39`;fn-%#QrCiy_#%ddx;NLpGBHW2|%%ld-wnDZb*y% zA>rn_*08oWi(cl#tdMUYLX!BGq=^#BtY(8#w_{HgMD7^>((CNw-KyE-Uy#4-reW)dVp{zJv}Q{{&X>&F4@FRX8(doT4UZjzjeb9+ROaaylcpYkrE zv@`vq<6dt1s@3~jTf_fLzRcJAmMg~yG9M->A@8yZ(Yxx<+RFF%Qj@5wQ26srs~Bzs zcOf??I)UPN|7oPnSDmZ+Pg=rYOs!vQmUd);gizy(bJc)IYf@5NFllH=j(aWCfqC*S z;OInaCg1JHgI?oS0T12%Em3m*n}?>{+K1!+oxPv%*Vn2K{*@bLPbq`0vI_O@_A37M zW0@(NL$@hQzFW%D;ygP1``z-g-{LeWrF5)n@>4NlIx2^Tvrb|j(oSKthVKwDt^^2P zNd$)WtAUumqbDmI?~@(JfDr}Y!|&#Un_MIz;+Gp{?4mjpVt&zwr*qm%AAgiG!z zo1YMW9B_BuA%(u*ESvh2FsEx1ZTkUWd91g^&AA{Xen1J_SDU@V|L%$GhheGCpUtEn zN9uBBFxW#w!xfTUaK(JpL&m`4=E6MR-lX=K|@Xaw) zb8)7j{d$dbwFDc4&)h>W;tG-EwEq*75F^9BiXJcAR%q{m^KZq8Ywy2@Ut@WjNqc2t zEnB->h*A{mLQ{`&!{zVmkCZF_L$|i@71D-p_;`Le>*&2-;I$_`vURlS-QT*_?yCUw zN_aC(z%G$5S9m)(4xhPca6x^5U-=Iq9U@jUpyig`3thQFRiS{ncbhd$HtV6SQ(1pu z_;JS}Wy^qZBE5q#6-acUT&E5Uh^bz#oWB%|k~&(A$!RCPAZyuzOB!D;giRh-g3@gE z7mD_>18T0qWbsSDYLRWH&3_UVeEsUKxwAT+;1a~(5q(@CI$~O*r1^@R@rx4 zWYSLk`KJ5R6(RF=QQMtS*&4+kIsdw1v-nY7tv%5Y>v8|J7%|UP^&tK;Z+hL(my1sU5zeZ*1e!V`_IF3=1p#Iv zO6l;^!MV|RV6)lMOB%0~KU=5;hUIY^id8&ToZkLTLIiM-bPAUPT>US@n4Qu7SpN9g zJ9826>46urbq3VQbj=5aZ=I93j7#nRm9ceii(s3=)ViiXELOoVsNDtzb=&gdKmQfa;9&@OWxg| zhhW0XNeY8So?e(T3rba&i!hR#EYea}}xe?9=HQxS)mHB(MhIlS4UG||i(|AjzsLP1(?_PGKW(8gp_|_GN9}mT@AWsof2$@7 zC(gUS#o%4vMAIhm3EX#w3=OU)Jlz()-Jhfzp!82g$ULqa=a7<-;6+fyrD9b!SG44@ zS%=ToWmQcNGLt+;m0%2(*>8TZIq*F;-l`sDNL)Q_7=BAPnNyi3aK*c{EJ}cTcaUK3 zSxCEqoJ{p8P>9}qGv=7v%HpQFa87BoZT$6T#x|~c6A1;IyU>dqHdn|-Y@y6PKYnnd zjtk7;{yazYn*-IHUjnEi%N`z_`!V={6TO^Q7z6s|@FS%wX_(~|E4K8r5|7`9DqmYG zcjbq^kTx?fx%|kNgsQMU@lQl|H zAEqx@SU2>&nB)n4twdmYiBc%ieJqNx59<-cSVbgpXP5dTx90ABzQqNse1jYxI#CT) zyay}1SN6PCJ5uAJAFI)YeyAh47g#0V6(qc1ft{_mvTz!|1e4zN0bT<{e3o^1s9Vm8 zV;B5acIT5DwD?VfbKp|-T(_ema}#+r?0Cl9b^7}~FI3YlR_cpZ{r*8d6rNKr-{*DM z;QM=2DSbsg#^qt9Mb0E=Ujw^&ULy-mXYKzFA_`&ir?(EaVr4=7W+U{sZTe%#Q&fWt ztbm0Jf81#Qx~rgid!iQ~vS`ET%~pyR$!kH;nTQe83u7eW+@Bgd{&e4(Ex;3&(Z9Zv z;hv7)bD>kEa=T0cpi&1v+$=QaG1M2e*d~rUY6>(#FoE`c?)SUpNV*NhZbrKqjp6VS zM$65QpGV?s^W~^7WL+@Cn%N@Z2FO^4eCP)=kGd0wAA0u8)gdlqSuXRa@8}Ef4sW?l z)4yy)upx(*{BDD8%8Gxp+i?vzxET7m@ncByBYG17FkfLko7o%2Z6SZOYK}x8C*NuK z`&n?RuPd>&Bi}{)<>_fO^FGE_h`cDETf_{7wR00$)rXTSej8Q7IPk~^COsQ{S@Edd ze@nm|aSJxW@NFNR&AUdQA|>Ov>RrPxyM2YM|3|Zdp^spfxTh+H71n>CegQX<_)uoR zZ96N{Yd3dsRrgXcyJ0%rq@crSF7Kpb<)LOIJKbM^Y)hS-CZkP-;xq;c@Hb`VXjHZEvr=jh8oV zPPOP&{H@&++M}Lnts#bz6A9vgaXo8f`sV$SUh4i(3^nt^x6$G2lP=PYC!ULs%j$WR z93tJuMIa~!T{_lQ3$8-a)SUAq2GNHiynJ)vf!W+IREkXkRFb?O1Rx}?VAcr^3G?4G z)_U&B%VTT^OkeV>t!6@s}Hv2p=trJwTj5E`^1uR>la zs-`~@E0o>4Z#0i8kz*#^39=JZ{kxu;GyC0}YLuv}=bTFaM6Rd!IxU9Lbem+5H(e8u zGGKJ;m@>#WRBVoN=GF_*T`_9c&asIGL=XPqxALTy!a^~A&k6r}6h~(n#6M3Q% zz)!OXgmqa4rW`qq=^y-LTW`+*_b_g#v~C*~i{sU#fhw1`eX*^+IpL_I(|tz?00hIK ziP(3zlIVK@5BoFgt-NaQLkX(?MHhJa_-tYMy!NEJwfn%wNWTqMa{k-87GLu`?JZ^d z&I4$^IM-n$-@1D|Zk2z~zN#cSR{d5zkH2bc9DzH;7WfI3lB=kp+r;ilg-B!Ndx6Iz4P^_9Bg zs2UOtwYqHgNz&Y;6VADNl!e=KkDgnmRjKX*t@sP6soEAZVjpuc_$HyZ)jpcDKd~Lu zQX>Iy-EM0hnLTf3PINU%%@gukS6v_&U=&2M5KFhP8}?vDBGv1wnpDfUYLm2Q}6_oKk-DnV!SGK1U?*!7F)gO zJm?eDJ{lnf#1rTK)Pzqu(1-0%jH=kM%Jv58HcjK!Njh?wnKqK6pGBq!P?l-)uUQe{7gT7xrb~S2wTd#}Czt|9eq{vU#fko_d zS-%dr)Mj7#tx(Ilf0~d@K)`G_z`ni(4-NclHgBPeRjJ1%b}$i_BQch`_NI$)Rc}0i z?n?x2V1gn%YEY(uxO>)hCv8)6Q#$>49PTN^>k~M$;+E% z#|w!JG7Wele)@XjCa6CySI6`8fXkaRSKd5C>?{RT=yD@-Zg=-G<-gqa`00nRrLFpn zsG;iWlD%-E4HTU-gN%^N1Wdd_JAM(?k)13OCK)54t+IEU&*lXCzp*C1Fy$cABxFM= z{!-p)oz-TPaQ^Vkdd*k8G2j}1LL{xf-oi9WjN z)b`g#bAomr)>9&yfzT>Hhj5rugA#!(3=P!lcYm@!kmXSf z3HNKLJRMAstR%D&X`|&eS7A003_b8gEdAFZ^t9h^hb{12ZOU)elr-kHd6#U=t!Jlq zI2DpD?PbdY6J82Ujq^GeRaJ$_(?jlq1v(o3yZs4N2LwCR*Jx3u(XFYApUUgdy$$#z z!CDr&vLB~x`MAsk(|5z6U$VT3_l*4;2sqV>2 zUUxrG(1hZGLGO}9R`ag-WdI?IfRe5I z3O@|IaZ>qoXP+uPa?C1?f%ATut#8|I5o1$i*cTSfU~zZMsY5{$X`-Bt0s=chW1Rj9 zT`iQFo$6brQod?Y?d$r%O3l*lXT+}F#J;lbfN0IGM5a37YshoN@Y7aX#eSIxSYGy4 zc%G6=cX4NBtJy^%O7hAxc1BdANJtAIcPd&yvM{#8G4pU_P-VwsF+O$aeVOYE_w6MH zOlG~Bx#d^0<{4`M0Fv$PAJ5wtIl<>g0`}XUgJvF)3Vu z=TD;&Lf#XCie$-Gr7-o@`k0s%A15TLFH=4uPP^p?`uvSkG*Y=Nr(H!kd_ppxUiamm z+2>HY%Ve9RPf;?qwyIueh}54rd9tctMPGRt{TbD>W~OM7^}C7#(em!(!WgCR2U{=X zSOFitzA-A_EfX<(VO!Wx%e6QVGNw~~rWHK)k&)(*uTj+kvD=Mi)|@0Pir-FuTMT|N zQLGiHVI%Ow1Vx-npVjA2B@06yYo04siJk$s@dD4A0?Kmc zj;;c)#}iDh{j#q{X>;(AS6#?P!)$xs(i<$3jsD+I`6wXHf894zYj|CA*ywdGomm^G zseLDZnhH_Whv7%gBXGVz1pZ0*map&!MLOax zN_YGdt{{!A-<}CT8%2c~L6^OjDbc7!huc}C1TI7_r+>Fqw5$&>wsQj2)s}SzZ4E;x zwQ?NWGhJQ;;8A}urCjB+$Kd~ur?+rx^8LexRa8`jiKz7U6$C^;LTMNxD$*s5bVyD> zdIOP?oYEaicQ*_eFzJwP7#*@;VHDzohB)RTcLv2wo+`0+hLkL>A_ z?8Rndnkm#@yYXC(-SoGk1~gAyva+U2$+sl_UpaEV)rGyM|7LW(um|`%pZ_KPn-|c0 zKN@p9=W0@5ra#_)SNlIKxAc}v^K!Rir*hw1?qcxhZ-!3!N==b(P#ets+M_l z#s393^5j5=UxQxOmyCQ}RJ`7E>&WoOJ@U`sp!7^&*pB$MU$#M?hV~p90=m98j};C7 zSA7-%?H%&+^k&tJN}}&9sy^o|SUk!8)^(k5{?74>(Mvsj(slcHAOB#)AYt{p1-23~ zO0(b6e^JFX&&Gop8t_aYflL$ii9f4?doNQa77SL7qQh@1pY1*a+#pQoF@87b{lJg}_S(BDu_Jbx#ZULX0K9E6;NNdZ$nZkAB_;oJZ!_R;`n5;rYzEBu#Vy!!!bu^uGh9B7gog?h zA6ZQX_+cKkOa|oD(dLEiGI}#KPNT zCI!r&W{mbkDTp0UO`tDvlmgueh$drMDO1GZ(zZkg~ROSt35C< zK-J>2!xyJxk4t`Gqs6SZ*1k&o$Cv)lNr>3(*$U^{K)n=gndQ>82!k>3j}(VZ#DbN< zs?P5_Y}Zv{4DEad<%JeK8#tfDvDU%fl{6&tO;k)xSWN6%7Xa@H?qql4Xort3T|%T+8xjR$2rFglG8JToWzL zmfh9y=|h+>*YvMOp6s{gq1=-9G*KqziXfENeGGbA{TmF@=26cS&dCr7Y zVl82Q&*$KHJ$d?P1zcPC=>f~!4yiSN^IwaP?$Beabr>xDQ=KqHYNT?$i=$9j9(9zc zk=C3=QCmY}V1R7v{TAI!3K!#)l$TU2{%*k^p|&1rJr zI#Il1T^j+$yNPw;6@c05FzmM&FQ#qo@2ACT9@k;e&C$>f3sPN%XwS1c+SyKV)){IJ z;C~*b0aw!ntP(PluLzuBqea-%+l`8`$xnT{9jH0{M}pR)kRBt7D#5)+oK|z>!$zD*K`I|hR=Zn(xcN5R)zDO5!c>K1UWJ4bab0Q682{0dRa~a+EmW z6vyIP3Ky%r&2aF)90Q%r%N{uryoD#zd*a%2{-cj=zI~4XfNfdWyyx~GbpZ_h6|1WQ z@PTzEMZlXjt4?9Sms!hSuMF>5i~rYhQ94w3e*U_}^PsL{j{Qz%;Kt!*iw)DZwey|y z8(B9x9}KSD?5RqA@@1y@_>vwvU-}ngzXvRUVP3{dv89Jkf!2>N zdTBq&Xuf;(+>=n1Y!{jT%chDkEn1Q6af8^ndE1|S&1!pHns*z0iNVZP^N8d=KOj#t zIty%b(boEI!-RHGsZmQigPTjr+(kFqDg5t#7>aD(()*XU{-Dlaj>))SP^1-n_;*v~p3?V{koX@eD)+&j+Mo5B=D*)g z<>c~ux>P%~L;v6`VU%9u{gi~}2bQ1S?gUCqD^(VLvtCt7fbS|dB6&o_@#E{J&sl`R z*avjHDUa*kDE9C?tNZ(KNSMmrm9_fN>B$QV+h>iP0+R!{ZQc}PkGc0;86#QE;TQGt zhIUHf5q(b3C&|HA6aZEe6NG_eV)eDDTOWioFVot*R_E5A4qrDbGG@FdKBm1FT7E0= z$8}qbhpD$*@|Qf9n3gD-|ZngL5Dx zn+p-e%#*my$QIvX+2?Tw9HDlO)aeA2&H&6UUIg6!TYU51oJLU%_{rtkh)D!BMlq*b z^P+dCvP_Ve(Xo3Kd3eiwrLha~?%Kc386g94bEWyeB00yDN(Y&RIK5q%(UMN7NssBl z3XjK!gH>tQyeEu_Z4Y2g<;WXuH=I+$3jeww+({?mmj!29qq1$N1zg>3(>f?z2<<&QsMU_R52;+SG{hhbaXjzlmnbq4(Y;s*z0X!YHFB_o0&bWXZcTs%0>QVuF z_^Q>@J)Luyx%#wA^G@j!0OimIy1-z&a>X;9q4QYDUaZb&+Kd2s!EM0sJoCsdAW@%q zzCwMG0rP++0R=@f?jwMVe1egJ=UzM{ksq*}elu&gk3t-d|6dkBN(?bU^;R5kn&+A; z^M8p+N^qWAmcw7`Gu=$)sPZQ>b#&I~ld9_uS6|S@mx($guJ(Z4oZ)c$gUFwPmeH2UEjaxnnZbsiTlO< ztf%~nu~M*E4Qty@+LXk#HxqC|=+`FBjOvYH&9$ zLGiS0SMm9!b1mw6xSi7t>mJsn1Rk%VFKfzp!*Ye>^e#!}4X@=oFU0D*$1cH^J#4)| z2IB=GrO>|e5}ObZo%O=mH^2_c|tQ0MuWwo1hs}sa*YoMcrfIW8b=k4%PJaQKa8qW&b^fpGfP++#(_Khh~@2n9g;ybh9u0Ii<6B zxxZMpsfll%*D%j3MCKRm`CCxss_lPAM}_sz%Fu6sCt+$Fc?4X}eZnW#xOd;PFrzWt zvNPj1TO7DT9Rx?#Kl~ZEJ!3R>OE)^CSFP?Y0NRu@wC3RP$;!}iCiAWkHq75*-{}`U zG#=RTArf4+j0tlfcLY>TdnP`vlUyz4_DC37nVu+2+Rrv~4bJ>lR4ei1{x{q9y4yy| z!%#Pbwo*Hj23qbYCFVbByD4^72U6NkOr;ouL|#xH zr>Guu*nNYr8@r&b4)86KnbCo0ex<^iv-3N8fPTJoY47XppB{S7yQt*5BIAKHa)$bY{_faM)W!kq+=x*4@;B_3_|65NFb~7TIOaV?q!4IhKr|9kgrn%WQ zgw199B`#?h#JUFEK1kdVBi0G7l)mcoy2E|`N(uEwF6w*zLjx+==+tv?uvFxI;!GCw zqf+slwJ^hZH}eGnu4FFdR0R3VizRN?!janS!?+zvcNyN&7oKecUyC|G`HmhTPt&dvsc|;blqEZNtsZI z`H-r#slfNSy0xAK{ap(A$E2IJd=>XwY)6_7QPO%|-`a3o>@9<#D$6;F!P;Fs zhVVY^fLZWUW2d2*4Obr%u+Bcc;<~j)4EZU~$#WBLHGQIm$8ut{%u9%MdTEqvL*qL) z8dFEsXvL`rjPQ~TY|6A|8dV{i*eD7}bYwM)!R(^DjE|Jp71$F|8(@+ZAF1Np-mXR7L~i>PSuS zlpC0S=>%P5%Yqfo0J6`BCi5_9b^diy z4en(NY9qsAD-7+Kg%B^hSfUstY4H}pG)e9OzZeo?78sSzw68QziNx~ zn5QM@E%~4No6Go1V^pvF@km4AseSjVx=W~kO~yEEt_TMj`K{H2Y`oV-4M>ufe(6Vi zhM5q1_FU!DMi>J)1f7#qaS5I}r?OBG7SZA?&Q%E1pBSf+o=*U0?)~<#%6^ms7sMq8p2qptqf!~Vu!#7m=1Yi zG2IMu5AOh{lU^Wqu>ItWGG9OZXFuSmSeX7gm1~C@;H=tbwd*ap^LJFH)Y+sNbQN

    #6Zozu@8?(e(!3{WCvx?}~Y=l#Sms8C7q4_1k4G!9pamj$2J1ObD>(`zWd|76pI6 z%xAnB<{6#?t%ek8i98#;J=Zao>SU%8-he|n$j(k^j8EQqqZ*I>_xit1y0`|WAh(A( zy*j&3+`owCtFMLsONf23vU~QdyyqdEs4o{|$#vGA(C$Q7vOs?nHBmPjt3$)IDhIv; z@{p`6x_zuOI4Q`I3%ul?8y8&Er#Y{jF=$!kGO0@dtmdJ+tBn#s4tY{GW!!06NxKu& zPb=k=nA=4kbtUW<+ML=O@->Cq>Uv=ASV?wjVT=J&Hm+ z3XUANpw{e@+TZfsmw(9WSXN3`8q*#gF0AG;$cfhsP=3-KT@-O_QuvTM!0D@*Wu=SJ zH%9ZB-*a7ahSJ;7ILkLP)JEzm1n0+W`iY*K5gAFfmW4r&(O*jg%h7j3EZ7?RX%aT4 zXV5QlJ{cS-oMWKQTUTh)rvOZSad*5eOlX!qQHg)->GdpA-C`(v!^4)A8#%Juo zstDjtUHIY#)VFZ}>*y;AIxFv?g|EqkLwSJKKIt20L?5%=L&PDP9giiq3x*AxeBfUf z)gxN)=@TX?GR`C{_Ph>lFH^zMYJ<`NK-j!WH7JmcWVMtu-2laT1d$g^mlM%Z#-xk4 zWEJBW)`8PMx0XSI-FZ)*a}!At>Iero%g-ZkaKJp&fl>@9?g*wg+Ru`Rui|ppT5+!y zG@WH6c(Fl>Z7AoG%rPDKo5(7sQU;8Rx+53mOwB^oez=J}4+Ns!uS{XL(Uahm6?bcA z#|<0rD!9o!S~wcjJ$NzoFB<>HOlFQMK)|TpZ~bQ&A>>#32RwOKkgawuQE>AHgAew% zIClF=Zvx46DRx9mQZTC*#gnDEg-s3<-*lvddsBX&sAHyG@AH>gz<-U)bpnzBlFw1H z{zjSYh!lV~Nyf$bxDZRy*}B9nLX%gF+6kC^yn|GLM2yv-FR6-Ff7gP`Ds$pA<=Hg! zg19OtceaH%<;$4xIXw{f*Z=~1iWuzNGOJmG?af!^y+Y#diuqPNthN&G*Z$~0Cl0CYu%J$y8NbAXPn(TqKRP;2w4L97SR$h2&2LV9mXJ>1KF2lHI}GD(|w zLkBHrE!0``U_GD9CEbcc<8_HRj~sLn)xDSy28SN`wgp15*IbfKr}{=ptT_(HjUn4s zI+vKYV_JGHW}3 z@mZ+`I8f{U)$rSVv${RMW+m}iFnV`Trt5i&Cengm)O5~CYSRSV^WZ}J5#8i&(n+aq z60Q?FT}{67yu)pZ(TtlE6 zd;*nltHIsS%}%Yc{M0@GvFAN3;tAJVHT8Qx7c4KxlItRYagch2{K_l0vTfr2G4O4L z#18x35d1J6ehCW12{V{~qXA9cRqr<@|Mu+r|CIJDPi;bd2^{dnEN%)j7 zGxhzeHOHB4u?*zOm<^E;?=#`UBEP$aYxgS>Q5{2ISZg#~u02^ieztxQUEF?lYs6PK z3l)hMI2}TB{$3kSYf7*4^OIf3%zzjV7laL<=dAd7>nKN6uunI1*zNXfGcTb3GOAt= zv`q5Gky{@E;OK5yyKcOqoUdx$2s&!Cm#0Bs9)He;EP=fv5nMmaliY&$MEmdaoVJsC z&X`6(7eaEqFV+F!1}z#Q_EnEm!X*_G`Gk4kLRmg z+KycLu~o`|w1A^c2Be_+p0J7v+-&Rch_p_lvf}|oz{Oqc1l&nSFehZeArJsm46piL z#URyImV}ns57kJ~5P%aJtrEF_@Ol1ovezK0-dCHR;Dj}ODm^BNHiHf#6 z9iro?H)O!=2m)4mBZ#aZoA~$;arvT0xh)c>KOk15_%TlS0(psDX2001Ks-4Nt5P&s zgSmTOvM-5y87;xWj_0pZP0a$<;v9d7*Ka6E3~_yk$aGla4ADm?Mo1`GYJUfR)=_H^ zX*9ACpD!IV(Mkw-3m4HpT@}uS^jW=E$s80mE(-Hs#s0=klW+hAZMHbRjj?pGvD>vr z`X}2VB*c@roGH+G{P~1%H1*!A86xjWxN*eyHP-UlySw&wn)wDlwtWn)(_%`DtGOFi) zaiU+*{|uqxrl1eBcxDx%nDZ@+C@?$5_}&*yD&fATL%drjw4`@M<$SbY zf&<3_NMKfp#90*U!J7w#?SE+e3>fW|aK(w(7i-Fl<$;oU!Dr^6UOjuMqpXSl=AuK3 zLca9Cn+xQ_L!=UCGuJ!RJl^oS3OP`U3K>4m>H60i;F2O<7FQ=Vj?u?6K*p!<+<40= zRx!AgaMJ#~p-?jNGxEH%j6AINEBo@VbxMpukLFsTEuSR_@!m36s`++dpr>*2b1W7xQJh+bVT)|v#HZEf9QH9mqkg|nIa8Fy zutS~|Fg1&ftIQxhUiB;J&^s0;q@A!laF29N(sNeXN?G845|Zcn_6sKLzgG-4IvVGb z#jR56^B+doxDMXDoELG~L|j)p?G~;ry&^+^yr26@a^R`e@^NgNFx=O&OzQ!A@Xso- z>qWb=RvKPSVp5%dpn}aEJo)fk|4QOSC$py{s#DRw8=M!Os7npT>X?7_U}dVbuhcP` zLOif23v8RvyAamHK%Q}-tiO0~lHJ4XOuflpZ?|bc_oc|>TQiQguohM7a~+zQpTuS2 z>(mG8M-DkBdYVAXJeWU2CFRZU^efOX#3jb;a(=ZaOV*vVp;G^vKajh6;6@=WR{3$+ zz>*`g@VmyuB}*0iRI`2ytqGIRPN84xbs_T0kI-)yv@<2$DJ!&#sPcWJl{B`cqbIWB z@eR+VUl-NOo(t1x!=z)b2UupsS27M@51$1V0eaJam*Z$F$t)OluYC%-8!p@GSTS@= zIH!pG-G+GjFXwERtKnY32>yV?YCOrqKLOjclh2xZOlZR?`q z^sC1L{ZkvHd5rS@C&b3zOvF5z7gwvX=$C;A6*T0xumew2@AHCCv+a%*6VHx+W7$TQ zfdJgIHjP6?(qFxa@1#nB%{Z(}JDFRn4flLuy|I!V7|2E8uR6(YG}cn9mdF;^%0YVrMc$c(GM@ga`-`1n6y%&= zlJJkOAOvdrrJ42SvR?GBQhe9>FK}cdGlTu>dv}YwaEcHjS{j&j$J@0kY(Qd*=FTEy z>o1b4zj1#R-iCzfcl9}1cKJ^G~Zxj{N!$M!vqm0j)ur5R|}jnQb;Ul{+WRD zF^NFPW~(?oL}=(uW{xptBpq%Vht8m0n4!tKI17_r>%jr^Zw-U0FeTN6%I`b`ON~Mb zy~lM};Ij_7IA3+oYCHaXPzRbyGtmDCi!T3nN<*kf2kA6rl7K<`~lo8H5eNck%S>i2o#^d}C+wJ|id=>L5i}I{uryp`G z?!(9BNZJ9v0@LPB{NEHQE(@=EE_#5Hju}n88aEZh@>!^1`oGk=yI#1MShB^3e4bX@ z7wCROgM1}tUAHVE{`{Hc_+hf{0b3)Zp%X9wO zL%Wj2id3q)ZQ(}@(WmqB-`!swo*#B#2F*4Y6f(R&)e^*n-0Z28Vd^&uJCwl5%0pKH zmY>hNPhqQf4*4$RE)OB>mA>cm%YLfo?q|H6SB*c`8+iwAWxgDe1&^uWzT0eeR@sve zI-d~7a4M*XmlU98rGa-mEje+MxktVJHrfp33dXUi!9iO}#J{~2?1!bYb`WO&16S!R zXVN@*kfNm|CYH~z!gYepjvWwg>C525V}(c=@&yY>RurDuz#)j=y9+qJhU1i}Dn9(y zxZ)$}#|kQdrrR7y`n4lGp(9lDHNw9zs_;iiJ0#T3_*>})0%Xj(z!7|!u z%x8@>IJ%Z+!cZ0tvaH2g3>fX4N+%%bFRJ(Kf>Et`>C23`PUscy3BFTPfAT}ucL*yt zuxXjnnUNl&KU>GY4%a2`=f>8+1h}dRoRFCg^__Hfy(N5==aCS9+;l zN*V~qZ<#s!j~V}yt=|40$HkG=)(p-xRNsPhmxQIxZ?4!K6t#V)#!ovP_mq&2Fwu$^ z9L|jWu^I=?eobCyLeJyp$2b5smuFa&1z~2NG&8$K@g;BMRrrBS0N7XD>@=iJ+#g>F z3pgj(ok_6ZX~70XVYg+|Cj69_OTumsc<-&E9%Z#}5s{ZCe*$Ensj^GcrBN1-2Z73)Hs_Fappze}+kMtg zt_432iX)AIO2O87?^P=^+IJl?ph57QyD%(VH!3wKSwc0=drpCrsCN3>Z$}|s*gllj zQ%smtUhaSWx!zFQ(OS*@0moc8Lhfv@!c-Fa-i2w+V4@G)8JKaCPBkz*U^~K+rTjo) zWVb9ptf{DfiX+aK_(!#L5P6-OTSOzHdXl7(tT5-GKm%1!sKB3El|!40 zgP@QaPOH`pNb4DupfmaOnz2|CclGyulS%VW>R*doglvnG(v@XV@Ma+{l*l8WEPpj^ z{l{a!*IC;BM%xgn6SPt7Y1${jE=8!`&W9OQ7Ab6N>4W@J+D{ikTe;1*^(TW7J>6d2 zl|ppa^1W{smy|1A(X~uOy_YF@3{CM@yV1->^}eo00-2DB*nua82#ys94BItB-l!R- zXVYylBN<^IUBl!=8ns6xS5C`K7(Zvekge(@T=Vasx_y<6OwFEQ&{Dep{?m`vr4BkV z2}Nvrw1^m~v)BE1ChF+Knh^ET&Eipqphs|9FKrnn67*Trx$N)#XO%^c&`~-uBUNY3 zST({BAOcf%xnd^9!K5eUH4b<9qc}dv^dzlQ(LurRQib_^6wGt+`FCT{(3g$BPqTH~ zUXRqTtL*8}#&6hFCOB-kT(BCYgU!C>!myYMiqu}HhhECDM3 zuNjeXLHj5=Z*mS)nS_EUFh_-yGTBZdbT3hg14Lb+??_E@euo5H2C8!@c`54;Iy|CGUXK z_A?2LcX{41{ik3<%626V z*uee?v*?8(6>+5hLtuu<{2iW9ZD@)q|$Kzg~8MW){Kjo^j zTQ6^>SHKQRq&mamtWpqfO7L91N8A^4c1uqzCIovE7|SIfeRgU4t9B!3betf+VM~KJ z05XVV0}@EyX7iY~3U8C|5L_-^9FAfFQ^dls*@AtvF;EWtJY@^qc(jI{PQUDQr>Jm! z8)Y*4ga_JivlSD5yI&RW&Pv}~k@;>OISyR54W9Q=!zB99;GqQF6lPVoHpC6|U=}Ha#_nYp}<#b!ITwkTM z9vQ8#I`Pq?PIay?H#xEAQdfjGY&ka&n^;q!>Lkb2>Q8I zA8})$gB85=Q!%ZJ`XsEcN~MdY{Q?sv_viZZjW$=<&d_p6J5g!>jiINruK6r={d~0D zk=6I=6VM4axbiiGY#%B zpxw8XSWk$t0JnA=z+~&KmVjF{@rczmEpm_Z-!~+*+7tjUC}Lje@d#kX3VF!0E`YX z(qXj9a|~HTJ#)vFWpj~O#yj~GJ~-f=nhAE$hE_tTo;MYU2_f?rzG%~P)lgAe8cReW z+`gvnrdWe+QaLM%uM7;AC@ideNWUwl#OOWBysIVl*1=oJpQCdbH*xW&3oj(c0wO?M zLX#ybZtLttoIemZK?vBgscf6q6vl&{<)Q;?(`+LIRBHofehytL^?3B+)8A_?KKz=O zt*ZO7$7>--_J$>I5(x!{l4caaxhG!?Ez`LWBlP!zT7Yt)kP^Yl705zKusS{hm;wguhXG zlc;Exr_J&P65x-SSzTyaqOiN4%79p#Z--aIpK4tBaSD;S!lCr?zNJqZ|EUg-DrJrN z>W_ypXapLo2+DHJPDk0%T{IR{Uv}q3mDR6Kg2P9A6Ke)}YKd)hx75@u+thf2SAMb%cM`3|4KRlt`}Hi58iC<}i39E#t34w6WAYeP%jz&*s!(7j64|iSMO( zWro;zd8D<0o$?vVSkRCAx$$g>yQFc+IiiG~olRznUv`xWv3tNux_CBkN*vZAa{uIa<0&0EhyL%Tq& zNHAIZ(l%$;-pgF5@fFo+!U;S%2Zs4+KI)XVfA_SI*T*1;C?8*VGwWuY+Xq(6Pp8L) z>HFqL+w5&_Da;&)b|801?}{1I_XEC~|xGw6sBF^aNVe-0_80u^FdEgRoeA!}lH$Z&f zp$2NM69_P87WmTH`v#nsO}-hu9%>^B+ShUrp9}#|>4qo20BrC%^~yboEIM^pzGhkQWQ=#NsQBf&=$akhHI!i-E5 za;Td3D-tLB_cbfPZ)U({c`RwQJZic%%9lkfqbhRk%eItLZQCNK^?Ztzu3_1Ydo_jK zbx^T+DiRE*G6`ZX`HPc9JCJ|pQ0jO=O^N8S1v&E0->|InGsy!oXvzB{554fuFlvlN+ttLB}Ng`J!)YPuu>a@0k=L8c=>!GQh_~i`ZI2tFhbF4|Xz` z45Q^cbCBV4bSI6Wh2a_%h{x6qZmAjoxX)t9wpcmxuz6vEX{!QC&G3utJ$GG;`54W* zA-Gh7Lb+0|c~7}!x8`i7RXh9+wyzmalLE+9;5taUey|)n z@5fH@yx!ob_4oteLHEXuP@A}m;1+72tK|;1_og*7fcyQE0$FS@uy01HtBB!geUt;| zg1?C`iN344IZ*>#RnItX(_T>PeE;xHMn{dJ%ZVc78i>)e*RFrL*%P$9gnbQ+_gf*O z^9eIC@HcPAD@q|{zgU(v-~-T@edxzxOGG2z<6U-Oh2i)1tW4MhsQ8{0MFpIJ7`E-5=}iyJ{7k;MC~z zoz^D7ZJx;}`KT)xsJ9X*&W-x~Vsa^*C(c|uEUhc~>~-3|0S6IP8H?AH^(1as+#bbf zvG}GPA5*#z=Uj-SwA-ONrSeCyN5YHY+#R znAgN?cdpw#c8}OEITg^WKO|BMnX{QacErlWINR?$W^gGoU3?1R}FFtcc6|zht z?X+DX)m^g_3PZ-(lJv}eQC-+uwMiVbNqP{STHe9YbvUKAQUV|RP_9NGjq2d6YY8xR_&80!^C+L>bP=^pJ_Js!r+oRz z;PlMeAaRuZ zu}#-h-0r&nn@dumgoP0+GVnkJqhcDTu`Z*Zn*wq~RsC-4ZzBr+xWTO)LE~@f!f-YY za1>G{DUI4jhIj1u5DR}`-k8JVcV40YOOQFvF?Ai|*-#mBifS}maOal?+)@?@G&m~_ z$=XlzFl4sZDU*)xNg})f6A%e^ne#=MZ?mU7=;}QQ{Hid3?pp zUx+z623c?--$p55mb*88ytgLnD`ER)&ko_O&eQxD`)>vkAlR;z|NK4U(yDg9EU!Zb zZTe~@kMt%@ny(CA*uxF#a3X+^@kBD^dvCZM*o;(z7&pgLUQB~9Fg6B%5-`Tg#H^K+ zy4jhzT_!k!!f`v+VIA==94lt`(9^&q%&O~$Q_O}9X-N!JPzonim3hgW*;mXAxV||f zF8;y}ZE;Fp$bj*oZme0iVWJEHt@g&jD7B3Yu~arF3e&38Ns{WlGG5k<G~BzvK@=eefv71z+vMt{Y(g8js#H3z~tSxiLusU?13xAPiIn`q?l=R>Uv%P&_w*J_x?7xua)N2eF|1L(zqOXatPU-^au?^t ze4aXx`1}@b4tYnYqP*qW6Lxlvga{LAz-D!4=M$xVk+uZ1esslrL$AFgS2^J<3sNe5Gj zlZK({OX7%$X9sUp&afz_(#6l#W|w}fgzM7HFS%&KQgSa89{0Q=&<;3ofhNFyRhB#Y zjz?7VHj!>BuI7u`MI=o4Z5rgeJ|h1~gv1O|+fg;kDrDE3b?qDL%CC}kYE~@dRbbu+ zVcU*SwK*K{Sv6n+DJP_hnoWLqGUEM%=70@oqR$#5*ie;Ds(R?(H0iwDG#Zd1GL zE*Z8M8lS~A>F)600XIAzk6XqFBf&=Bc^?|yrkxCZhc$?zKee%a`AF0i93LgqSq;O{ zfi`*A1*v$FKXtyG%z=Jl_s%u~?<4;46&H47)u=g1$cM(nCi>Fb)xMn-!@cGuq42bn`$u6mNrWxy;!Za?M53HiiI@FH}Euf=-Yu3drQy>zmnfudYqkn)mDpvFCnD zMt=*nl!SeX&>_%V>+RTG*Xbu|xoE0Dg>udZl1!yrN&OXc$)l&+VHJ|l^=8MrO3qG` z7h&KtE!Xq%^71Z8Dh3}7xzk^}ozrVE)}q>%cAh&GBXre7;{vxas#aOi0*^s|diW=i_1 zZBWD^1bRk>E?;?+{6B;=PpaLT?yxtYJQZ_mgw;lL`G(<@4n^-xbPHuu;Jo$s5E3n} zo4LubI&^sGcJ?&j7@4;DcWn#Zhx6`7RTCxJ8|8*{{h-sp3P9Zg)d()pbr@KH=iD2f zk35kcxo`A8H^4s6hRB(*i)6{o4e3){f4hhG>Ya9((Tm`i;3KL~oUj-?4sacV4CUY&AV|L=FiT9hz^Uxqn-oR00rb{^IiP>y6UqI8w{+U4YUhh({SvFr z-*!KgsyhC|2>`WU5Foqv&#cx?DRTQKc$}9Z!jFt(&?3&nXbc-Wkf9a_$@{DD+4U1i zXtfxze$~g!**~{3Vdtd0L0GDk1eR%iTuD)Lh znIru~qIiHgkgTJzo4`l#JtGc7a4DQ+jLw&b&FFk&z{z|-K;vCcz|E_p44$OVUHS;a&k_PIbxA)nmMgZ|>bqnEbs=os}ZGr19bK(f!w(OOWk8iFw z)ABvEh*oslea142!0Xs~tX-pMP&^_hX4F2epUQd#Cx9cy79kyn*PgxYnMJ z&juT=70OTPDmY|kcjU)MFo}mGRX2Ai&V{}7|Efl-{oBJS-l5J)vW`b@ZC=QpR)erWjZ_m4t@c%8 zV^Jh9B{2Qrde(uJproE63)Os_20rI)p}c;8>NYk;r1-CGOVKq_q2S!kjqRzM?6dAt zeY4+3{a4{v*0X>OeTiU!=TmZD82C0d?O=a1ES?N9qGG?UF<;G?slDVK&MRKKWj+i( z1hflycB!3ow*QU+ufo|3%%&_r1l-RPj??eo$8BGgIv0M6aLVVEwgJ(|ediN@(diKk zXV1&1{q)FO0=?r|&(g2}GGnK@sO^1i*FT7`dVG<)fIcTB$4z9n;HoB2W6^7wb4 z56DOnQYlZjdgkOSkh#4BKfXnr4gos{ge94hr;%lLa{i4Qy>NEQ zzk-YGW7s6a7chvghYEV{EG#H;#VTl2YYcD|S{e9NAJ(C0IHQT@^+1h1R3EO$ZwiM; zpbRbyOuV6!V4}dO_m!+h()o&eR*OCg1RuEU)9^3%`K$^Zpx(S;^Ueu9y=gakOFl@)_KUDA>jz#(n51?1WdHkQ{M|lZ2R^SJ^3vLV;ZeF}NEc9bb!S0`B;xi~K zK^HTi>={X>g?1UOw&4Y23@}OHJFOJD0za%(^j5Dj4mI;*Me9uYr8#>q=^HK&0`$0y6t2sU%^l$mlK4#Fs2YoFVW~XkwJg}XDXk+YT|S}gWD7@&pPs1 zd!ciB6TAYEO~SGqSLOClKnv3}Ic~ri%2dFWoaYj*$kwktLi8gY+FT5;CiwpM?YzWh zemPH60FZ^S0Sge?-XXe65QU>43g&@Xr|W0JSg@@iV*8UU%!^Kwa358{Eu^{djqpud2u3fL%n`^RUee2o9S3eCylM z9r6$&l8OUfjCkh>n79f5*5*1fJePm{sM@lj-9K9(b+lTXeDxK zd}!^ZWI|O=pf;|8+{vL8Z04JuDmt%bVH54ot<%VSM)y3D7#z$t(U@92lgr+L%lG`H z+4z|E=Op(9i)>kq5i7FmU9m@XEDVU5rQhy)#8IWdlUGd46Q7)fi*di0c`aA=hxhF1 zHSk1R&pY~wH^zBttQL6=9TOmIxO;$Qyk+ti8)#*C{x;Kd=QmpOH`yltKEuNoE$)?> zN=|rSz!SU{THN|XF8vgT-M9x|AeGa%c$0l!W$CaICa!rF3R=c86@xw8Tc)hHg52hW zg|NI>?S|OMUVcYq+1>1ZtgeGYB(Q+p9tC>yRou#109Pcfq=On07uETcvZ-li!ln%Wly4fcZTqyj$KjKxaGU#(jY6v2Z7^X?- zm^+X6L14l5m+OcnQBIldL-dz8_am|%?8ZA&~T~2%g6VWg*<*WL2 z*vl&C(|CC?vTb!vsny!TF^xp7#hj0fdlT>;0{@4qGmT3!{o?*KHDfzdR%RMBSz4pU zWRpv>)U-HiMQOPQnVFeeYAPr~Wo3>j<%Xugv^Z93Kk{0p#Ra~_57g9M5D|if;!8uEj03U&{RvTE# z2Xf~_$n_xDAxz-&KY7q1zR;WXe`OHY6!#^$$-*^`MOo4c(V zS?EKxWA0NvBoqAfp5Eh9hh3Bl8S$1kn%OVAUIRNddbxx|Ak(I#`a=sX@L5P8+B0#hc>eJ9t0wxm;mFjUMVY-WgULZ%o3H$N&n`^X zyz95a1le6LpBz~Kd(z?yZ<1u|iFYo&CVj}hb0VVVN5ZC6#*WpWmZ|q0xVAaGA3BNqfLnQX@k54U6*V3Lx zfh1GA=JsU4$J)cbVz&vE>FinEVkzrV>@w|n+>&9SDz$eX67 zgMTDvH2nImFs)Cg_>w@BmhxQ*+v(e`5Qh+#=b1YQF|sPjjt0B-m`DCUb)LX@1P`CR z_H6gZ zTSJ%5&*j~5S$KNESkwM9f4nC6(r>>X_ejyt+ctTjJb!D!oTkt8GyfQ%Zhqunu(SmJ zeyynTbJ;B$x&H-?i(6de@SoNLg+F2rJ%JTl4tD;C&aPf7=@$|(D9w;VDb-bfTNnU& zP%f9EE=Y^8i9WI&RliRy)~{(|JTaRrLs=(>|D7-szGdR(j8*=$*rx-~ghOjdHbC*a z7Ks_sWz2wfAQi#&c2k^xLUV%Jq{{_6UGZEv-`gjO4+5lPXG{qo$ym(I3HUA*BL`KX zjRdX*ZrWI1<}rOtYAJ1d5m4362pqSQ-VwO1jW~npj6W&|28r`ha+|bXy%g&k-V&5> zL#VSEiA#DhUeSWlb}r{>0&KwE1gM$O6-S0-sRY3o;5{oZhZNGAtr#atP-J~i!IY#N z+J~#0rE2HJ(vLF3T+pO!0)BM{tg3eVS5I5D`NiKDk%#-3hCK!p6~I zO^u_U8UqU|m{keZ?8IN+Wn7s1`suK)LnPN8K}}jt$_8Sv z+WXl&zB;wDMOYyO#SX`_VhH2e#-5idOr0A6GsiOjy?mvzlRxtD_@sX!T>sk0_l7$y z;*2f#Tl8u~L=BRy_<}&1)D#HAC>8vyD#eVz7N193xSnqRplKXv6fQ*4oJ#(vJZ9fV zRb1TH1kRuKbappgF*F||&PsS2sLDWjtP-7Vs%7p=TXw&Pmmk#_*LNtA*jCVYz{FCG z&r;a<$9!{?=noHGO-;#9Vpr@Gc8**gv}SglemL-}dn|JdaLI8^iL-rVhHTJU_9FTU z9HMn26%cCsK2_+raMbSRl8|vxmQ`EqfVJjYEq88$SLpilmV-9&Ngx0Cz`WtbFbi&^ zR1DE;zWkQiyD?0IY<*L{?9|ai!<0ee&9JT!rG3m~<%_G`&e$tnw(W<@4(f+UK>Krp zGt!WKJ|2lV{yR6h88r8O23zOeeeb0|EzNC3V{+B1_kZFdyQ|(?zFLE|-I)Ty z?pQIuKAhhkcJ7~rL+7>{&wN{W+4)d?z*>FD4SVwAatB7!X7d&?Y~gL14ic{h%XsbT zMP`TZYBLgRyp5S(eIvRo?6T6#F+X+s6&nv^9h`Y$WuaZv9sBXwlkMxD?oqr>{X1ju z>ci*H(#BV>`01nzJFRYq?d!nlWen3`W(H!-!TR-emkTlCMG1yqorhaV7hN3x4L($l%0|~yZ=47%#GcAum6&^|=HxnRM0H+7h{jk`J5V(cPjCapm&leu z)UmglauPCL|6gMd8jhN+u$8NoMD(ApxC@1vE~c?wspb+1eZ zMNcNGp1udGOgnvv+I{TpyTlRoRrerTBLegmMmeLD9lRQy=GeYGH};ME3;JPzfYX!pYp`oLEUvUB~!YA}-)0C$QG z2#NoHgaik+Omz;E*<}*Rv%j+$X~!pL{-*Gd-!vrmmn~esX;`-gDR7&No^Qt@x8c?4 zJh5%5ySxZ)PxG|+F|mRnU{8;%p$;8{BdFItj~Lro`ot@54txlQL9_8cj0We9TwK|0 z%`B*C^JJVgczo7?Hdx7=aEkbO{9rb(m+b#`T5}MVh{r$D+(1{nfzrdjk8w!TCW zB*aaqm4GMaMIKTrXqSW|k5Wcn-$uOnsLeVW6>xoQ-H+z7xDR!Re^@SH( z?lF3LZ&^^7b69hy`H?o!Wg~9oF{J;WCKwsY|0nY6WA_$4T&YZXVUE{m0io1Z6k7WZ>>E_uRDU>Bm34p8oXGA>-Mf zKcz3GW&eHUAD@YXS0-S4|NW73YtdY#r`NNS&m(+8@Enh5P@sbb7z{lVgvh+OAyi#KK_!Ww$Yv14}I8#tgu z>a{_E;iwbhn^^Mr`f>*B=4BilhL%i2!7oYVi-ybPFc}V`+S8(YC8FK939z`$2JzMH zEx5@JC=v_qnGOE#F5bIG(jw}skbeGduq!C4Z)YoqYk2ue`!winPRKzI-zW2%&EJWD zU|hXg`COW>`kaZzc(o^|WhT}Z5%nnj*P7{?=WXh5;SN#etKSl`+B&9z&W?AM2GudV? zd)aq#!{?*nuFXa1iyu@Bw??bqYM*XL>mxt-23CCw_CEGB|B6YmQ_R|v<|d(Ae^-D| zG_m@iy=M#KTgsO+al?;jFW;Ayx@@)ndoAMDj)~{1$lu;J%e|XxHqX93W1d|0aC5%$ z_w<`*p7+Wp52`}O{38kv>|mavPv3d8CCl&H(xLLzg0YhoPOUhsqI?o19dccMGn+`P z97hsHKO6iOb#M*i18Y@eqg@3jWE8RTR6W#lQVat7D*AmZG=&kxtPEgO#)(9lu6P> zl(A>)osa3fPg9LH^>;!OfVZrZd@b1^#9N~>kK5nmnMpB%K0YXwH6dab0F-?UBc4YF~-6uPhanFN_`NzvQ%+J9i28U99^)0{ovtbt5d( z!qLC8`BzYbTzk85w=IJIjo6AJYvul+cxq}9c+d)p2|REcr61P6yA6bo(%);9$1cjn zu7plXQxa6{zix}qggy(2#WZcs1m3VzT~OuPKxT1ncMr>vOtKy)d&q>;8YyyizD*oN zf?Ae5I15gYJn;jf@ALEaFgL;nQ@Y6o-+Ys5o?yRu&M!Sqb8KgFzFlx^M)wwU!8JHk zPOmEi_A_l?$~7=UH!g!Va%60b(N5aPng!N&iGDbC5ssN-xx99K#=WNX`9W{z+ubq5 zE2XmcS3(yq*9vEG&e)lI)x?EDo4c5Ni2mNK?Bsz-r&C|c>IAo*ZB1mF zoY=N=#1i;DB)-@Ww(EJst+^cHhJAwY6k5`L+r#f)EcSm0M$82^U+^cd-7F(eR_;4j ze82UY&bD31piaz{Qq@c!vJ5ZaS<3?o|eU z40>fDRPNm@Pu^gq*cJoo=ZRI~C#4dV=wgFzs&J<0@&fH@8~qr-)UBW3(7Q0Z!H={2<&j zSLU@uQASlZ0?7&eTq4Pj>KBL$BS#IsZde*OLz+^Cnwv3RW<{3|GqDa&osS`ra^cP}Nf`Q&Jl4<4)l}Vda^hv`~gy zv0dklfgd7qT$(er&8;O^b{p6j>6q{s#W;0q0%|ae>&dFW8^dbw$gJJYMEjvcpw!0y zHvFvB?t5{n%fO7?gr@8AY7|6KYg~3%2it5ayuLU%`_i+*`K9isGhm72o$HdLZ%yA{ zQT%6S`15TEw-(0~-xK{XaNO+kxW%Q@G{@{s7JsZ+5k5daHTOBn!`bu6O2qGWj$ho5 zSJUUvS5IyF8jY;KqLeH2hqLvQNcJ|v@|wH1T=FX$Urf-`ZZ}lrEogr2MMi!d0H%}+_bufj+`?uE1RD0Wl2&kE(!p8zbfmE%J{l`61gp|I@ znlH1ZD(7D*F|jv9G{mS|25;Ylm^ehtL)Sq4N<>e(JZI!Ey!G{MTt7pRQ0pBsfxp3v z+-*E^{P7it^!5YiL}k>bb7{A*b6O*7=F<6&AIj>F#cL(+R&yM7%`B=|T|@KKOn;}k zRh4G{?`fj({=h$|?H3K9N8J&EWO)33V41}MD_?BfY`y;Q3V5S8&04nJ2o4i)ZgJ3%XYh0(;H^vm)8Bmvg{J+Zc(L3Rxs=>t*S5lPT?u6sG7E2*Kum&Vv(#)$C)TIVC9qMq|z2h#TP z7Edqc`i{OMb_PLJEawbq%DQ(dVL5Utnjl`?XbB@yf3-V$J)5@uecj5)7iDqElPe+{ zZ&}-^4UJxS3b1gT>}vtK4aAe6sViv9o(v_{+v)s9`2s6Z?KkYu)vT zjdQz1j7;kOx6hqElE=MCe%tT=-yY z??K|&!5^+z`2A=2WoDzxzO0{)O5yG03tS`8W8`I2@$!|1eW4Ds8_Ry+XlA*^vVYFJ z=yTUQ!_-4wJPFEK-*w@Y#WP3ie#E8nq0FwdK$;QoYqg*IAQ&vJ7MTb{i^DJ_2k=4e zlCO$;J};#8J*_m)HW=_ofF6UJSg1o!^FwU<6eH{6fyk@wfQ!cmM%c~!z`l^zFG zd^OVkTR054e7S1wWPueu!xn`Z0IvZ%w_8_pGYrIoT0WvCFgz0bjLcK&#I_hcaWIE( z+%Mm%^|7E2id%(?B&`FT_#1$@@Q=EvN3gw}W+=KeWzLKto%~m9_C2r(?=daS!Ch&{ z2ZKw~MG<)%uQH$)J zvcl}1HDb^G^LjKRaNQ^;{OKBvK%MI5J?q;M@_q>d*Oz;z#BS92{F7(wk4j>9^;Byl z85$XPt9)J9kMvd0X>$qL7hU`m1(1$SWgb%Qf06bB5Lc=*h`s%TG`I6C$>&_)m(!jHc*EJM z**X;FTZoqY4!o4!HZ13Brh`O1PHP8AGscT@XBBHVxT@`t%oduJ*R1p8E_$>w)2`5I zLVQX3esCA^n6#7=bV!>6zNmW2Nj@y7Vhj5Z>x8v)nsW>GFCr)7WHL{gOguwuTWU(^ zdHMZZL;jurCCQ@6Zlpy?gkoqem+Q(dE5#dn#$z_EjaW3NyP#Ivkro7zBEiR(1F;qOKfB<*))_ zGs;R15Hxc!!Wcg@V*j7d`wwQAZhPkJa`pk|js(VCoZs-4>!^+#T>W29*7BqSE53m5 z?N-`sK<>ZS=Hn`ddIILsn)DUi{}0QVl$^Q_{>nlAtvwR%Kpix6p9Sy<7y_t8Cv3BH+m9UFPWtGM zWIl`bn*e82%KG8tWFUVZ0W-HB|18H2n8X)EfS5t?zJ6``T*T{%Ta8JuVHU?g`^`ya zhMHm@62FKUr<-9YP*{C@w}4!~vmLtoP{*L92eTSq1djO0WHj2%Qf|eGrVc2_s$-yd z`(FIao_7kBn{St3DUEc)NJjc_qffQj z{Jl+aTQcEPd7F{Egd-d_qoGO?%Qzo%JNSt&HDDh2YXe>C!KzQkAvp5>MwY6(+5`U| zt^pufc_Ck^6@e9YM%ZBn52HdgxY5Kf0-@~GNS*5UPP+z` ze);v>%G%GAqmSE*$nbw)lA{~8UaBv%LATM-m@$8w$+-3a%&cE~4gq>rHa{+ao@+FM zJ}lnv*PJa#EEIy$Y`_3&%}7y@wUKh`o~k>y&7h|O<@Cus0~87Ou%T=__>1JzcF-x0 z#`_>G-zQJVO441@#3-eQ;H;Y}TJh5^T?? zE-PrH=gbga2EOonH`pAsjPuHBeCn7~#xeS;>C6y6;GIAE85C>s=z4o&X(g^fn91t( zh^R*);K^BgVK2TlB36xd|Db~|L2(-HNG_aT;usNOtk2@@q(IB|n9=^CJ}`2h`Gb~6 z@76Kx7ee5vTk2ZBcYV{Z`})2CgNQh-u0^Oh@}_kN6h+pb{=w`$eD-$AsT#0bkNE>S z&UaGZ{{%x{S@-6b;JS$5ASU#p#mm2E3BPm+t)yjzA5ZM-I2R-OI% zmykcmUr}t_lK7yjUc=^SHf{?I=hqrjn^->(X9FOX& zMHy=ZYXe6g!%ZO5Q+*ihR7Jn^voIvlU##8gr>*+gwq)G5Mx~6$?AB|xQ|Yo^g?qgD zxGd%JKtM;P-2U%UGt<%L4Glh{?#WQC*}+yqx(S9##?bnweMOonRg;Q*lsw)q#4hwV z_E*S{H^dj>6H(m)l9tQ?f&rwU|3EFcoG`#G6hL7aoDy}zU zT9$;`ktc$l{lX_5k%18?t?FS%&1YgQ3WkG1r8au+%X%5@A_^2o37zZr8Tte@fVwvKF}K1>J!p%En*De!jEWK#OssdvngLtw5+RVqZijilwe zQCkaq*BK+)j5Y=9)G-0m9GK8`j7&i!?GJQ}7o2XvrPc3fv7}FlHizZC2JY#IbL0cV z_lD@6Ox`LxKV-2Q^Z0JTw*Yv0OQ2S*jQwJw*!aF^d@pozNJ_slCjuFObF;V*wxejF zv|OMV9>=oi_|~U?dD*8!cgu`MjM0mYMuKil+l6@T+CDh`-r`*`hyFRhG6fo=N76=C z5NZjtA!AO&(W`B^9t6EW-W(ce9G@MW@ zqiTQ0?Wh@%gBm;n8^dpwo}X21pNvSe`OiQDm4Y2W@m^oD;{rjP$3tE2=WltQ()FU6 z?piP3U%qG{-7Ws?4`z9W*9}~Dx+0|tvjTB#4sm8bi6XV1pDRMoE5FlW0#oSkVzER{9@|P4EYEX|ga?Wgl?ADaa8z*5q)Sh0hGM$1o8iH8SKD zqfb^KX`F3L)ryhDFtU7331YiBH{KH(cMYnQRV>u;9H1di+Fcz;6+Q z7>&hrk!Ew8R27H;UNi1Qmc^$VR6)T7$hu7MnFsQHLJEcM2-f&snr~wLd~1j?sSb{n zJetor`3#^(zSs_bo5J}Boaf7W2~;IO)e1kvJojyk!z`@6+}ETpzbDw6f!T<#L{1%c=aNfktm#Bf1N1r*0S1<; z7~RbTyf_ImX~V$^AX7*WgeMH3hfVDUd{yUFYx1M+M~nj^!!Y>AL2;lCZTTC5emLF9 z#DIcm14!%mXk{8}axtfV4Rh~zQBK&h11`0C*bSaUAU_I4k$u1hR$oQ+Ugp?AU&x+O ztv3uhx|Tk3k}a)$@?OQcnK$|lY=6&EVXN;#12^Ah-0bHuw^*!|u18L5|`!lQO=FsjT-_3{~{kfE6^ zWNhf(Iv=uC8`_ypyK{?t?6;}!AHS5wuiF9WvcB`18)UX9QL*)5^3metL3Q5qWu9}# zHaQ<^UK`&U%ZxQSfxlfppHgXoPk8qOjOGb56?^ld2sZv^{WXUy4Q(^Z_D1%#Ms0hx zXP23uoRc#ySf1Bbu9)yY2Qx93T|W7i*HbFUl+ukb<5G_j2RViy{b`v@a4YxhUcOu* zIShU3u|luD|2TjU{Vu{u5esj3A%Wfb@mccGaV;-$3v)*44$oaMHOMh@5QH%0 zdLSj+UYGupNhYXT>9Wo^F(~@b zx=qvQlOz0VU|!<{^}f(psJ&$~?offHvBhLXJ#$QTleD*{0L*6r8-P-Q8s(|Uzr>O$ zcJk6-GI_S?f}*H0k|S~P?KDWI?;1fTqF#)D5HrNeqIwZqzPmss-XHNDdF%I%3A`t7 zlZT{CClKD%h=Pw#tsS<7TX0#k2f4iqj5g`vogoOoTBFQDNfahjNL6)`K zVW>gTnS$x0^`5don0rE^b|8K=bKqYBBbmn+d<)S*p;207(YDsu{^nvdJRamcxTg3; z=*Xex&TmMdleN(4g2Jp1hnnAjGm-Vy5NMmH_&APB&?ZC}!-`dNY|LMwA@GrjLRF9#(?`B z{uhYor;fUP>Y>++bXr(QA$p~O;7mM`HcV2i?YvFzpH0HSt3o4nMsyom$Y5gYD{Ada z354SLr^V=zJx$RZ!THcsi^1lUf6%4P{aarJW^?u*?f22xYBvRZkH89x2d30fTnnM} zK9Lo4E=M5Fl=kmB;hPA^8;E&we~|%_F!iZaZWr3SkP!*FAn5ai^)s8kLDt( z?vTXFr-DD^rfG0y4nGU9#Wq8W?}U@ZWt)V{&!i=p%oBMYmHx6eXrR)S!cH|JSe}v# z2=A?0>mF;Kkgv&EFRem~`xYund6l_m?UGn6rU1rK4*m`jo_?XZa8 zgjs4P!O*!~uRrEjWQ%&I79!u?r||sG?vs(I$4TtCiyb4Jwg6m$!$PLOGde;g(a35` z5>0ESLH7mtxj?GvgKf-xoUNDuU}_)30Zw!x=#H90tBt#_a?tL@FKr$Vc$lCL1^`c@%wJ6e0Oumi{%&Bv_Jzg(*&(f8i!&Ih`r+zpK45HH9f{iBy{xB6mg~w;lZluOiqQz zoWKNg^cVA^Uk+p`__ukBvjQ_QC*=od>i3J}#F;lrIf<+$x??66S6ShpQ-V=8{U)AL zemx&6Z4Z)(GwmOa{FoH9^5B5-6F0tpR7jRt4A~GAjjTKkS!NJk>gb_|26y*&J&hjb z_9A$;7}N{kBfUo_0LBc_JcU5D7dH2B30TRiTMT zg$FU%Pw~F>zHHAkfhZNG)Rq1r|8`jkpBE<{W!+joS?LAoG^rVw`fb#na;Vk0fM0l; zc(g_NOOimhjaAh4*w41DEGpfC)i|TN9jUFcp3(yXTXqiMz;2sDpMQX~;$WW$8nZn| zX+OQh1|3G^?GcsS>5lLF{S_n|6fxrCYwxkQrH>!$=op2^4puv;jxXUOdgR+Qhd2Mv z-}KH-{_;sRkSSJ3&a1i;gH_|AFIs)$RQ#@9e7Yw-mfdg0nPSfafKsfr!$loNP&jWw zma2=@YUOn=!&pHqSxUM}`nK}^J9`X;)dl!VC`F6{%Zs3w}V4`|7&{nwwh-JXO<;*>SnAA5V6!0&^(#8;)TaUp9&Z{Hmv41dVnYsI@)>A>)_ zVN5G>x4BmPl8$3Zc%R=44)rhUFc?GxEwP_HkM+2q+vLpGVw$5cgxwLnf5n61CYvY6 z=Dk;WEa7Ov`!|W`khneKIUP1Zz2n&vK0%!bA}`cxLxyH_d5twkzOaTQwD7wDR$+B47QY+GO9re34CVE0v(13;mPyBlZT&&()*2=Xd4$l}{O>Pl8i-Sc zOJSVPf|LfVY<)r)d3Xx^OydX^5+Eme5Ti*Hv*+h(`Fe3@GZ5=DxM3bky0dE@M^4uEti}Z+tA{ zRQ)TUOQ|${gpjV9vv2!ETkt3$$r~cKBH%SvKooq~trUZm+A?@ym@zP6SUjdWm(8Fq zu~40)eQ%}BAFofuKeo1>;CoTM`SDKe1(e_QRZpCHDzy50cM!&D+1^x1hA_3PzI3oA zC!}D2@P%R{cqaDOXxw{LJjq%IOs6NDBhbixe`aS#Ft&p##pAmsjCe@ty;l9ZzXgox z1ZE>0o+B+33t5Jxj$RhC;76$)i(@5_= zQ1BgZIlewH6*!$(>*S4jSJ6`dg<^a0J@gbD>?8&O65suewu*ndua3Q zSKKq&wrr&fYIL1pB33Upe7&iBtPU3C$POgCqS9RU)P(tM`Wo;F1xx@&WRdj;iZdMP*cdo4n_+3|AE2len1YOxtynlA{9>aZ6oYryS~ zx3!!6>npl^ezQzZ<-96uF2 zY2*5|Yyq{p`3di!e4_S~R7!41)_OB66eC~0i`cujLhdsEDma|u5Ld|X7DyL!6G=Dg z^F@Y|zZ!5{7k2M?LHnLZ$0_dRBGR#t1oD`^OPF042sVm;b<9!Roo}fv(_Yhl{(C=K zZxwOx&K3@G!E=M@9VYoiA1u6?Qwaw_GzLU;OS77%%6d$BAl}wpB2bjIyjC}{jT#Yj2gy%IHWRktQJt10gc4AepOpwDP zVuVv2@%1~oJD8C)QxuPhWhugn$W|dD8j@uZRuBajr3CfTrXd`&)E|mzLc2K9A52(5 zm7lowVF8U0Qcae(@VzaS#OuQSV>XT+t@qV(8!_>0d8m!W4&_Wmw(glh4_LJr92ANt zz&x1bB6>VhY}BL@=O&3FRo{+f1_jz6ag)cS-s!?lO(Apu@A~#r?#*cMpC_f=h}sbC z+vZ&i+m>Wbme?1|hRiO*L~Mv_A~}9W{5A6M|Ej(u)OY&dGf-el7IB%_jRweQc#X=D z!gv}vo?~nat zbd%QQ%|pIx*YQ@4&m2bOisrv^HKT?BN2|31AdT=X8eRf{3Tb8W%muyrU2PyG052~Q zrSUd$$U`~e;mp(WZlNcF*WV#`p*XM;^<9>UBj)?yjVayn^5f`wgW|5QdRzAVT4&4! z5mP^*fjHrcNkX$3wdZC1kxzie$p(MENuoKh$%4UBqLK8eSV9NbXtKm&F#MuDJS76? zJe8*#@?0Id&FbshG_XygahJqb9)hoiBxT;naDvEzyrAJ@$y%_Nn^4PGT?a@9HyH0@ zoN*{3TxqVqK=LUkbe)Gr%_c%%EqlI_IW4wj=OH)*<Q>`=D8g}r0>x`)N#{dy6c;Mw2{k#^%*=KnN$HXxHt?7kxmQ5sF-iwg{gmQFswpln z$b?y_%1`WPh(xFK;Q(z8stAhGThvh|2uI3rX53u2(SFLc`A=&vCejmfC}+)vY|r{C zi75U;js@=Jz0j)1_XCOdlFQRk`e`1#YsK2JSJA?lyxoD%L>fw~QGyvp^H2HF zzvN6P$zr2N9qw`{Cg=RGJY5F^G)W6;em&f61(}RQRhp_1(&5vbD`;!6BrorCf zc;%fHfzVzWIDR%Rbg&1ic^e~i$kJfdobq00_H4FlbDF}ferMvSxc;r=KDl{0I+Rj4 zjI-D=4}NJ*jl6%^vF;U(P&Xm=$GgAlVT~6zJgi@dm7M62DYN5ARDyQ8SNh2)c$X1iMQVjd+u^N#vY3LF4WwXu1>tj~I_>3up~Psg*J8%k?QOQMhw^A=2TQ z+RGJ1G&c)vS5woVk8GN1;oondXQ(@l~W0x*~b zMdK|C8a7AN5b4)!@eU;2jT#D|0f=ZywEvF@=|y*|R;=s0FSvq=7k5zP1F2FvUvu=F zn`k^gqN_W;7F#D8*JvmWl=P{Q5x>d5gGp! zB#p&fDE%rm?_9N(*(We+7>H%sIEI!t6)$#1L1ocGg<=<%ZVKcHcV2%I-@kSFPnY{g zfB9v}FI(yoI-7rbwI#l-3%13(ru{jh#8bN3CjZ)oEaR{Xof(%67NtMke(l{&AKQqh z&e&@NQY}P;m*`tvsD+e|2}A zq?9PTfQ8@33Jx9l)$oS|Y)4Ad{ zPq-Zx&CC4WMo9Cd>z-;aS2ff2MfV{hRAL>7SSaG+s6Lc@R$;RJwXzo&4x={!R{AN2 z-IY#mF{hN*p|IH+i1FJ+ zScu;Td+8&BQEUC!%Ing?a}!}tmNay|haVX5tL}}}Psj&4=6}Pe9_xdcIv<#={E^-U zj&8D+y|n%Wb1747!RTdM#6?cUq1vm%P-3_bdMia$!HVu99m(@QYL<=`AIhV)B_7CI zKv0z2WW}pC+}ruI6Y%+LgdWBy3y&FKd=8Ii#}o;O6EWfq(sqSEp65qJ6L{(K^MsL>`X3XlK;Sga zfpvwFrjhOq>}G^Y=4>cegF$q(UhWrAEs(0T7nM`3G2~X#AGS;%U8%GueO^|nOc#nU zdh1vocHz^%M{!+Mt6x|J{dl-G!zppi*Bd!CjQtsZX>7R`;_hXq$rhO}h$q`2?zu2N;OFMjt?;#&@Xp`TM$a0ec%H;JIl@H11-%_>XR6s4Um8k& ztj$g)Lkn1RGN!!Xm}yPDEp6{`Ah|k}zuHyBE`9GCe}ie(x5f?FO3pgx^w)!ZN9vmz z10-w37s*pc1Drk{3=4g4!}JweYE6NzhR&n#mgr}ax5nNyKEi8MN7dD}E19ie3 za296s%%;n$tjmg3<5#?Jm#XGZawkK?8Hz1%c>san%A*W-=FDhuk@gDpX!Zc{ADR>! z`==wWz9>4h7xIR(x5~nY_Uh+*dn%b}W81(Q+F@L_- zENmx`9?647J@Tydd7gT6XNYe}<;PT9=;7JN>$y{VN_kGROrP6-mysXJ@s%L`O8Wx? zxlK`Q4wlWfOiB;YQCvc%@a*R}cypqpML0+;e;$!eK;^*XSwVO{ic>CAsN=JknhDJ=D=Dw6O)suHazRIbUNnSQG=u$CV8{Fn%kAXA`cF9U|-X`&E+cM5|M` z5qE;~$*iu&+L{kR4dHz8 zip#614_I+eSQe8Jybu!k;!jM@i2u7oUT!5j$}E27`kMd!?M$7wp1gG#Oq_C=nQqHe z7>j$>eyCZmfz%TAh82?5_8aQ-v8QKBLl4oy9D50a)e+h8wGVF-HTnx7cUfbrV*iv_ z=zh5`d(cZy9SdRUl?V$@+L8?wQQ2h}xF-%~G2eG;to9(7l& zM#H9p#VW%XCcpRMgvw1!xBGB!wP>dH%w(r3i~sR2M(NNcm@E`Cg;+PObx~Cw!L19z zcJxKUGjSRyB9M@tpkS~eJIca@jU)`ix9ta%0ZbpCaZeKF<3M@ur+|z5B;2BdF0Xw^lhoqWLn+3(0pwJ!H$pL>F&-0F3yIHZ2~bP7%dDw4P&Dq$R{ zd)#jNi0;v6_E$cp{1HwMv1U7&`q{Ub;;xMo2GVEA0e5K8)}wchOj}$OX4802k2L@$ zEzzgWi2xxJx|Wj29#fL5xQ$xXGRHqjVHTEIRLx+Q$7I>PqCU-KC=9dPx%eq_{_(A_ z>NUDB*dC`&oXPaQVGqRX{a2pNh*r4dzpgo8f>>}AYOzn%cptQH^M&=bh%n*qRUd+; zci&O!Vg}qfbwB#QR%U-~rANB@^Q-edCb@q>=~ zSDeQhGZi(fu{r|KXjQ%AHBuH@)YEQf@-XN0I87g(B5RY?yx+XJc%p^VZ87u75{3OD zKg1*X7Vrw346FMB-!rWKRw+SEnrONk-K4dpO_nN5gJ~kQs%v~IEy9{0k;Jass*g?W z=`85wG0!`Zr#g7ssbn-!vWh*^U`Ldmz0kkuxf4mZ%qONT9`TH+V6_q0 zT!3@KSlss_KsAl{deNDIR;!Y>Znj8x*v9=oG<|7U()kzff2Nvhn#r-otW=oE8Y?qf zM$HANX`#s}vPLaQsLV09NX>0Ta+x?y!e&86OGlSP0u|Q!X8 zjF%Ur9la3_KThw!ZlRBt#DjG$KQbbeyL{+X$o-!rX^+Vnjitb|*a^j6cBLdT%zRdZ z{bYr1s38_6#XHd+!}+d}gy7C&q*zNDUsa&1PdvfeZ|Ap@4yh?K^8=D}MmjXQ^%>_e z&u9?5Jk7U>f`wXgse_c;h+#>%xBLw~$^vT}Zi;ZMqDf^U_-_{{6MPYuH6W0n_baB@ z7uq9OuIxr^(T2N62GbsFI(CyAMVjq)v$O45Cwq9sp4_QcsshMB$+gI=7DVNeGj~II z$HPEzoN0oCoFh5KuDsJ(ddYp)QeQ@=aC)lhpxr925qnx}wh!O! zt|u%!aItHMb5NsJbW(5$*z;8Z^@Ns`2KSs5aMB7#V<)dN{$m5!GC#^;gF*YOE@QhI&+B< zWxeGIn!q^4lO+bE?(kS<(M`#Yb)Ftj2%>M55N^bsE994gqSj4?i)zABmH~|nAQoK)bh7xCz%WV_++dU zCi!1Z%@l)2_{>gsDe2@}o^SUk3Fy{8*0-q(u=BdAas=6$R>tQ|jroQkKHB(AzG&Zp z(~VhVC%F~K(AdsH-rk^vb-G$g#lJXv@w6W#VK^qiYf3pQ`DkJ!D~XZi$7| zF)ktC_5{6(FE5beU4)=eaJ^E+jd%omS{ZWEavUh~Ned%Z$3sf6Lyc9B(^zXau^;0wv!W{KZ?rbUwz#`#_R zHt8^Nk0E>M;aJMlUbE};kzy>w9&DM;@YMCI~p zVt@y0P{Scpjjtm5snd#*E*ZQT4K5*Z`h-thy*XOkP%ILpkZ0)c`kb6dtvds@rCgos zUmlB)=GbqXUH*rpe3SiQ;AiO=6o!gI+Pp5N`@T`;JY0N?Xe|x_km! zS3-|drs|FV`)w#j-%(Xk(@LG+(cU(J_0+%^;_ICyBg#93d~(Fcvlj^M`f0aDe9$K+$K$uC3N)VYs(v)g9oL>z5k2#-J`Cf z6Z{uWxYK{Vd=47(Y6w9;F6la)!n#?K_xLmY-l?} z=Z3}Jsl-2ExXDg&a8o@$gs#_&2lN{j+p2`~9O7+!KDk}sq}YbKFEfovoVj*W2@rd3 zRJm~G=sbUT&blo9Th9;7mDOjwXzaG5hnchA^AVNq58g)Hlv73)?dIm3Z?+8}72!^U z^6zz*SD2_#F?ABt*|DSHWU5;Sn4%d-eEdm#f&KLqjGW2p68O)xNG&^`mmV^+^{3wf z;IO~A{_WylA4)wC>_@57{}?n^a<5-UTrpj!GqCwZI-ssO&@FkP=ig5T{P~zAI&h5A z?o5;EQYy>x-!ePHNOJ%8b`WL0+fuQy;UH%O*i0s$|ABq$=2#*?+a|`gwGOHFDTf}_ zNDo5L`}*tK?kqo62zL3rGAWa#IJK56#N{aQSBVf-S5znE=Y>+8j~~bL1#p$X6GJzR zs`ry(EAHT@mFKd-8;1>h=&P9qV#R%sb+3o*e#m5Ye3BVL^CAXeRbFoxvO*A9k@onq zQmy{7LQudFSP|D95HiC zneV8H&@%~SX|ds}e(%MI(HK^L)@-IhwEOPUbPHqQDo5OGFl&Ox-8^eZhfr$5fC6rC zv-<)w&(M4V&3!&&V*BSHYdR2r7-?8Pu!w(Gii!CCnA8l&mo{fY*g#On@v zL_(JBAs>cx-NRRz0mrVhfSwhF1((+AruO36ETcx110J}sWoQhdM(R^CN80saC>W(mHe099V~y3) zJnQrG;AZDS-hMmO5yBd%adFRSP@r`jcV4EF`smI7#+)wjS*AXX^Jr+wy2-q-$h30V z=SA(yw=VW*z+6rr7_?^^GUn+&Ch0f?%UG@B5LuGVVyxBn7uwq`zW&5-%#!Z-_)a}V z`K9(65i&<)1c?&gXp;rQ<+K^hz1kPL<(3+0>-GWx%B0l%Di$qy(Elk16H9oz{DYBx zd?vvesI~PVprEt(;NV-@F`%<4K$Yy7HO>{FepolL^YifL%4M$^}YPqrGI zOCYfO*V?mE*hmR$-yenIq`KKH{GDR&nny7n;R*=UWF&{4a3 zH!~cV!rO^In_Ix<8k{-ot??R5b3)W3tiB0ZfA15Y2_Ah0h+DhqoJ<_m`cKQ%nEBXf|%Sn3(Bm`NaxS?(x-5 z-`vr3ow(#mudJZn7ks!dO&2#w46YK07MZ!FmhGY z;l|Fdf3j(~XXbtASm)0tsi!Dk{^Gv1ZRH2iLtq~i_CO42kD_^nFsBdAdI+Wr-Z;T^ zm`=Vx2VKZoql0-kYw8&&ym<#KI-u9G`8xvX>}v~_K7Bt?C_V{5_+({Wo4~pY%dy5<1Ep=9MkMEi{zwNeI&FBq)xHlZMe;^ z3tr5hxh;4HjezczgpDQnLj5QM;jopTpk4B4P3;s0eUaV`eEmo;{`o@(0)%&B%bKbB z@C0YnxgFKZhxZ_x79z6p89r4JxcyaEY8j$4m-aTKi?y#5-=Jbn!|zTGTDw$DN1JaI zz;5O}h2H%)tR{vJkiqAhc7aYQc46NZSWDYY$Ry*@)4yXvW-7*BC_Q+Ao@XX&>wVt9 zox?~y)mVtDnJ5a&=1`LijhktF)fU9LoxmY@o|qU4`kGO>-CKyRC?k?kC2cBQ7uupM z4EEwF8Z)V{QfVA(V3Q-4%K)3+PDe{B1U{XLL1F`3fsR*u}qS*7|L*5zOVQ@P)kvHQnUV>`6V%`x!T zl&H=pgaymCsvMAfyCZAdwa4ggj4x)h8Xd|IblhH~>>{+FF0ZBlFI071b?8n!XBk;y zlqJBD`e4T3X79pDmP{9d6-qj~4c58~_OewAc$4`?OL9ODJ}arRUMjP8JnHfXMrmRH z?XPxss z5hqQ;cE$>Y)x3_flTm$+FV8R{buj$nJ|M_pna`>=eN9Ezv6Z4z0(#FOV0#YJTm+^iEW7H;Z9zX%UjpB!~ zWWX=-fD!-%%wFRJP_nACp7%8`$97snB#MGO2_gJ_B+u=B*|SM+7PME;JY;pqR6b$=w>pKdP_QBzd_LdE|CF3~rGt-RQNJE*>F zdY70RXBw5R&)G(=fS;I|>ua^e=+TAs)wBnlo?zO`;x2@<0DEY$Bq8t$etu->95^t} zG*QFpJ|j(nRmC(cgm5!`keJs{^N2#;uQZ9}JN6{-+||qQKO}t`*X$UJe!Rk1p84sI z$=}#?R6AX=6I)(rI@PK&9+0bZO+R)m99&V4?x7{IwE6_=2Fd-e@I<0X^+{JrcWXT; zth+GXtNv^(PCj1mW;fBJ>z9qu%uByaubJ5XEg1DxZ0leL{VJe0<~F{t3YkQA**fS7 zzErWHPW_7&(ydOIYM3TJmvtDT4VYYo)NmfSmT%~D%1$BU=@uo2dL6^&QW;SNxLLmz zMRyeN4zASQi}qr3+}-eg0m-H8Kd5j|{--BXnIIJF3C{rQX}5f}Y%hR`9hH>2z~nKY zQ>xz^&GurYp*D5_cwWn%_tnm6;(iC_bXu2U-iu3g;-k&WLnRTO$BsZ>mWE=U2+mDb z_$cDU{kKEUGhJL{EM>g~JbiIME#rmvsR^!Huasw^}&3|D=fpNgYpI7CVOV5^qe0FlCR~K4;!?0-R z8OnoVafkbPbilr}7Z=yBTFG5KCLX)pPq5HS%f!QirxQ2c9~IV{Q52S|OIFkyAqvfg zV#Fj;+5*wJ>`;^OjAY89jkkT@l~_;J?*v<`;5WT*SP0#wePP{*Dc?PA^tr!C?viN; zP(anAMRwaQW#V6;0DYe|d%I+==&Xdv_(@0;EN78k$r#F0G}VP6MmE^#&eT&0wr#^^ z^K0lOdw$v~OX-4?HyDDXiTO;?m0UloAcYnd)D`m}mTOnl4k>?BaLu1qy0Abw$7UCT z2a~gA^*bcfgiXmtIeSt{k`jV_FRR)$V(T~k!U zjAV)%p?3rAw4|;2ott&PnDTA+qBzN#4e;5c-=5BnZ^;}UOs+Gd5H-pa=Rg;YAxK06 z$#fvSMf8XGA9}n5Ba^JKOmC4z&#dH1<=Lq%l%?kn@twIk2t&4VZuOq~HmrDJ&1!|! zLWrbwF+x$;3FFDbphX~Ly{zP>kjYiDYp}&Es+dKfz@Y+sH@^TUyl|$H8;&XTA4|xJ zHH>M_S|=?%w=pyE3A6KhL2pr?c{wI0`I+{~fT8&?dT}U}QLU?L z?%k*9NDI2;@@w+&N*#?1senB#MUgWv`~;>{vyLHdAU>XcQpaFWZQYjUA9VY}XM=q1 zFI3uHsa7^ANM{H${}z9kjORNAJl{LJmLWEe2`Ve#RNQ2j_WLeRrtNW&>GiF9ddkTm z+}_1T_<1VkF`7g@-8>e*L1rS<&_ZS{VJWQm$KWiu-EAJ+Kpsi|Zi?~kqalj8q~^q=tFsoJ*bQA2Ox)i@4Drk1n(kfa+ME$)BbP(iA{E^cpAAt1GfIl1Le#v z2N#j6WVxj7Wv{OG9W-1<9jFFKGtFR6yk=6-t_t9wLOUa-NxXbasK%p+1Uy|1a>ryl z=_ny~FJDKPImwTCf*^m&a$G>nbZ(=>U7MJHA8N>Z9q0)m(>GQa&P3A8WxAvw=YdY! z{mt*16G^X^j6njJl%?!J>`v?P$6tNVn!xgE^(p#NU?1DH>U!vsdhJ_O3vb8eWSECb zM>8(gH!(|Wq5>ll&oE6Np`gG9gxX(?_SG}!t zAc%fkzUdFN?guB-w^xck{5HIr^j*Lo?V;eozcEw);e#QC{qjw3NU`M!S>mKUe%Fsa zdzH`N16c(h=fVF-{dje-n;B~;{JnjdRzXy>whJ*_ZusY~n5*U75JVB5hjVGIr}8a? zQy*iVeU|J11h8_+b&$|+q+BOpP9uqsSoI6t;W+`s+V)iZ%GK-0$9J+^GxW`qc%-DW z;j+?PBWp&H+-pBMb)Q0B56+>fOc?bYddaQ)oTsE$&r2x{7vJ?R;^x2$iPp2_p|a)` zL!GD2@lCMdO9p#a!_CS-_zP`4hJwD~DL6PAHp}>I9?1k=cnkPies02*@w&&+&}0wj zQrVrU2jKRWJ{};N_L+D$IDDu{qkZ6sO1R?KluPOrgGLH)gYl2WeQ%)izC7hoRwK?w z&L^;Ay`}CySw`(svbJIF`ftOWsRv=%-=2!(oKox_*&REz>Tx{ogPVBrwg<5cLD`GP zk6ffR*v6l%NLf<;3S_dxPN)oH)9TrgA+Zkbos7Bcjmib79$kw~4ugDj4Ewu{1U>tS zh|i_Iber9uy**@VXh)vGouL?ob>HOlyV)6gu5nfz(Y3E|dVO@aaO8UM|k{>dKtyzgTWNA*X4TpDDhGJkPCZy}TrF~^O@P5g9K48gF zja_|w>|5k{C>f2P<_XA6Ybp#QovQdBkY0z*&R`1@GplW==&pr!$C&ZbOunQh8PzjF zSIafuQGFU(U>WG<1WP*h^$?7*g&Q^)Ro*|i9HVSaHJ(9(X8S{D zA0lJkU;Fgt@1y+PgX;aZvl+nB_QZU4VyZJVfZlw>N1*VljG*aSEQlpaKYwtvPx`cS zln~N(&y?%StVt<^0c3~6I*;&r{X5LJmNqK+j%_u>)i`?l+ef>Zsp31Bbeobs?t18C zENa~1U(es^ZMtSYHQT{k6F-~QjKzNVa^=K>Ws_Hy z6~}tFm%$b-yV&LmdaEGYq!n4_{z8@Kf>E!cX?knmA9KhYQb0qcS~_DchKyUbyFt}saY5qegpxl~z5;9~*E8AJw z)4n7{Noo2^Z>R@!%;S3cTxI(WjH<_X1F3VB$%&>!fy(cVfcdpTz9&r)$qteFZjF_K zlYj2s4G3I)_Ic#3?zXT{(oP`j-Kms8ONbZF|KR`T@3K}td!F(oxclP5xV^=8Qj5Lc zPIghcl074Mc&6kHRlFXuL@0^U2o0P3qz|ca>`4!6rO19do=D=jJu&KIsD1o-P^$>q z<5b~T>=n?qmj0iPki4ei*625Ff7vEde+=R!OnGmk_Ps$})UTxuB4(61|AIZIfO{b_ z+teC6-7#sHi9>Dal=*1w&jj4144Q84=w1y>*htYS^k%f_{`1M(suzIsb7jU7;Bp!3 zLW#f?L~%7LuY|+<+ch--{QuUwHl33}aaA2G{b99d#?i{l`dmk^jz$+T3pZlg7r8<5 zN^?4p$36i_0!@hUDd*m50Ha!5b|Nd9%8?wnk1f$9T%pegp@7eb?~bsY7M%3I$xD6Vi(`Gb^RmV%a#l-69LffLvp8qoMsst-4g??UJF_ z%97ChFwQxJw_n?@r!Ei&CkeV&o{%bs(ubnY=TAp`J9}N{!n(*ecvWfb4w=$o===1< zowvi)cgYAvwvUJtGLMyC7#?`NC&CwslzT3`I}E5er!x8SDi7CKK&lsvu)Lz4zs%W2 z_7ZLXAtE`@QTvZ+43pE$f4$MK;*tEj zIT2%N$1!$|fVuQZRAIAL(9Pn8<_T73uBlfD?wu5r^-7|>(t^3rK zlz`BLFxYe&;76mBX+*4HGlv*xXZX>`to}5D5D(u3_f7~2#;~Hn0vFE*Bscsd|O8B5Iq%7Q&7f}{!N0P-1E7U=*yj;>&allA=;uK@)GV;$9 zU|>fyb?Xl+5}N92ydZ;;FDL{4su^<0gzuR9IaC@ssXK~*41#9k5hkVweLS{R5*Gi? zrkxcoV_irj)p~@4jq}`?YXoQjv%=+S&71iu(~GNpjXyGZ+b5o*9oK!0WihG0lkt)N)$@h<(^$;!I>u8As+G;&1yUpd(PPxnXnIk<8yjN~yxc6mm z9dQDSlk^d#uBAjs5E&l8?;ona#6NoTSe~hcA3yngZ{Z?ew8w{7y$2(p?{=9@_5C5x z*t-g!j5*EW7z!T|jJs0spQ&iXnHG->v&Z0z22}XHrJzF(-najliFws_%?(>?i1mz% z)w3P-ia0y{SClx=gCPgd3WDJPh+bD)@xxK>;IyDaXAYv&< zb?<(@t+Zey9oGlF;c6fh8txe5HF-X3u;v^sq@JbB;R{B;tipwvXD&rj)MPPuS^*r-0h-%k8m$N-fqaKd&eYhLk zHEB-^P)*UvIh|!mnhKN)T-6@2YP;%+>zv#WVc886%^};_<^I2lS1!+VATsxf*DUR8 z0lHmLCOF|?a_19s(3;g2eZWR15zjuuL2~sIT(vN-A6HX-8j)x_%h3iqmsg(-(5jdF zd|-^<4o%gL2>t<2pyy=M*;r>V9VHeVVOc)Cw-9qgycf*u(8}Ek$Jx~QAzJ_BbE=-R z)7KRO71wL2jR}zM8;ufUn*okX2Th)CSL79-4lopX=>*mH{GWOC=9z(?AUC9hFIHsr z*mN2;06eA0m2C0=t^&Ccqq_Jj$mK{Lo%Cq~Qo7EABhfkLa*BYDe!XOPg~t-;t+imz_ke&ZHQweirLb}~8YP&AWd#Tag-6MINz2kHPafEx!Du7J~1NOT$^o|A{s zK&99bM(iML1V_($kyMviAcL4tn z!UMuNS3^-^X){N2=x?*%Hm?>QivRXV6l|j>_FHm>>3En&JR#ni_)WIDL3$@5(H_irXg1SqaEG+sB2};cop>#MqNMq zljjFqbIinpF4B}d0`xke5_Bx)DXu%1cb}33JY+Pi9_%Wy4=2@&^amhpBrye=fSMO9 zZXQ4;sp`|~e6NkSF3~RPd6F}_+^Y)kU0z?3Vt2gTO+04$e3>kIw%k@S7y-5INVpRH zpZAT18T|xub^%XLHxcTobpi)G1k*8Z@)Q7Z6F^O0U6rK(%I(QFx8>xL5`P~;7dsHE zty*jjhf0w)B+x33q1^a_;E2zPzdasLA0q|fJ-2bTR@yE<6Rc7Xn^p0Bn|Wvj{yHtZ zTE?v|+5Vi zier?Wx*u`zLJcK-FddNDA6>vEqK~k1jmw*D$MdMdiAOsiQL-?)hfvQxHfU309 z)m;#yaD#3P-CqGOYZL>9zhL*!`C^)zPLm%p4Uqd~0cc6|53bN@28}P0v8fRRs#r(_ zpsa2i1{~H@ws_B_J3Bn1A76Dj`&&b6-pMrA*Ms=nbnK;?6QQ8-cN-y)hXon*gyHrW zQ+vj`Q=g)`0&S21WP2`=Es|YddZCmVo7T8=>Ifo__1BKD;&gA!^i{d@Knfv)4;bCX zjbA5HMY*Yem$6YLWt|G&56d4ioP-|GwpDY+p4^-iLYVo5jA$Z4GHg?Ka8ErodFo6j z(s0q`axvY|+Hf&8xvni-P0uP2J$)#<%gJB5@@GIo|0c%$lRLN5hsU6fG-8P!q_%Ie zd?|VPxMb*g@dNcYE}!kks+k>jF%i7GmGkII9^a2$OYd2Zxm0riaaw(H_l8)A!d-Za|e-4 z8P+#CfcgVX@C?l{saTN7p~J28J$+jcRf5md9nBr=*Hrk(p7vY^Vqdmo7y0Q`02frk zjXpUZ#XJc_*nEV=JyZaMajK2psE_31eWvphcE}=_^QX)ZJKfcjJ*Av>{bX_?jpJv_ z^n`MW?O$IBFoPOSb^05LaS}HQ-O{>%31!ZHd{qFzR@9ljXdF=%W~IJ4g8m&g?lY)< zX=^B6XvDAc6wi&xY?uMv_NSWE65E&~jSwA=s}tSdu828?@qiD^G~2gkM2t5dTB#JS zhCe^Tk5?gAY^;hwtl0E4=Q_DEUG)IreSFBR@cH-8$rb!I9~#`~k8i)UiBfr}z`|FR z5su1yJq=%i=G-NOBG&7dG{Bo_^+PN6KTh}FaA?kH61|nOj-1Dx`B&&W@yMa@U>1aie6Pm^?g*M)tT`B!`L*WT$c_Dz1KF-N6esI#` zRygV+_EjDE1h5K>%I|c@SIHFNUCN2*a*69XE;@U>Mmf7_uTws*?7&y~}8OsL1-X=Uj zX0O3)N99Gh)u{)^cs`s2naYiEE^G8?%jico%3>9;LNj5u957u<4k&6(mn=(LfZ4W z*N%Fb%x|EV(xRXzb=`c}le`>Lp!MC@dFdoyO%^2N@sQasTt`QhsXO9OjU zxI!)2+a5HfgKH8YoB0(baXfi~xF-BhpQw7%s><34eZoNg!feDU$JvK&``9M6r!;AB z;P%K9&?@qQDr8!_1Kz`>rQMbI=MG0Zq4)9UPiLHvgWQ# zVnBUJK1>Re^}jG2k2qTZH)~c{2+vpt;cMo)k!_B+g>l*O#64zan|(zV#pWMahz3o* zyX=D{Xb?V;P zN341}R`c7umFnC7^Kj8bFu6|6A;AX1t3<-2+joF|`GTDGx?yj{&k)zN@3?{xz#Fu# zvgk8WxIM0rt9_I59jz1G=8#8zs2bV3`6SuIB8LVv94m?1%zdxyA%J>&M|w#V!|--4 z(p>UfgR4)+Eo0Rcx7#gwYUtQ8VLpwzSa&>g)(0C5$zAGCjlFQpDk8*6eFQ(Ar$J}; z4C)4ZWXOUF!{dD|{xC&=V@e>}nU$n@uw;`aH(hG}Y%IB6Ap9~&_)}2s@N5j-Gz8-Q zjHxV1A>Fq7#R%BcR>w_5g8n78ZKJ&{fodBmeRn79EZ-^>)9sP1Izx-U^5SCrf{|WX zApc4DA0zMyz@6*%R0dbAf77i$f~fYPIy;_m*vJs)Ip7V-Mr``(;RwdAk*huc4>z6g zak=NQb^n=uBU*I|5*+qlm)pjzqPSX`m#4TO{RHyeg7t|u(VHN&tglv?nLI3)`ufep zX!PpPo+!;0MeKFi*5_*e^T7&P1uC^$I1nr-;W`e3R3)x2RYs^)^*sVhEQ^Z{7MC%N zyDIv4mhwkhz?193Uq~ug8!#w6l;jVD6a2w`OWo{{);zn(N6w5Pa|k*b&`OJTiJt%h zXQp0m#lr!$3Ft%kO%Xix-o?)XWe(gZ{(ba>12sCBHk!+M)7$0NmHGLYVqffD}TH-0nR%re23NCF?`2gKu$w0;j6WdUe zZjR4aPV1+Ge|7Y*Y^Hsjx&;Gy(7<4fqIbIwhfY}4yB$#Hjgb3-UKs<@C$H#MJ~~(K z$&UgIERz9QYQJI@KcW*N)FUCQx!caYptzdm{BlM867a+?d|mll!{-Gi&|ZF~CrM}Q z%>4gOX!pvBcwly3_?HN2Tus-nE2bN&4#5vbl_NBIaNFo&sTVCOe>?gua_UO7^({Dp zYfZ*3kO`Qf7*awfWfnfP{mvIWQ0sb3kmwp@WBNtOU~Ix6+ose$Ph;=yhNtO}%Ltf- zF5kU8`Zl0Hv@>}D{x{Y)*=Z%0Tflouyfr(;R2AcUoCP00Om8zcf$Vf`z62|H+?wx;7820}@dbzH!H+pCYZSRS4q!nU{dhSspPQP zTFCc}M4~m|+Hg`8ggQa0AfXSp*`B^0t`0g9} z`h&jEs17%PW9tO^QtJg}t}0impErUz+kZoM)H#!Z*#Av+YXp)eh**Mbd`Sbb{wOhMYitHDo#CX&9(% zMZf&d6%sj}dkf&&5>WiDP(CFb|Fl3JnC!*vy}D6wnU#E3UB(V3jX5;r)PKz|>=m7o z2{P){?XmA9o!I%CWXD%=c`&h18E6so6KH4=+1Bi_Kj;Ku%BbDXe$Kfb$}8dT2rVh) z^C`#W|1l~0&I=V;q$fVo4b8gol9KlsPX>h2%#v5L z*^TJmzqShvdA#zJPo+Lv_gQ4@Z`wTI2V|P#5J3A+Ct5YduI5I+QYaZL%pvn_Q_3{a zuwkpbHeB2$L@REC+7;^O)7;d$PTK5KN+KJuQuOU}OUX(yi+EWeU_9BAPb5A58PeAp zlBK^Z`-LtX=hiy*hoIUfm}>b@l;WHn7%f75F?4ABi5QNdO9TF45c`kXf0AddSudKT zXW1nj=^J*%+k++F4_Gt(-l$xI&~FZU{Wl6hEcH%=~(H`K>iRD}V3E4Uyk; z8d&M|WskT+`!R`+8r2kvt<2B01!OaiRoMxg1uynt)bJHkvYDRqPNy-KqGOWcF6`m(TaiBaB-rvbRgk2dw=0Z=-Y+P%V? zX1UrmCV0w!fy2Vu(+ZTscxq*NjIsnSe3ZUyYEk+2Ye{}H6Wq@9r8$5!;*#m%(zi+S zCii&Og(3CbE=nS*tEN-n39NL9oZoDD{Mt^|&4sucU}Ky;Oi`A1M!lC94w_~CS#`f~ zpJoDr?$7PY_56k7x~Hg|sfWwKb6}!vA>NrX3%dai+n_0K=aaNBPgNC$v5ZlzW8s`@cT zVe{4}D7x97SQBQ>^la<}b=CNxD-^!^a<{5YGB)!Dd9_IJ@Y50j16Ow>=!}+lWx+2Z|AwePP z70&CHv3^Ts3R0~Eyekmay205`(Y@?C2V51S$OqRTnA~cR6Yp)ibz8eacDa}qvQW}M zLx$}$CsWjhY2sc&$Mz4ba^d*H@8)<7Wmr1}vqct3*tE~AGCbfmyga5XhSV);Gjw3B zgXUZ51dBp5WQE=*{KnXseVELy`#MOS#@t6oc$5yXsn;o_OYR1NN|R?#0fGuKYw57p zlNr?mxV^sfE<_3Kk+X8JE2Moo4v$N$c$L#A)wC#l%ePR^B0ymj~hL|$@kuU`-LX={bD5-&=`2{-njDU%Tj z6dEi`T^W|}u*)xQA~0b$`f+S=P7p##=!Q9u@sx&o#-|}v(+2UL1B}mks_K4R+TEu0 zhwg`t2dXO}TtLa&*O~?Zif`w9nLH9n!=Uku2-t_~jSH0tFU&LPwl6Vn-B{^0ig!fL(7w4uT(J6WI7k&5vP&qw+h8!Q1Pn*kajT*X!1GUx3Ltk09DiRzYB-s``Y=?O_HARD!)JVLpW ztBK^56fH_Tp?*snXEPj9R;Ayf5l~H`#wul}Ng+AP{DfZPc-$aZ&)`~93vUl+Fd!(? zU_7~(tu!a|f&A@NhG-+KXM``$o`&O4xCuT(jRHO9sJl!8r}YNGrD$ZkA~+xSHfrRG z%fyT*M>x7&lI8Lxf%$fKAEMKzqIt|;bT@r4X%UQG<@z}1v@bQQWZ<4KGcAMH;MU!5 z@awXj*D?UozzU2Rg zvn;&ZpSvB169IyrY!v0ije1j-E2`RIn)t67su4sEL%$!@B|2%K+Kslq9|jRF1l&GU z!9&{y-p9&^@>cp~P|(#f4OX~ge036z?cW)Q=L$BmpgBq;y0pLN*MwJi9n#UzxjBKX z`((#jNTQuH-3OBb4qS^^H;uhTqB%#5*E5wA&7h%My(9Ibsw^$m%%{=p$&Cve3AZHE z9smgK8WRG|i%U-%J6rA+&fw@89a+J6&+t(vd`-ja9Q6;)CqC_kU9oXPQESb- z`}+Agi?_+~k2z$`69OEeABC`>A6%`*Wb@9^6wJwKB{cMJSD8BF$bcuWjQVe6?1p=i zOyb$-K+3?a#uc6xrib=eDRmq9odjYv#g9il8!}#w5(}uSXOMsS#c_;=wYG2fZhpz* zv`1m58{ANx?Y$MmuXtefJ@k$Xc?2X3(n^k(Qk36cVVrKQmlAuXH;8x z5jqM5{+)J<1Y}Y^>kN$y9>+oX1n|0d>IQZ^T24t?sm!4vkT2UV93zEyIuZ*p9TBLC zIX6mqaes+nja1I!Ksy5)zh+VRF|8erBbQuC*tny!Wk7~wUZXl>vioQoUs{HM)h z%+YV3y~XvIaV>4fB|!D6R$uIC+z&fT0UBWUJ`Ufl{-4lUd$*NUn2YBtvtg)RBUVQ1 z6R>1l;(xk*9t1SG7&t*nNs0QU@mB?qt>=QD10Hz?$z4d)^W@8<1|(RDd$ zo$y?J%}^1j;k7-G5Q=t^Y=rIg&;kgmT;!cFRE4|JEybOG)HXhQ7sK0nnu$*{`jEgpxNcN;;)e{Y!Au{eLH z^q3zc?9%6zw>gA6fEe-4-3P`Y%ywI*xs=ooGK+E^JYdoKls7JCcHQ>oVh-m}4*iYx z0WLtWDJ!^$J^uxh8~Ge6Qsyan$W|^!jht`$M-nRwD&l4dL0*ZwZe=n~r1f5XtHNXz zBFFAX(;Yto2U42nX(3Ei`anDpYx}%F`I9R{Jo;;S->o~i8O;{#CqB5Mrc|TPGteag z1LXGKV*pCsJQh%VzE5%j0_@iONnclS<8VF*&7$*U$RWRt_au~n{j0=dc$)Yh}q#l!2nm0x9cl0Cwn0athJKgQj#*I1GfNEtw`+o>)& z5NSlMp;=K96y=<;(4&gKa|a;+$bL~jADfR;j_NPVf#W7stT7>O^v44Lx3lAxq7JZt z>Q94CD|Tm>LBP!Sx~BMDV?4Yh2PK%S>Hhocie%qcl^ij`jbMK;2Z(ZjK_EGo%dYSVA z^TGf1NU?DI1?e&Z6}ds!eTQ&!%j=K($DX=vjG;tW58Kge!WbXpJ|~j=mgdLn@{U0v z-~9Q4`r2!=X8DveKC|G;Mo7;1SzcKyQl&W%hC3p(=itbAvo)<8j+na7mFokzowVT} zPrR?FnZB{i2{VT13FgayP)~P?5;(|qA9H8{q3#WkF}wi`YjaN+z43aKO|PAuIZP2? z4xEsB6>Z?mT=Mu7!NcKBi;~T#(#dXY@T-Tac)@V=$9R&-@Q<440RzBbnX-pHW}dRA z0H#xg!LJfwkfv9gGb0R7_L>3Ae_y3%L;H_X75qZS^`4pm*`MWho~$O!Il!4`6s$uP z$YXZ^=jc6|3u|AX#t`>ISwYg{!;%cq1<)SFO5BsADW>)DD{8^$^5HoJZHM9{c(*a# zaSC#mP-UE)%T|<%WxG%1wB&A^GmG9+&W=;S^?0jAi5ybJLxyIXM4qo~udf{2(lyB1 z1rt|OKKn_toIur4H<=MimkHf&3XspiVBjIMowM6Dn0;iVZWTOMC&Ru_C5i@asdaJY z#PAd1cO|PU`_F3fbkW|neX7X6#U)|Yf&m{#3X`E4Cz!kXZ@cFO6UjZihdjIh*&}2YqWidA5Q9lU zeYvN)$9@Dj;gQ2VzzW%d#`MqmkNs#`7La`bu25Kne3_v!d@_jC)vE;tx+g1L{MlsH zphU^lwfEvYgshmGNVW;6q8b#qrlLAv%r%s-KR{^n(+l=t8-j` zw-W-H>%(^LkdI2oTOUcs%3lEV-?w*iK1&t>_ND3_Z!pNZ=hp>?79Bckk7-wPBIW|q zYTwQ>qVseJlSVhMI}}f@h2KGkJbIU(-yQg(7&dcR@V(GBcOK>rD*&NUzi{^H?;hwK z$#zg5_C%NKfB;J&&eiWZ6>B{fd}3HoVhC@8XkXOyjj=2b>u!~OZEq7#u4>o4ROGtm zlUp^-W1)!MnOvwM2310+AQpQ5Kc7nWtUcpO$3ix>VqyO3d|Y?vBjZZ25B8~>6ChKY za4NAV+prrH;dTbPm0!L5tF$PVm)7$=em)&l=p)s%fzuN_a>liW&(jHeBcWQ;wB+9( zD_9$J|2KgVWHAvE@1}iNJ;z$}7*V}n7gJY#1DaoZ1i@v5I)UHwUnfH}>UpL`k8%uI zkZbsnt5IXWY7>ewnnO?R1zUdI286_5^8G>;;VHapSdzMp>sIA4EN?p=cA7hFKIlh> zjxAnka`CuIGY;OEXcDOffhz;g(IM-=A z*3My|8U#v=JrfMZjo&MFlM*>|D8(|jA6AD@qzIXP%R8=fi=@^$esG8wEo%B8&JbR1KlSg)&m83Ixr*OI;)#y3VdY9OCu;EuYWM zG=_`P~|afc+H~?n9}+RpZJrBB=Gp%WM-eraIuDb_g32A6687lwlbrKwI`xWCiya5 zQ=iuXaMpEorSMoOKGu-LuR%|~Q}+X`DXtMP@1X_cFDPR(|7tU&a`7`WP>MmGP<&|>VpoPZ|i!h7H}-rNl4oaVbK%hmz*0q-0)%i}pavi|@KK(FspBc(>4mm1SM zML?Gi(C~5a`s}{luw+Xzw5Hs2_CuRz&;McS&7+b||2OWLn#O6GGPANpp~=b`Gh4=8 zpvKC|ifqwRgUlRDMKW_?pH?#$#x!k4h0@H*lq>~Hgi4c?lw2_}DG^ao5fBk%d2Z+X z{GRjt+p)tDKj;3u@Aq|Guge#5MK)52XF5*o<+)#d`d1R`?;hoCSVq^@eqW1|QCA*4WE$MeC~jF(LX9BH8(RMm;Yj7>akI_6$fA;;-y7uapnnvQ!Uk#8%E9( zI~l9O*zd9=uU|N?Lbu32M)8rfzou>LT+#oc=gpnny-}-U zrd`jX11F>w1HaOLxfs;wJLm7k>jyE~arGJhzXP!w4$j|iv9_20Ii|#V*Ak1q%YU?8 z4_iCXJr(Q~sas+>|2VTz*K~!YZ|d@I1ZL__Z9bZp&Xg6nmX;Kxp8Pb4I!$>*>x z5U)D)uJS0OkAksNXf&1j1U}9>@B%qBF(U6Y4p5FfxRKb z_j%YPjThZO?*TfrZ-p(gd?tuT<5qe1fvd7#Z{dj^y(@I=8D}}dbEo$xFTikT%bZPA?s`7ShPwp}ZH_FxPo@Z=?bVBLytY3{QisV2|gQFl7IT=VB^_uV{iQo+K8`&6k5o zCViYAtk4l%q3t7Zlcp{G*;_`#^o7%3D=6eqnKLJHg|cozSI-oGM&I%+;skwTH1G!s z@-73vo-}h6(+t!)M8@;G7$<~!i8qDJ)MaHHby;sT6#lu;-W2qOi~|}7&wK8Scah7$ zTblQ?JKWqx5x3Cbsm24b)nSH^ROvi3@;Qlzca0CO8X|5f)t@71I&;hKK_|qkdNT$=rmz9$uc%-+^lMR5qV<&5mc0QJwUyi2cfI9Hoy{r)8d}-- z^Xp}K=4&5yjJ}UEMQ-d?D3Np~U{cu7Zu#u+5yYy>pFsRPv}Ilswv=pwBHKgWjE-a-M7n#H*M-=mBf{>J{P-2Z#vv9qsK+u6C)OKkVDB@zbiL<@qkqw9o9$ZfU(aoZNTqb3?A z+E}PsK06(t3K$<3JnwK3Y@$?WV-$|=B6W!?_ZUi0db)M(D&K}&-OZTMZ6OcJC$FF~ z&QRB2Mota}Qy??A^wSX@m(D$;r=e5+6Y@sN{tI&aEz3p!{GiY3w5&4RdjcMLOhKI& zrOdpGe{uU*L$Iq|T#)yoeZUZ-e@}c%^F`1rsB3=vfE>MEf92>Xh*u<0l*fJa#&m4& zXYfb+Y*MB^J8$k+&4`8N3!Fd#@+6?69i}XO)z=wYdwV6-mDX!MSt%@AsZht4(Nyq* z8S+Q5<!Uc6n?2((73{AMFK-ybt%1n6D0`@jYfVfKx zX?#qJC8KzoC~jF6L;`a=yp<@D;40I{u-@WmG8GRgEinLI8f0=l*`PG0dXJ`}W?6W= zq{qcX9d5I98E)_CF}L;7q}YeaPJO6g7({7paU_ZlUVozujEHpr=5Km8cghGi{77G4 zt)BQ*40=^tr;;OU*PQpAX;H7z{Z@-Mj!2xo!8w27V4np#!)|4~u=|J2?^N}N=llc_ zt%cL~VaQ%FMUg>l5)@~Kaama`E4coPOzRSaZ_w2WjR{^9tu`(sGo95LroPY{QM!TH z@%Hcsz}#esxdB5|8}i;(FwXa`%HZLsG}D3FShARpgW)J37^cP5l>0Ik#>kTk^lm^w=h zso}blBzF2xN^nLta}rnED1L><|J&*Z%cFZ@O#?_8e)nkNVwM>?bik~glAMzSqc1y4krTXd{7^l2XUA|)<`}{Qk zQ2BR73FGx4gnna~W7uZPNw{%RJ@!3_?G`9lQ35d=R&g%BLTIn6S>oU5T?g^$--($u zG~j!!9gaUt`UDt`VcEijrfcxe1Fvxdd6iq4&&7z^@;KvW_3QT+$G4dY--`-sp|De} zgEU;o*|r-Hvi1zGI)L%4n_yatefc**tQDKLekx5f8a}-aQzKet%4Gj6(tH+ql{?GA z+4yG?-i&@NkliIjT=RJ_F+Prv&DWjJd@Z~GpP@Om%5yWf*{A=Et}$-n9#|lbXDXvY zYpZNira$a>KK3BKvY3yu4E7BAMOtBq&nHGvgTMu#Q@#=eM5I~rcSS8&f-yzyd3%oK zjC%n3bHvPQ*=p2TAk{wpzvuh#KhC1ZnD({KtiHAIL96q@A5VHXtCQLD_%rD%Z&th> zTutOOQp^f7Pf9UR&Fwac7|*{E9g@yGpg$+DjKq0fYbJQ-Eyy&-$nPoFa|D*&eH(c( zVf7Mg=J;C&a*Qxo>KkOh)m9j1Rq4jMAUNY^a#O`J%@1hW^!chq61LPLuel`t*(-&3Z&0Zk1)97FeD><*HtYt$9ISNX?Y1{r!97#&#@49GpMLq1LcireN4 zrN~th@UX5y7D8rJg5i-b-ltC_^c?aLHro20|#bX&DqRgr- z-80SDf%q`=N007EV2D7EuE4;NSxy%gzdytijxh0!){8y*9uXH7{)b&ztxqmHIk+0v z<;(7UWCr{wx(o4flE{jZEB9G*>f3tDt0$%Lu;)XRdYi=m=k z&+616>nNdb!E6~stvCNvcw71I@ILOQ_duiuK0;#^Mp+YbEPVCpR-WdjykxDXha!{? z3>leXdb~IKMC#kYD`q<@v@-9#V2#?+7V1qubP=gH-v2`Pg1^a8%e6rTg}sdU_qI+@g0V)Yo(3#gcFP;TW=9 z7u+QHycwZe6a)*C;0`+A*KUU8N*djBPBJqNtVIph@E+GXl@6zJnj?bGR!ttUINd!{ z@hFfVtPU&42(ldL%zM#zyB3UbmO^2w5iA_M*@~Ase5&r)u>&3w+1T;EHa^a(z78|H z6#uQAy-8+od>T58*)!kx#%4ArM_va{dPCcVdy~s)&EW{N!zEl!iv@9s_}@c1k9{G^ z48Vn0Sus!A0)C$u!a^B~X;Dc>V{{F)nEI3@*kc?hLHAa3MYIn>Oui$CfSa>@PuR89F7_?|^XRtz)+^aSJ#bCeNs! zBcpWzbnl6Bpc<@%hD^A$@?BFu5;ZFmU2sk?q)&YhMM;X(ZUCp=^vn z1}i85EK#8!X{mgQg!2NR;(Qx2HNIi!)|et14y-)WBgXWltR_7$z~=B?g{`Oji}>a? zeMzW#emJ1N(T8)MA2_URI`p?bP-fHS#g00UTyd0> zX2_rdl&Ucg<`}nt;wr`h(y~}J1G2OveYDw$;$imo^`J?;cb8ySi{fD~OLc3_PPH8@ zyd3|SyQDQ4FklOuL#X%MDl=7B@{Za2_kn0~6%8z+U#gSkKkkD&5PIcJ|E4*>E5a&` zyC`W%l{%l{-*!8gW}Q45+##C3HIN1+uF4g|2;<@D$#%0V;gf@-zHP4k;4-~mFqPOj zwZiu@B679eeWA~*`_DSUs%YNXu&{Z5wzzSSsMb0EksW#P3^MsF6u=N*v2P`MlVoMS zB5?$Xk1sJ?`**TQJ~?uD5`TS+_z@69$aaI?w#b-sxo*j z{GsY$;z2QI8DXN`Z`9T!U~Mc|y)6Kw%oe%Y)+@&2XiwYw>R?1BB(nDpOKr_=pSk{N4DPeX~2E;ew{ijkb?(}K~pbDMl zn2nRQaNS|FaTyKuM?Ek&_dIH#=SG1d>kMbr-?<<_;_N-B8Pi=g;VPZ}d zntYFRHF4e9*WVdtDCQ9jnq4f6f>)Q1SSwW*shzm52TLO3hmTyZa^*D{cS;kCH~p8K zZO&2acE_k^>Q}V456X2D)(^rR&=cQg1(7t#PY8$JONANgw65c@sUHuhbjuB<-DiNE zr=%6$+?lH1k8&{44FkSH3nI2w!_n<><@t=cqMsHUD(8fs1b5}0wFyQ4Lgku)*Wp!t$B@Osi%pR*+`@<_ftuKY zA3AM3s|FGXuGCS(3v~f*USX>!n|>{TQ9!M?ItRz+say-qy{1-Z_v}O3gE+7^lUNL& z`nkS@3U$;Ed{1W&Dtpu2-(5BSP^7MY)=@)ngWbA&7e9OR4*vRqv2s#b4sZ%SbZoby zRna-X7j5}|>B>pF( z=5LX#89x4)dtJMc!SvJ{cfGsktI|F%Jc+cTUXWKHW7DNEr zIGlX|x@wZ3EG_jaz*>9C5n-5S);%Z_nYbyvn5Zr| z^s!(pJzUoW?-W9v%e3sJ4*~D)iG+wi)bkUxi1@&R+ZcPl?aCRa=?FZ7LCJ6pli;f z=`A)bsUKHYgcsA!;OEI~M2_yz5c9E{aoSNstK9c^#*+RFQgC!SLx=^2u^(H-e=utj z&68_OHAxe1wDdYUXcA% zsRQFpnCE6RmW(ealXc7c;0@>`QLk0*svg(>tY*C^ob)|FK;tG1N}iUrAwO}aBD?_5 zeM~Vqvu9@?HJI$HJLo;oS-@bcmJEJ<3Kxlg=R#g@O!zAM4*1GaxAg<)M0GfLnUB+v znKBai)(zeTs-$!98{)6l`-y(Y00oeuDVkC$gm&cIdZ_hdZ~t-mkm(iwD5@^SQPQs&dAyM-;Ny9`xL9L(88ee~+&{+XR9YqfM?G)b3DT!J-0lqfg z;Sdn}TrFO1_E0yfWV+3kx`DaRhiiyWg!PW^NU{E8pm-49IhvpDi-Gr%YmA3#!Qv=V z?%#J8*CmWwge_wfLkiG%+F@LI>|yM$WFII_BXOY(nq#U7Z<{ZSOy?ohix|IN>0!jlh*Zs=!d>G zX*tV{Ts`>x6nPyg>G9|61#q*0j8F3xN$ zb@s>;EYIBLhVJq#cW%3OeLLKC<$IvRKv5U7%g~mvj%YzqlIerk6&Ry#$Ypy56sw4( zmh`y)!D7y}P#8=pQs>(n&*{H0T{U}z4l0_Ha~8FzF?LpznmzLKU`{dpWAsNUrYwJn-Z%)`<$hyK+9#w{xDhZZ#} zxH4l(V=Kp|dU-CFDGE|`KZ-5M6C+h+YMSQSoZWQR2TBw)Az>6z`Fs;0K~4EFOxZz znumSe;Kgp8D843ae^JI-?(7+z3IoIUN5yuq=&2n9DUyi!BvDnuZ3Nz35bBVoHvVEa z5nO2i^vLn{&L$u4F7<$X{|%NJ4#)~DlogC!fiS*y z==kyTH_MbiFN=fULkw(7NOR@N?gezlq%&yLqm*YT)$5xZ2i&J#b&p$0mV}`{e>6N0 zyIfBPae~aGuggS*>{WM8oEx4+uPt;}jO}s1fPT5j47g}}o<8fyO5)G0g#ifuL%dQt z?PPUhVC5A4oax!_z$=DqMs z+~qXw$A-)qo75@z5^Kt6wXcBoV@)CgDxXBUQGD z=9&K&t}%OC_z*XX5$Y4#Gm_Yer0UJ6Ho5z^d2&+(H5(rT6GyWfv8k@yh?(wktd4}r zReI0_I!EvDJ%b?adz5seL`V)nmU7j)PM~NrmRmOY!K@HfJSBiKc2Y$Pe&tRHtsrz5RG|y~KH6*WvkI(uC^m^R0(BI{a+&9pKJO zMJrt0ez`cj4S2@%- zSZ;?8InL*r-EcSWbL1ZQF$*wP=BF~n0m%i}wAIynbEOe|4x3jtDbLyZZ4PD~2=Z)@ z)mf3$Ail1N7(IywvfpBx=L6ZvAVD64G-JL}+Gc$N}e3jMOJFi>(jBhUlsK~L&s;2ud2nuh`xMkGmIgU~=XVH+$--_lut zZndz81^hJx;4d>wZ@ra$|?#h_j5ZV zcwykD8~U8{uQ6#$eTD0G_zwC8kj`lDL6BP+mSpcx*@p^Aw=h?I2|ke&;@dn|{p5y! zaDb+<0&#O0sVp|Fe+Mcd+7SHOol#k}+c37gtO%GK&@iztw<@sx_{b(k9G+B)^Eeta zvs$o&0CRsAz^pP16B$al1b@zDw;{+L3O&{AU>P?rJWHV=O=hyM#{Zc*UCEU*5_!{j z7++FHWF`SQ&eznZlXFd2%eKf`D${ex*NU>LJA#C0_3LFjhhoz(%$!3@`Of&ug)Lw~ zj@4=Ev-|UAZxCulRF#g18O>RA+25@JM2LmA7L`UUWC*XE9=RZ8(5sV9CA(6LHxyI4 zXw6A-!~Fd8cSy3T$Qhld>+8B4oxhUNb)eP*7RIjPJc#%q4EkT6MNiw^$O1m&0Oy=& zXa)UxnQkzc9x5`iRK{PXP<^ZhK|?IVQ)H$=1TRo%Kg-elyG%!xgqwCXcrM3U6;4(Q~i(+wF`hgf6i8pIRmK(g;r z$L;X!Gm2eA?|+ltaGc?wFlBUy4$_Ojw5&y3TpT#+aL;!qWE4D=O;koVzgF>CE4e}1 zP?+WY4n-w%K+Ng*CCHn@`+7Id?)7NY`tLW4dPX8fHM{tH_1r!uvN~@VY~G6OPPHZu zKoutik#~X9>Vz-GxN$1l)+o-rQ>I-QZVrfI;#~*R|H3WUa2WU8!CVGFLJA~6?0sVS z=Kb+hIg~wV-gE+RGOR6IFfbEGyQ=rmaB|`R$b={T5 zIzX2R=v<8HcS;q@sO)$hMzAuU^n2n0&h~cDX_Dc%-=$Tp0@;6}oy<$YrVo4PisgH# zXMYzHOYZ{Z8P2GNer5kqehzz@a@|+*q9C66`>jzA*c0xHTm7AZM$njH)$pk1mRKI? zc|HUy8tVtoX#$a;%s4etJTomfxgRzD2wnCA>FfS(vkGm}VwQ>X(D2&z-{JT!GZV49 z>JOjSl!Z>BMpG)@D=eA_t6n-mjfYR-H}ZTPwpO*?z*xZ#RM&ghOLb3JWPATTj>ABWxc5ex3*!9LG+Mk@;vic+Swak)Nl;^%$+P2HJ!>#3JMg0r0-t2QvPQ5z z|Ec#w>{<%$s*-))%IgbFIy%4Z$z*yp-E7Ext5`qSjNff7dEL}tIb=MxXxyV5kZ)V0 zG6X2iN`{)2BwCuk+jT_?UZ)h>#bX2Wr&dksfXUy#0U&XyX_mBEAJ--hL2vw2$Fv_4 zh=y!_>5eB}Bx#u5qgjW_XDHLxMy1B3Gs^C26KjHbAjSGw_x!MeG4&4G-dO4FT0HHc zywWy8l*p-2R^Yl2(EFAPyPY1!ybCjQ1zvb?&3=|h`3Vop@idS|JYiv_`pv*@erokH z;LhAOe98-5X1XQr`cQVsa2ci74UP3u#|6r$nj{7TBs}}BjRZqRKZyIz`7tCNVfKV# znp#CVh-?(NU$F;E-%5$`#78V3LRijpk2Y}@Il)JoU)Q<9pl?~EyWrw*3S9&Z^ZO&%GZh}ZBUN$ z`%cSheOGn1&E_(fm%@H$;~Rn1tieAvLjb5aw^*(Zj>>_v(f>)wU2fV-?TZ$sPVRhg zs-AW8?sWe`uLqrBI%D;>2g#~K@K;x+MOBf?LP#BH)MY@Y0DCulXsjPKb<>4e+JJI`o-AS z8ht}zZk)f0WgPPQG*e`2i`Wu-=MZF~xRa_nBLIu7_HqBORly?jio{WMs|+z^wcAC# z)T?2cG6P2U_k`MvL4}TX5e*{ADk-r9$xbgHas-Bil8mU1aZRD}Znet7v1P%OCCyfx z5!2kDieqf)IR%W=tqxV(1CCRwX)E5UB`GUJ%KfpogZCB>^{+^<6RPTh>s~KX`D=!B zg@YK9hq~m3_mDMlmZ5%b5B=GA@XHHkHF)3Tdr+Jx&St&DWA$ASdn5sC7Hb@zEzhL< z53)$UFwP=`cRkQi~zEMRRXAj3+yPI zX(!Rz+T*LwJY+`cB0%@vnEZy8)x*?bWUFK61jac~zyfo>4l7&j`Njpmnc}Tz(phNt zar_g10SpB1fvO<=E&F?{cB7XF8fs#tvYC5Pd6SI}Dqd20a+iqZ#&B-VrKqt$-8~Hp zWm;;whUJ>49Srqnaq<&}X!zLSsc7;x@mcnJ1Bi+T8OL-7^4}&> z6%`%oU8-X*H$itT-G&5WZ!B-etU0S$lxb>pUTnz%StY1q8L8LiBJ>6(lY8vp%>2TS zxaBjp(K4U56wbCuPm$vk5rbuEimM~@$ee8LydKY2CK zQx@5RHjMW&?k#HUkIGNJNl#KhKTo6(iSz4nWEkF09Z}StE}fcyhL+DIn`fLNS>+!a zW|SYW4IVV~z`|^ynSOoeq0q#JwdvvDu6?#PSNflVf6$xKFF9a(>?`a z1R1PV4w?FJCS9)UpPn1txxm-@(nhyIEH*ToNtlE0Hr=_uzU5_l<%gLfoBGS|K3!i* zl11kLTCU`*^Q{?8r7n^bJ-j9~3Udqx%+WD~zl&zAqRX*#Mqm-cS6%JxuVD+IS{u(O z(R4EbdLdNur9UG7jg_LxQ^mM`Zav+5DC-bpvRL^206yCMtt>R1pCdChhJEUaK4tWN zT7{}ZYdEj4yjd-`G%c&edCT$pSV9J7M%nZ^OsKmM|IiQH7_~g}8hMSi5a~gu9RN zRry6JJ|BZMDHzCjE>H8;(gG~I@^~vr!^CX0-u;X~{3`HId&L`Ovf+G- zJpPPK6R1)*Y*q>oOi<{f$1W?c>^E!>EGZvwBz*?$RDY^U&YjOaY5LvNQ;0wXB}O}g zwc9TF{(vc+LeuDjPzj4L>7D(>E#6ZS;3%H)Dk>a6#~FVLoWO;`CqkZI%66zkOusD! z_zrVa)D}B9mXG77WFM}N`n>WDXxE@X7%rY`QA-Z%zBTDc{YOgDF`R_p&i1w|<=w(< zWW`H{kMj>;)FODrA?zT2J!jjXfq2 zk!5of6E}!@<{%AkifRx@R-FJ^L-L&~%7Izy^*?nUFqk-V3)C0%ll7+xu%)06S{lg_ zFz;01*?kO(u|@i%gp-iDj9`{ijNkCr78LReTc9wcPS=kSyl&YdDb+^`odL-7p0Ylv z?MJUrIq?iHG}W|xkZn$4I|UiTbWe4ea;@>7s$sXW=imr@KYIk0G$h|ymZXgdYIQK* z`YSoO9%^>UQ!&=gF6U0m8jJL-8KVh7Oibgp*_cz%)j&9zQ#X=_FGo{ed-t`^v`x<-D|fUln0;x zTwA#&u-59$oLi|$|Exc?^U9~o&OiOc+HamCP+qj82BSFYWgmVo#kbpo-VOVAunU(?zAfY=-v#kTyAC^T(xazuGKO#b8ZGH!_@&>c%O(9P4b} zL5B!Ve56Q;!&eWz&w&G4+YCd~Uz-EWzKwH<({&(>0$9;OXB?URH3-x6>C{!?k9i~C z*z?Mz_o58(wK5}>y`48 zmf%C>p6%$+DA*+6nTI~LmgD+UCVy^0!gYqp;S&0*z>EDP%I0_w&5E6)6}D^7^8|yr z+`re0GrYx`WujF9+-77ay{U}cPh9Gx@Lz6xiTLYe!SpE zJPW0&C40G-VTa{Aq*iTIk(|B}L~XNHgN)S%VIrRP&9I-+vDb{bZztI29Q$)&n>P*kuf_;pvh%oT=`--2J>a2<;5_P7-7HKp0a7_^bksXp!7 z?30g}^5k|g1L0H0=~HM)Cb_7nzyW4ACc&7pxg!q{bZ}l`GsH8!<-mWsSu&*-P-KJg z`6`R4V$Ln3OhnbX$A#;~PR5`rZ}(+W{M8P@xdXicwU8*S;@?-A13;@f^#vfPno z({CRNBgfNfg_;D9MNJCiQaL~ct`r}4XtM7Nz z{Aqi}r7UDmt*Qyh8*W~>n0rzCC0kwcT3=Rtb1GP}z%C4;3R2^zq=KpsyP1~q-Ijvw{Xt$n7^E+NEvs*2|LMtyO8-XRYh7FttnJHN-AubR$@7m|`J>CEHiTKKcGcFS%J)q9_II-Uy@dY!)u11Pb%+|V zqE!|j44oON;Kb85fkc;@>iuxcDhY!pvJY@Ri0)1YK#{=dZ2meZGn075c9!Pzsz z{1io-cHe%GW(sT(LX^*pcQqTnj1s=34HHNjhZ*2dFy7$yDSE7?Ju=E36Y*dvvrj(u znElc3wk*$K`tmOE;SFL*R(c-s^434X!**7lW5AL;{6V^B=aTWd#vk^c*EOY7@PxxD zNpcB)j_cJ5ng^#lIj2S5or}Kv5YU=USF_mr7rYp9C%;riArJDN@8Bfyz;dTv>6agO z?XY(zt>fCBR#oFdxYFKcjY|I$_pbT`_p1sMCQ>=WLY{W28^LzmL3Yh%GFlDrSgM50 z+`y2LR-!#9z?xbC$~M>aX*)x87=x9?{bqz}QLk^HACmqcUtFd8-1b1y8h9>h0#qcj zbm#w}GT7u}sJcyVnt_|N==pmTrqz;^i0JnLrmct9ptd9rSf|Z0PDSq%Y}=^WtTDs7 zjGcNZrpfu*m`T%B^soYguHQs@+cy`W3naN6-ns#|oRVG+&UIiu3p`4>;pm2B3_oc{ z3$F-#&}H?imc%|CMUdbH$q-i2#8e7Eqh1=4*btD>+MBqd<+Cu#=>|AN#!CV4NrtZ; zM?^&aGKtJk@221PZq+JzbZ73xM~L`mI?lmYcH)y*qo==~(y@Uux!z4X(7XtQjqA4w z12H5Mk$H$=$GB`d0&6VavDn$^q04I^jXdJbL=XQ#eNWQWLa@2|5nQp5(#MaT+GmOm zmF=ZZ-vTRXnf>qunFan{;As4Lo%Un$HdvgYFJdJ+KY1x84~YD*#b}k6%d1xojQ&aN zrxE$*7VJzr^8hT|G#r0MBz#@Op#;j z6f&osMf#mhW81f?Vt*r*0f~b6=B^3EncTz29-jjym^I-5&3{`oUPo1MGPaXb!ib|O zz$UA8xDCVkp)cf1yw6^#P@mKfp2w;h-yvS^ zVGo=TBRwd7m7AN3iP544g~#5>lb~@&Ftp$E_dXXv15d1O?(yXj&`5$ISbafOAy_Ir zuiRmIW;k@WIKL$aG7WrE-^U1ZC(}rImR*zCG-9A43keT4k;rjz$f$Y(sdiw&m~TVs zYhKZywR{cU&l}bJlTVbvU2!F!%Ekz1UL`?W-H(-gq3;>)Pcwjqt8508`Y|pg375pH zqf%K|eD&yu>KFc&HB=%U8QGN1v9N>>x&0iu6>Yn!>WPJZDw{wYe}(Pq?a0FQ$x~ng zN_M)K)G7c^9k8w5BLb%iG#SnXcV)?yKWF{W(h4!Q1$z4#KOa%CjHQ*7qDhm60{E*| zEyMhpT@!avB0KUl3|LTD*IW;OYQ#Bzmg;_^yD?_&AV(j}o!#<{ujo;RhHTEj-3f9! zo$ov`2r|SBkbLLBRTmqX;U0IVKe5$vN0heiC=|cc`3bLK7l3d`scARC`UG$-^SnE4 zjBho%Gg|I>!#@_2m6CG5)@Ppvk&QE2akx|}^0WC#OyqFGe46RdJi;0vuZdG2OVRCDp& zCu`TTj5_y>WAExBdC6^6-K)g)j*5w#)p!+h%c_ABi&XUx&o}WuX9KRYX^QCo#AZV= z?-FNZK>{!V_>&7{csR~dq=}Yj@$4^cxg!w1Sa@tOZ?FJMx{jH_ss-i3dXH-AD!#K! zv3-#XBv_rY3h_-il}O2(6RSw%_c?eY7+O9q_F*_l5s-K3k&AjPv<#v%96R&aNkCe zFiq`d)1`HCZ@9d>Ocz^Bf5z%|^8Q1252^RXMDKx7cgx;0hMz6grVY|P>Er-_Aqb&y6QUKNxG$b#aVp07u`!dk(EaT zs6YiBn?Hg-r~VNpS6%Bm^Sh~j{l3$sbIH^o!a3)D=!M*oY~`MiO$~i(`(AKkMUx#g z+nGz=6@hXoM4AAOo0qXw7Nz>XI+6&-cD-Tt_LWVpVG`Eclp;zK)kqY>m|n&Dkue6f9Rin(w@_N!NPg(KEZdX%nsH7chhETW||l?mLZ1wQ}rt zIJ|_JBsbc9Ymwi-wtY3?-%m%$DP`}myokexbPrK_ChFCZ&#}Ii%I2g!D>mH;T<~Gg z`DkUi^d-JB0OQ>D*1fZ*TZJ)n2@A=w78J{4B9bl&4>IV(ug9DZo{w9%1ih_C>AlxC z%78J==yqF5yG757OD02FB48$v^4p(EkGDzd5xp4G>+veAnl$m&f*qZ%6j8|2(%Ht)m3QR{MCrGz2$OaUB5 zFTuTGeuxi!4cX}|pEtFwJA?YrnzW6qt)aw&vT8T6LE5riq(9de9E_j^l@*1FCX=Wl z%~)v!N?b8p9EO3s7q)YnE0}iFOv5e#9H}`)rb9)Ng;g%m>X`r$u!rXJb_qOV2qcxo zw0D)ZVKue@TR(#P5l)p5YyU+dmzs-dG@*uPPi_hRidXpar-*`q;DK87a-}f%uDa@D z%Mu6<_n#@hL9zhiKHf*tPXfREMOTWpW(GXlVwgE=4iI8PK^XMo$)P7<^=^IQl}<-l z9hv3!SlZY2`S;?#Fw9ztIkAMIFCn14gPzztSEVkKhVRsy2BS_wW)|2jy!A34C)>4v zA7S$wKk#rG4B`&m7^x;$tgHV?&upa4f@X$qEovD1iF`tJLt9LkSl_W=Yk#iw4@_-E z2}U9Wy=t!BG)$sHS)H>p~c{+JT$zfpsdYLzmye^~R_sZ!R z$fsS0{u5eOb2TS|067&M&X#*;o0vJ-_-wlOT-K%ZDwc$DNLQlX3GY^0s87~am}Y_! zyhn8l?Z95~I_H0HWPhK2rPw4Y5s1O9LdYfGL4RkIbIBtu3zE(c@3PpJXIxwx-$7hU z{+<45-grq=hqZ1`NGNZgcd`2GMqY)cM~y@rH9s>2(Yl(bW4_IV8p=n}iZ1uceD_BH zbX4yEe)YVKZu$W)(xoDWQR|BmH4^XRJ077@#HJ~3&8sI4>Wx7SgIV!m3-Lx&E@C!G zhyTP|J(amn(YP8I7Ho>UgBPQ7dAisRa*yT|pFhndawF67xxUI)U+LX`K82rf2swGm z$nR|2Zm2Ki^_={eBf^dvM^XpNa1p1EKFT?KIcm&>5Qq1ks|Nv{U*o~p=K!<~Me_5_% z$7;bVx6dqNI!3&AYz%)ERAFYa>c7Acoet3mvrg{jrq8bJmCI9f(Of@nl-~i^Onuz+ z4`}2=^u1SWmRHVQlh8w+EaH0A>PKqBCltpjzjs2mFj8{n;OFiyy6};HcwP8fsigB_ zkNY{0C;tAVD___2rsDtd#9J99?*kPqS=nb2EM)N>&q$Oom#5@AZ$3szk!v=W)lx)Z$4xZRi2-eWz7m>+DIl|+0}2) zdE4z%T3PH|<&`6ja@3qBTM5sM8NQLm!%AYGD`Sw)CZ1=URiu{bHmaSW$ji~~!hVNE zyH+fVgAF}?z>FNjv`b(`)LAgtT)476j6ZJghLn>gTOIgl97Vp4F;0}1p|>C^ITUz# ztRG*qVpd%q%o>?cOUE>Nypx~tDb<@1D$s^!h^E6xU)k3S{x+QZ^5*a@)S%_ei+z+c z??DIGc|*23uZ0`cgk?LA7aPZ-)8>wX{UOZiupN5St2mh;cXc!c2jA!>gm_OIUpTXQ zG2VNor$k&-%*gPu>%14JcQtnC(+=MTr!#-DQ37FwYx@E|mhu=We+QA==JCTQAt%kt zj&Z>Gn5)>+_`w=na&>#@L_{}De4L9G`(b@^DkTo5ksk|^nWQj*wyMmz%&q5UQsECk zOR<|>tJ0lL*Y6SWIC$?sPYa1C9}yO#zA&~Ce1O3k zIvh+=&8%#w-K|>La><@b`E|2pik@`%u1o2|y%&Gsw&_kb4iIK#hz_^(h@OcSMR z-8o}|VmZO9tu4b%c{(GjL32xpx8vLJ@|ZEhD^epgcc<2p(ItQ$tRuc^OiaW*MWVjp zv_$%Fm9THRpKLAnD_|r(WH^i{68iovZ%u-Wze=tRyx)nt!B|JeQY!Q69Ln%!~m!zBLWQ=I8I`jkofC1@oU<0|tMV9@NveOkl3SA3xROsJV*^Y)IE$%D0nc z)y5z)PJ4@Vw=~^`92{xniC2k?P8r_}V#%o#-*#b)u9kMLH1`tR1uIEvXDa&utDxfa zZ1LM2n5qK>+ysGW=dks1Kgsm#5Oy6hKUB6)(e>WC4909YEuWIj_BvE0{gbGvETCi{ z|B=*!evqS*Dj~|;zwpk#TBej^=t_LGXe4PEC%vU^{A5l1;aTB^<=-=gY98&vGZX)h z1;Fe*br-8LPV>z7Z#Yg(-|)Te*t_ueU++6@ATL~D2QB#Yy)6B=9L6u-dGrkmcOKBJ zI`{d(a%@1^i`D7ZgjWhe-X!~gBWFhj2`2Bygn)W|M5?rOOyRSbR)f^ z$Sp_Qpn)q5ZGH%E#Csb`E~A-x;BTGERqAoHBt6c6L60d5G5OfcMM2MaMDMRvkAcT# z;o;|UoNsW0vL&S}LpFyn*0wl5jv0QCah5`k_)pWCtuI_f+RjlOs^vkE zjIul2bGhitca=}n>*P6xW!3Oz2ju6E*rDR}fF`aB(|l9!+wEXGW?0LyZW~OADYZ$KA>3p7rcFnOwH|qH3KO z<@QxoqPZUK%ni`hoz)CpllZO;+hcnc4Qa&Qt6;6+wCS$KKAhbo6L9Bj&ol&7$~<(h z4wu^u;IFFZGuQUT%*}$wOs4cYi>yhe)r1h%Uo#o6TUag5xP`wJH8dY3czBk69+;X7Y>G#{%wj{GfoHqbF>G7`@U zVO!BwUH@Mycwe#|bve{HkLMm-bpW>cQ)Wg^2`S@q(uNG{mhF}Fj=JCuWP^>#yOI_=F#9*&*IG-hRf@Et zB1si3Dk6@uNn%}Cc{NoO6eLk24j@ESR%TsA1d<{O4oFl~M8JTIC}dO_5fCCXKqOHD z1PBna$>cogdw$n-&OZPb;mI?;_vgNEC8s2`MYA`hpE{g6&$jCs9G$V$U7}gv*})X} z?%eK*O`g9FVM?wVG_Uug+w5=)ga5if_7eAuISaE8SZM{d-pi}Z^YVFPvf5jF`aoPWmedhv53Q(y>WpM-wD)k(&zLv$?q~?)P7toH#+6b)IW{J>!cL0=@}kUUtB;Te2n#cEUY~!?`l8e z4Y(jdfE5TH9{-Ovt9qTRAP{Q1>0x1GM)D^`BF8kYY?f(ViVK;{54A?)7tSQk#JHM` zrBM4BUi!1Lx!^sxd~79CA?8#Ni*fQ0l8sS*kpvf4V%bhgzE?rVB!0u}0?#MPjM;x+ z2amTH@wb^|com!lvLZ!oh)LcM$(@^~_OP(xKNyZF6KCYG^|Bb9`7GaOijpsZI>10$ zgl5bnp?ooOxDw0MfLd=Pn?y-CG8!YYwLUBD z$&_+6)a}rcyWa-uV0&W`U-sdfxAnw_w_pvUKEx*XIejDg%U;jUUgJ%zQ}6&6uj&{q zU>wh9B|c%E*+`EGECAh^!?Nx3S7`l06b(+iTvCX_NydAAYu=^?FJ(QbXg&W|A&TWC z$r13=S+LYkL)kPK56BjlM<3$UXMU<1xM0oc#?42rgNmww2@~jOmy0I3W-r+7T;s1| zExR1f`?73Tk76m-oN3G}7A~i#7FFW!2A!v}LTjHE#)h;NHX>^Nd8OUclt-uYnZ)6C z5S6NmL<}^|7narY7f3F+>NKqe_SW6Xx>*708qQY z1by+ai8%Y}2UE)1{r8`6V}VfWRHz|w(4IM?mj$eV;IE)wgHzlmDUS+8z4au4y@EZ2VZQ|IUrQqeEvioBTgH>K7U8}95 zBg~Ej(~CIy?{c?{s6f3my*gL}2Bl=e4*RMyPzVff8_neG@_&AmY9F+_9B_N7PAj4w zFoi8!{m6Z-)S%mldY9Ksc#EfD6|eA%Heavcv4|4$TU9v6&PNG~q94$2p@m~xAU8aH zZ3V+N`|ik|b^dgUH9+Qr8>rQf7>f2ZhY;JD%c+|(yAPmxm`1}vKIw!0emILkN#xQ5 zJ}tRzL1b~l>K4OEF}M|gl3+x~#_oHd7`WSH`mh!0iPSc=!hxT|s5&L7J$xBp)0FN3 z&77HYOB=SPJP|U2n*da=hZkWI?;IbI{enCar-H<(m(M+Q0&j zAl12v-#I55pRSUQXC?n4D06(b$q8BcRfL-4&--R@IG2)aY(kRp+?1njVC0hJa;NTN zqc^3tRCUm^<1&2w$frge=}stG5GCc<3V`dwbR#zw2UttZ7|2`Kt_==VueB*RN|m8h z%so4~22_O2(Jc%2KQ{moJdvfjLC_%Pz*IQAj??e%tMsLgW-keBwPpOE$ywrAZ}iD? znNI$V{PZOSH?02AWQVY!dlyy|BK@KX8EAiT8=`H;d}S{c8XfuFnBd!60?h)#_hapo zItKaiH{c~KGtR8`oW4d9y^jgll{*WEs%=vqAmXW(@27SadZzC~ymVL=Gx!bR`!os6 z;k4>|lj=1H=E_)LVK-VU=)(A;Uvd|X#^W!3t@>B|aAPVeAGlCn+Hc4a<{H=$6nW`P z8myQmUz*;0PreFGcwQ=;XdP33?}|US15x&`*0B>h{4aV+(jJjKJv`nKC^gJ-k|!HnOy%kjJz*jv1$Z0hc~M zz(Pye+V`sUZL&BN|IJ7d2lNwCaAwjh!5aj6NCPc_d&TGA2MLsnnY5Vm=pJ2iHtzfu z6cCW}fmeyPW`sSRVl$ICFdFr-#MaT@eN1$8{Y+T$OPPT1i|Hx7B@g)*{j=I}*Y^3( zE(<7ghH67u!|OmQ$uE)*IRK`ApxlZIGyP8asl{;@93@>*dLLs>es3ThKkzR=Bhn>j zjP*4tv{j9+V@*<_=dWT>Vl7x2L5&xI9kNqasGS-xH5ix$Qxe(loC|M%PdP2SNKiEF zh#|M1NFjYXE*NcBs5qQo)#{7^{gF1wAokqGVN68vtWCuAfQ^0?QcE&i^k^p+A*GzW z)c1AVs8V(6h~xwDWw(>yYPYcMYSoA8$P&znwioBfx79^TWZva_SJMU@V3?^PCRnNG zU@4Yo?7tjI5De1;ma*V&V64GgVxFniw7VA5I$X=Tn1+{zJ3T2XhRRj*!Bi>z9sZ2? z+5Gh_hIs$*dB-!oxx0*W-F3^K@MaFy=IMWpXCSRWn3>LOnP#DrH4rTbnuouvH;daj($07baXPpyh3}E`;AZNItP@E$#Q_#%$sljDGfR z?~t#IHGiX9sPlW%p34YOR4y$f?nlbCmNvJ@RPM6N_J_n` z6mTMJ(v{m&CTd~m--S`q{P^w6Oi#ke%n?SS33DIBZj3m5LSIdevGiQCrVmMhxK9QbTgStIXiy*%0)P5gr!qHQW_)|n#P;fE%%pKpF~v;w z%PeWl9d)^;IX|grpPz2&J<_;P>}IOp3OW>{ANBM`G{JRE^2cLNG= z(ov8fKeFl~jHke$1zd~XEZ(TyX^=%so)cNyhD7(1J?}(VeP{J8tj*R}OV$h%VaE(w za2n=Iwyg89*lf3)M5f_8q!E;4&g@jOVT@Gz=i;DEuD8WGA@QOROje4y}AFN z$F1tDf6#{qOJ+dnE~4g#Kb#|bmwYMs5tzEV;z8xEi?Zx<-~E^pE*)dw zi~#lP*x0+Nh@wb%kzTCIMJmo+pQ2APyD`#bVUshDde(+pe-!$ICcy1>OE>3GlwU)u zY#{t9{Mvt|3|9zf|EOM3zRCsk2+FmIWM+BST!ega;;$RUB5QS~UWex*YLhdJrRw9_ zKH@3VTauE$T!Cr`!~h!>i+ zdj{Ie8fPAh`@x_Worjxf$|l4bH4sTZ#?1S$M=?3`B;knBG96cy{ETRS>eBn5iED)V zOl|V->B`HFwN&yzkM$zAXuYgP0~C%fl_#rlY`2cidT5{)Il@})}9O!@G2*h>*as8 zGGTooPklEGH`E!6fSz?DpsI8{Uuq&R6evBIYdhw&4`+XIbD)UolvY*YBzkxcP^{_gs z<>rjku>1>da~18;)$m?#>cQ=hJ4oF#@q?CyoFoBdY^Qi_{{qKf73q`89;H&=hFafm zez(f$_Y03^n%xoZ*2PB{SJw7|$V9 zpax4T$MP;(!y#LExgVuMLZf}0ZLR{W`nF<){Vo?HRZl>yQ>hI7_NabU&?<7gHx_2tJ`iS z5v+yif*ae%F_Mj2AkY5+pvjoDPt+xMHSBD?zb|DWgD~}=r5L<A^yxGesw?e20 zK%vA@g=Ta4ZG9s_3V;XY#$IiA@mJn`W}S=2(DzJn5a%yRJQG z86~;Qu{ojC9DgUU+fANkj_*FhAjS2#hQAUY7Yz0~5<=02i>wvG(maMLu&7Gk`=C>{ z?2Lw*sRy(igLOvptU3$AzJTJ3sZY6E5KTc1lk5VBM%H*x7}aAJ03BV)ycKDMyFrER z+(zvN-ZV&Q3y~EXpIB=Z+$8b~TD702Qjt}IIiiYLp^?Vd((64X{f=UJ@=09mP*2w? zZusj)MY3~%q+9 z@37>9#{L+lJ)%1d%)DHMibrlUN0yE)t$u8M=QeNE+||BZ%V-cKiF{b5AiE_6$(`pe zmcBB3RDOSUpe4sOW!5}js4AFyj2~?PJc;J69*Uwx6^GhFOS?d5sb)=WL(s{O7a%5l zxLHl)ELqO4$KFHc9lwCqJ);vtaJt`N>^|!YNPGOwz`6zDWGL9&RK{uFD;F-$s9F$# zmLWF;4E=Msn4Fh6y1d;%tuw@MWeHV$UgOqqDr6kvo&%Ew4{Oa9y6SNT`z`XBJH+@8P~@X~FTy9ZKWe4k8IgUEcOafEULd<($$~FQodB zBeFLkcG$6I8yk{3dhKmvg}^7Kb2mRMI1VRhLs(9@@b~ZGf~m$e&4~!|=P1ugO95K` zhbi5E@C3NiCuBlj?9Ng?gD0kqMGy)*M;-A=Q)a^j$7xR|K7)boTgP00@}ZSD*>5!} zU8;(bIHOW10dY#aY_3gP74faU#|0}u|Ajt7E<6jOSHBD97W&)5t z=whNecSIj(G02PPF!*BqxFhL*!6&|jg)+y;t~#J;IZhSxjT=jIUS7(NKMF&g2oQ8= zYj77!uzc6C3d0mrpaWj3PA%+vvw6$2AnP9w3XMbO;3-j2vqiS(*705%3op8Kii)5_ zd(QSiHmLCHo1f#oA-;*sSnG?jhH>fOkLBvbG%Crq#=%!aVK2jWz6$O6Lff6h*s{))=qaD&- z?*A*j<(eV|3#G-4H#KCe4t!vlSCEMtp8z}COIoLGU!yn3Qw+mA7=?WlKFHoE8JQvA z+1yV$Y&Ito0faz5N+6uyQ2XK|pz%~DM@F^(1p$@fK0BxsMLg)n2qikh@KO>M#u0Co zTnO>BMLR8u&KG0xyS0x+7%LWTh`N&xrI2-rG?LZVcs8wc4>{h-r#3oxveHKPF7G!i zWkA!4MHAOAh^(5y23;<(kkN~IzWn7mn$q{HF}IY|$RO3V^O^D!RaF7SJH1*RediY(Tr@p<;0VF{E1)qRdU)oGwauH}cx)fp0 zTJ0WO?|!PPGA~fSx%Fw3U^OW6^uv0; zPowU#i}$M5sRrAMieVcqDh;4tz9Y1G(2Yc&422I}I*KOB9J#dgvhU zIt;YKiL4PW-c*$#LU7J7m=dP27&?J17qEDs(iuzqx6)Z|P`jCieqnr?4)!q}YVapx zd5O5u`5?;ftMGV{=byV7LpyTmpKpgbe%v@z+2?fh^Wtz=js&UkcgaC|ZhFH0bP3gb z{YL-jyErM>&AK}r<-Ls{)PA5Ndp!Esodu=(>VZ&Ln%*Rt6^~5~6y{Kn46;>?&SQ9I zhn;_xB54c5mq|&WwPGHy4zZ}nWrBM9QJ66H&EK~?ED47mNKD%R1p*3v|EC>j0UVyq zBpGDdNN))n?yNA*&G$e`$3+kf5MVBCqCoWR7y}k=Tu^XpbMsuLqllGLs5vD)#{r!A z#A@c34Z;)5xu#ES1JwBZ8th8ZLg_{6iN4Dc*90ACFhaW-zV^X`l%e4tESvggUJj$z z7q%umatQ+s&&S1K32Qa2!1pf!nbRa^9Mco+^Lp3Sr(r=wD-b zT_KG;x{uTv7jirTWJUs;@0H3WxKFD*hreD7o~!yV1z&^9RR-qC)%d-rRglG(@(M#8 z$yAK{c-r;k&?k2qMt_Ha;?dsIrWk1-J(+KA?RjPPeo4D=hRJM2ccEScv!{gzXJ=@L zt(3l}>d}av3EpKfxM<+pjdZ(mtI;wCmJbopu>$>id81bVN>-A??4``)0=$)g75p5rV!qq+0F!S``t>eF2IsR#5=A(aTG z9#C+u01^ou!tcp4A9|v-?jbwy!CcHd#asmh1Glj zuGZ&gM9rbFxBP4CZvBV+XFZD5H1N@O=pqqTCE~|Ld#1fNo_j;*ey*Gcs15+wr&U&K zw?-d@A3gu8Qu*6IN4WPFHJ=-3%(I7-4IHFK=WTeAd-~13nC5cF>SVs56xm|WY_LfC zV%}pL3$#xlZfqdxm=g1_f%18A>seA3?VA?frVVikM6`MrQ~UaSGjthS-Nt-XI9Hn-eV}5U9f#8V8^yfV znTLj~CewEAb{}SpoLSGOzjdayP%CRWnejX3B)VAqOD#Hi?aS0;-ZwjO9q$A*Y^Cf` z0p39}YBHNioV=|Ay}_2xP9a@mXNK*gmh}!PNLF1mJ_V6(Qii3gB;&(bkPl0qf@Z*qjC?~=}kl4d5JIx|c5HTD;LVEbL z(F4@Y&=#KZFUs&!m5H+qHd+aPZ0%578?*nw@JEyu`shk>?{^D@GNu6)f*LPkAiWm# zY|5-kljf`6V}~WV0g_9oGBI?vG;sUWwi>`zi;2w8}opQ z16FIms=+JLI2nw^H=YB=3jsD0hZ10~` zR^wxdb;o72jsvku=?)nu&y%qIizgTONg2GLVmlYFV}-?Sp2+d0Mt9$+ z**bgeIaqlbqAz!0z`H{QdP*eHZ$At@tlSfZ3ml%Q!Kv?7UDORB+GXiFg}@PUq3|I?>pj zdsS}Z)4c*D0oGY8hzV%mv8&Y;uPgq{KO3#y|A-dWLMr3Y_R5O+Mw=&fwV5N+bKACXCnItjxpf^yCO`AG-2A^3` zp8-5u0d>_KhRS^(KhSI#V>nf5?{oY}^f{c{Hj;gFT&JU{t0QM)n`3x{j@pfR(;t6d zQv^{}9!q5lEwK;6lv+JGHp^|2(udPj@;9seQ9UC_nN)gBGU=iWtssg2V&t$~W~VDQt`Ri`giEy<1qHr7 z60ijZ-3#G>%Od*I+i|H za^|VF;#io>G!{{UzrsBKDud^;ZHaj?NksQRDw}lU#d`c<9Chn)2l1i)gw+3Jl#w32 zre)m7{nKOFx6|LY^n=n3^w3Jr^h-Y=Q(yyg!u%!z$>ggrpEh^FVk19tWuR{zACl_V>;zZduJlo+e3^A^g@|m>g z+*0+eyi}s@t`I7M3X{I)g{4726nGPFk9{e1hqJ=!u0+GzV zS4hq`zCl38yz(TkQ}&I_=%=S&BaF@@)sJ5o)xUoA|0?wte_Ig|A)Q^&upqXT>HJqz zkQpriGrn)ZxXvYtUCCbI$wota+LEgCq1o7qNL^`6caJYzjsQ_sN)g(nw9H)J`6v>pDr`}mk>-^g~ z^lbWO>#cJoPnbalt=|+?B z%A%^f5HlX*^BzzIp@$90#%-^NAA%PO*PT-n7;t5HHSWR0zb>%q8H=yWTael`&AlX0 z!C#rHJ|+na_1X9f$M%n(JMo@hM-at1^76nWs(+@xZAr>|laG@mi)DD_&C}=d9VtiG zI8jpG;5tE#AcvVJY`jC;Dp^c$Mxdg5J97I+?E`afBr!W1YheeBHT>QTgt*)>oD>h= zqOdJ4M#9S7wof;9Y@ByxYsdAVo`tcy25E~Y9G+x0?6EULuq|GpPbzd+?hr_U!;{u) zW4I-m_=b@^cbaXC@a%R^I=EJL@BcZ(ea2$`jtm@K7HGR3$`XNaa9| z`W$iV`QRj#^0QT<9gXwmSp%K=&RI?!I~DlyT!s27xyLm&y`}x>GTCgqxRP70uXm(v zq?on6W585|0Q9JhWhu?f?oQvI{$i~#4MppEwu0c&Hl_w)AMNw;&>rzKzHxo21E;#X z9KRtqGo-QQ@yHrs%24rReGLPvevxR2HI+jNLrrbSjx&bInO*Se+egU{gu{m8aBGQo zoXvenQq{gml8`7xT^%P#L!n5T8TI=caq|OmIaK*g_c!SucO*>sPqog1ayCs7wAm6RkDH=2+j|?((}=KgB-}?pk6%xnoa3eez(6Jpc9O{= zj&d^TgLYG#SH@4(nuiNAV1M|leud)CU5(_2k{>Oomk*b9mEzyLoO=}7#m#Gr|7Gy< zlHU1h?KSe+YC%%+YIr$w0hTgp$nY&*3H$PzY8TX;+^(g?A5B01k=*qRvQ|<z#(P#6J|@K4Gkb{)#^6r(424aU`)`ppDINyIJ1%m=nGKG_qVE>$zxFh{bPaw^xOJ7A-f|T>S{tlZm71n2rcbyX+namh_@Ar` zPj&6DqyO2-o+cbCENnpIKbRB-PGoh?ttAXyKzBN9=qZR=F~5-|nBLGq`;yoXWzNRu z9iO=3RzvMQNWrc!&0E=^b(okm>}SK{%Jl79eIy3+qq#e2>!fT|EIuc*PuswR~C6fVR*;Jf zqi04mrxw-?=TGjGDc z6wW2&5lk?e0*PDT~kfHiaf~#EXj|j`nv27}v{!g@=2N0#~+^abrRHqwk1Wlk<~YxdOg zGr9flfmNpoxNb+Hc+H%rM|eMXEts!}`Va?eO0^>&zp;7ER|)#xzFPHei}F&Q?gSJ4 zLmK@;i-Gj{PF2CJ=M4CX$BFTMZ2A()hs`1VLW}`TR2mvAvKAjL9ST5=j3q_R{P^&n zryJ&fOF&mzs_=0LZiKpOBhV?HS`jwcB)w7-7HJ;7!;I+nAOZVpJ(bt0e@?C~dFloM z12)n4pnm`_*M#4AF>2L&OPdne<8gVSC|@D3tz457d(%B3!0PJ|^()ILP18c-j2wtol19 zzr;Qi*?e(n>7p4}w2iPNE6Vebt&-X##RlB@y*$(JK1Q)Wf+Qmyi7-4Zo%wqoIjQn= z%oyfV33^z_F7v9kb!%Ji=x5{$oMrK5+!&5m>Vnfec^!ldm@=&>U7j;LLrkB!d#3DV z?#!caK-N#~PQdd|AN|yWHg36T(@Z&pTdAV2DJGH0&2VS{WMR~<3RMbp51e`rLi{btdzt4p_OK;=JzJTFOYd; zylFB1h}+^<@cNlv42{lJ-3f9=$}`uV4t$<&i|_BH1#v#UBs9@>`d_l__2T5SaEgN5 z@LmTHulUrPKfWVuVS7`2>@F1}o=?3b9mfA{UhN4)QqVDH71f+Tb{ZyJT0bHL(xgq;1_iX9v7Xk`;WJ?M%ZQ%QYfh6z%<0<_NK zVW1TBm2@OwO+bf~0|F8QUCAC0{ziI%)zNA6EKTZ7!djm&+y0jA3gl_4m05cPW9FhI zDT{$IQnIWnh(?S-#!WTJeTVhCZZGHuW%EjfRsybcc|H&Z#t^)#dZ>R8(SwmnbjOQ- z%H$a*1dJXR5G2wl#n#eqQ2v{8s2E^H&I(+8-+FiLZDBfo;0iT|e<{PwRDUZhxmi~$ z89-n(k{50>gY#A)-d^0kEt#5?VR!|#j4E;#i35_T=uJCsocU(OzrNEsrxJ#wj~CQ? zTkrbJ`|sErFLcyo)-5oE1rh4rHfIZ$UXNpR5is%U_qIVta?%4}b{TPWqhEUG6d4qo z$i@a%{Ndst)HJ9HU;n~8iBgGNA+oYoFy}}QRMh72`q&CJp)F^i!x6;nnLV%K>^l4DR^NZURzE}Eo(()BWfoeqhW`>{WNuoxVW^^$52aKGmgW5s}*^6$WM?%#;s&C&2X(#OsH%IDg+GXg+5Dz0XLzeu_hbR%w0IZ0E|o7$uE;IkUwsejxtlr zemaUfaz?r9O~0^=&;G@uN}cZ^t687#Nt@bbYJ?au|E*~k@hyze^n|B@&-0m=c6v?u z&T0-s&?Z_(<)$5;UjJY4tmS2@N90opXYXE8P1|jG3#!Bek+@=_<{xcEYef#rfXR`J zWC`4gU3uhYegbNTcvVL>lx3PecypnuX-SGdl3S3Z5JxP4Kg28j+fcK(<%^~s7EljR zmL;A4JN99Ck?T!L^4mFl_u_ix{!i#Z;#odr$XxxZ82xJnk&}$!ey(rJ!VI}4{(Hx1 zTfhhcl@p)>Witj;a1raheCv8&7UK`11~>o~$5}@j9w3&^6jJu;-?4L>9f{v&e5~z_ zyZBW`+4qNrMT+0yB4lwL>iIfT4y>gR@yF2cI5^4TVoL9E^7wYqV|H-rad7AMZc_@0 zyUh2$JtsaW(h^JEv>&f8!iCWJA@1~ZJf9H&$g+IGRKn#r${=sbd{eqkdyChGAHKtQ zb0StNIqb5@i<&cfw8M)f9q}NmV4(8lzM24Q>RC{o|0qJWWy6CD30!!VTeRLE1Ha2FVx?-E5sM`wl*wPY1nhTM(F9!AX|>Rtjmgbg_bexmpR=w$eZ6kx!-gdwx0q2+9P^PCI@)H zx(&qhvCLcIayMg7KBIaJM>|uqX!)6+#o@iWY9>T*ePeUE{09BOl9oj&_7^^gZZr7@ zo#eSEBL#SIdrm2__Ji@Qx&E%EN*!IvjOX0-8Q!O1cVU_ezx?LP+g;V~#UX5{ciN`ZWu;;mFO^d)n&$ zgOi#BvxZrJOYW?S65y7TI;ZmP{{OuEvj6l4Mx&oH$C10sp7@>*tnyfw(awHbcRP`s z=D76V{5YH8{hT33tZ&-|3bR#D#A9YGth@83Oi5>XK51#)Dtj}_#OCs<$B0k#KxcpJ|Qd7)W!LCTO{2V--RmS9f@QK8=&#S&m_4|v= zW~s6gzIp^%r+=uJ2U z2DWmv%ZXah3%T{G<{jU4IH-VEo=d^d)a&mWyHWa&wa*YVg!TOx;L!tWXGRN<$YCGj zZq>qhYkH)&)Wy|D3mEay1s62B-9Z1SgtIbpwcRWu-m{qRzEOKe{)2px5H03sC9>ms zi2=8GE-bV8xb}yn&)y`_U_lpWh<=OkMTDOhtDYpEP;SPk9xT|e&R>&MpFIj->;HVAC>sTea~@~0%R?cYP)wOvv_j}KcQeC)A58_!DROMgn_wy%_WM);vh<`Rm^ z&1p#_Vhj3wQzud76k&*2J{}E5W{jSh9{?uxU;=9{M|w=kJ7?ZVtJ}r@{X6X6*LEvBdv1XWQM(2wv`K6eM`-;O~90ku;S; z-dCtSo_sgUP@;VcrD0K`b!uZ<052T$(Yq>->Mzj!D6KE(Qc+T4u~3 z@U0(EMuE-|j8$-e3<5LNJsXIPM*b+!IBHP3is7H=0yx2E;In8vXMSjx;~o1?rN<5s zroyej6M7#0spbb-Kh6{LZq)|I-}vVOE~&`NMlcV zFi^vo&L+l;waB~m{2BS=WL6G6nXMaUMei-{0(2H-<+IWj!$*v1s&7W`rV_QKR@0No zoipI2Nn<1>hcjoNK&1UQ?MLQ4$vo*NshK*sV4xRk%ca^4yc(c}CfzjNLJ9(;S~k8H zBr$X*ZO!uW+BuJ3&UBtk?v>AhGAg`b zv&0nb5SpH;`K}r5fh=rtUpr}Rdkrf|p8BYQ8uew`-I6gg$;NezGw`5U&fv8w{AgI| zz7+?dfs?xJ>ngA{_;r&=x{T|F(Kg_+$QYdhpGK=lu31JFEBu;L3r!ed# z!s_2@>J?T?9hi>ZlFw)-M&&mi2zkz~@o<-ELRWu`ZWSy6QSaYrZmp!xys^6J?%LrwxtY+9rot7K{NbXLAPeEs z=L*bHVWC$_mAEH|vVj1%mg{%)U{pu2`JN+Hf7uISZ%dz9PLtH{eg7awa-z6@fLax_ zom)Vpo57ioYiNY{|5hBvL|(LXb;|?p1^v6YI*J1j0k-608N&CWx6r*;URLTkRtjF8 znd;Lna`Di6Zx~kM&+U@S5ux_}(MQJJ)%VPYOHxFp6UYSy+kl zfxh&xVqi5>O*50VyVOizFTNw2_wVe?Ag``rOyYruGD>YrqE6s|Ai{hzew6n%7x@-F zn}FAk7Bj`B$G-D6IDK*$nbeE)X}3gCCr8|xNxu#e;eQAJl_#+~eKcVGJ*gVuuN<`J`=_653GfO2 z{bp6oH-?r{P_%e-lnX(g&^|0{h5mYWNtI?MKA5T-#@&oqlw+K*ho_kDAbNFd9D=US zPQ4jAn^^sRuKMlfiEE+g4p)%RG3-9}U=5UF9vic#%nSv#*#srZiDRG2A@~jVnhn)X zJqG3fIX{ol1Wq_U_ha1wn~=aCJ;#0ilhN-lkR8f1vbPA5Ik2u7H|inY$hnj`8z&)D zkDHE-h$-7)mWJ=$3|}Grav0Q%@WI$2m)>L2swz>&M${KcmgoOv0U)>udD4VM`^WDj zHgARP7ayoN9YUUbF7db>Z%H^0ck^VOz_I)J3FZ*a{e1?9$$78_g|KiKpH}ouU=K}7L-Glk@{OYwSd%1Y~2&@R5TncFsurG^#JYubn(BGxa zHACd3!+Yw3=vT4!hV~SgNhJ$E#RFpxJ*r2vhDQ&34e649QYztyx3VZhTI#m4ytCn3 z|I;fkZ$PfPOpg*}6O$_};3|gmTX}Bf+dA(`bK=Q_x9j;u-*;_xnLgkQR^nRf=y7)C zVXl+1gyz)WL zWMUCgJ8Gn>jt7Wt0F>S}WlV~_whIuzfZqVTe?_+0-KUsOr`&ZatKyczpeeg9;)yZ1 zTs3+;&smZK?@eH@UA9Ye5K8#ElV#vm1@2N?KeG(S{T7*OA`I_+ukgo?Df$|B1Tg$0 zSG*Y?H#yNNYkurN&wv4&@N+r6zZ93@$YDUrxT zb?Q3B)tRSmy{1PmbI(~Ceqna~VsE+;u3BL-{vE$_S@mP;TsbYM@#+O)q}>+E^SAp) znK9X|3HCD4DHd+x3k6q+cUrSxPW-&}g>9mPF(6Q(Gdxb!HJTq16J=o46EffC1Q9=MJsU9;3XA*IUTqw<0^kD&{C5fv8W;>?5x6Vq zbD7$ccby4fkaialxhZh~8TQ$3Z}%Np$Z}b5BWv8j zrQT=3^2B#zZGSE7mzGK&r#!9Eee4{uU*mcG*gqhydHC?6to{9uokWBFWcdzoaGD_@ z#Y+$=i`EPJIb7}*tDm4`IPcsUDdV-B{swEA*Fj+$@};7j4~e9MeEX4S^sXG7e6!%B zf_D@aif-y*;9BLjJ?;iwITKmHf{9Jz>AP1`?knD2l}J7yYNGEFt5lisfXT+R+_gVa z_S0d6?DxMDc3|1Zw)Q8llr(LfSUPDOlI5d9sFw39rB|b48$ihJ2srEli|iKLOTSHR zq};5f576xzXIuUP%&%76dT5y!2%r=bpx1=ESnasew-W05wTAy{eaWlEYr_+-$-WHS zMdSYjL$ty&`FmsGjU*KWEIBpOIrk{~S)?#w;#vfuYO)a(FcrcBy>lghMVK(6T;q@y zyeXlSiO|OMM!+~>4TMl&YJJ_+sUD%xM)lYdlF0a;(1_^3`~*E$rT#S%2WdhZ!G%p; zVF)w!9z1Dqde*Qke!+{`N#%2H2dduAb5!(vpd*A5jRcdr>rNl!axS|%#CM251_pO0 z(3jeAhUpU_eV7-a-wPWmJQ)M(s!Y0gwuoUOJ|Io@ye_C4VIUOPPDf>N&`A1X8-u

    O7FDU2OkbS<_E*$;sUF1ZgHKH+uTdN{#n0c*4IZd9XL!lIm1qc%EBeW7c%q&rygC31_Wi zHT1#rh@N=l(3iz2!3E{S(Ujamtt#w%^FEHz+X*_H+#|3{Xv=bStuc~y!hpvy1bF7? zGkpoNiK=aojMUY|_bP(iq054%ee+{rG1gz~dogE$oyF@@T&=J8h#+vw#-coH#ncHf zrCngiqM#K>q;uWUi#>cBxhM8 zbFw(le~Y+sZ~Uba$m?yIln1InYm@v!eu38EEZ?=`VxPGJPvov4X&LHM$5>dbl}K6) z$q(w0!>hG-%pd@iDZP#8p!e<89Hpc&5Z~oujK;P}StpnNYBu*ns;_lYa6OT&tB#!o z&buky;o}Bjy(y1=gXTL|4lyYY;T}+TnmOKDDabQ`TE6~YvtYBlDR@Y@Qu0}S^$YS) z-XHTqewK|!Fj>0feEu)%P4(&a{LZ<~b-ovyP3i#%2vUJw z?M^ChWg0aI_@_vsY%R#b>Z$nelj5S}57SWsH9?bnjV7MfmqZYzbJ=p<9}#lL(HZ8gk}&@*FYo01qqP8cb{vjArr`<~$-gee+lzl~BO!qPolu?L zqbynIQ-(xTshPDt>|N^e&wxtz&nT_{pmX&3--5QE=>N&&rq74eXz;R8fcQ8+D5^0Y z7n*ACcD1vtAC!Nz@5Jpa9(RVIon`BeNKXKey*Wzwa=Ruu7Kj%)1jJ}Lz69XR$AENu zwZxsif+lK;8s4h9e*9<}3A`vSs+2*k7H$$o-VX!fXzOr4m=T;+a*Yg#5+LY;`U@CI zG=3xfX4|mf!i@D(52H3#vQ6ibrDpO=J%k(10@D|u1tj6OEU8~2Qf8tI5<1xmf8CQj z>ZA|woQGm5WZ(*}EKBHZ(^eTwsGNu~+#{-W!aVFu3PIt?ChZN@O;LqQgJa&{!a|;M zsBY>GSG-euu&?Wo6v}dlG;NjO=(udz#P$v|!ml%&;FuT#8_d40t1kqri%%q$+7?S(ZUQ zdch#_h2IE5Q|qLRI4A?Go*Vnyjt$qh=_t=-U(@aOuDAJY;SF41AQK%YF6SsjLsgG! z$Fj+_zU2(YAYOL*g|rm2NXlkBlI4gJaamBm>TiTzh$N-zb9YF$`ex2A&|FONs)6@^ zk=b*($;TK!_p(1g%*%mE|G+oD_(aI`htbDiUU!Wqdy% zy0o3m0n!f^Q>sk0B{IRKVWNGX4dz*4XzdPtV`%pygA9H|tI10#v|1?8Z8~u%2eFuB zPwug+q+OvFGDoBCfnOs2eV2_I`|DBwnwtPDjDU}Eii&8@g=k1P*{p68*5rhqm9dO@dd@0FWO)d(}{f4y}fqQ3$t``FhDIIiy9_q5=EiCw{;;4852 z=5&(uHBBF)i)CX@C6i-stq5hKFfbk+Ypj-+}^k%77Yux_cc26-CJ~9%b5lmGIX7+U@dYQ zcYe_U%30BK_~ZAe~_JzoeMoGxHV@^Lr3RzEF)Qw=iRqg%b-1kF$g&0eR*Jrz9QbwmA3aq2<)EM)4Pp+^M<(h{K+b#@l7v2+WP+T zJ42*+C(zDOH0%!IB2~-27QXzqU5IOYI`vY=Z<-wc@V{R9mCr_FIea7H3U$XA2h}`E79=yaL?!CYL61%EX?k6GxIbRh;K9 zrp4w=M*;eAo;R&k#07MRDj>>0mD1q|U4*b8MlkEV$Ql85cw13>2EEFw4VjHe1iW*V zb3J0)D@dn+_td8(OK5b)kquw{%n*x9U%~CdNXiQnF0tBdaeVinpO1-76Gg9Sspm5GybB?MIgr25!wXyG#j@P5OD+&|6PJe#mstoVW=1M1El=+g`vZ znHNGe-+PORbN|RTscdr%CYCfSI$<#J#W6O#Va4 zpTRbJ-2LYAXF=W(FwaL8m4wGvZ}5j7F@HH*3)vfvNInzeD0kz^nth7g)YmH&xqyE<7j zfcp?aMes&PKWY}|fnKJz5Ohy`wBWmh8b9yW^e19Ch?!M>fbVDH2yK-}DwpEWc&au` z-G)H!Efhh>O?DV&B&!!L6Jto{o;<9Jo}Wm=rHPmbP3+!7(p6tp{~jbiz1;eG0#9cK zxWI%~Uu#=T-3X-V6#!}9tSdaNMk-kH5tz!3Bfx{^b?3es5dkrEhyM8wTP?}$C+nby zTFY|rP5lh_EIeyTtj|LENUaLmfa_DVRFs?FiW06TChfIS)@}&w13H_BLPZg&y=L2x^Qo3Y_XD(;V&h}>`(1uC3+qar}eA5#N=Y3{u|y(e#B50P%qJzG?8s!K+Q7 zFqZHHpmF*sVZ>4)VYj_RrLQ!#YM$iv6(|$uIw$2U6a0wT?Ycb#eWQF2{xDycf}4buE= zKv&4;Ppj;TM-qN`_8-}B_>8*jAYbM;9NjN$XEGKFMCY8pZHu&qY;-C-`d#_S@M_KW zrNE079lLR3&udstbp4Dh9OBMjy2+!9Qe7{&IqP=Sr?uHd`%2Zi{Nb2ijQB{-b_`J8 zNa4h+IN0Q zKGbz*qMk*F+W_lR(1dvU%w_Ewz}71H=Otj)nF9RA1D%fi8?vM#t;#=;4dUB882^W# znrj~@JXa(XCtPq{f@A<2BkHt=fPyuto{lPjW3X=*gW#^_vA#rWROtqv07R8}C$5OC z9mQVuIT>jiEaes><{VR$`QV6?+oy3Z3m;w@Q}X;+NfflXRulSB3@oqEg%Jol^!W-j~cFe$Xc z#dGF*ti$}pEf$ctFIPH4Oc>E|P-B$YN4mY8wpt@t?3TV#55=hK+W@1Yr1ngUbx8>P z3w@pY;wZ*OuWC&@#uybzllh$CndC1ar^e3k@+k!G+H*d{#Ul%2$Qw0-J~AcvDfa7% z;nT7Y8=@e{z7f-qO-u|t#a#3jg z7YMAf&V^!J2%`n_4C<%uX3C_a)dDzs5Iao17}HX&XS_}0srTue9EkEd1iy}-)|%t95LWY zVxtpyLIZxFbSNeZ3s^))LtQ}jol7}p+n9==tdIjh1i@Y?u&K|(z*LRhwKwidi{?KB z0SuauY*BqMVDf)(7%CkN$pLeJP$8*+o}i1+Swof zGl&{lKo9xDH=^e9Ns6ed?`@z(Q&0)>Zs6k1;L5}_b-Vkq;3<0;(9jLefmP0~-qcd_ z^nFtE!#kzsRuS2w~@HbiM|x%@&b)VV=^@Z(gSgJ{4{(rL6?o3Pt1l{Ul#L50{ zIe2RRFn}B^U`j-3=-D5Jz&0n>wTX&lS46m_ga_*UkB*WhEslh!vjE|DFGq9JLQs-}?e2*<7x?|5}c7 z3E0BL2C7{FO8n5f2N87{^aw{A_cq2@87IlArNr!Y>}BB3F9ZJ|=}c|()%R%!rUD2gB8xnYj^Z+Z$Ckg{>G)ve>L&H4s4OuBIkOy zc@$=tcY8>T_Gq`#_B{(Q6dVX47ds1JZQa3a=k{3gcE255nTfq@+oH0VmXr+Bs_$7* z`3D&lNbqShm)<3S!O$w9y3Qm8{_!i*?^@Kq=;sq(w&K9i2l-4#`%z4F=iwP*v{K$3jGjvQYsprb4u03@*^mx5Ahf1OfKZ!5|LCJJ5@(WC!I$z^tU(>x%h znf$Uvrf&}a5jOj5r&(_R37{8feuL;$>ibFfD-QO4+z@3S+_6dec2&h(q4cKymi>MX zkO*Cd7LPeEkxDyKCw`kWVF8zKM=bC4-2D!aH*U)^tCkx!K6Sv`8}QoE(Zl~*4_x#F zh(%aJ(9Wr&d&v`45ufwIo|B^nZIfd`v@sq4C3^Uon@+l(#TYYz=qt1hL7w z1%idP$3p^7DDx}+gpPIcb>5Tl_6sIL#y3>y1bchi zTmdRmOgSMtpY8Hs;N)cGMe-Q`3Z%eB!cokIgWm4EB7IO^$ zy_fLdV`XEst^gKXRK(9!BEb)ifoK+ea^QyW)9cD{Hm%!>ra!UY{wbCJM|h>skPqGZ zW$)6fNMXhw7#MeSmJKkpgZ~1jlXxtdgG*9HoVt^pNz>Pw2pWR;hv2-=E^VAr|ARv* zne2(@{CWC4Z|Vvztt8^VSQg-8LuI3m)K*mIk@1oPxCf+Vq(f`xj9aJO^}936{ytST zD4ZAz&sj88N;Jy*wD_{qq{<2$_I_HXUq$Ay#qm^gAfG-{syGf^Je%E|hAsUnv>L6* zdTmO)48r>gfv_}$#Byx6K$j)?KmHS#s>Z$Tvi zEOb^iC-9q-Ver%!>d;Mi$Rogw&xxwt;asdLp|04m48iaSQa>1kjQ$*C)-hhR&MQyF z0-0&SD_K_xoRyb;;;>;yZ~*0Yp(Yf#o3J}{rN$uG*~rpK7?yRqSy8M`l!JbCTnVLlw=!VQc{13|9fTlcY<@mw#DzSY3RlFrrY1GPrtwkV|U*lZG4;cZ21klqWy!XT2fQ3 z<5@d4?Ef0^h5ICXW-(AR7~b6%z-t@D_%+TiyQT4)X1QzYecU?=(<**L`z=(b zhJ#Zp1~W*Nkb|pb!$fsg3@fU2`nrB#Kw|B%6Fos+ltUQ3O1@%R8X@Yrk%JFdfw+`B zb=}{kj3?5Ws`$>Y$KEwi-c|w~^>i%qE?wLtyBO|+6&6Jz6erGf$9H^lHiTB-x(F2} zUcb*bI@$#HNudI&?>de+px2X4L=o<3fRo3D4rlG0^96=HfI;YK)ffJBwi~fH-_NT4 zrglGdV6-_uR#|luHWIRS2UM1C^^avnyj9pvRWtUpZA|u|FYJ88Vy;V~SwtLtuAO#a z`1kopGP}_6kZl7fQ)hSskYHglBbh`0N+hac6sTmJ_F!%+>gEaDH`~8)!dHdtiP{)X zq+8}NZ1(!%N$(g|;Z2UFu!1v0DOfIfFiAFi+|6KZ& zT7wM7P7fI4Dt9dtUiW9MjJjP>l<9U2=J`4&3)la~U-+Hh2|MZf*#EZ=MFshfD)U!R zG%Md#f7(LqHZ?%{zE=;S z>SH?IgJ&OqsAF0cGR?OSgK-}rnVc#)8Ei3Q&6_w_UL(mP41*B8X6$GTz1*v@zFM*}@18 ziqgbi3^$(|Q^{7eV0Ii}Hps0vLo8Hfhh@0zaeJrv(1~#Z*RvTYwVZz!1Yk$=iqHHwI79wq#v|Gl(GgRJ&r6mo zt=}mHf-YAmWQ@2nZ$8yT@k9UP({?}0b3@tKjSZe9i;BbWD+MXV{v}vnS))CL5=0yV}djab0FDn ztGrQL`PQCzM1+HEP58(-!*>kJ%dK8a2es>{(sy#6RKl_H#SHsAOYo>-8<8uP_Y_uq zRYr;HDEOfawdX%*KOIV#7d9PwX!G~4hnu^XT^iK*Kv$M$Z=Og%sXt%W?|XXSD$VrT zwg@%>d?=n{VL?WntMc@Lqe6%ODN;pFzKZ?^ulr;G5t=UC_VhyuTlD*~QO>Z;Mf9|+ z<+H;S_mrrsqBut$X-4Pt?w57T8xkKq9!87P8Y_}aMp7SPmHps|dMw-3gCD6~oCkZS ztNZUk9}TRhZcUfW*VnJfh&)P&>z%J>kfRTrVkdV3rp;;-Z<9hy} z{X7o$Pt7I3!k;yECb12DaHa-+V{{!JbcjbVlY0Lf#L0{{FN(K1HC#+rFX9|62m2PA zDTFua0S-Eh;Z2hen=QfiE<o0NCdR=utH zm8+IlK+csGK*3BeJQm5jBZvVblrIl|J9)b@ur4{b7+;Q;Y}}&}$cL77m(zrk@*s6r z)ImPK7hU%Di#3D|7A)I1&F>j2qvBbv%o1(%gXs>F8au_BUqES>ji#=XdP|OFU$o!i z^haEJBG_IzqW{*9j3Kn3B@-e3;L?|;h(W3!5ixl$$srH==?rzL7`xK$VJ%A+=CAp|` zR0pE={t4;lA22#t#HF?P<9@E{qtp8E0*J{@-2e8oj~KGHC$Cx1(?L*JYU zZu~y*e)4;tMjdB+yRvkk5Pnjfg5-t$8KEvm_^adW?%Hj*=k$U^^iEYu#&!_439c-V zh8#dQL3do5_TqNLQn!LTcSi$XX%(5lOi-3vJ7q$NGsh#SkS%|zcULnn7-4FS2%0_t3yd&5MlNk;#q6&-BEfr#1ux)QWa)n{k>(sSr zsd>ni4|kewH$pJ;u3#7T+DYRT?U|bXIbFsq&H2K2d-o>pH)bsAg!a^#Uy`^ItU`|Y z^Uf*oRRc)Fe(4+iPp*UW;_1AVr(zN*shg9f6D6q9ZgaHMCKxBcHNr6)Dv`9erzLjE zFAoy3FEUjI0T^Citz+$|Ce<1#C{+u~NJ*PNi`w&IH#m7m4dtalKji_LCQS~ssg$1` zG3QVu{Bsg`L&Y&0=r9FyS{~JP)G=qE$ST6cncJm&32iK?I;a^RIN2HtTV;vJq0TP% z$Y`1r)^2717JL+SscMiehVH>eKxQ z_!z+7y*oJlg6OG{GFu6jGhr;T1mR>GLh+b`4p) z6}1$og?*7RzD|6)CZrsb!a7DdZ!v07mW_Bba>ecj{%0L<;zAyPrsfZjg#(`@IOnSC_kNoKY5~pK|@LwH?+_lmJR1 z-7XjPW^pTE=YfOyWI&DGKQ5E9u!;#Xw~teOZ@(Z@Vgf%g`2)$nMJg{4O?F*v_@PjM zeqF6Gf%sd$3_js9t!;E*(vk{Row?;zZjT>iEww?edpY%3( zwPVkipci__5Xzp;WFtJrGHYVk?KHgy2bq*z-{R*1Q#e_0d>e||Hzo-rZUmsgAcW}56{Yd5|sJ3AdJ7I zgiuci+Fu7U(PcY1^fYX)2kj=LvN7jy0)mKBQ@$5bg^6ohQ2+4X@2?F2%c4;Jm*zVF zTF^vgI9#!|9FKRKVj?d!G77Pi?@_u=J{Xk)?8j!H(%s&oif)9!KExk9tEQB%(HW^Z z-4_@;`@u?f!>9=v(#F3O739Y#I>%;bgF=22oHnKe4LG{rhTEbf%Fhh@s)s=4Oq?9ss{`aIwq&G^O?k=d{@x- znEu#8eNVw|(^L6Lq9~Wq!Ds|QLZ}OKA$9Z6XVpiFQ~yx5K5ASh9J#}q?J@ZHL!T!D zu++SDX_mI2B4wVYA@-OyWtAIZAw`)IRr^%!&(?2VJBmH1Y~YpXx4~c82%u-szQ7RN ziadss=z;Pi5;Cxu(oVGuSwxa3TWKp4ia znaABLjbVeDw?7ji{)pRYYP6h~ES#=5I{T=;p@$~=4aI7yCBWf^ak9o20d9oC>CA}9 zSE#Z5&PV&^UR7qHo_tx5=f{H9J}VFMp*0pZnToCdt6+4mHRpZ$Dm_&w!Sm$#py}66 zTuw;-w4T-8Q~d4S)3mTr>3+<1mBgE_aQ){hN;b%%wb4g)AT25Oe+2oR<0kMN za$7pCnSF2Wcc0o4Q&Cse1@ITQnd zfWN%x8}^hEzK)b{In$j$*}j5PjOW&+d|o)|Z8E=0xJme1DJe0#cK_FO%FsMRXSg+e zd%pNLUMrUWaSIi|`i<#??g)bK*4=EFje3H{-&{0y_-Ia&mW-6)nBJ@x_Nd*eXH7-S zGzupSpHN?orI-p>4_%x2B{>kKa(NJb4Z__7XtBc+t(3zI07RwzkShWVe^;%rj?&i^ z-BGSYH@ASvl%_@d&(zp@*Q{(b#%rYd=C{wch1CeGU>$0{Hw>s`Ryq`9UwRB(;;G7J|F-f)G3%i70@n& zy^VeN%j`W~5xu)ZXiv>hB)L|jd^e3z9un-Arc*fTs2B6{WagB|`q@`TKv8oV@8y`C zdGlgm1nAx{tCC%f0)$MO#`yXvpW0YizIKk?hzx@pA;$=75-lud4XXc*{k6o|^g9HqR&sg0$BUHU8#L8v1ExRL`k0e1&J3 z3Gk&tUx8=_LBi>QK0N;)xG?%g)0blo{ZGHUyZ^>fyt<^gw0tw=3K04;_ueN7Qv0d; zExFGCWd|D1g?+^@jiX;3q;-R>I#x|SzAby9u9;G4!3dPF`iH-73mSg2c4U`i^UW}< zX8+b~-qH9xD`Aq}by(=B+K&7^E_5>sbOc;=v)dz{m#(jVxnK6RZQ|=4n6K(Rcrek= z^Ne%tSN+K6Ek1UfHje}FciP!q!q}JJ48;Q{$C4sw8T#>@#y(z&sUR;5UMe_n6G9S# zfN1~=gA;8~`Pe208;Ql#P%qVO_?hhAr0{7QhE#wCG>Krlumrn>;q{C>h@u^`^dJ08 zY64jmPBP2O_M;QlfV#zIJ37Nd7F`{V2I{eIA9zKkS}L!WUW9Vw4rgM=zUl5WkSNy| zIh45)CfZ|$NH026KZm2``!WXyQ~W?RFF9;zf!L#sNvn8M-pZCTH#@fb(F@r0e5imw zS}@+HYGym)!F?Gq0`%~PEx;tYN23~Enne$*+(h4vYxb7o%cuVP<|>J>XvGer5?6GV zR6J~0bInWeq7Q>ZXcW1zPX3HJM@As8K6dRI4A4eD(@FH~88dw_8i9?LJgUDD_NO|^ zN{J0uO~V+QU&n`~aEqtAOTtxuv%ee|PJ<~wyMVQN=Ui!0w@cw&$Y*hYix z%qx^eR`h%D8$|lX#wbJ^@_(uvUU6Ghf8&sel%jGR&Wc)|DbC_HnD=zM@&Te9Cy3b{2bW7e)w^q+LtpEja~}QKmR8 zIW=rDFX&cUeAe-PIbE=b1ZN%+4Y*vE>eqe(hdE zHmZEV96g3JVH6<}_3LCfnv&`p)~v`IIhs5s;y9A*JwHFNegiEfDM-?&b8kIO#IdN9 z%w36Y&RE~RoS_Nq-^_?J+d^}pf}^&KauL#ywD-Bh$WeJ5lbo0abD+yoL^g>lG3#XE z>#MteM%c-xlpA`PM}zIbZH{|AkF-UgDEZl(TI`SW-j^N#@0z&-34~c;-eDBo6@{vL zGT5Qd{SrB+v|5ml>IbnAmh}B(SBf zAesOs0q*k%*;l?@kP3|11HsN!aHBL$BAm8Uc{V#H$gpBtxN1KnkMT`U7?9jvEw~MI zX;ozBR(eHu#*l;K%@ZZe`38yXuzN;sk1u%-wX&RTUjR&!!wue$?CUMDyC`-ya4j-)P8`G$KOfM$GpHUkgyAPe=28 z$nPBFPmURsAorKXmQNr_I-2wDFgq^uNa8)Xz4EkZ`VzCu>zOY9un7JJdAMsJ?ABsN43Z4;Zqa1@} z>N~OhG4DZQ;_F>Tw~1q-v0O4-wTu60dFjhpXX(T2Tw{IPJkRsNPffaYB%41z6eB0c z^W&g(bFC9Xl(u_Hr@X@z6};6sGb&Zo`Ct2=PR!M$$tUnB2<*Oh1LL{O*!9y&UAON9 z==RJn`Hf}i{c2=38#fm@_2}LDR^Ob{7n+~hIPZe!ECMpW4`JoUWxrU(>*C?>o_0j; zNESQs_jx=pHG2Yx81Si~0?RK5cp_;gkb-=Cxm$FHjTbjCMjDf_Ny?Q}>dtj!0)4K#y~xK~7>&ri#GXUIzU` zox6?UN<}OU03FJ|F_R7?Qdf0OB4hXh3kg~Lb|R#|D{{1@z*In+F2uZ;i>kww6Qtz_ zp+FC8cjP%H^A3GDGxN{&=b>(f2RrG^F~-)!Cude%6H0f-C@tG-pd)d zd~guHX5w?)u?Kse#J2m7EPcaM;+;dc14jS!E@M6T`!S(Vd=9p!cuZQSto( zGtE2hb{W*45dbIPR8m@cUL|GNbIgz^`)RS-QuR6aO-*d3>?#hv_$6Wfg0sCW>>}5P z(dx4vF+giV()v%f0BgEt%q`8DHie?qiib0OmJFNMj^n;7*COl~s?vYi&Jt5txaPB7 z|6{)-P>Al>HmMR+5PW;)sh}?Ue788jZ8oY>;UW?aW>V2E=Xa0>T9KIKRB9;wCf)2t zZ0JZwgCr`>VFzWzPMLSxXtJ!nB+HzWXFUwV1s%U;;|cU!hRR4`knRytbAVc_var@O!E7#Q0|v7DZ+ zu3l_JmX`~h`{c$LxeD8Kg%1Q%jO^$^^C|jMJjqJHN8?=C2p;@oPk`=ASMF2IfG99Mr^y8+XGo(Mt|PcKiWTgw8B@3={$ zmAW2t{9}|Ci?~6l@&M)MfQhT_&C;Fou@#u1&p`>``sY$T z_{iSdL12g9P;RCvdSDaO)V=_5D%)iS^%ZiIlmi`K^_kg{&Q3YzTPS{H8n^9$3wfg| zefRuMd;sW=`P{2Z%?8RYt9;@XTBI> zfs#}N3Qo@#E(`1CXI+6@*@M_lr2bKpWf*VLhM<|Zs2h#(2$>6l5U0#UY4Ts~9#i$^ zk1Ug*o``fki96>_D)-R$eN_IK=}8lIg$@41Udr{HkAsLQiO;3a(~bCXQm^$x^~xW(+C}|`b zAXDc@FOn#YRB|j=B2}cDokDzxoIYI}Ffb92bW0qx+t{#*bS13EDifL%KG28`HUKMmJdL|_2;PxBiX%zLh z_1oUXO~g3B-n2$o()00K~6ECapVv!G)T#x7OW`Z5E^*xGMq-4Y$f zgSkqJQ2<6R5T>_p(#)|wfNJ+D%h21kc;@z`Tw?#3f ztlpb@Zwr5Yonq*4HY-w? z=`ocA=#Dy%p``_8?0j4k@&_HzTW@jJ=PBR9n1`hG#+SW;I<*PCnFBOgB0v%KIo0gb zJl|PPew`4$4YNL&22h2z1wO(5LAZv)$BmgWNo_{>!NZU}ZBp;_gJ1m? zG9+5_S*TWW-`32W2OdJIe$@PctG+g9{*F{1Zb2z@`3ZyzzPRbNCh!3!MIeN_C)Ycx zn0yCt#>PtS%duSP6QNTHu-~}Djoc&Wcf^i_WJ4d#Oe@ESd=^~=djWA0_Nn?YCJ4m9 zL<@KP6yJ5+E=oRogAx$qb?XE*3scbxYTV8ZG9~u8>98@%(!)$oY4Gj(+xd zEog3h2)lxTXY4f=wp3_`(uTdcrpceeBPNQb zO=}u=1+A1S)6}v0`|A9WK`Lihh;r8TAz8rTDC$p23woKLody{`Stv3{X<{uDb$PUz zHyO&GUmY>x^z0A`*=e&$>f{t?#z*#n(Uc$$fuC~eiTvr{v9u95GyHVhk}774t!=hS z2zRotn0;#&3VI9or7LTcA3|X_ja*Ne`;a-Fen15HH{C127v>-hU)6it3L*PZ(@Nr> zzcD6avo}Ih1kHX?WA}Y9*EBtC9nin8ml`Tp1 zIB`ji{1&C6%Y-AjOsDQ~`W8SM)Epyg^MH84H$l7g6-N-g zz%!U$Y8rSXm#)sp|@rI&%s@Z)*7KCt>S&k)P?h!P! zQIQ!U?jU3=X7gULz7v6=M&2BKx4GQk2vWa8`(*$tuEUD;4hu|`pOlYlk8k_)w}?$) z@E(8Z?JGX& zOyvIHpVqi_+Rs0k3Z~1eBzb31Xl9k znE`Cb%|>YMDfuR1JLn_GjqN%QsP{h2Yo@S(^)K=<9(-F__NOzZvFgGXLmROkWwKq9_E%yDvOmaTn zyGdC9>Zp<_wqIRaa>ibAtcRH;b^Ba83geyZjQv1;npuId+ecK^GV8+tAK^8kpB!{u%ae?N#I+% zq{D{3Z!#&mN?!D2U)f8*m9=HCk>W9Lb!WtMs|`@xeCo|}H?s7{K7I^Jz6ZX+vkf*( zxWf84;fPu&>wv01^VV)vo_x0Ll=eY~|H&Eddt`uH6pSd)tSvgJ#*W@L0`{^6tTMZ% z{9Ekb-d1>LL`UTfTB>{(9RotWH}eK@(25Q&Nw1bE;Q{47>+bxpMWZ`$--nwhX+YTlwb48b)B)tLTw0rX-LXDML&Z$LOy~ z7`6V)gRnQ#t=_USiIU?BuA;F92O!2&V#vtcc)$vh@qaaJ#4Hq&%JwuhF>O51xJj~O z@DK2J@slGS9+ZIE=Z<4`3jlwY7<$BIdhC`I|FM^tnP|=9nJb*@lEfA>CUJlh;70?+UQl<-jE2Uu>eF8;iRpR z`7|Ek>f(ln$w!mdFdgI16@}EX`tG zf1$;|ei9eZNd)-D*xCIaIlS>2tgP#9nJ8eiDL6@vz{NG}Nr2qbemt-9YXyGFe@i%d zu_I9{!!${3fhWfyk^*)`O&{N`rK$c9rs59Dp{JFHAPHH$au;E_xu}hK-5xZWn zFagvzw?Hay1S2q*_uFp!ea@k+aQh6OCC8a59KSrSwo*HSYovScl$TIQXH`5lZHs8G zONyMh+$l#&)`NkOa;eBEag&em-jMK7(P%-hsrJ*htXe`a1o8BctXTY2#!Rhp1SQtY zMKK0neGsGCNVrd=W-#@!#OdD(uN=sN`k{?Fq1NoPPEqsPp-f3L!nvNk+ko>5=v$s! zufFGqfo;^W8T;SSa{CZZ0N66Rn|varUn=?hf>CJ5FQ1!Q(kXBY!m}r6$3v&WdLGTa zPm2_u&au)a+n=H9Zx)Rs<(n8~ZRs~#glBPO#s4E(Kyoz)D)MWS09c2!BKIK#G2)Cv zqMpUiIxjrE*>bO39IGC3pl2Qm9XZ@7K!+98FGc|FvWbQfohIgzE@sIGi?~NNl$W;c zR;g`385glo8-pRcVxD&-Ce%x4ONboYfu8ePBN9YwXLX)z3V@JMUqyusCAO*dfn|bl zGL&ArA+wDkJeVx+mI|mowlhexPOcB-O7p!p7o_`IYs!NmUwAu*8Hx$w>x*t^IB(a& z$!D!BR-I2PuD>z=OZ8*->Fn6iM}?|rTv&qTcDsq#N{ocytzmR&*90K9 z!(g8+CA|4uCY4RKEmkWHeeB7=-V3Gj{v zKt`Nl7IEzdu?vjDu9w)A0i%J9NLtv zpU)=9+pm`vd&UENc+@$T^a$<)FP0V82`F4joKp98pn&Kv-)=P?@GSFlti?@`OV$f~ zd0?y!C>}kWY|U%)cS}n~NAD`)7Z&^VJh|=|_c3G^%c^u=A@>{PCw$2+uzSoP) zBDfqH^MDW}xc;OH7&5qJW&!=8!`a{bN?VuKNl*s~MYwL{VPXahuwxtn8L?J`SX~7a zq!%JVnV59&wp8aMBnZw&NeqtK{^2!j)-mu;l*nYR=Un{8ZyDn50tj) z(%18vv)*Z@%?9Cg5$j*DGZO_Qr_yzXi|dp%@=7--OvU0~9sUrxIM_{>83BT-IiS=H za(&twSiJBEpvNC0iRQ{DYe!T)WaWgi#)$ZlA+eS={bg=ghL#ly%GxwoI2m6M{xMs{ zOb|(MP+DPhlj;;;HUY*;uag5u&W#!4j+QhEEP^t8=%3P_+_U@RXQ*ABz2k<2(ISxE z#hP;*nu~K&mI}G;-)$5+md(Dwo9rR8pDk|se?*;!ThrGY_S;&E7ByB{aR5=#qIJZ@ z&QMXKqQudvfFvR+B0^-7kWpNS0ucu&Akm_rWkfazB+3ei5CKVm01*NS5Fmt*z1~BA z?|Z#}fn4(CJm#-DotDwt`!;ikp#k<^{!7<+zsG{?ySG`HE@tIiv9UF8(2RRy-FI3&_C+>$)n{Io| zJQBHC-Iy-gInr`mei%Mcy;i)uS9blqCUX~egS(n%V71ZH`YY;Q&cd?{q!GC{&`&TA!GB!_@J;ZlSw3RZq9@s3OA7Mb$@ zs9Rkk%pzIEh~pwxNh`&|IG@5~Om%zIWUr*ha%TIZm#6&gg8w8B5o!9zQx;yBQDy;`ib&&9k`?f-9l{z zT$neNa<$rt^>QscJWE>pavihdydeqc$#a5cinLF3_F^;4c2!5phR>ER$v{*ddG8_K zg(%+}gcJMPpej*y6L&7lLt8cvbXSFsz1)OM+BMl*yj3)_f==K>!^OUYwS1%(c8>FV z?Z6^WdIO>fj!H^r5%qF8vA13IY*TR3VK9bwTuZ9F99MFZs|-Sp>Su*P*0FPX7yyEJ zZRoK{>%^Y&Ropotbu$oB1tCIfUBY=AL8!4^0LdiH_%BKSKope6P5pPXirr#sx87q> zSiP0S-D<1?Rlu z-aXHs*G8lNnO($zUk?KtBZb-7*Y00) zK^~{L7n&@GB8l=<=_P39Zy`)dcIhdGP<>yr{9@vWoHFYQZQIqv-ixqlJc0K8JtT`K z@v5917ZbcUNYX5TQin${-i zP|({{Mx6iRFTIo&xqzFQ0BHHBVJxy1RwfVE;r}}m;mu_m{v7Xp8_pBE5xT+`iJhZ+3 zG%l;)6W`*?jf@weCGn2}y>Ydczd{x93j!yG?-x~{g4HZdb}+m#UC{PsVHSU+A#U~%msXOrj<#0ZUqTUn(rD2=Co>rIv6_4C_C1sg z6saDPL3^0TZgFzIdtf|SwU=r&tvd0vTe1OsNZ<({uB;()VPN%OVBxFHPgK+Sfh*qD zOqS7ZNqvg4q*{flb;;I2Kb~&J#ijOqUeFX?huE0P-jWxz)p*aimSz7?u#o4Kr{a;W zQN|Sq_Tm(+DKx-Rl z|AoX`xG%9=Mn~dmmb_Le-^f33XlY$5{AdW}^vlD2t(MS1XJxxl@P|?7d_`C8rFXX) zA#_8f{01O?iKUYhd;&)kt+^cYItE=B-da%e%096?&F*<&KSyZ)ttQW;l|&4uyGF8#i7n?#d62X)B?fp%hG@; zn!#^?YL@;@>VBpGI~kzvReBxi7vYO zZq$A9Dzw+ul{6dNGgfuFlsE5nrP~VLg3h4co!FAK=0!F;XiYmknyHQ7|I_v9F{U%$ zxWdDe+VOP1hjB0VP97vLu*roUuHS(f^7Dq-`=kABHpZ-(8r8j}Yh{}TwrI6HRz$~_ zMvI~s!0j7(%5@*3x7f`xA&|2uvi>>?XsyY4G0WnJH5sWE>odd;QeUEAu_un(i4Sj8 zd8f(mFby{$rBQVlNc>S=WwctLZAJ|&_xkyX}~ygb4r zHhz+yuTMit6X`fG6&nKyv$QK2oHFIsP6vQ~brpGlSLk6!8PyLRZg;i0g)*=4TOy}l zZ;Kofg?b0%-p0O}`QZQEFY*t;0Z;~=-(sDsIWVcrwt2Kn(%pO}#twHa2Svz^E+6dx}XFdp@@-`_Wt> zqd~W0B6SF%@@~4fG+RD%Nk6MDCC|LbBLoX(3PU~J^A5u^qla?*sUdOXcLg7FCkHKo z_QikQPn6z@lGLm=)W zPqa{C)W_!ljvwQJ@g4I3={G7{$J|E)8A>nJUrzJdb7)Gc24f$ z(`U%Z5$D*8Wwr0u76p};vAW97l^MPN=!CID;q|Kzh4kNZ)M8^M`MdQ?v#_{NvQz2O zcf|Sj^{BRsHZp9TG4E1w_vrO)Y}fKVU!~@A^gwFrbJm`e~hMwvW`&k zLOdtOeIil07PUKRq>gk3SKV$Im8_&*)IX&6GJV*(h!`-?xbqV`7zk>|^30P%;5Me( z{ki3!`Za~$OAm`@gE>mhz2xf2F2$OJqIYVkB~_MspEi8%)5Z2B$RFM$WNe3@J5t&Q z6R%ye-uL=-PxqSa$WyRw3%cW1*lq50mktYWxcT+>UdbtZUIM_cNlqpnU{+5x|=%zYE`&MnZn2HT7$4>Msp_;$*DahIG zWrpe|*7e3nw&ok{VtyM&x0+JFX{Kxe3NmO*=t_#~Y>FE6C(pxuN(SFqL_NM_A0RvU zz8t5!(EIVX!3&>Ww^WH^Gb42Pf|#0gi2HKB@QGq$qNQi!CSKNv>~>RmHYC(Y*;w9l z?9ZkOiw#`*ZY0&G9wpo;X&{j|OkKYRfNQWWPK?ARtK>cE{ma+m!>egxbK*tohx((L z?`E(@=WJ|Gp{f-!fcZm6lPseQ$NcrMvfzbH54y1qnBV`Y_`oI7g0E@A;{k7gM28{^ z&z89leEEU!lp*L_qTHe_BOVz9 zZpO#XR?ESUdIIS@3)Lo{jWrueVsfk^l|D7v@j=;h*^W#;rBQ@ZSyC*lgpQX5<5-~H z8x%loI4ucvR?#d45_wIOTQ{8PjPja2m=3(4dG60A_K1pdBJ)0H{{3Kn<%>-Ir5o&P ziju|eZedFDcFZ+$5THkoCY6xoGV&$mpXh4%k%!X z!A1dCs)JvId#w)V_9pwY+Zaz;w2hkCZWuqX3p}ukvUX)|z~+&w9+Whe9jj5IWSQ4# z(dBuihR6QP@SmYI06A@4!JVj^_t`!M-h{eOz;BAToRB>-E`!7@e@&LQqfta%_+YJO zT3R+1BZ!G10-f<5)%Q_&fgBBk^$wyopF+~mhWYDehHugzsOp@d>5O$b)jhO^b75rW zZh_yhJi{AaAn#O^;h#$nQAW}>d9oo}H>^*3i=Nu6-QKpoF4b%9p5|~RN`4?8A-n)z z7%0ZgyuZay$a;NSML^7c$*J{tRM`K!dfw`Xv~y-n>PvW)0&@ z&*si0C5BC`zrM`i{^*p3Zyy-7rL%C6vxkj25z7GiMXaCbR@|T25M6B@^ICozm#ME; z>mJDPW6*HXsC>y$x6TgjS}!NT$s6z+vy*Po?W=%06l7Z+5I^?`o)zAv8ZzCF3?9Y} zFB^#DS5B8a;X`QCKy{T2y7no){DxiATZWE)S?TZdax&yNht6SS^7u1fNqYEi_toWh zN|K~KbBpDeM%*cM+Qbm9fac~l=Hd#;nFAFyGAqYd2d^NKs=zq-U`b|lCqiJ%#iKS<&Vl7s02p=p0wwM zz~n59*pOhkwdv9phS^vyVsN~*!%vY+)XmI^<+?~fth$yj>1#0_bEk#rVaur^3hu>xcMT4jT_ zA0Qf}g_&YHw!B9B9{YbSNi zH7+MY>*wJSm->HHy{;qq&Uf}5I>YfMF0*TDInIZq+)N7_RK;STU#7ZS#4$lkPc9M~ z4Pey$SPuR<*>?z9s+kNF_-}aah@q@UsY&6K4@gm+K_zfRD7)+8{;5a@k`4CNdkeN+ zkje2Vwrg#ipoi!uy4s6C6t;o5H@95a6*F9cF@x)gO>JZhTc;8^ol*2U*pq(PO1x4`|YtgeqvpoG@83NO0aY&b@t4C9{qRS7B8n!@Uo zJWe2bP(CAvmp@^<*_69bUL$$jQzwP)rWxX%`^&biq;cniOAZ*TfITd((ro1H;7H*N zS$Tt@aR(1B2ne0*EeGo4UpBCiKZO21o7YlaVx5L8H#xg{jekFL*VsgE(!?qz>$VBw ztn#TbmwG2}hM;l!dAGr@WF%Fn+sy)62Kl_YSGE7dyBrzGSlxe|I3^ezTB;&db4SvbnFx~1hdXqqZGkME1mY6+?^V8_jSPsvf3g#tvI}`bp6EER z#55%IzKgn_d8crv`pFIsWN_Ezz{8S^)agP((SDN_>4FVscAKw#j*w~*|ZLs^P1a%asB6i`5yMh?8Z&oB+}5a8VqS@$T#Ly^(lry-&tAH*Pcn;oqHuU zo%B9?1Ho7tn?1?b0F+b$2-qLCNY{dZ<(~|=bn;2Uf4d0WMjbHVkyKs^BX*vc^S$__ zvS!D?92{53)8q)PpDQ%4{(@cAZJKiactzK})t7Ogzu+=1dK9^?Yp7-BG1iz|oeE>_ z_l|A=*hgJ(jf5vKrwx*%$GKX32EAJWdnHnAl?WBixMqm@I(Cmuc~P~Q=A(X%-Fj>% z!LRa3a;99f2J5~61uZ<%w~kS_gTg&+1DTW$xEMjs*m(Lf{IM;78h39SbSGUo=DwjS z9bb^+f9~^{eKXcun-IcR7y@Z5&Ja_(twz0~ZS38nIBZU=+KgY6xm3K9!mW9Icd^!% z4!$a6f{jx?SPt|S&iUR=es6f@qRs-?V|=V`vb$K~2x$L!$;b6V8nPZ5qcvYWZB^$f z{dTA65e-RAO0=~08|B=z;XG|5NEE_YsMmjMrBfTL@xH{Sb@RZeJLB@xCDh@SQOd1` z52?oCQ;P#)tiBp$gt3Y^9#WI18Lbc#7yp!IN!rr5Iz}e1HHW#gr?OlC*O-@}Vfa=? z<$3xG#_yPoG}*rj+DD^-9NNFKL-O$+JK9J4MdM_He$6%uu6~XT*k?`+;S%Ws)UV*L3Po;ks~P z8-K~Gwi?C2Y_gQOtKWE36L8rXT8XiMvR9f6Loj2gEIGq3OXVezEfe^f3H7b8d0Gk5+@wS=fpj9m2 zo3^SZgw~*Q!2;NN-s;cvC!6TDLE7sH=)>aI?hu68C0hLnZ6( zuEb@j+I^d6`b>`iK>N^+UA@+yohO!vn*F1%Qd|T9woi3cBy2J^FbU+$!`=n?FQg9D z4N6Tmv`kLT^bBuB8$cucNHZZjLY)eE5|KtqSkqgq%ce4Cpi z+t>c%nEH$n=4&TlLtM2Nn%!Y!$*>5u6-jE+K6yZjHzrW5V%V9(b#Ra1ZSId^s>0zn#FEb=0{6B}<9?DkNfn9E59)546F z+equ-@8zWJp;ObNZK{E)5GPi1b%BaE3RtArykycL-d|Y`+)|!An-KEc3J(#X{@SCW5nK37S%j|4&{r@Ldrfzxrx@LL^F8|5 zDseGT@fIT=qcvKNv3;zOrLgUsMI#;h)v@NC;W6(&I@ZVs!lzV%XW3MR>6qBqEs}6&y}mhvfNIiG+s4%4SfuhD8)y`v-+s{>Z^qf$Vo626VE3? z2n&uddXvjm162-2ngVrTb*>s?4@%eXCC*zy`EyOo)7~pOBJ!!((tM!D5p|u-^#nkm7eWj1( z+w+pi^%&n*FXu_#*q|iW7Z&bE%pgZ;^Nh%pXWf#!HkEn#IoWYknhon1geqG2H4SiQ zfbpub;p;WnkBSS4mOMfl&&E}I%TfR7P0z&E0Mi5MDv5@<)vYz>38S4MgAhP>liI0G zOs6_md0^QbVJG8+=y~+#!h+UfOy7-&#ihOf8KS|!5XB4;Ha5=Z=}xoDifmYI<|a}_ z4mlkXPa774%>wE$0w-1M1#LnwkRAYiZfyLdUFEg4bWUd?cx6@6h*KW@H$eWDPt~DJ zvH)!#>vu=Rk)P^XnPZMd!B~oL%X3NeY$<8WR>&G#61*ocPsen1i6+5c_Gd4 zq1p29+%ve`Je<95`n#C!uly1N?-7(QE4&s)sbz~=LfSAZ>yCd=H$PgY)%e*5Z{`gx zL{6ip>Vl%V>W}8vygv&MaOZJ1Ee!%*DLY7`b$InycKildf7^xLwWu2Y)If}Mq3Z=^ zNJUTFRLzd0T}+Fs#(31hR5lI^{Un($yA%?vs0%#`%B4fewWGWD${J1ToSv|^8 zCzJDJ*W~hu6n8c|>>MSG9r-8_@Q_W z=@Dk@;{gQPkCfM_&~tmrNqK#ua?rfO{zRcXuv-{J54wb)fEubU%~c_OAvAK76dNrPCVvr)!Y}9U@ ziTr<{e0rEKT048ByH&-@e6~%G+Od4rE_nE!>K}k@S00e^@AvA}N_nCaZ_C54eINbp zhHeHY?^C1Cx9%uCD@Wa$ulOLseXe|KDag092AY7qGDuK~u!3#GEm$YW#F#vgC9Q@) z)}E`tZGD+zS&E=$KBE@WBA=D7cym%9p{F1wW`~^Uz3Q0!6n>X_J@s(4m~fg~Rq_*Z zmeJq}O3Wvzt!Q><5jgL7N<;Lo)@qKM*GG#=2s`?5II(&QbhyHsrW!v$mWeX0O%@pa z?BF{8o?=Z{imm>nGz}MO2z39XUypHyTG`^{vTrm`=FR5MP7f1n|6zm#YywA~?G9lgQ|((l zx__IkCZa>QUU1FGiF#VkEo!+H@{f?aSO0@wGj3>}DGz<^T@n!R{<{g@rEXlxdsmTE zZ{1u2ZKjt@tzo!5mtHTF%p39kMnXI(4L5H+Z6*nWf@eXg-{P<(i9cprVipzCtL69P7_RI9`vF92Mn#76G7DBI}<`#?xO;9*(R0>r;P^~W^ z4pqQlt!VL9{cie-a?sUszPnO&yt`1<(Ojj}4)r8u2cu+#)2L;l``Lq-1|`1}|&WM+ddWb+Jw}duH6|41=cB53G4Mprp(#jCkoL^zW?BX{NbW&dKeguTc!))xI?1&8!4CcS0h`DnS6He!oi%7XFmCE z>($3^{8ykyOPSm*{y6{n^qRr)VlVFS$V%lTJf$@6ZE{GC`O2+<6taw!kXV*059X-L zuLZ)h>tYlaAi)zgvV+kB;UgBpt&|;iM-iX=Y-ooUD^J`5T1twrkC|A$UaT2xIGn~9 zffHlKqrX~;rq@x45y73?S|R$oxZztdB22)q*uDpt<+q`|y)s|MnbFE$14-=*@xwc} z4PtE6UW4fWhN|;Uo85CmcUIk7Erc`>9dRsEp=Yi7EFyS)WBT1J)c#$;v$m-xxVyLu zx8qPN?C$;s0#{CzeKU4#=aC8p= zIfM4qWcQ#c0ZqYXcO)UWmA66%M5OKL#t$y{NMSEf!CXA_wuY3Ez_>k|Z9U^q5e!eM zGYa`Bj1l~Zz3}jRqS`B$-|S4~3TKF|M1oNtH0bIN_)Gn~4oPQ~^bXWL$~YQP%fjBM zMQZ+ze21jkN>;8yZwFZ|)kKZed%zzP3m0&cSt*A;{aE_q3Wk%YPv|}UR-#ULRUDq(Pr$9lcotfy7 zc10|f_l6)#WgL5$YZ7U|Sc%Ra6Bv^Nv@cy#Hfe&p_0tfl|9hdBj+zyVuo7}i<_;j{ z5k5(He*{i_bN_jwzHKBWJ`(Z$nZ~d|LPcseSaoBkY0rsg9HO@sa1voxB95BhXS`&T zSS<}Rg%0lj&~ihh$>oIRJ}F~Zz@-w|nwN4ecA@gW9PuS9v9RYCs-64kZTxb3dt@`_ zVUwozUfGDU{dlcchCAIbAyGe!RuRV3mXyGxr_}H@F>fX<#B;42#7Lb1ci%DkT*YEIupXA<0gUMPE5`E5}bnD|O48qzqf_hb-2YuABiXL3tznHHl&Xn@|#_v!v zAE4_4AD&q)Ie9!C79Be+|0S$`{)|hWyi-Q^zRHdx$zG`D_TAc-w`_s`^nwv~i;-v7 zEM+!sbzcc{9PE{fYz4ltdF;9Aj*>MF1~O`bgC}-)g!j4JWu4z5Ssb#>II8()ouPp` zTX*N2+2Q7%_Ge~o@HIAPqp~mz^h4@fE5f2l;@=rdMUjY?eRaagZh0Q3W%>+s$dOyP zJ`fyo%Pu?zBHlavxdc1kXA5~|wr9EAQ=N4zAP`@^XhoKn!f>wlLX0}O9~xIZs1l{~ zAf_$&i!*QUlpq%0ved-poe-PK;5sp&+V0Dyhwj62SFf+%x&U}KST+TjnJJ4_lzeXC z%AN(@VW- zQ*TvFn_8AM?e0=miYJt6hLr-N26nU)YTBE7^{7$IawJcQ8JB6p>jwgzE?+5$SS6jX zCOMt|^MpcnRix_fOsnkCl;8UzVEQ&K^Sp~$K#%^XDm!DmR8=X851ZA!N95F2SY`a-q ze&%Eu6in)4?=9ggHx|g;B?~pN z9c0b<*SBgdv6r@tb(f#hiPaiE^nc|rdF)&S>jjYLB1UCJA+)}-^|F&#ORh|if)CuE z5Et3xzI|-PAWiTw;8T?RV;)3|+Q+u>cU5Zjk;Nq!$Tu;b9w7$}t+9DgB+i$eenZ3u z5kHhD*4ZK0k1VK#;+E+)wvdLxW2%I7ldYFEv6vU>QF*}-|H(9N?1WyJ+TtQ+R%uGfSXzwo@7g^ zG=8Xc;zrl;{wdp8dqxG~(;BfP@a~86M?N)7RgM8(H;!tV=BRzed2d_e@eXz7R!!N8ZoCfK=1yTsfxZQ(=>ldV~@_RTjt&?K} z^WxuT!m)If@<=0SpXtuBnk%3>HwTbzpqWvQw^Jbs-oA|@R&Y#$X=jXZ}rD$HyCC3mkhi=;f?SZ2*maVS65VqkA18Yy5PvA z;g2}H;U`=@fLs+kl9ycAW3{P8lMMa5tB4&~-{BAx!ECae__IJ5vHJejt(mytAC@o! zZ0u1Y>$z$)+?@zY7I=5wJmjIU^+S1sZ!^HOcMaj=Erzlh%5yUNN%AOpJ5AO$GP|NJ zrndDX=Jsl$;3*TZGJkRny~Oiuze{;1lSq;mV%7=>sVS;AehWoN^!v4NFALOKt;{5R z+YSG64>KMZ4gQvnrov41gOEi-X}irWhB29Nlz4KMMco=ae}cgAJPesNsWn+FKJLCj|GtwvhKG{&8#!tJrIC98KAfU>@6 z4^ZHTU|<&y^Pfj$qN;Ze0geuwUF(XH6yv>F*7~N^7ZZu(?wfI=c^ur(6Lq~*1mLFQ z(d+^D@h7WB*KK>Cdl!t-yv>V`e*M2dlne5-9UM^Qz`!W|+Q6se~ z$~TOMX=d_Fj%n1Ds(M9+tDCAEvsHAKL%)%3>}@6-X*t*b0(95R&D0HMh9||su_QU5wBHP(NMjuKipTLlYWtOHP`g5a5pm*(o zNcq!Wl(Ue>8j=tONd;j+JjmHUn4SwF{}&5$id7EU{AcJGJ2cs10T2t7Ge?)NpJY$w zqZ1VxjB%(jPULnjwng1FA=dZ@4a=Wx>+^Glw%|dgw7r`)9WxZ)5_kVuZx-qyH^MmT zuZ%4{zr>_I+d@<76J`QR8DjI0w0Exq=|lv0+txQ%hqed& z$ZyBo0YHGU9(3P42NHx{w7Rkfd*d+rSvly|ot%E!D!nE8>{fdgiZc2+LHz zJRc|$BbHVsCeY>fMQcvWEM`^)i@zWGEz#?;0r7UR1yl@lK5MjVkA_%%<=KxpRC8KvfgXreW) zWGdb-3|futHKwWK zFo=OGf7Pyn_S;Q$q@!-kdBd){wYM}$O*w6h%k+w)XN~(}Ut5Vu-%iwit!lL6vC3Yx z0wlF}6|K!OhWRDbo#&wVY}xz3qSkT56Tu2P_ael))(rR}8%Y>qTyTp2;cU(d<@7pO z`?X7-_}xjSnP~DPdqf(xF|{ZiZwzLdLG@o}pK(az7jp)TuF6mPVCAZz`I*CxBkNk; zH!B)8hWZ>qT|0?Qc`ce4{XEZ+Wj3n~5?ZgU7H86++}!Aacv=OhVo*%L68MCs_n9-l zLX+7bsc+MV2iv79Paq(WGOpHP++^)2QO_h`qLc{GTKw z8^Um>9rzSm5qj^si0W}thxTOIap5H%db7?8ft)LK`-O6t?k}K7#|ry+zl+fn^K24re&ql%ux}S?i$qhQ833B_nHOE}{uCX=^>tZB%>q|rtA1_uz=wLh?>qqJC{EBE zM+7qfj+-`==966;9q8{3h`kFXT{r^lg6-*b!yp<&`hk?wQW6YOeR?+O2af zH>)DY5$7Yv8(ja9fAGc&u73Dv(_5x%lFNGH#Xki8OsPcCUGxwCUl#zJt?B@MUb9~t zcbAYQcvno=%60311$K)vd<~H(0#jrkgJnZ6jhj%-0?rKBxo?jJ>96!G3A4%gaLa5V z>v>nv?=a3g*wY~9g9@LdZ7C=aQXP~P>Ys(jhAa(A{3%}XyJM;RA*rdzotBLRk zq;=d2Q4Wu~qKWiLFO=@=h_U{k*0^dA&r2**cK^UEIS3r&E$GI$pN2O)4ga9q@8|SE za47+RYOV^9A;uXU=d)SNuK0Da!BO5D49^aq@Gf_W~+v#2p#$|=-a z-p&#Kvq|_NmvvBm>7Utx{J-TYxpfqpu2>>L@1wG92q)7pZJl3jbqnTk4-a?lZKOpE z|MH4~0@u|!>8W~gQo>EbRQWZAA90v6S$GLz+5uijn|{4$uK5k@L#S&{mS%pnHSZOa z!kM!+=-}Cg%oyqDYX9mVFOJG%;|}(630u8!jT7b;rb9y~ zsnF-Cot<&)kDRgawEqTE^8o*woNx|OB(H}%(liYC4Y@|y=ph`?LM7BQD}~wSsArx zL8}{|C;#h&Xa0YO1>-vNMKRo2r>egPS%uifJA7;P@8ce78%AzEg zHJa7UA&V$ ze0X7mzAPMn3YU&*IVI=+PWQ@sBd=pD4D+csv!7$1cbsEKeLhV_PUz3}l$YKzMQVP< zPc%SWl|ze>(tgr)=`%DUm>XxY7z%$Fe6f$8Xt~_cd(-=C#4TExJIHneAwx( zJVNO#|6Bb1bI?2Rwi@&nE~*T+h3-#s)t=>nShm1vV)So&!tH818$7s6O6!L4vecAK z3|oq8HmY#t)7y3J^0?VDw3hT2ROKMNjXF9<9E9{yNcNeZTbwv2A!;CyHVS8Mo>>@{ zsdPc5W)-MwR0UPrtiBdyF)sS~R4P+hHj?TO0}h(M9gfRoGi2jzMjuNP;gXgL*4ATE zr5=vlzJkLFp=6RLZcKa9oKY~`JM)5a?~ZR`Gv3-4bl8UHej^bkRR)JW(ZdC8aJbi) z-Y!+s%QchZF%i>0JsmxQ_EQGoH;ZLmUMTQ_L!19+qpL|lPs?Ucr3Zf=_~=-!kqV6L zY}0Ti%mZJoQqH2NV(3v;xZw#w(JZTs8ZeK#$~b0eyw7;5+n&tHgd(sgQ*8!${1koR zR?qL?R(786-?HN|Uy5_$Y2J9%8^fM2Q#A+75y7qgF7SVM{oY;7;Res-55Am~XgC(0 zBKPH^J0$iolN#kj>hd*o&}E7E7TZU&ryO>t87M&Cc7}SqbG}zFBDAzN{vtb;u{LHj z@T~VeQ~TVq4(`{hxG&3SxMiX=v3zBeqze=>fz9fwGJf6{38O`%7ZC`up&C2d!b+l| zv~GUFRQ#VpxAc((sNHK)Pt2@0t-GCK*bW+DCgQD@Kem=otEEB zrPV^VR+>ht9cj|;;B?LkK}zc{#+Jt7TX+)@h)4N2)WBn$><(7{3w*9|wZso5+r~TEXYD`k2q!V#j+BkrE-e$^YR4PXHAqHxOYBWp0BQo*to~y$K zv%h8y{_iHO1{m~LkXPWZkfjVu7y(uM(|9o;5JWQ#g3 zqIh#`1HLFnen6(&H+(%kJVLsv48L%`_>K)klt}TKD#UO?=Gx?jf0V#xo29}O9dT5h zhFcRu8SAXf`>W`Tu&z3`Wuk;g5dOYIB3lA`cd0qoG>VokYH+MgtZ}Ua#S6&pw|2@? zzyrvRte!vlGUggj^;TCm9t}2_!Dm8Vh9x;CMX0~3l+C-+lb0ICe8^Dle=e31by=%C zP}D6#tv-OM(C?F<)pz9HilD@v7(JWBfFswlzIoOz%OX0HuG|KDjW${KWv=O@E;`x1 z_R-1zmYD=cMRz{CwWiXcajYht7Sffh_#RNwMY2nm!uyGLQNBrAHX4sm4q$1+TP3@# z^8VYl&qE=jq!hLL2)OrMY9fsG{fe*Xj}jo_qV9n*r}A7^ZBxqziqk++&2m?Lf1LUZ z!%~f3S+*kBTj1!?nELMX3kpSUh%LJ$n@25~drU)EahcTYm3U^1gla4P>X$)<2p*PB zwlq7gj5GGH<%adQs%|z7)m3LnlhHOmGiobT)3-7#vC(7oDD@^Sz!FRKF>vGA#3l z|DANrunxO690@J(qcs;WftQNV_-y0S$a6t|vFr)M){9*Ro?X&bzt+en0=ME#7&<*0 zYN*(z-=mFc6PP|OW=7R6W>R+}3Kf+^o5#cJvl3Q<@)9se6 zatGbI5Q#EBX%#g3@Bh$2+0CiJ!_zO9^wfRLW(Tv#6DePW$@)j8HIW(7aRDgUM3duWs7X7Sgt4NKu_URYa)ZDt^^jw9F0l?Zi+cQGn;N`56}))#O|X~^kp;*RbyuSI;+(2a#%7m zQ#4Uz&>Lbp%LQrKEK@!J8YVCG6Jm$ijv<-XV|$y)X7s=6Z>*5X*ids<#WtHr$!lP( zfZxX%H%t7!3wwf1&*X<=ZIhY^*YLRA*|&r@8r=e_CYo5y{uVwh@o`(WRI+ZQ)`mCC zT!IE+VDQSuGyu~O@QjO}nK^4y6w@=hU_Sw`zfMviOQL_1G&r08`acgjXNnaR9iVeD zPP&{GyY<}!T&N6mH_6*vrFZ&?_^9IrvVbUmO3WAD>0+4iE;S@tHbm|O2FqmbrpLCoywrfOOYTg8q;KlG&qbes|1 zKQQy1=kdW))1ZrtBKlO5Ep2?;tM(kB7JgOKGWOm^i_*ewNdF5g>0us;-!`h9C~Sx zgUu#rU8d|svK$e*dZp!m9RpC+h=l*RV-;THCR~6kEav^9*(iJ`*ac?_uXVSB*D4(c zo(;ulwE$qAelGti`H3iVo$CXBz?;iYKH_1kr*G)rZJ~4tc%l(Ww1)KU$-8U5ZS$y} zb6^)7iLGK5&0YMso8ECEF}WE6__of7t6C&n+?7R0cd*qIB_7DVgq-S#sG_q@ckcA$ z3;uwDOj1QLj1ql@&cTBs)nxV=W>WY6$_hH<7kTmPW0Xyi8#pLpu25iB9QYg}tkWOaz#Bg^q@WX=V@BUp$gfNp=c~a|QuC%YP^Hh-n>8Bj(RjPHAkU!|A#+ zX7|)MwaEBz&%@KUz@H03*drrf&XndC<0F#fJ={6*KZ9QHDnHi8XT~(uSJC7Vz7WX? z|5lT-_ON{HK4Zs#@|O(hEz5E&@MX;4VLlqt5#%=E8C9I}OdC7ps~U{9nohtV9s{|! zj_}De)49MPP63A7ORNOPBS(I_+7n-s|2?H-R^Hec^l+>gwhVQ4ug4qB6dm(!W0r^q zS||lKFQwbs`{^HEo_Q6N<8PH`dj;^*$f*`Vx#zY-A$fW)VUf56MimZ2GC;-Gqti3c z)jN?rtt$RtoJ@M_r_b{afkT#}Jp}*oVwDtO>;k2??nLOg4w)~)^dj5_Bz8+V0V{i!>k;rIdVkurCL8# z1v?tm9}!d0tn#Sn;l*U(HwoWUi8Ig^Y&F~NTa(afq|t^PnkPR@*i!S9I)_s8LCmnT z!&CTwsCv_|r1vgr`0nm>tjwsatW?N6W#)hl&Ipy2m8F#@XC*VsAtg0ugvyf40V{J> zGIQuSkU39KIp93xfJ#aViem~0f=tifbHC5~UhgL_y)OB**}uKlT6?W&A(YBuw>#)qT7ScJy1I++oPhOeV*p~@(D^W6w|-qIH!daI(y8caV(r&?sD zeC}x~uZBr4iQfwRe8_NHRf`e4zpN(;VbmxKBxL17gx|dC)E^eV)GdshIt!?^=)%T1 zb%bna?z<(uq*8ZSRcm5g72UsypAUe6&c+RP)~BmBO}5uj_Gn(;s&r`gG%l)QSI?4e zncnaNKf2XmYW~D9D_?_vz8gN1#zLe<2}3>3SvAaHIyTo+Kll|a z4N-y;l{F>ZOpqzh&oqqaS}|Dd1g$Ej;dQ(TV2q$F-(tR1&|l+zZA5=LPvSAQ|rNRQU_fpZoR6{b=X!1b zhWSM>>Pppqmj+#L>hGw?g{J@@p(hqJBGl~EBz|=5Oj?doyZWpamThC~dZg#I#cS0_ zVk19%WK!Jiy$0Ao-R_RQT2E3FwW0flD7Z;34_;=^hjko{R!awv@UU&4AVBF~rNw_u?aFEXQR`i{FOBluA+|4b=i1x{Jjf z5$i`O3mhN|n8G=UyuZRH^i+2vQo;iI z9mB4B`No@&0MeMB**|(Ff6u`f5xy^%tRv@7e>)xXvhfpOoIPS?c6nE#$MYvaPc(9a zjK6PIxb_5BF{;Ef(g!&_I7U%IP*i-!9ZF+pp0mfvpS zFCLLlU}R3|jv7X`dE7Jm%PKLji<+Bc_XYm?!C{~aPH%X50vEx{n>f~bzrzy@S2o10 zO#}N~5kKw!BJ+ToIaR;Ivs?^}PUHO-I0C+mU}h+`So0QQ!b~rHuZvj}ZAK&|P7JD} zq5>x(S>)aI&d9i5FQvcw`x;UVms+*EoKElj*Hq;U)(kyYX7*jNyX~1XS$+!1$tD#% zbw&;*0>XSOaBUQ6xSpJl4=2PtFk9ZpI)lPr1xk&2JmTijw@69)mMYI3KvFI<07aaU zJy;%hH#06ZCD(D8J8*9<_dL4Xo~&K+7aRv_-*eO{Y44ATcXx~of>qUmlj2qGY>t?G z5wiPX;>BIfo2LGde^3?^!Z2z*H0+o_y)3n-B&fFiTDA;=?_K1g%5eP_R z?KKT#<@XS00*kC0>;8d|O+Wf=K23)Y-DaT|291Zt$)q8(1na_+EgH;Ev}-=dg@il| zrgK{Hl=gIY0LN(!0SEzIMsWULs+KuVx&NKjS;ZF+ovNw#k&mN`))Q2W)4MD=@4Irx zF;^hcoSgwm#xsKJK9KRl!REp$+RoA5ZWnjBXcTeA2U0U!9J#o3f4U_2HvOqt>*CLu ze+cz=Y!k8!X13IOFP9_rO-YC8=9$46S`&6~b_@i$jIpt{omYhyo1T60u`lTDABEr8 z2{B=hzGZ$vOt=#MJoa_(4}%?g9ZqZwEC+E4$W)byTJC?6uFLCDG_dFQBX-h$1lRrw zoYg<=nsm4z(ZoZ06k2^v^*Z}Fo?5{-w>k<>pysJ8UmJ8I<|kFk+D)fG#`|P8UsmeQ zKtdDcMEoV!%+R%^`mRhP|NH*#YILe)d^vUWi(S?7nQ6+=mM8(JEaA2Sq@Z0A^uep{ zsTa$sx1ba|?I;mXiKqVn?gM*oa$eM2w8|~<7{B7&)pUH&@etXKRqrKi0!_4OeoU|s zUjgC>f82M*-h!n;&o|#S`vG!13_ADN^Rajw2;TN(@&bVS+lrD~1JDw$;=QFamUFpu z6?5=2D+?ImBkG2Y^vM=RoH#2=kOiiE;Sv!EpLzgd3-EEVlsdvuDdbAsoWZSX?Xl?ZfC5pWfk;$rM|M9h_92K}>UxNLsfC$p0|7 zR0?w3r86MN&4(!OUrHDx(jC|L@imgNZVSF|s(n7FieHtx-WI0Ko@&5X2~W-(bSTKZN@5@s}6M3kzMMgA$3Od{UCuW`XsuLrP!kIx1C=>cT9A0 z8(8wk>uL+R{!^;qa$#VjMi6|1wi-t#K`V`jtb_m+LwHQIHJf2ttIz|jD; z?;bxc4i(k(Z^}Ah%`Ge=_@$j_(WNBX%+6o)fz%tvg*E&CW~h>*j7!`*f@D4%q7KQi z_MKp`1>5nVc=+w|LhbGFJiABUA`?*mB1IkCiw5`ADfkEmeYDy8bbd$AJgJpQ<)9~Y z0BhwtW_aiBJqV=`IC6@s2>Y7(Zmz?flnoqBTRo_}_!f-dWYk;=HiD5I56sm89yC8@ zg*obcApZk*^m9D4#JemH(baS(D}KL}x!b<#Fo<{0Crp8rD*b`#D~lCTWxk}(*qp^P z$n7!)wB|5XovRr3>?gjf8Ut^#K3sf0jid9E^L3$rvs;6D!O1Q{=C!bwko7*15@@aY zEeI~yQvYFj`j;FCn|;sq>q5>oVcrXYf^D15Wv7{1|Jlm!GU^X#4~hpfLR8&p4F0qY z>!_BJShsW;;ThwMKk6zlyij}{FKK9^=iCw(u-*-{p_^;eQ}haAIfGH~gi7}g1O}$s z%RwJD5JuSvA77m3?&CFdpfe$jRnpLvAY3=g7u}#=ZPx^HeLs8>@R{0Yxx&~Q0JcGU znwho2IKpm;a8^gOteBfe3m22BdK*6UJH<#+$P?_6s}a6@^Xta&>WT2!*AM>q zBBX{yms|utKn$ib26U*t`GAWlc97^i!*MDUf-E;v26?fHh-Be9z`#y{j$_|VxL#Ev^4oLcoPs>Jf_ z$D10MqTlK3oMvf)>CRD)JWe7sv#?U~NX2KB5_ABW@NZ`WuW%|YBQ#A-+#FlY5;SOI z|0wULtKn}Ueo(HW1K7VsrW2U-cTk>x0^zEVMeD9)2}8k51Y>JYlNtoixq+&d*cYMQ zt-*^~M*dX-^EN$9n8@F`dH*^i-amnsZ+R8%c`oyaPZHT4poHtYBG=3gjE^JE$CZP2-wOvR7_{)HQ^~eaVwb4Qlx!(Wj#|BW}r%dPaKElDkD>0 z69f?lKKL46mVJ(PK0hCTu}C-x>m6?M+{SpzIrTlmvF+$bKPubd3 z(@dofPjG@JY2})`Jbkjk+o@IDv>>oA9WtxR#`INt+pW61EG4E|PhkWLw39IAw`?(& z$atts-UFT5jLEqcc914`UiZtwIAGhSj8=d250gl*m=rF(fp4Z*{jc~hpMwkA`jNM4 zA84lEI8@ro3GK=v2T?V$i4a2sHZkRJr8!_JUnirwMtm)u57Zj`83mWvUK%$@b`;bO zk733jWm#iyFz_J$^tbGWGENSTY4aeAuxj=zR``)atO_xopOfZuds}VSl+m^o$&Z`V z@|z6)@Z9b)p5zkx93bnYf5ysV@gx~ziK#y;^@f{F2AW*$v<&n`*H#fJE;RgR2gsU< z6TbuawtT8-XK$yO9E?!8Xr&f3U)GE|$T!bF37Mi@s=i+2*B}ffKk9h>6_H`toCX?l=U}s&! ztP`PLJGjJU(O04n%w7HI}KvJyF zoDz#14$ee4?OGDZ8OL)u*0j|;eaVNah29y?3;B^=L_>l#+k$rL2JM0LMEc*9rvW_5U!C=&kd`gBP* z#vz4^XYO`VK+c?y6Q5~(X%p8pOBq*OUIrBXO2%r8KkJq^Bm^g&yc$-erzf8)FZ9KE`Z2Y2V znWen$5c_%Tdk*-HiWgGLrnk3uQjqX2GP6domDe2!tFTLMl&KIK7FPuf$9%Er?xuYa zk?{A@%^>td=}bhPO=Gb15%0TDLlqS#(_2iWJs&r~j({B#Fqq(gYy%c~{{?04R*v2^ zwt^5B(0FwHqC9i|N8dv}f&wS2n`3m4z+d*#`MYN7(A-NQg&eiJH@XGYNxRx3K2m-%* zi%yfTeW_CVi^e}F{1f7z-I|m=*YQ|3AS{#|uTlaD>JlD5|Nhjnz3EfPQr>2|Y2Q&R zs`OEPZSqM73i0@!6{UvbC!30KmP;n=dJfc|6889)?6*}Yoss-M_BuAGh&tu=SJFQF zfK2a@^AEwB9UN&!qMV*R0AW+Q1S}fx92KrpaD&gKWlwN^P7d>Lb0anmn0CTdr|9uzo#mL0JB+-1mwbPTNK#-ob5e}q1lY@0T5 z@{$@(2!6+-7TS4jZ>`}zLx5*%&v{Fobs!&8ZT4{@zLn(ow=LJjSHxLufi%xq=zO2A zj1nlcw(({qtSR|gNQ_b`16VFjeotqgoA|B+st7$CN61|42xMOkQyufHnimWA8Mi9? zg|hDYy+Oc3=RZ9d0*x`fK2-ydA!}--fw-i7a@I7OjLYFxSMSbddEaxS3f|T=`CmpX zlnkw=V4it`JUTk<2MAxHlXKnIS&J1b)9VE<+?>X15aOO@o{v1;fM)J}n(Pn1G~5Q8 zDcu}BqFJd)oE?z8XmzN8T9!1kW`KBrBX%a#LF=Pqf zsU$5(^mwdt{syV?N_oFBnVm%O1zdL8vTgP1&9fE z8E&1@VL}o=pPNz@{j>QMhN12zSW*NU(-2_nY|di6`3M4p_`L(;#$3Ka@}38x<52dP(mP{i_MLP zZEgOGoIe7zz-adoq(d3SyHO)M^jKKdS@J^h@Tz*3>_%z%-!@v#-4-&hSeQy0(%_8W z&yi-XyrfIb#3-TRMd%ZM?{{7l@sRH69;Y^8d0bbnKug1>v@96?Y0dGh?XUJI<2AXx zO%5sKUW)kSj`5oBIw}Y=D>%MmT6t`7?p%*X=lIHI+l?yddC+z;0Q2x%#V-WY&3;}^ zY_4+uieu&K>2bvWR@*GFNTleRk`g+_nhTpbvmTbZz=k1vu*NRjBp+-T$t7F2v`%Zi zC(G${fi-bwI`m#;w)m|M#x#D$U5Dlvr(EM%Cmm!`H@ zPi`jp62eZcSZc~1BWGSemIbmgY-P0CmSZb>qk}{qdrsh;KU=#K@i)7gXjH|dl{73@ z$*5G;wv+cqqWfv>R2%8=Q+57btT5&@rNG(MT?t&4zlZSX?n@`jEAf)YoqubhjiNKp z+ZD88NV1VnEvXio6J_$ljt5<>DfQV#{T($&tYhcciE`m+JL^S)Nl-B3dypgCOEhN` z9|6WMX9^F}mbEn5P53*7mVPgp_2@Oa?7eaL>d}bQnm?NMFP##5#%z548CTCVkh`ly z*cIjrw>{cDhBToYlM~n4c3L_XnC1)fxIGl7MJxf;d~z%0Mn3vL6?>`t9JUbW997}9 zfb2qIJol43o6N!rHMD;IU_5D=OT>KGUHhk3uE<(u^s4wKHp63unRP1-V9?9I;aZj1;YJ~)-MzismO{<3dHnK^xDbqMWcn(sT952{i z|L;!g#WcZA7N~^#1}*|M^&1IM@4>o%e(3Hh^`JGi+AS1M5}mGTp46Saz;EMKTa;SV zxE3tkzvBlUm=4d(pV8D>4_+L(&;LE{ft9zf1g-Z3U7KaUNb$J0P@I~9B4HRonUmH0 zRFFx>pNn@1`E4#t`%F4~r?yjs(b0jron@B3Ox=KDhz&Xbrb%_I51zxmth*RH2wc{_ z>n)gDT=S0?P76aZk&YAurEp*uNXBhi#_pI;g0&MH9nWqhtlQ6;V!T#6 zK#3UIPD)f!1QrOFKaao2sbU9oZN}+PFe96fwE^{4@Y)5@^bS3_C7q#Yea%It0Bl#M zx5Zt8hAg$j6bSq4;`I5Qhw3aW#dSQfw1VI0T5UJQ5Zfs(PsnnlWdSF8(!QqFG{S}* zuSb}H(~%~mmraiHe5iIjwDK3u8Fv)SW9wxj74WAB5x;AF*e9L} zpb#ElvZ`W2j%V4hWRFWm2u!F(D06RbMUSy%`-YV3#mZM%8~1L9b@N+tqPpy^jInlr zHR&=FOPEv+@SN;5dXiIWa*#B5sr1~~$D80;Rij6h#=+OXkJ4J28b8nMmFTRI^C9r; z^;Qig@=enaI@!HVlV)Y2JfE&^SstvIBR|%6(ncg&Y_yH6~8VzVW%~S-_ z-z=Evp<7&2$!%dtcDrL68NkJT*Fr$!od*X*c;S`_*ZbMvXUb#62ffI(P7_cdy}m@w zUHrVOL8Vg%!zn2kS>QyYAUmsRKYHtgAEFWHIVDc$!)0rEI$OMcrdccr3Z5sOErl2a z$`g@^`s=WTTrH3=v`?dGor(1BBqx;n!rZYmhvsOHYM2L^R2*+zSly}4e4$dM*~tKQ zRUg5(fysX-oS(hDTs86(_i|y7i34jJ%O`%o!P1K(!HX0?S)g#3jfqo72fxH4uNZh% zxz*jIBX4&Fi0@q_z*OGi?!gW#K9(?GsZGywIzFgCkginhBxXEFPKn4&qT+Xs_h31f zM5?5W{oNtrR>fmH1(MNDoZ|v2r3az9tf`ZRTDhrjm^dCVKkS|wT6XPw@RHtFUa+^% zUBddc_nIGj8VW@vVY4x6Om-Q5ygbx<>CGuv`r9&!KXb3Q2)@b1_|TZ12adh-X;u*<|$r9NQ9zPcVR{H8L<&R!PPj2Ho zeMAgi0E$h|ukA~CJoQlr=qv13AjL^A0NN!#peDJX&e?kzJB@qfAeWm=vkAF3Mfr{Fjs$RMM7FoyS5%PDH!7pl?PT&li{9 z1vUq-dmbB)SkKT1JtAX7Px!xAC}cw?%IR@NkYnAi}CSb)f1@oCJ9ktRs9$ zY+y*fEA!QbsHT|UB@$9XXCI5f41hh7;w3Y`JM%JiR8cD3Zlffwb!iD-o^Re&ovgmZ zpH?HFo2(4NA|I@!oo}~ZaXj-=KpdA|8hE8T8Awr0C@LO{6;`&$2DJn~fHa5Fed7-c zr^GIm&+wZpbIK36em-3A`Kf!pcUP130sq4flCIe=Y8>y4+SIaR6Aq^1jlhZ-h(2NA zN5cEN! z#+(mgqStv8Mv?V}afXL4(A9*a zmHiT3WQxVC#XahNu;+OIY{_rJWW%ur4Dmkx-z;mi+n|}1(-I0m;|6PXTdUFQ&>1P% zG-5XNE&))7_KD+s^DJB076kz494{BaIbk(AOFuu`mQ;P%q+{d<1Y+lx*^y3B=`NYc zmCarPCv+JqA6im)-I)<8-6n!`%)SS@myg+3qg&V$2hHvj5&{qe*351Q)Gu2_3m1Go za?)P|CuY6r7loe%mtJSbH-161$zT&fRJr0;yq0Qd0)$HZE0_z~KR@-2f^urO<58Qs z77Le!EPPAk?hA->CRZGGTv6xfEdmYgrDwiMt*X5U*}}5uMS7LG z()@xQa9L-Rx?;6h-OJ13{M+?+;ZknR)!*@phbSqHitJ1gcUHH z<8*n-Kp5Q*d#NuNKXWYBY#56x`jUAU2ZeI7k;gK&dO=IF)6rAwCI zYqnhlEISoZH@`^%L{T|-Y3{7m9Gfw-bQjV5x2UGL8}rjOB}p)setBTbLdza_R&RG8 zD!Opa??2w8(Czn6dN+!%nn7^scIhC0!(@UFz>7#23*3(h$ad0NY=*|VegdmN=p5L+ zNgcG#49c>=gUkP@qlkp7L$fTWj+9{8Dtpcp%;kvfL>Me6NP(-h!@l|E>#>)Z zYA+K?5idn5$>i?poc`Z0vAPlk^0zY@HWTK(7S=(ie~AgkYs~v?0D=)@Kh++F+Yj&=j}LHXLXJfk zRLt0Lub?AOsS+^P1-(Pp*aK?{x3Fo-V%P+ls}L*t(TkPF&b+g8y{WZ+R~AtkB>c5d zum;12{#<8hwSZjjjQN#5Rw3M22*nI=yjX@rNuu>}Mvyl^_t;3ybs_8Hyn&~@9HsY zb*{N%YfJVGmhvFMUi!;+CBNh=Pfb$a`*dzQ_9BNLd=Oj#46<9+Vf?a%o3w4v3w4Nl z>jpNzOSC6)v@C6b#P@B9x)9yjA4UqXrDm!lni5QAhhoEE5p8U7ZBCnQS)DbE@yuENr3qlP<0{LyU#**pHQ&NT8}v)ez?ZEp3S?qmNPN@6@^ zU)UG0{nJ47NWsR>x0Jn5vC>^f%ML#y>%#^5KyhLMXZzx3`Yi~~;=Fs+wx(n@x{mL( zCKCGj!6}k{>51tG7g+QDe9e9sFRYJ}!bK>B&jAEzYP4P9mTW)^b=Viir`Skg3zZd% z-`*NnCBF*?+N9khuqppb$rJjyu^kl6btf=#-SCe&J11;lk+5(0nE+?dHlW5Gh<*_d z*}-79f+}BH&8z&iZ}R)KJEn4c~(bVhHcoA~>OCI0SsCcTPUQz72l5Es7^`t1@9R{p=z1%LSE$Ngthk!Wu@H zyg#gY?RrHtBH$2(y)EcF9{6CZ4Tkc$9ObpydILwew^gB}z=Bf{XX0AmaTAPBN2d|+ z)n99FJ_8>6VYd!QkWQX$3?)(Az#rQji{i!jg&n=W#>=`jT+QS9OMnoxiMtbix~J|Yk&Y`|OH<_H=?t@-kQ0NEQTQ`VN6FbwQOYpdK)CeQ*0CuzPq@um&oAr5L5jwpQ8XP;69%zwAGda_)O5A)1aOqf zkzOkBGLxRk+4}^AHl`9;7OqiEC2?NuH8}ue(<7@xn-9PWg?Wq~JXDI4-;fEYd|s9ar*Cx_>S? za%(3QH1!}n>8<9n#f)W7M&&79v^oofK-9Ar-+IYK^MJoMq{il!Q3At*!XUC0!Hu-w zroQljAAD93z~w4Wc}?we(39OEIxYO5vCa`1zHr+$2ur&L8Gu_fzOpBxP+c}AjwgIm z@J)`6<2EQuS~e5}RS;uY)nP|-*$vm$WQ^W#kNCXY)mW1@-d4JTLa>~x@yFk*TTy4! zBL>&nPZ4~N0eoN=5n#f$f2vo}7Im^uN8gU%7#t*3QoC`2bM&#Z>mG1FOji-#UyW6; z3QI+0nVbRyEdDUEm#~7HLB+IbB)Q9mnAk#(s}3UdcfD>ZR$k-N=67 zOL+l+^u48?&h9l5sg+@ROqvb`xIj!w2PXmK5(ot#ZGoWBnxIac&Ne1k^d5o-u8@Ti0pCK|G_X&=hJKxnk z3{`$Ki&Q#tvLXSAzz(OPB8L{y0)o!E;~GI(_Rl`_Uq@bTP#uY9H7|4m56DVFoT86O zz43MFpS|2WUjuzx-xY`#{}k|PD2Jbq0MTBG(t%?qf;BDtni?XBxNREQMhv!7Gw;aF zNYM}149S~g#=|{8nW~ZZKn(rhJyW5S+)%Sa#~{yFV0VO4hV2v__( z1&nmOl>pmm$^L5eBpn1h8~XgzH1MPi5OWaH18bSOi-9V}F9ttR%yEA9aYaAxwcAc* z45v>`QZ&ZzhkC^jlv%f=T@)>A_))^jCx8l!9S{ zkN-}Jx>;LIGxd^h=5&$8aT8+gx`&Pe~6qefq>SLfkSI+EfAdVmmT zR)9!SXZ3TZO-v)rrWbM|4qhfjNGF4Ww4qTc)%`qquJudd!reJLuebXm(8r#MdTvPs z=aA#C;E%%*tYy1G(;b!Mn$m$(DlD6BBnrF#`?5U3kkHks!K4ApaeJ>Ez^dINEc?4g zzz0TS^@Y-cnRBIvS21xxRY^%pIF@PXoefRRb@vQO#ZIK-)N43_PkV6gwY`_iP|6gy zh&ACAtZlm#bLjz=PU>7j)u&{nxMEr|oy@9lV!nZ8!|P$(@_N#VcNVDsp?*gMs>VH0 zYL|K=SICB15!3Gq0-!D@_V&u_&;myGw%ZhfJ-yNg zH(DD=X*D;~G!5g#ef_F4go5A`2s1g77>HatKK-5G!n<-s%!!?h;ZJYgL@q0(SbPFp zp<8mhu_p;mezg;A)k462^PEp{gfk6%gvULK?3<{h|AtiTXi0^N?>7I*GG4Sx3$1iswb&QFu5?85UPV|LYm6OGPXOq-BVp+q%XCry4-U`AW1gqpxRbJG zdOM%)JKKvb9S6FoS4FPZkcjJKl@G%k{#>yF#BMIZL$uQ~p9+2&@?ZWj1=p~_Xim9= zjMu(DDlx%0yUukD8)Od$R=I^{pH&jR%v=jJLZsXy`X-pINBR9bj{dOrJ_4Y~ZsMD+ zt?8KePyH`~@p+gR68}@^vUuP{w!*Jioc?0*n_%_^(q&OGzT;YN3RAO?`?wY+spl67{U*@Sl-1O@2kBPy2~HItKIY)*`}*X1knhQ@yjY zv5)kYn_d@e4sH_;2i(h)+%QA~FwLO=t7{+Zgpxv=VVpMiVU#alHYu!5rRgq? zhc;*g1M-N6#bZuem1K%bMZx>%vhpPlF3r@{mT>{TXYEdi*j$DKrd3Q7bl)-yCBog8 z%x83WR4wHQ{ip_fDs}NHi6~Ys=dNs4_J}m45$n8Vy>khCeKuuV@t(Rd`0J^&-1U55 z)ldAY3AS`%$Z$Z=rddx;mZO8noV!5XjVERe`5NAumW+LDHG+Sbob6}u zbAD@bpMn}fRHj+Z|JMt^f74;nLrqr?5<_?=VrwhfQm9Dj-Id`!mS`QP9&jiqGp@{u zUUep0+Dc(l#R2~3!_08W=^iA(L6X&J|6Q~gh9-fyDj!!_OMQgtT|=h`+brOoy|sLcT*EDB%boOkB-H7t9ZS8iu z(w*iFJq>T(5U^6>qDqMONlN3AFUnz&0Mn#*XGb)lM$Y-28#_f*i@@IeF7(*(!ROG! zxd%VVwmZ$&U8>5QrD{s+=EebL!z&gd@c}NM+CH}sK1oi?;6u16mk78Yh^j~M53mak zWg%5=*}jbIP<(WmP|x@k z1RAyEK22$Aa1Fij|EH_XCb%4S*H70jXb&`!pdn7Ko@-!J7sfeZqe+w|cAv1T<{7ZC zE#ZWF@CB-75$TJ`)oibFdO`gLdRiQ`qZ$hOl^w}1;)m2I@^gN|0Vh`gmy{kp1!AoW z&{JYec?dheio%#LDs>jOYMG#2Lt6tb9zo8U2Dx>k-9$ywv(v6^tnVdqU3C%-S``#> zS_`jI9^t(9B(^C^YKrX^#fNd%GTy01=+5gDIfS}pEajAtmsVJRJLge)=Q=S__?^h& z`)Y>2b}@_s%+BlKG0$Sc25Fy44suuc^@^F!v)b;AXRrQa9$cvLW)DI74(;ai-`eM6 zaR1F8P9|wuySD>gXsw5)*aM2bYoP#S+B#~zu$t!r7^OU}oT*$+bFR4G?S_blOH*EB zPa;q91BqR81cT@!TuN;^V-DJUzLG-3#R zn69v_2Q6{e$tX{}YghGQPanzF-6-sp@y#y9g;-x5{#?1l;Y?y^>ih%8+3^BdX^A zp}q^O-4*Cx681tI^$16*-4Wy@zyn|@*vF}YX;aeU&#OTE5U+-XXEuJWtRfPX#k}*f znsxLxouuh65)#)*foQyhtD^~LrGV@7CQ%8=sbnljbnF{tzkK|8Wfvi`gfy^NfnN+g z%IYMd2a3l~zj?maM1mfIEK*il#vOcs!(=b^Qp&Uh>r;|NC+x_>2nuMl09U_W$HaFU z3VSfL#n2T9aE4~Kgqj*J{bjlms2p_4G_%bp4%oZowm^fgsmi3wJPZW{w+*3CvU+r8glN$S4ePlN;YqSAZ?i zzqXj@jGWT|umT(WO3s#m?JikKF30{;aSeA8M8Hm7Fl_#(;aOmBwoB|#_?Pq62DS@% zyg8|&?9c!^W!SLlZ*IRv`WeuaRu;(HI6i%+eV;p81JgjbnnixSQjUEhAb_6g%0}kGvu); zI3`4L*2=xHJ2`zNR{^NdR(E*zR72ivFEsNTxQO>riWIk~f15uU`auC8E>EjCty?0_ z6$AL$&N;cfHuGJoj2pHqf+2K-iB{M;Zwl&t1Y|LzIVC?T!iA}2lT#_)yN3t=Z(FVh zC(1=Yq>sE?Tt^B>=wAZ89b9Vrqr>!enOjXxx0UiKNT--D=3*P|TQrF3FS6ZtsCEAENPjSz#=IocU7J0NprC=N?X{!PweM!RD$&!bS6VpP(Vs zBA2kM(H<@*v85?o`(Y#AP4P3=d$=y-As*~vr|!l`0!(p%vF{?r-F-#rAnvo`S<{f; z&$1Xjy5QADc6>z17_UXFLAgs7iS{fOFbKKEfYVA!lQXTRp}9PPUV%Ozy(FHQ9_WSk z6m@sYQbCOE(UIx4x_CLNdY(U+Qt%Mbm9hu#CiO0-Q>noi#-iwUq{dPd$$Z8fvi_?D z_(iE`{X86ktpDL$yZq{+p({q15zKQHX5_^h4-CWaA_s-Fo3sSyv3a&D{;q#E8R&4v zq_pmicO1EafTe!2@iMKBwrIDFAaaRtO+;5TR>_^Mcs%X71@i7pz^0`0F6Eb=odwsr zT^?2M^VS|3dMa0W@ax`N4_pT&!!Yra?aOLTva4`kB*DHy;`d~dqPuglVCm$!3J*`-kvK=GSc-6{y4KrVP1# zxrJX|Xs_l4C`*1B0c9KQf5ERwDs59Z8=g6)Jv5k4AG`>DHrpr7A^)EJjN(q>73700 zR!LF=u~lzkf%(k9Bh1oUuM~@^hzQVRny}se6jQiQ}IcNNz6rOQfa99op^tXd#;T}86WyQ7StM@gj$GROBHQ|hc zza)_T*&~!X7?{h|q=jJG*K!aO9N+QR{(SSLCG=epr~NYxMQ-`WwXA5J^w5r{IG;esSdVOp%6R$5qo0k=>Z6Jmzp zT2fUqw_1;J8(I|S61ER%+yjQ^C(D=WsaabUgCbsiZ`N+Nx=nR8S}|)qv6I4YQaly# z%HqY-))VmenP&HJnV#cY9CGJ7=KT=}fVb!}2btAf{$~VAHnL}Bg*u# zB|xb(LlS|1diM2HM_W%Il%wT-H>0^i25U$tSPd~3S+eW|O;HKUnDM~DK6Dd$P^?dP z2H%3q(GrmkzaR9)6O~cuwW(GDAoi6C2Kqsp#@8idHu@`ulte(g*|b~gc@`+(<9I{K z2LqtM^D}!nXKgX!?10Q_CwEKOp?l8lfy~;Qwr4tyah)ZvNG6DA%uoR7 z!K4`f^O+}sLNH$k{@QzDGbsXK z_NzU-$(G)I{Dk?Uq@t*UP-T_hJvHEK^pBE)84bwS}iDAeN!qW$;J89PruTmN@udI z!~dHU&V5)%&c?6&`tQ?iheq9E@Mtk-5;ty6x@AVVlaA9W$Xg??*}!(&)GOEoH#Wju zj>0FfN3laAM3y2)haDKis-*YgLLb0h+ccc_m3(P#{G6=*X9HUD4G&sgm^auDVCHPUZPSbowC)b)iER?gD`ZLUR5ItUVs>hxmfEDXm zo%~R;&m(VR99UAchWW~%Y=9FjN#+UkbSq!#&#R~SUnb8!aNzE>IEa0$Mtv_epm+Ae z@K#I2lhUuyUmH_qcy$#Vq*pqaarIJf$abq~#HzO9^fzz@tm2K`itCt@E?pDyY&Df@ z6oAgAk?E3iQG>tEA(5H6@!@Tq-~6SY!N-3La>Ev(2`RfaH;GT@W9`Af>0m!$S7qfP zX~i#e49twbh7$ocOjMr%ZkHF6^ppXdO#BYe1EYk)*$=WhHjdeBh80Yhk*}F6!wUqlZ@^WkKiS3Q)G@t_Q?M(jx5ue_AwA&HsP($A_xzlx}iqJljlJBO{s)l#4+$UtrJBm%109Z#l z2@R!`*c^3<0GN$`B5M~1KiTk~vNbn2Gx@y-F={42z`JI7$w4f^8k4zVN8r!l16|Ee z0|~FS3}`@C6=R zljn%a4JmvRBSZROTiDhQxpBZ%148XXS^(2zkUm2*ZIAk|_>axZxkOD2G&Xx zoW2l#G0Z9-Enf}Odm-oC&>m&x5ZQSQRAiO)rrLHFe&Bum@7C?Yy)0#}cyEnccYeui zMgW)2GHtZ46<1Y9rtoNUEo2i@!Mm}IP3r&~Vv$HWTo)FWiGrrsxWt6?;)#2R^{S3CIq7mz}=B)u0Z(3m7;@WzW#^*TxnL zf&@Q;F#}_3*M0&Rz{Z{J?GBCZC=g}>0Mc@2Zi~EoqEM0LVQcH)@&M_x+C=f6^ouV0 z6H1HIWo}d??*2d1iPrPVXr?+DbX%+UZ|C~OCy}?uow_=zveFKb>@T^Og)du@6C=Ts zKB7j?Ed<2iIOCc6i$V3ni3=xTCm(whyx5k1k38Xu>@JNoT$#Wav3YapQ#GLDRO~$* z=DgxW39XV^H(jR)j^LtUATmcd2_?@=HKpA8fafDBL%Vhxo;M%2jf@()nRih z?-8SMekU)SU~gm4vqtI~#chUYvV2+O|Do#L|C#>d|NqzP;u7Tu4YPgpJuMX~|&;Q4Z^bm*jky9JUb!_4@KY{-^J)ka`NY^BJ;-Rn%Dk4#(T3kSN>R@qqE0!A)4 zZLh&9r>HZ2eDF92f4{5Y$t%<7JnspN@HBQ2|3D)D)XX%|6w z#xn*Kl4C86Id_||9DB4oxcrD(8+dY$c|3GH8`m+k3;ub3?p6K(rjN_y?@;OUc%vuZ zh^(Fs59W7qDvS2Lq$7EI>}Vi6Xd#4CjA$+2`egw=J*Q4hGgsmJ+CJDw5SC;&W}9UTB^qVVtrYLI17EQ9U0TQ9t+_F){u6CKCs z*(pxvncSPzlc|(+d63q&!oESraAIr2|J`AU?6%bdba!+{R+ydVC{d_<6%}Rf+MzFy zFLbA7kXEHL{E88p5!|stZ>03b!uMqzwXa5ueym6{au_i?|0el{!vK(p5*rs?PKaaL z4`ga{UK9-^PJZyaq~9!$;~Qpa}k=y9FK>=zE9E2HhM{nuyxTW z$l{D+^;i(1=1x%;me^uMc%e}`a1`LwoFyA1VWWXQ6JW;@J*Fm=0#bl1!&1Hk18*x+ zBix4}cg7XW)Kva-zBl3|u2O!PPqjp-cCEGx@z2N1Qu$+}j314KKfa_Zj(cvYrGCE0 z2t4}io_r`sK#6>Uo~v?H%+p@Gf~AZu?q3BzJ}~#4DPP#j`Hf=G=V7+}7xaqyH?1}6 z>7!~$*q?F5i;y5XV{6xhX>sR8vyxbWm_gl`Qgn6xSQQdU^`@Ai-YYj2`2X+w< z;SGu5v#OH+qb=18g|s&P8sVdzeeRt!Do$SkAPTiu`^xX%gPS>X6~(NlAL5L*IInCe z%BNcM53?KZr;oiFCU@IR{)mCTt?6_Vi;W9AiDM zVwYF)S4SJI()#y9^5TIVHqT}<@Q(rK*@2Is*qQrr2b=8EhNW}?|AzJU^SBBsRO zKhzy7|L*xZ=z;&nr=-%e9v z8zvaspTi`e;Gch}Xij@=tbS5>a*Lh2o8p_!QP80@)}R_1uQZmDXM1`-JhqzQDjEE% zAKvdDe!lE#dZngb#__Kx_s#36fJO^RWc4*jHFjPbK7W{dp5&vyIIM;?x8e_Tf>Mxk zn?UvIdUok$-n1dY>5dJ#l;xQg1PKUit|;D{9;w$NmMe1ZY$Wceu2n%#P5Gu}qwY7% zkghzZya=P1So6kbR9<`lcUnnqv< zPv;M`KUl36WzvqDf^MalopLjJ)nb}KY8P$dpe6P|SB*}Q_m11m`OVc)n3ZCgTRiCr*gYDZV{{{ND43@#17JFl-wLBn(Sn^t({$#xh{POP;xR z3>08IXhu;t?X(7-`zDRtnIvCQbdjpsO1vKRWQ*F`=<~V(p$gN~(79ls7N$4=kBUjD8l{u{^San<$oUbGdR5_NPT0jHL3g{ zTY{KWWo+#+v+9MN&|#N6g$=(Vbn0c{P-B`M9o|C~|H)>77rq$HnNCL*3&Ks0+*sgF zzbdTcO5VW3-MBYuiStFI$oZA=J4G|LW$$+=fNaO(Mp7s)bnz*FBkw*m($JGURuw`o zTf!D}l)>lIn68#CaQqDaf{<2|E%cFO=mnW25G!G4q5orEStgKB<2@FDk`v(8Ci-Sg zaKjjD@b3dJ%4S?Gh%0=pd8dgx#8 zlBe9aOmuLU?pm3zHK|+QSa|o>JtjQgX(cd~h@U|`t1x*`_eySTwC@e@4w?;&!(EeC zbI*~x1aanAsh908+}FM6&1cv=X>>DP<(PcM`+suOJTG^m>}M7$*h6}YbIrMgJ{-Xd zyZA(j?SC7m{q`X6GPx};KJ}n23i_J=QC6#oZTO$q6<7IWA^??7SqAMLSW&s0;qZd$ zX$xzVo1=q8c2b zZ2u}hNr1y-+AaDTciAfBlZGMa#bFizo+-fq@l#wbyOVMqk2uAszEczrC${VWcDI>7 zyd0qG``xmNSG(sW?z>fKT6^v?8RfRKTCu#}tu1#D2{p=P<%-O-$4|%DSd3#vs_RN+ z(7jAid>M%62UIe^Va|UTqD7;tiWtX;zSTRCv|lw3T6VV2nRZn=5RZ=#V7DuA*5kD- zQj{|56cMK~G0|vaft#70Mj|XJVe(f*H!T;-+uY%z*ThIJ&V(VDN0=g9(BCnEBby{( zfyI?E#3bSarSLDDU5&3~%GF~7;$}(a#!c6v>?}3*>E9!PDxab6HzaJMqW-M7yni11 zRJ|l=tjRRG;wBzoe}@joMTF~uHfhiAxz<~OcQqc+AP~L$@^jnQlPV?>ebup2fYH1P z@6eT?VQ=%*Y%yADAOUu?MAKvZ&F9{cx{L^Yb7x06|u6d5`h03dqY|Ny7Q-l)xcS*;gseJ6Aa}IWtqt5 z%GgirqvdxxNy%_PhjQB6X9q~1n&^$dL=4Xmlrykcbs+1H9iMnXXb$fd9NYQ=baWCQ z?j^5=mH3Mrw*ij7DqlTFvw?U62pVd_pvixp6<>~6&s~?|X7nl&@o)R;3FFj+x>{k6 zW>?XMCffb3wq!V=vuG;BZjIR(qRQq%0oC*Tcz0|hGZ9MO_Gk@zrdz3{HUEAM7x*@4 z53oM_+@|YQO9RAz_nA|FXLQc zGLcqnvJQy}TnMs(x)1Ss`1`zU)dKZ^8FnE#U238%~=$daQ;85HA8OiYO z3>C#Y9%>7|!;<=z1t46%@OqgonANbZLLJmZs^n5{E%pjkguY?<$lt562hP0BTtyRR&~~TMdl7gxYwAIN&^xKGmg{lS^8nU zsU4c^Xm>8_68Oe)^pPuR4aG}mPwtdHoQ*L6YG+O~NB!dTRQ4jD-54LK-B{Vz>T<>G z;HeWW>MxcH$J*f|6_HlsO^--ZGOrI!+Dq-^8y!I2@JjH{z-42lU114GvcJH<$dKy{ z{K_`W$6C%`8C=NLyXkI+mSU`L;HpvlWdc~*rgR%W3+d+`3oAN-K;`rVC*s3PxqE==Z5Rs+N-qJRF+JCQ z5Vino{IZqUtbEA5&m+#oI|X}16VReO(a&(j&yL)b_>(h;J#B${$6@y$JR_!Y#9KA{ zt=DPyBQ&LSiU&bRROfo9F_>)kX@XI}&9XjxGQ6T~^Br{b>U!HkE6D7lskHSfkkc~c zgMwh8vTvD1&g~_qBc@LDf)fq^_s;*_iFc3RKLrSzY~bZJDjX~O+6_f%3M!#l@6RMxoQ%DAIQedc)7 zyYr1`y7DByQ+y#_Vz>9mv)3KMl0E$ zxE^Bc<)Cc5Jggga9^uH|Y^SgTC!sJ76rX;N}J(H>Q2P&nx67WuuPH{Z2D&&fj@s%TKr z@DDM%AV5%YD9>yWt?@j+jiprSiL0DedJ}YWI?3-WItGMR0V=kc!sL*7ZVK|G76kQm zG>j1yQ+3upMh*RY?;VRcnJsjia;tt;A9vTMybPp;;_2`%x)IB?rH>zsz9pGaBW??S3QH<(Zx2<4ugGO(ni$%AQZM6*vw<& zj)-0+=~K$@Kj&uK7$ITO3AH1eM+G9c$sfP%hHp*;pr1y)Cy7`3Hyc~=f*>vf3O|e_qKy-#)^IR zsR^E9gWeT}EgQU}KT+78UwnYQe*&O&p|EzwEWg?o!k%L9P8R&IF`R+`en_OfXJ@SB zEMY30n&eZsNy!AD{qHqWD_liadq45Yno~8< z;8kO2FENz5NPHJ#?HmstR1+@M3CQE~(ZO`gHy7booF{^cF3|k;Z|-(4z}H*#R)EVS ziMUs0bI+$vG5m4!u#*UJixJ;JqOhwRul#@uxRD@@9tvFnAHnvt{Dm&|7$;TIq){qJ zJLm%Q6hgk5IX(q1&^`h4SW6E}vmzUpg^hlGgCofe`GhbSj*ES71u~%2YaILWB(b45 zpytx)kKcT4hjjlLSzN7nh88|j(`$jc+G}w(y7|B^EtIT5*GeK5k_6Pp1cz5L5Kufa zZ44d!a1vPD%#xY{`! zQn?&(+Q;#rN*=15fHd%1=-UE3>$o>3ZAKrFuls_%QiXq(e5CG;0-gNXrvnVAH;-Oh z{AH~O#vx0rr{xluY1?Iw=ecXSFk+Lae+e9Jz5}S7L!==G0U+?pf7B8POsM&|irC>% zAaXi4aNn%Eb=j4azoifX5H!l+1ekoKCI0d!kOjFV3n!6Yn}ox@LS4DsYl<1~Ej=xP zQ-Fd5lKnn%L^UrS=My{ny!4ZoLJml-MM)`!d255;=?48%@S=KMgDYQ<|oB9-}~ zs{T_fVUK)yV~;UxO#o-m+gC#|V`eZ~#)d*g#|%4qgDj);S61m=0zGgJx%ln~3*7Qr zqS-}2>*9T~Hg-sl9QVqBxm6*T2d{rqyajH;4q^X~ohlaj2gvKy##xYH?xiuWTW{dz z#2nW31T`wKR=gzc@~4sB7~5TyJv=jslfw{vR&-^AA`7kAObaLtq7id~BL%fcm+d4M zdna>b@LIha%d^kVX1p5KRb^n``3(tq;JzYQ74 z_L<|a6YuBApXwd+{E0Q%x)8L?_gKY%TEPCMT^&@_N@-QI`nHhv!8?@C9ee|>$K*iu zUDV7@>yO*PxiqSR9GN=wKILco7kfP~yZ=u9NPn{;L)2>a&+egj)4A02owHn)kHKBZ zF>P+`jO^+j1nN=2B^Oy~qyv?|$^R#Lt$nLC2l13+C8*-?+Wg#>5zp*KYBAznjj7>4 zbrTk^F&XIc&I^4WyN%uIdx_294L;B2q5Q_*Aa}vuX{|LT9FqG+3;SSvfuBcBKZJG2ZpNQ{OfvG&2R>xd2CC0 zJJ1ae44`NuIt>xPrVk1U<$#Ab&KkrGgSdgI4#HR_`V!6)j3Cw))RTo%LO=CJ(N6Tm z&WMc)d!^l@6vbS#pCzjbGGiIOl05}7yMlNTFZvC=Yf{z=@- zypG!Fb=x(GakeVUfSW}`5|tmN2<~Bd@rq{1YeEplDb*vdBnVEW>*j9m6p&spiF{efOLPFZjlFG}&q_ zP#CVTyYg698uhR6i*BZjAD+L(s#j2zl(tYeb^pGb`O9k8W#OsBU(Sa92aoG&2b&1{ zbFmE=aUW&(2{rWtx_*+0Gcl*z6X%V+XmG7=P)QC-x)M_m0RfOMeeU`1;M9;sW~!FO zW#%HO_VMv)4Qd^Y8idF-zo-C*H*Rmj#u;hnmZbOnM%?j=zh8@;5najKp~gEnumhL{ zB>ls`oV&>x&qI;XP@coPQmeJWq%~ZgDR!Pc&oqS+j|TieK_mD4u(gWB#vom)slH{v zc1r31o5Eh;m$!Jev+Glu3GqCKwxyy(hXp?~R?UlQP}2uZ5J)Y~LA3!lF3(0anx5J9 zT}SqD18?gY8_izW&-$@tB_3}p%>C+A$-1a|x@jZJ?hcvh6VF(t-)uS*{(^MBLup)z zUo@z~1nb#D4XgQYIYr$x=_+XT>Arym5uV3-&-a!pZ!yFcddE?G9ziztT*t4(4g>DK z5g!;4uhonETrJdJ&m{Pyfg}n6XVx}eObq6>Vw&X@a-gT+~I%Q#Vg)|N6 zGhM(*pzoKz+X1AkG=YZD2~2~`BNo_ZgSgO@duCxBk&F8y^d*a;URGZVGDB8O)zx0^_4km-Q!)f2pMq)wEG1EEn&A!% zCkJzTKURZza6NR!xeanKIVGGocNwkf9mcebd<^glXCm{9oWY}P%mEZzthw-<962qU zcR1*<*7k`^avSubRFgUuw1k?Iw$mA+=oEGrWlYo+`)|1-m|fPenOtm(e*MdTr*d^K zJt@o}9bY-$*#W;|w3S@};;pH_XP^4|B!rzD+_UEEDM9omv{vN`-b|V5_-bH9^YVIt)nEQjQGO1{T0N67 zaSK><$*1Tyse2~FQ2P;^XUu>?Hse~M^7+V85KSuWs`7uAMJsC*r%XMj5!=IDx#Kx`8FjH`Gk**3 z#LYgOSk=zcvHT;DsP(&A_70Z34%qbR$bhhe_Ln7Q_}iukG54Xj;W0+Vt%4==oG&gE z-2rmtS=c#N*huSjlJx;p9?phk|#B^49QqJ+nl6F8z!07 ztvRfGLG5A_YuUXv%ehn(d6~X#Df~czZ`L(ljM=$?|JX9$*T&jDXG71+Q3?@c6W?Q`!ems?^`8iqUWU#vGp*>E{+8RweW-^BS?c2MoKXPyDbRcyT zId!ReD{t`W`^qCH58)ey*$c-`wd~pbza?b%$`Au5n-GnQ9T%;J3adP5lQrQdi+;q( zrkF(aedvb^B}D=zVO}UuFHJ7nhHLHf@Pz=S-Bb7XxOqXR^eZR16(79&^sn2c1F?Wp z_E22juQ{j+t|9l4^33OU)$H2M=g1xOY5*4_esh_$$z;8wfhT_>A2lLeZ+p2$WP|u! z&8jS21N*&6KwloF?YWg`+YpV|wEx+4uz;$;JU4Q4&F1OC1af%2n*f9RyUpDex0|Xp zeJ{DgPka_9F23jc{DV-%wYB0V-ybTCRW(cs)5`3{RmiiowJL#47OmC^P~b?*$b)f+ zDf4ZI+~qB7HD2V!(c*wym7bc>F46VLA73BkTLR81S8%_@Ubt<(li%ulZ&rhEx~?Km zoLBTb1X!DK3*0&lF}ljf{dpnjK%iK5!yf-V{eAJ zU#Eim@Tj80daW*`I^gtdXWNAU~lou-twG;c&X{2XC-@Ym4gZc@!h^zf_5=-RQN+>mZ~cK8Vz)!*_r8oJo)R=l<%UaQXKlelKKaZ>7&?JvoBQ4 zjefk?du-d6O_3J)u9v-VVX}}BfBa6E)b@w1dAc_2qF>29Sbr}oYD{b0qllM@xk$D{ zDZ$lvEQ)*${Wh%muLuo;)sIU+j=%`=Ri8Us){oV~^<1M;$S>Y?2YnO$3S~(jpe@vj zdQn?7_VLf|-NJNk)GK<;Ej(5Jg3$^Ta-tM7m9p&+*7P-UN0>sU_D07hL4!xl{E(eF za#8x+o(iY}9TsL#pjdfmegVZ3~?88j05-$ZPJ z7?a(MdIEa$!fK9DaL^4izDm#t#~%=#!R+(v=UVpPaJ3x6p?t7!;JZ>oLW3&GBNy(j z_{+@1m|fJ|F0%K_aX&!yjdW)r+Rz9NXXml;Kxt80A4v9B+2XKZ$a>^o8?TCSZRdlE z+mb}hcoCOVMjW>E?ZmBGwm|%efdw(`@m-te{q6{mb>1I7)>zl36gwlTRyHZvV~Y__oY z-r|G{wm~K1sl#iyPgG#`I&bdVXabF_wyy0rT?i9R)%Y+?h3_{F z>4?g&dg{2ff(iYO+TmH-soQDG@jZMX=fFQsXR08kRd3^2(kBLi(Jl>3!2Ououm<|` zBo39kO`dfX;uhx|SAKUEth$<_%=Yzv-cMFa;;?LeY|40Hb%>G zjo0uu_Q|ijW8a2uXARxD71o5fXD_xi-SQ>K?0)TfR>r7Ni3^nZo;3_?Y!Uh&YKTUy zmDXU-B(MXg^Yyp+O_>7(I`eVJ)X`@~Y$Q-JV&FU`O~rk~6MG&4*v#H(ggAaDaGf=c z1GnQnZ7H)w=TMF7D0n6r=CcvFLNkC$-j>xvr8ebY&=*h$`)YTQS4LE}bemQYvp;`r zSJ>wRmQN@xyxM0uzE}A5ggte-llbkxFOs$Zjp7!pQw&xr#{}SMiWxJOH9|cR!0}(u zwg(t7VRneP7Z}S3WC?pCj#A!;4ixykxh9<`pM`j6e-oXEAIsP&{Mf_o!#uMz&izsd z@i$GSz3WC{7LOqLxz5`EqgSL>YVyu^49gcujM6K!Zf)jLX}I_U%(9c>`lag(cxKd#=(0r0->DG6HG?Z62L&RVMfGN-meJ)Kp4f@wEs$Fr zn49DE!{D2<4g+q+3Jk4hMnG|qA}Mp9WH2`P?_K{H9oD>l+Tx$dhp)l|=7;+porym> z2yh4n&7N^Aa%H!+21EgKkNc;PH2F)blf^qSKEE8^ax--FAlpGRwg}NPuip+785CR74XCnI(ue#k zl?Qyk7B#flr1FV<@JBO8s4B7?lOW5Bommzk;aqFMcwL15pEY=l91^!ROC?lZ zKfaVjpqaL8`m@4LFA3q*FH7sL_TkCsf~3MxZtq$Rm;SoY1WVPT7Ijj&t2>98G}2{G z#ZL}mQTlW!)geg!GvFsJbhB7yOz-)@lB#~F?jB7u`4;045jecq;MR|$}#NV zG)I&u*oUce@%9{ciUT_(?(H^5v_@HxH4hB1PG&5oPtQ+>v{;^jQQY;ki{zLrZ~4%z z+hM22&0m{n*>nRb$&G+aLN&vc#{r77>8`=OJ!Mi=iu>*_>$jYuze+Ax>M`L72ap>Z z-XUunnB^l4UCaN}dcfT*orfE^`6+p%KcB$RKfJ=^XV>^J-6?wVvw&%psjhl`Y0>MB zyHImVhq>#Gl@t@{#l7nlB*wTcvx@Z!lEvJS8Ph%Moy2q?AgRA@0K$6Jj_i;4lcQvX zEVNe0(Y?84&+~o%*99N}uW1VO-hj}_)+gXmUf4(xi`jx; z;A=-v2~3?zphULr=J&9rQM4qY&oNjob!t|VWKpIqvj_tYuf(!1F3|lWX^1Y&w*Mh1 zXi658V!Mn3YS#V?mI~ecEnQ1OqmE%P#UTE~A7)v=H1*QAD8Qh_B z6i*Bn1vt{|i^v!pV06o0pv1kYMPlcLy-k~Ld8(e zghALV*=t2x8v96=1w39A;%AhGATNjTZBvIhs~hBDqM3#5jK>-d%lVg2lhV6aSW7B>OGA{Qe>K z9}X$yQ)1=3dIg~SA@PQ3Z%$aNUZ3EZg+P zQg(=h+rf7UmHOpaj8CehF9rT=eYc@w&9dG>)O5OR*cZBlV)c46tgd!o?esks^BcdZ z$b4^gZIdls>p;B&IrETOFKqddz(`)o2C$4C)r3C8WEAo1{R) z-gn|kC;K8laK>W43rpK+{?^isQCP*5<9J~VbDhX2r_6xX&BHOS%-Vj7vv^kQu%3Ji z9>@jf!hF`~vo7EkLEDnJDYY*&_=<$i7f7en4y{{Iz+W68Y)D;Ll{>M2hbUd$*)t5hP z_O8o`?rq?yf`FsvfGoM$G&VuXH*4{59{CqruX2W2%*_qivRf@d$MPW219ptq6L7eH ztx>v#S<&Q|Mj2kf*A-4Efv?Q(@+LMzh>}ru#c=F37$r{TZ`mpSRr0)h40$b_(m}4{ z;R{I$GCd7XxzkC6_%hCfwWOI2UyroBXF+@=xE@LZO3o^g(wHIaAaql?Cg#81muls+ z)*@|284dfrRy^0%+(-^1^Y_Lwe)XzAgh@u`C0&~I52+8T4}-+oo={AUYoQNlr46qP z=r@9dLF7W@akm_yp+uDoGhTZWY)MaZHJFu60m|dyUy~Y&3zJ@7u}=%=x%OtV{-MRC zA>FS|0G%8!O2!%&^qCjFT7s!pTf-i0=IEQeWPpdhugNxb?~aqP)UOekS3^Lpt=s)l@OLun%hGKS&TXq*Fj<}l#fgLmt;(?*YWfyRB~LRP3F z{cLtxl+o^9;sn=DG4T)xeD*wDNxji(zt4hw7JYv^HeD@N2%KbyLk*{Bg3es6W)9Fe z<+o|pIt^5GefRjSL0J3A7K63h&EHF@+X@F)kHJt^-!qTH6xWcOn@mK2?T#=ymUR<| zMbYBfnVphzulVo!3J^IEv%OuJG1BMNm({=->Y>wXK+!2+mF8) zygH+ny^hLBf!RY(782)O3N?UZK#wU>_V2J+qJJR*G~AKh4pTRhOq*iR_jI(^BH;vhFR71L4|PhcX+7FyO~@y}5fQC!bR%}h zR(`mI31$rJ-3^Sta_g{hYtyH2IvPLYK}L0XaG~l*cddeQe0neJ^B!C;bX3xYqhX_H zMyr z7MEeNa@j^ka7#vizK~oRG%S@^di`1KoDfmczpM)V?b4eRlFQ@l_RJjPtJOh6H@dDa zT+%imMmWPXwzyEp3{{7Tr$doSf%l=<^ zFG#=ew_bXD5PWpu;pqd1_UM;r-9C34b$)I#?j3jVfZBz4-SI7I`dKT(Ay~%T^@_Ox z*E#{!RvoXX`{YotT6DeQlOIR^$ua{uQHGTc2-~~sU_d*N)xuN_GXbuR9qkdRP|WZ7 zxf6C`@}fT9Y%faFyJ3g-7isXgJC3lPW{r*}ja>?Am8?z`5&X06y7)&dNE0;`$snx- zIprGE*YdPvpS5}E`vgl@({EXOJT_QO`49F%hc^W97rq~YW>{-K8azTJpx(xhCd}4| z+|uJOL?*~4@p%686&nj*jAzG1ROkL;!g?p>ACMkK#kj6zBZGmz~F3^?QjK zZEeX#r|u;oTMhrF%UKc;c9Aas(wG1p_k-Qbp=VShLTF&Exw!Dv1`)6&l^o22kHSrs=j!mQ`xde zM?Zz1qJ`9l9%iIRvWwP@*RpY7iT0>dW0_@)S$Xg=24fJZ5-?8 zvu1l}I^I3gDGC|PA?y-55AmZ6Kmla*LYS|jyUrZ0+`%K8p)tdTKT`L!>Yg#Z)rL!B zPnpWVme0hWuAMbmqKvy4&Wao??zZgIF`p43bSmmW_(0pHLlLk3E?ts$fFMCtv%!JK1 z()PW=(k1yvZAJenPzMTz_5_btrvIw>&F+k+wE4zkg&t8_hd%bAW}w5n$w?8YXb!sf z<#OdBNu#$qx*QfVSxDa*?=SZREhnaj2NgRbzt|J1qN{ZkQ@`%Idrt(D^8OQTHOjEX zIzvd`E10m%)>L%QoxuEoQrS@=FbQN;YmN!>Yt?@LA&ukRrEaNR5ip`hpo+QGnaCLU z>(qs*Bqk3SVI8!GV1eLmiqgf-XsOxDmoIa7@K5d8qzRi=nGT#{LEh0rx*WdbQ3L86 z+|d5yJU!Es34u4|%WK=n76Eo3FQ>=)L5}SwuY`E*B z^ys#LI9N*Ks7@8T{6^$dn8f{OwJ&%o-<5@0O!!6l#K5AcECgX~}Pt)3Nxa9!2a zAPLm0&_1_VcD_~M6CV((^*L8S{@0F*WT>FX;RX@P)$i6z=fJqB^VFT@&_$*f;Q+bhwy># zZ|SM2MkE&69xU`!n`ca44X^7K%=_}P@oFO11fm8ZD86?njRBNA1zkyXjertMEu&R2&xO3kMTuz&vRIGB0 zzK1GCE#yPr1xP6jd6^y zo&%N-pOArp<*b;lQNAu>@cYvHaAq=Gp9+b5+%_((d34pETrap~efZP66D8edCvdmE zCL8ZE5P3a3S<`hm2O>PRuX)=dZM(VUw&AXZHmdQ}%B3`Q5^9m~c6=$o7fRJ`~_dS4xZFPqBx^*8&-8v=~{u6AtMsh}%8D%)^D2p(Jvnm!U>9!+OF_>o+7aaCy;@No-n}Qq&>4$7_!g9@iDBD+klqDA0^tb}YZKy0c{2|Euh3&Hd%|doq zhoLEGyhjh)@WGN{IUj~eMTz;6aHw#hJ{g2=HCq<0payenu_^b{@lO6lG7HK}xUW_W zq6^Cr9V40%FV;%A4$M9_<*vVpGC|8pb6z^HV_u|%rIJjpf1>6y6cu3ENZ%>~jlqJ( z*wfy&ZvT3Jfg@dC=Qxl}8KV-x_V{bsGpn#Xlj5(H2%)qNj`0##_?f~6~^4rd~zvN@@YMeJlTBD}Ek<0oX8aHN=)1A;6141*o{ z+oUy?LJ!S9|87sTIzxSbC>*oDB7FWJ!DiP(UCM*67Q}3)Ki}>=GUSNsuB_>7w9}f8 zeEP=yv9Ncg-(E4|atkdiT?N6l)~)9_Lo8oL1i|?;nfZpaRP_DICcT-~0IMNjh}v*X zpCzX@f|;YeYG@>*Vm!?IKTAm3l^673b*Fa0Ya=?9Pp(lrm5H`_u$yL&Lu*B{`3PUI zA-@Ej?sQpV*`J|PhF z!Xmd>1#feIv$E*X=>VtJcq__YYAb!*C%Hw5e#*GwvZA2AfB4x;V81mgX22G64)OkI zy2Fs3H@t5Pd8YEL>*&pJQ-+gTQ>GXgj%BydMkND9Gju8hrm#Hl0*h^BY z(bU(bELNrN%u`s$a^|gj z|9-|<8qH{|rnP`&;|0Th&{b}X)jc+;OR)!vkn?o#g4Q-2b5>@=>}o9b7f9x>w?7X}JpCE8LuP ze2UHFg(nWx+bDZ z<*7`=`206#;kMz>6w&XtqCh71F+9%yGcecV*Gfm1yA`}Tf!mih!4GLww?=L%0=v45 z|Fs@q8hZPnM0@#^hRVj<1U57y{PVC>hZE$(e@7+Ev=g>345)vRH$L%cRu25AWxj85 zKOs@cN&W@%R!dFto~4Eaxxb{59zc$5nMd7;Gy#XUXjv_Oa5W$8ekQ!N39Z&-!$2Ky z>p!>UzZwzN0#>+$FMDal&|^lSbby`r`yZ`c>O=avrf_Jj<=WjkO|~`Q%>LdGgE?2| z38CyGoVjTXKR~FL3&$b_uK2*iaxYUxt4%oJnX|c(Z1H-8jA=bz899ffRN_}}$SnF> zywnV3qXCM8e${q5ycEs9QQq@E^w>RX?+^-E4uq@ zTIa`(d$!nQ)dXhJ_)Op4NJEHqEtRWJ8iA$rF7b``+K>yZF3O~(Xc8V#;kZP6g}LUe z14Uzs)7^-@aai2)`%EgE@u427=-)lctf2if&7%R($>((dEqipE zU7*78wMf-poPFqn;Aqg^nNz#rJb1udv*lX&!i@O+07Ar{sQ!x11naxkW^A80EeEFI z5@Na1sM-y_zlx$q2|8lcqSDG2fd*6?v<--9yiay1891Yt*5u9C404!{Kte~o{RVT8 zU<|n;G<)8O)g`bWL7a@8sFen0Xw3t-<=`I*aJ*8TJV$mK_pz#+EDL^(sM2QDl`nVG z1I)|f5ex2?h_N0$QzRk}-*IaHEU2ph8{2|0{%s2tV_b%#aHr;)>)S7?qIW`>#B z#%%2Hd%M5i@9)nZ9_2yTuGe)vPuH?vm2s^cNnTzgu8w#SfNn0%;i$!6(f0a9_?1 zyrlZIyPFf_!t&>cSB}BMQYWX+CGjBPohc zyrkuZ?fyLXgMsgANT^^zGmou{cQ`frWI*75akc0g1aZHxSsv^aHn(!FgKK%J9ToDC z>mHttyjx9>{<<;$GU3a}0Q0Yn0fEqErOD#o79H;GMhHd7mZg%(W~rL)P>L?O5soh+ z@^R(-SV?n0=dx%R+D%FRZA$sTn_Z+k@w9!9UDj&~LBqxEuAS+Oj5JKU0o>Kh?t z3&MmLfZvq*(%LngvC7T8C<0RD2JT-Wl%-Kq|JMf7>*pi}=)>g+NhkKZH2bijcQ! zUK?ICJJ7l=UAPhU7kBA6*uw#K*ioLZf_q9yOfOL!LrjR81#s?1YX{`ohO>Ie^Ylan z92g;|Oub{3xa7STe%Q|2R-Ox7{!OwNnFK=iv(uxOCEI;gBHjS=Bxpy^L4kKxr_|1; zi+wp@Rv1AX>2s%M&*5I+C*H~+cRm`$uZ5{dS}^z%qfbg+Nw!ob#;Y6yuIzek8?HUX zbo5tU*oBI0h@mwP;FgxudSU~K0}a|cr)ZRf#65hZv^xu z10ntuFR<)93plj(!dEhK#P=3(9Hez&Y5OW4cODD*9_-8;hl=q$A64U5h|O>AzSwdbna!5K^^ z?M7v=J$M+bOS}*DALx$3xc)ctX)_$oK=<(99|O9aUsJUt#v@+*QCs3JeS2!GvB;fl zHpIuA9#tEkW*c}|#|sgFx_|w611uW0DfTEmDJ-eVAEsY^$V_tQQc4Dnzbc8*IG$9# zrwlje>EX1BLvYTo4i|7;YaJBXwTZ(qj-IOy3YPy<#*%3v&1*(k^;e^#Bh$z~ky5Ta zSjbtZMZw*5N~BVr>$GF`LfnD4qK6?$Ttz6$Ss4)o8Vc|1KWJ zWq5PPm)hFSmGsT0&=a2tCP^(uS*>*cb25(kCnrOG`>!;u&;WOoDt1fW+(2(^FEjA6 z&k6*0`HW~=*5hon)lUam&<@zAg#1sEx3WJ#4}kN3%9sE(lzWR2zU9&|H|j5K0wAIr8XzbsWSA-&l*YCl&dS@ zU*dI)%a9fWVQ_kRalA_KTvW*1pz!Pw5JE1r>xt%a`c~ia($d7x3_#ke<5T;D3!40UzF*iu!#`k@!47_%jWL zaJUKm5zbbLG%I#8Bger{*Xho0jVW4Yfq%6q4IBfx+X_FTNMG4(=e`Z>V0(CPRZ}Ub zG`J&g2WTo;-O46!=Z&dy&4Q&MT*XhlGSSda>T>0y>{265{p~34p&IvEx9z{fzm6dC zI>GflBk!ry2YveoOZ75*>i7wM-Da_cncR^^LOgvm zSV7NDodukVZ^-nP>=z_buza*vG3SZToDCNi)^WUX%~ zi(EJFnh}*l?;(u*v?0bOI%cCc{b9*5VMQu-9#{~4|2pbdn5#Pd!*}xWx8=%L>t1~; zDyY%sCW zY5X15ipRvY*Sg0N(G~ef+6%D;uRgNJw@1VNST!X7DwDYgkIE;Ib(?N+if+*aMM5>1 zk|UtCiDMNrMh4+<3xkwA8Cg=3=obrd?sre*siAN|p%T`Osf-H@M0LcDniTO5zp+r~ zg5!bG(py4k7HA;=R)^Ve0Ky_Ov3fDB0fE10_8Fi7ms@)w8Xe4t;HR*1>3EjyPy==n zDEjOlsx5Z$`bS&#daPAl`Ce}G{{*|6Hu>9(f?{>SNl4%(N))7wm0La18B29HY-~nO zv=0K0rT+Fre**o^Y`FL#NhhonQI@XzbN{t90=Z}OwO$f2auGE8UuUb) z_d`wq#i!kl6E8F_L;CI_Nic4N`ICX?ciW9bC1GJ<1-z=1INQ2R(brL%!>(CW=iQ!G zV&_lNo79N>$ZMlcu~Di7H5-q(5aS_c;wA7USMOAWN=I zsfk_7vkBHXY8PmMLj~70R3-Eml;bBBrY~7&1TX#~cyL^AvXOOvzaTxg2A9tWR?|)k zjBpUf)Vu4$BGh5Zd4J$mtrdF8T^MJc>W@+saj#~!GBgVk0#<_}y8_D`KU`zq5J9Mv zpFZE-bScTKAKV=E_D+58qv(P5^8yr078gU7YL97+RlUP7w`V#2m^gUQ@kMx;9l_MN z4v+S1k5;92*U9BVFSMOg>p8&(z^|HEZKTX+Ie}uu(b$)Mg7aP6=LPU>(tbj zpm^jR5EW~5^Y0~8CBf&G9Xz!AKafQJ_Y%TzEa6tmT1fO=y8w0keIOMf$S_TO^P=R5 zVKmOhIjj%+0u3}r%=>=lauzx`Cdt{O=`Pbz3n2Qq+SOwLRufZ2SBKQ{P zTe^`OYeVKt3W*UPRzOw|!$skh;d+Tt%<-vY;N%&27wG;TKO664KVXhKvO}*VDa;t= zc|vY}PQI|Wh6D;5PBM4hSgHJ3YvOeEq0>P7;bY$75c%cygjNrkDf!X8lSbS@Vo3K9 zj(fLm`cHY`$=~Xe=QMp#^$Uh+6Q39;LqbP7Y@;=l)6p)K`oA5WWyS@4dr$Y3^nE7- z1DWS|+;POHyJXDZOz`4nH2C*sNL;%fiBh!We}v!kUWY0dpIJ8l#81X{u|0%7hENXS z6x@edo(O`^@OHfCxRVHsXK9DAt$y=>E=jOB_br_!e|WWf*gc=%WtEyHJvmx-%g^5G z!+9y+Pw18cWn8k5N07RZu^BZVcx$_Wi$D*7o%uoQKw|EVHfY!%GV*r&UFEIkR$Gr{ zH4Hf@Ol)anoyS8zXHM;O($bF(4vY{y{8-+X1_|l-kfX?FJ$wnIUm80X=@q}A*&eR~4EznS0(B$!$geBp2^?VbL=6~2Mi9qe0~;pXN_2)=N+)F^4)ok>0V0{wC3-_ZRc-&% zU~1Q7_`_3_`g}xPU*}%_BRC*(DI8HT+n9c6H%t zCejBf4L79J)vxfAgU2jxr_WkKeTnUTaBwb>xy9daoK~@6`ED1cUZt2ALFo=#L~Smr zQ4I&L)Sl}uhaAY}OjxI(M_%CT(r87&iw#z+3>qrS?^CVv5JoKVpbEi;eYq@mstHBI z0UmF6*{48qO#~57a&u*0`hNvUVQ{R1zY9?P+&cM4$r%AlvP*%caSRsI}J2D4IqvowP%!V<-4#J)-sh}}uU+pAf9_xlp zYrVI%Ui4Z_3588BxKM?5%8Qr>y%#0M4LJk%{4>&2r?)9jJ`UbDJf(lbDnaoQ1;@MV zp=CGgJ1|qQln#4E=(_g)l;znr{%6#0IO2)0K(alP2OcG}`9(~lvdV6P_eSgtgkrHJ z=)Am5X&aPN)Qu9JSar=*SO#i=GC-p5kBuhcVCqJY+k2h`bkL>@YU)jD+Hr;mRwOS} z!8u8^y!#a72w-)+iNlgmm?q6+r6zQ=qn}ou;^!m9(K+YGQ9e41comiwH2xEFJfJ)~ z6RqfP&R)XplD4VbfgDHgSJieGYJ4fE@R9bAyuPN6o7QHFSb_+FrP{>fHELpNfPWJA zHF1p;1|uG1rvJt*YSpZ19nMSz#pR6_nN^`3smh@c!+4_E@c-_Ree4{ zRcxS)SvVuZj%e5NvqlGO!*+h}r`Gp7BgS4gUg>CE@3pue!+ZS3@T1MeTtW+Bx1Ns2!cBOcaD);G^}T$5gHpHcn@aFZJ!}?~ zcKr98Rpcehg*4pxV0!j9IrG#v+@pFdKe7Q>Cj-SQN)pZ!xf1Y+p~JxO1|{jm z08CRG8X#ZlXPo423dNsmJzHwyJ?_z!A|N7>6G(96+Hj$iCQd@VEvP)x&ZjJoR!@aE!psqc z!e+^D92u6{E(6~%8BmR>P0IHeF5MeW)mpZ;X$=rVE z?+?p1XNEd4u|>+F- z)~Y1D4{p@H;+VLg9QY0*4Nf7P9WDRM5+39Jy#29!#-^Zl${s=)um#b|Bo)ypTT(&RgQ|Djxh+^ff}=T@R~r@&9d! z121p54pxYdJDukMw`zMqE^&FLSt%fj-=Q5u<}H-Zs*~VdK~8}qow8UxH|4aXS~qZD z^SEoi)*Z_cTgn;KXKLg+|1AoW{uC6<vpsF@#TOEIvbH??8BY zpuzO?^ZE!K#fA9Ypn{NmlqqEKiT|8*Z2ey!SU0-UO-$S~UAC?v483x?Bnq~!^g3-# zqXKhm>=!`!5gM<`gnTN&t15u?>lcspMc9w)g+-#`^(nP>SLN;L5}Q#wUF;qNycGlz z9J-WDqq?q=a0dW#=>-MQORe)H>Y!7=Dn4QNqlpjQvG(OeC*^rtjZgz}drpJ=fuEaFRqe+v&? znz5~{q?){e1~&}ASrDUmw%%m&*;B8TlU7Z#$w|n4`7QCp?fy@%Xtm=GarRg|uv$6O z)K%=*>+CiD>T0blpR)5NZ{2@h9ANTHXDc+_!-=zXyRGdL7iMzZlCMxRn-< z&eA!=LM-P~ricfY6v!RnZH3m@{cN*3e%At~1zVAham*N=aP`T#8jGApE|Db6< zYG9Y4f0GXk;a`)zo%apPz4>^ND%`T3yi++8z#q=%_`9V|x_HdcHoc$BThf;QL|)%t z4_-qGwitu>j`N5T`g@;pR`Mn9-Q`u3GJry&)Vk!s)8w&n(EyriF;GC&HP?v?yaJm~ z`k8pQ-5xlsU7GW;4=;UE7j;!1_rpeHJe?wTxvTwMDK1z#7;C}Rd%%q~1*btI>rj)A zSHBkHCirUNn_y@B*%1qK;s~IPNJBrc;1a^#F{Lm39yA+xj7$Vm0+vK9(HTSv_DvcDU5aD*pSRM~TdOl- zNgO|>2HFE&8{LC;?joh^A)fF~JUtZq&)QsNB8e(JumjniM2rxp@Ub*&QdS5-*5XQi zKC=G-BF5l2@E~>{?a8fBl(!FTbPr33ln6%#zFCPrDYq;wzbFa=Cp#FA1{`5wd_#0 z8*(=K`oucg-HU^Vbg4&aFf#>&U;@7OObVoR#8J2P7bd3=)5*TSJ}zjWq&YJ(C_c1m zVQ^TLT}TNIs+v(Iz{4jp5SJbaHaJ~UeB~j8Ou*B09 zSs|nTB4_I&jbILoYCA-ds6^0cE9G1&blT}qYMS^8(R@>7Q}k}8F#xRAN4=^!ab26L z>(Mr4i*q$UgKz5eR@6h|wK}5l8{O^P?{rWT8GW`xj9STyp^^g!;FH_$dxiF_2`nv( zqo@0>$V0D>b}cXVGW7rMm%Q|Q#mAIVRSZ6ClMlGpK(FBIC&;lZ@~@z}w{-nv%=dK` zW5qfP*GnYvQQ^W}P>T|&PuWoSXrjX^)KvJw+}kKK#mS%mvX_MDvQbG zd;J^!2XwyNM9BF7jPqz$I#VMZNc^ZRWq%HF=GWA^`+3!TR*cu1Gm@5@{F4DE$fObQ zoNlh%8mlz~l-}*Be+j=zw;TuPQ2=rnEC0Y-Y?m>Vc7rl|Qy+Oq9Xtn!^^aoF23 z;?k|E!{3MWx8WPg3!%Ni^(24Q^A}gmyRC=UF-*5`^~o<=ila2HC)>po3O=5q{)4xU z_ti?nEV9+43%~`~M@piF8Ma6GQuA_8PFyrKq}|=>E)qDmOL^6W#koV7lW90@c0uzC z9|{e{G-SFk8U?Zcmq@|^>d6PQ(~M!nCVxpc7frHX(Zyf-i@5ZS8Pq)A z0(9dFQSV@f9_8&`LKDT?C{0(o@%y-YqoN(Qp6qfam~*=Z!;zxE4U(yGlT1&FX~m;| z&cjCjm%9zT6JQz>n|bq5JB<@4JGODnU+SY}?ob#Xeg(POhXcgD#I1l_h;p#dWGHxaDlZGs13hUk05sd$}T5~)H-UdmnA1hXWP8#cv@-;` z+P{PT1U=9Nwv3&<{E}1x(ERxQ-_x%@!!$+%r&ZoptETg2UQ$EqR_DV!glT4@y%LWs z#_>`Zyff~3ur`_B>zvmImE%r0M{w(4UBwEE9l1N0$tQuoI{XYw0?__{Cbm-z(jwD2 z(Tq-3NT8%^gi+bwtw+xn3WsR0^)1)?JM>A?pj7EJUo^^-HhZpk5j@|(v4Lm9Hm?Y_ zt?!vEXNQEzd5COZIi1wCo_j}1y}yd}^j&2KNGs(QR^o~0L4R+lS6?jfe0y?ddNKM# z-Z6mQ(DOA5Am*9gW~qT75vgchJf{!PIxmdlJ?ND zLK1Ns*geIve3_@3W4pyzg11Qt!NT=E*rDtA)hq~8m9r{nP(j9emN&&&{>KaK!W!;CTNTq!RZG#?UNb^3^iq30=ivkb*dJM7rkGDi-27W4af~R5@X?mXU>8datMv-(PranDj5>_U> zIXbOkwK4_ant}DnkFqW1rEbh|npUv3+WHnHfo2Kr9_`!B7Jsyy%=C~o%Of+_Xmd~b zq*s^+44$2hR_6_I*lbC^{8MwIM=JE9B+C>rfx|2_BnG{Um3ER%hBWD9!pxLnf|z!| z06r|H;^vn8=eJ&=_%FsQ?kGdfv}=N%=G-cr$%^_KJ$>}VlbS^jr6{@jB4!M+N9_gG zJ&s*gB~m_-amYu#40uMJ;4@9-@g7~@Mkil-Y-X!+2-tT?yNjKO%d@eD#IX{Y#*Q-> ze?TJ}e^LXm|8B(7_+ccww10?7Vc^!`Lsd zV;AshLIkP)kt5GI4ygb+o*#CI1@hm>p`ZHDMD99y?hDDUVidMAt)%=d9jb6SGoj|* zCVUkbB%fKjB81XHC=ji7?qPOb7D^N8GAJnOPHXuh05RXxAfx;$YW7b0v68x5Up)Ssukxln8Rk@Uki z^`{l1f{|G3US18HuJxi0VcN6uq?%{FT1f!R?-0+1OeUMB@q311KZZ{xz-D@@Q@<)9}!1GZ%Q-Ovx@@->yS+D4URRE_84jL}KTWb_eaHl0g={)tN zkd%_zVM(eHFkIb%DDjS<1**WDvWT6el*i)b3ll1+q@khgr>i+kP=xCTxjPsdIbE_Hx9zhQy1*8xIqQuSL&<>|7*-2kQm?3|vlH@-3@2ToXL4?VJn%l}A;c$nE(hE{&N zP>fjQHd0s0RhENzlW`%OsO4GKK)Q_m;7YbA@8SpxJL_O5@z8!!b}z1E5wfgTTxvhz zejIsLAF$tSQ+~K1vUqC-h_CU@eG=J89zl4*f?#fKypV2@+iR5f*8iul5F7i}!#mz{ z`SHwM9dx@`$QvK&qL|)k@?I6Qxe@fzt|*h>{rC>Cr?!E)urG zwG9?qql#<^)QQY?Y)ZDAn|_&vgVr7585g3X0ieD-SLR?2?}5W~4O$qSlJNY-o~14H zOT_%Jn>+v=qvuI%Eff59-=GTvy>_>-Uf~Yzc6p7CIa;M(wvbD=ln;x?wVncx^!(nc zbzx#}3Lb-t(G{v;RdSh~Wq){LKlqI#!lyK*Zr(X91<(wmOAhm44 zjY&K*pGeZ^RQEbx^Ijf0n9D!g?LoRdI${^TBovB22KT4+N$xu@PVpQs^@Z^m3U(fc zRBN>V@2CTrT7l!GUwZZAFBR1ve_^{@NYX9XpJ|}%#yiUBk?qboCGk%ejDHoT8ow)X z`O1K81lvCe@u>sG69&w4^CT<=6 z>Hz~c>78-0_4!51YwV(sf0F5N77;@M&bG}h{;;L^S2O@BfEW(;wA%*Cl_SBT`iJg3`An1s9#iqU zDw^n=@nIr5OBmC1$6_?cFzu(+;TE9{fa-7U**9e}$vsPO-;CYwHjJETxVbjOgCU{Q z^2Q;%V4rjHLhBfnrR3o&!_A?M6!;f#UAIy$w=ZZXH}(pa2%$W%QnZZ@yhLn!s>~7Y zF2;jm@|c~74*$2nLb*}%X7<9Dcl0&?7DHv<5 z!fY%rHLMjaKv8D00%YC{JtM7oi6$IbkV9@|`-aPD9=8R1&tyP?K3MN|mX^Z#0l^E+ zf0bUHx6j?a*>g*(IUMe8$ zSZdQF@BsRVl}^@{+J9O6^U|Z0AIlI-pOF#MHZx$_$w0!RQ3sF+$_~=NO0Wg%Mtd}u zKYjNC-1sm6XFJ5;Xe~978<_9bEMSLc3g~8eTDC9bSBc1oAzP{C2i%po(|a( zF(tkVHcSD223noP`q@H5C>ph@v%-dI31Q=J8bhm@ zOUb|%d96yd4QqwB;9RE8$qlYUBS?jh0o&{VX=cX!$Y+HeuNRp5)-bE;p^r&w`P4fz-vwy1xeU->4XJh{rI`J678wQ;5z~|CE zkV5#%%#5012p5TZc7kSNwxFTlvH%y?YHzlq%I#rD1Wn8*&5b!3AHo5R%kWx9=Dr9g z<5vsP9be;L{?&|yUpNaU{*`F?C21RcDC$h!%$cBJUrf>gNyYIu=ubs2c?IQnJhJEM zb|JH@RZ5dyc8q$V3dCpCwwe!dZ|F?02c`jWpRE7btkh8uQ303)NWkI*IT-Mju_D@S ziV#n11|LOx+F@%x@;lL(uN7N6a8I~W@h)0PwgdlHWxVbVy%`!`fkz1`WOpO=j9 zc8XbB{=-vk!EsGWU)G*LiTIt#|6;8~!2iF+h`<-V^5xmXQ{;cn@XTAy>zzpXya9Kr zGdjHXaDk9Sr*`wdmJ)ti5zm&iYD_X+V1zxyCYj?&!o)hPidzQ{H1R||0Ccq+)rG$-#J(sPEB|85)nt~6BTE-e<;qq?RaF?eihQ^DLpV>63tVy z=_Y_uf_Y)}ASf_@mv>rqQyi`vSOZ3>ROPn2l4ya z4vOQsU<78*%{(M@URI z?L`LeFh4Gc6QG~%!;b>htvLX7DkIXuplAevs3C#4XXi;P_E>ElbgdAPqsNJQcTQ(P zD-xgd#old4MVi)in#DWa39~*(^T9Wg{9|ypK3Zc=``Y->ZgMMkb7xL_Yil?S?P6~| zaslv*TE0-ezYmzfdqBW)W^xu*^sGiz79!lv+x>l=^&|*^FA16R;W98aCGFGPh>}AL&1yE zJjscX1}@&oux1$|jq6=PF?Mfqu-oX_iDJC=l@k>4B|iH7D#UG?$wIECkcU>=5`hZR_`|`22QG0 zETSl^%Z9C1OKH4c)iRNlDxqxwAjF$&HWm=V_MZEaE3;T0%Jg%_0@|4wA@8O`8WuJd zotg`IQuq%!NH-)=@>^6n3N4ZqA#K12-xU?@-zIR8Id zF`1vR36N#AD4RLYh>Mt<{3xOF3^6>B1vv5n67lw>X|ume+o!{STpo2jgb;UFRqekH zIVR7W7`BA}utJ~B{{FX~ech&_t{PxkM*}kV*qV*5jbfnSoNlQ>CpI|7eK-)j*!Je4 z@8UTtixp-r_in8VJKUPg!dO`Ye~_gieW?B`1{w!~@3tpikXIabrZqFdkg~V0nAf1o zElU0uw$}|@T=kkys2nQR{%tbw-HhkiW-#^orI0?^X$rqPY?^3+_pdCigd#Y0lB?M* zR$a_AY3-w#vYDP76d162nysGE!NZ4m%^z@*;C7j9U58RcC?mGpnK|A{&vdF)V3%6NFz~0nU@*Xi^N%4`F^0UFG%0_rXZ>vV667$pih` zR}#si^{2C7?}dp?fpb?935OAWb7OIzo0L5Csa2mZoGf*5bUL3VpLiw#1|)mu3m+W@ z`w`A3)a%<-;QCjA3{&n6{CA|@qj9U*BtT*M&>f23zy>I6YsTbi&wew>u}h}!Y6L-2 z?^P})-)RxkNTll zn-X?Kk6l0b4j+pOm*&byG+_|VPP$_BJ^f9q(S2snJy-cQ>gHWpJ6X`+bTj(Zt&|Pf znWwuyBnDyxAJ)rB1o`SWi&!C_m{KmdJK8$VA1uR^FjFPboE-u60r;0}m$+rVWr=bJ zkoBX}rM!}Hbd9;DHm3#mj%vD|w-A``Pjom1-!u`}he^HdDX+D)9VA=I@kM>bx>8)~a@{9`Dz`_&Gh znVLER!8hTeul0it?(*9Kk5#5Q^NrV?gpl1H^x-rpmehFMP!QBE6_2`IDfmTYjLc#k zjFw6O(W#Hr4YcqUh-98#8Td{kSLT*99c_|S;3iC)r1KTbiSaW4`p(k{UaS>%R|_#N zBg*kUa|XlW0j!d0j?QduHi|ne$8<+H2O%de@fb#5}afVF1zXQ01FFHI@BkW?)Z_z3LMK$;}5G)j$#kM^E|`Bih%W+s}QXuh+X^B%g>JoIR~Y0TFi*>O7o zW0e1?f4{{j)Gv629Was)Q{7d_0fe#z{?O0s*MXZa(IWGbqI0Eyr!qSBuM1v~4^1MJ zKH9~8-VdNQS!!(5ZkjaezLAm>xha~jH1uX)!MIZ*6t@sHx7U*6uc81Jf`&#bN#QN5 z&q15afQszAz7(xc*#FMn!Cp8dJ)NcmIERQPG#6%xB9Ek`l0laKnAEN5V5$_j@8x>h ztPn+e%l8^t`mTCvjIO!Y1fQ6e2xyOd_XLnV5}sT!wh?f$y{tI{2lpT_owXT6;WT0A z3Cfjpu+KPmhEbfRdf80>bW}^ zemR)mK6D9ia5!EaYW@k)^U>qvVKq>lXs>W%R5EXSK^DVU@XJ6RoVAxAv`3?LC~ zWvDSN&O8r$LH@Vf#Vg=peXEtpwPjGRa=d*0D}Q`hKh6}=FYzq6E6HywzmD<=y$g>Z zIsUs`J_}emh3Id)gkf_S=VfZpYd-R_1gg5KosRhOGoYTHFUd(^;g>)^okB3M zR<LLXeiL650IG4rNruUbaaWg@p!e=Id&YWH|k{xqLHfA-6a^ zT@=?-Y~AOky@#}ei+O7;m)hcAE(84bX{_{JsYVZY4!G07{V9J(>EE*@5l{`rh5$0u zuBEfuMUU4UX^8~G4`yrjizk`$Q?@+V-pn9r^b2lrO@=YW9Yk@NBL+NNlnjg>+GWMw z9(&-wiwvqvDG;E*ix_saCAb~Xvj?;}&sQS_GJq#qwB$ix+)3QR$*DQc>omn@H{ZRfqR7FoNX(@RPV8zZ5W2n%pGje*p)!9@ zzYJLnulYbG6Jk6z$1YjUG1XQN@%QnVme;#i33Dcc6#?P@a)$sO`x-lancRQcD==;Y z#CwlHZolUvV#H|B(r-phNYz3$#quHr#`v0^7j&N5zV{=8#3$8S-&P>xkE&R}w|rhM zqlu7X_I2<=e#k(B#*I7mp_-hPfY1n##t*G^LW8?@)?mxa;&o?NZI$z>x}03esVtDn zn{a7=j3DwY(YfY5I`~L1>%8%h{(?!=>%i<5kCtH-tAycTZ6lKZAP?Y zC^WYl&5pzDO)InIX3wk1AesZxiyFlp!iV!(etknKo+z!JY-3ak+hAyO&l87Ssrdl? z5&`^lujFZdD<*FP(7lAXCXlJq#5rvnZ~C3Zm81~ixdOj%PIY*yR_TmKAF^#=rWwQm z%#Pv~|5zG1^>av_NjelLs8dg+NH8#-MFTKum-$JN|0!5_2lY@vGqoCJbuzkq8tpsUo1TsGpIynlPp}ZqQ1lG z#+VL&#W926IFoddhAcP6*Gc|9tMLe>-t5K==JPWk!fcAa7NyvSg`V*7nd_jgoX<(| zcte{cyFJJ&{}_aX0LOojW%rq*9XTk<2znB|yZ;ztMLJbt4Y#0iQ*nu_rGz?HL?2EV!yi{u5|YXb407;ugELO>6uj9G!1(!bz5g#n2)N>TLoE)EW_ zukA0qWF}k4>%B-=M%}Y$YM7caDI_^dW2<@S6~FY5g{V){3hs%Yn{9yEFjnpI>Hk1^ zl%~V#3b8U5H~n=dvud@qOlIiv-)?zWa;s)w`OixQUNRb(ZNFvVZ7FWM=Wfc)uCfQ#dvqi_iKb{~0cG&^MP?{0e!wxsT`6{EG zDdzv#1!$jD3;)#=Qa2Iy8uI$%B*kOrgvsVl{#kDP>ptjNTeSMeZple2_s~$#lXxJ0QBX$7y?n$XI10`9iJ#fMwlJt4%#s z<_dkrvv_3wn#8_Yc20sfe~)lsQ^PLa>R!v=!poAdSA7q+IW9zLOj>8TCx+r2D3e!& zBC*VgxL&4q>?SllnR8!UXKO{zO|p<`s;}X8&F61Y5_z~ z9}sPkidiBuLgj~$B!vTfwoCCJ#Y60X-pdkPWWQrc133j%AN+Mc4oj9?^qy2tM`PXZ-u#mWaLd;oC_i{3?hrO~ z_b`GLCT7wriTSM?X8CXF`1^z(aZs2ke)a2DuDmbruukx7o9Pk|BX*HYk>3+3ml@$6 z0f|^kwj(@?!Int>tVUo1fQ1TesQco0HHReU$Q%oi&2|)n%3vC{UpBwX}>+H z=L>I*Ujde#0C(c=P(h@snK-l}&NqwVjA*k>l3trzs-xg72q=H+d7q=qsL)pUkf>~t z>`Yy#uX%>MwK)7w_VNTS_O8!5X4a0iCy?1f#Ek2#B~`%d?$1R~gjN)+F>v$(Ng4M` ziO;I#H&(g(@hX}{$R$K@Vw^vmwPxxux|4lk6vC8j$EtjP1HA3Je5N6QY%NQhQKK|H zvp16mUye+>*XHtn1s6MiLZdx-GgpQiRt`E-bB^Sf)~3YU#Fp2o@qb_6)trE!3H||;O$h*?zzzAcw0^K0PE!XyrQvo)Io3Ga8Ygin#yRh$ z;CA9_5@<$R(%oNtotFqlK-+F)kn9jlMEa`1LJ6+b;GtGtvBDTJY5h^w1uJ|-=4K7H zcz7oFUjXt{>|p6Zp=?{H^20!Ao8(Ks+0^#0^Bx6fETFB7Qo7S@>Z+oKr6e2VtHO6X zfHrNOe}~RkH}MXTBJ?qB{&=Eu@JG0mddnU@ivYL!{|>)1?7PE!kJ>(sQ-A_88IZs4 z6$?oete9G9>8SX|s{9|*=nRL{2KWYlg_qt>kx|vBQETx(dGX=$joOv8DTZJD&Y%%ns8+kz`jI|6A$o3zp)Q5*@(V`SVGJa!v zcA~Jd$*iufMc}U~3N2zjmUw`%-}VYDql0l1ul-|jjwL{ziO(nQhpnE9es*$iOQeWY z>LNcO_de}ih@6PsxaQv{4kBiJ>uxFP4~Jw6ddC1(Fi~fD2s0*?YqIUuF!PV8oocO| zBy7@9tM2yURb76Injmz)s)sroRLdk)aSxfTRLmR`$Z$>T4z@m@35^!DaCF;?g5WRGw->8}%v;~z?}wVE$W}UZ%8turOs1&IJa9ZAC}HAiZ3xd5{R843(T-nc5sp8i>DKO z;p->USsA&?hqOR6{f|`UN(&*ubKzVsB1+)2^o<5LvpPVmw*(y)Hy0TJH~dy=Yg;%Tk{2DdTGE&M7FnA34oYmPHeQw zrkMXQ0(V$q;g2%iMvCrsIMJSosIjFf{1eh7rv+fS)5C6ILuEZVGr&Z|ynNbsJ|~(R zokNgL8JDJ}t+9r}kCKta9=jVoFQa#G7?<)rQ*ngc&9CU9^N!M^hig~LysaqeaJmN( z@T#>dPy8VQJ~v*}53-4v(}y>-uC7f>P{l^ui8`7qz>K~l)gPgl)2Iu;we>KUn)k6l z4V5Sj0+K8L^*&w4Ur^QXCUCj<20IHwzCg3q@EzGm&`{;wNXDl^yzbb^oXh6$Gro~k=aq`{A1kQ zS_~2(X!gKcvHP9xugOregK^uD1A8D!{9Vh`rI`>sn+(46>^F{&oy|hThs3DZqn)hucvd5XF~tu|LLgIakAu`By5#RC9RuVcBxeBq*|pD;aHN~ErgBPD%Fz9 z5)rZ~m7EBH>-~B?-x{Uy_ljrH z#OGP>$hJXIS1fi>0ybe5Y)*4w`II)F9;ec~VN1m*ANgI;A@>`A@`IPx?W1RqE0u%reI@KkC)>eK^#tknpc^gko z;S?D|V-CFB*hy~TBOv7V%SC5K^|1k#TSrJb3@|SM^7|MXMh!o9L7$wm$=uI9Kb=uz z_gh%)%c|MBOFU$&ci-te)=mZi(G&t${C#U+O_0a^UF4psMB=90GS?F)7Wp_P^XKmW zFIbHkIOyuQSsr)E_DTeubd?G9q9(^_YLhpOA%0X~C3@}~E?}t{h4E(Ng~ZHVHZO+c zh^hJP=+Kv(>%8y>niNw70oCshX3zZ()=tiQ8iy`lbir_yF^?{6hEAG-^W;~x&G1fx zVHA+!Jwc{5I=rTHE;AW~xusuwvI*rSPi|GP{P#+ajmALKO`Glf#*&Een)#fhmuPXh zpQ-b`>mFa=N0Y1~Zy_}6g+ANH|7|{Q9joFDL5Z`AX0(aoh*xjxW3=X*~ zAN@xqoh>kEE&H1-q)4YJ{}vckOB@_PR!iNxtGbfeWh|{ky!qA^iE7SIi@tpkF?^;5 zOt?mT&my}4+pl%Pqpa%-U^jfD?gI0j0^UQXkNSq@#m21;h$g;cR-xDy5J$vciFqBg zW`1yGj(}(*3^= z!eWf~SAhgr=O1;w%Ym}0D2DK-ly14qPdd{{678IJJVs8r2IDxFsYWEdAG3e~n3mPtc#Oen@{W45qwQaUCCkVXAKsywc^`?{{~T5vSONsR^(^vBgJKze*q)`b>*A_}!JaZe8wqTRyz@oXs(Ad&vfuw|cbLnh(Ot0P0 zp@Eru1BoK39Si~__*FI6LVwKjsNoY2!b68NOHTJ>h0p~Efzgk|BbCK$*no7f*O6S8 zEGu%?74K~KoADlqG3B0Rddcg)Y`WkBQF0&j3s#f6j)5%f_Ps-qyUX70+zz-t7O83B z{V3*4d1~Z*UxxqY`LhNWljIIbqzlhw>f_|rL=^G2{ud66CwOr+vRb{sHEZRBQ2ONc z99H02a|J|lcqm3z@)2)3AILL3DSR)a$0nF@5TUkhIyL2CT$O8-R~{5i!}d+2mTZT$ zyS~9?Fu8o@0Vgh5-1E#NA}kZRzMIml-JiumT@9b{ZR|axvt@aJ&VsC5J{RZ*>{Xxo zdsurbM*_pWwfCE(UUrLs*_NWoOLI4ObI7un>91xWl(9hP`)I9yke?U;?v6}WmVy37 z)LugPw>twHjhOj`vG)0CLkC2wWp#-~RRARw1n#r>!LAouog}y9v9W83ne3W=w`-&; zwR*eGM5p%nEw+lcoeX>S7D-!4Q+N8i|JXjQA=I3=Ef_op;$teAsQPYUyEW<77V^xm zdC8mX<_N#%D#Lc8w>I+!&f+2Rdw160uKyr)8YlQhePe8r#CE`Q`r?bcdF_ZJ?i&@( z9ff*R<=pIO=f(Y5xjc($N*21g{=#j&g=V0>+k8^5uQNuDNsm_*-ylI(16&tTjGQBd zFH8@s+rL9JGw-iP{AQJy@Xk|+kt9~b)(-4Losnm^m1@Ov?d9@Actp!Qzj@KGx57ZY z7YI>Q5eaM!$HnYEpeAHfF5ReFR{ZCJ=PATJt$U5U?5VA~!bC-_hm+{DKXR8GHtWnT zsyXWxX@g^2L{FRvN4H9kj*9Da&^8+^?n#ow(Z%?xJK>Ld&dv-PW@@I5{(_I zYTmcnwfLmms+2T8^!r})x11r3Px<9O%C{uuGT43q6?;RaA!RcoNl(PCrS6Oh-5B>% zto();b!mkK6ctDE&0?_4@c7wux^msLU2n;>8SF%GjJE3jK#UzL2D0OKA4sP!X8pje z+J8YMVk+8w>tZC$_YW-DH?sYlKe}rrjyQRvXIb3LBl~c{U^usc%5f@m&uo1!)%AO% zdBiIW&dAvt(RQwB_c*Xau`=exX)q*0;0%(ghT7TPqhB5Z^ZE6KqK4d{yasLeYpJ}E4(>8fzcIGt%;3t zVHP}Zpaw7Pwn&{{<5U!MYJZdXwLD&qUU-GLE2*syLXKDn|GLQJvIhNM) z6D0p3HiO3XWV2Kox1lMebDH_J4Qm5Q4%1H=*P(CaP*+sK$*7q`u*`}|J`!Y)SYtNE z+ce!^4(5i(6of74SBsEiL$)=rQR%L6ssfKW_A^aTO$DpGwbY`qKe4*BiM>U-B48T+ zgR#bU3l9kHv7_<=#Zw7|;^0MY5KD@OzVlfG*w9>scou~Qw1njoF=k{ z?1XObJwB9YF1z;O`XviFbKf>!7fs|%S!=F*IWGE^1@SdQ0#I*kFVZ^iOM^_G00~ZV zc9bs}NW*@#20kjt!m{{+gtS2NbAx}!iB*c=@u>?trPzypcIvs!l4Sj20qth3CqnUbW2-Ff?fA~cM z>~(H^sYxrkT75V8p!~aY8X|4fgiqP&Pst5F%Lpg=$%9dysH%;HhXRG^WqrR-bMN;y z=!%2EbmmW>Z-%Or_wHP{;`WSIW!5B|$U#Txb#$4xh!T*#FpL``q$nI(ExEr(Q+;KM zj(Lt>*8^_A;{SQ5R@FTwZd*KApEU#kr2)D*JcSl-Ku@GLETc7Ne@p|rsT=FV&WFEh zaS4?pk9T7wk0R8$0?3u4`3&?GmD90qJr86H&t@F*v(8hD?c0^WYRW`hQR!%`jJX+m z(T3LB@m?QnrWP}<$!rYIaK4;7J%S{YefhClNkCQjgWaUVDwq_-@^hVo%BnBm<@6fs zp$A6MtjDMB*vKXE?QLabE>Hl>XG%!x(rg1HaToe17Oc-|x;M=h=`c=^i55KALx7gO zw;Gr><T@#dkCE!g%fX5u zWbtU3tD;tX4%KFJ|B(fCYBU*)`>JBYTd*n~zNH?9^C=(w%xK!!kQbzd^7$`v^H4)Z zb%*aDR^9Xbv`h5Ybi%H`(R)lVJEpIoR#0x`3nvtcl4mpPC=J%Krl|SeQQ3-lp8a%)I%S2C zc$s{D9S7cQnsi|gc9Y^b>)Ki{cu{!VD|Ba8x`(PdJgZf2ld(YoEx|((vz^a!I99R;9GUkQBC4trBviPP)=sUk7$Tg>a-)EzY0t=`GYLJY##Ojh^57nFH1~T$>6renFSNFw z-06U_eJyAc(Uz@gwI7cOM|Z<&D+BQFJ~68T5Q@GOKWAu&N0)5hw*t-h!MSkpqpEQZ zk^GfX<8EWGi9G%f!PIppuoV0Fmmh}~KBhf#Ah{r9-^b*>^u0@>csU$bmX-YAsVk69 zTipfK72>!A15|?%$-m>)ZepItPnGSeRDPc0vH9%9De-g#&?e%>tzK`3%LP6`KmIa? zE|qJv;Vg>f3I0oDepjN`Lw zDKLLtgk%rY$9|`y`{8Kz5QHBwrF!*zK~$Nb_ezQ-p@8EPnzT9z4nB{Hm%xad>+TVC zh!g;%NlD%=#Ef2_@K7JLb4_|TY07}|2!PukF0P)bgX}{SxM9xgX>E;#c(ME8 zp_}dRWzJL&^A2q5+|eeS(cN%qL0pp<&ufW9X79a(ICl#O1KibQpZ{!}sf4}c%cU2< z^Nj;jk!Wq4rekc&@nC4w-gi+W+IS2s=@PW3B9gacI;H7g2QX6Wn{U^z2-CR+j_YCKsTjAy<0ai4I2* zwBJj|1|xgkR10?I^M^8g`{n~BS>3Y!cAFw#_j+00x+UBU2DUo1@=hv_AubaQbHkJi zAXsyZa3*o_hIBxDI?1a`Utgz%yaI_itpm$Xz>L2j{=jXx&EKOtdJ{f&gLLS38!O6; z^RYGzKWaPwlPE{@m3UVfo75leJgNmL3L>t;^^ds1*w~i$!dF+NYvLu`Di(APt9G|^Jp+~pes2v3UMo0$M1vqu*C%P z^sYvW9%sKnfNO_>IsH7d#5rBUzHiGK~I?q zZ_a0yb^`Q}*OFm=hozT7H@)oiA38MBdAHe%FCg&ZwwapF$*pM^5f`(J`jW z^M@l>>sLj6Vii-nhn%6*r~iB`$!8};52OXB3qSgdpy+tOUlvT(U8-lV1y5C@k3(nj zz`~A~J_XE~oMULT-z^m>YJSAa_$7$Ew?+>e@~aykCeW;fZdC*cNW@QKA|@&>qBd&Q zSw~Bj5g$v&($Z91`G&FwGUmjok7lWk{$EI*!jVQ(TU`3z2=d~~jKSbz6*+4mjH5Lm zt-woWS}(+>!GfVQneTL;OhKA(Pyae9`m?P&==BxVKImY?Oyky#-#qfcHT7XJ*M2UK z?P*vsE(f#)xbBe_N3N~%X#$wNO@i5*4X_j$z=saB*vZJU5^G&+sd9-~)%6c6hof~1 z2WPd^l^+0zAA(3y%+xiUs!5FyHPEIXMH+7p*MCTTB05N3kS2*2OaPL_@3^;LZB`B`yb35BsGX=UbClT z8cc-XN+O>eZpTnwR0Oi2fybxslJ0XTz2k1is1@V0t9TaR?n1;%tU(8@o$BhKdG=`W zwcm?Et-&HpnVw3O3zs8J72u(w8b}Zkja#qX&rQs6{d>5~2^68FCNcVKaX}`k_Q@SUaukS21j- z=g;tS)t0z^K1+AUn;&%f$btN|euyj3?=7@{zi(Y8pqxV8%LEn1ixG^0kB79!Bwzez z`8sX=+tf*Cw}m*PAYiVALe^~R&51!m{Sm2x=cF#mlNHVnvljOZ2?6IIYlz5SpKJXr z&|3fC!L2U4ikg>LAE-GyxWKUBjEigzmaD&GY8SD3Lnl-Nv*I=R_3*=b_4O|4dM69#Wg;>Us(^F z)ELUTmnaM}q(HXuejb!QZYm;ixTX zIGVR*7PB2pMam_{FaAPbqA9c8yaKg*yxutM@C2KSOyH%|DtlS+z%W1WQR^Mqxm(~Q zb&6i`ZV1{V5hbWhgZF&NhSNohd%3#i&%HJHOz8#T&cep1pPdmBKqc+(!v$Ry))#rw z);0B99P1~}qJBHRb5a8~0hfC`!8b>3ichzGK%>Q5BTT{AU#_y-^oC%ATx0fl10OJ5 zlB8#=h7JNF{`(1b_z-1xG-#h21xVkt{50a!tNiqf7`@j7(iyT_*S!ARmb+4O!TRpX zX4KC%)<^4Ed-@@=TSoysH>dtu)mdb!7Z(e9RuNs5<6~^ejsslnDKoz2Wq>WWw z4*I!_%bm|3!DKm(Vb`-rHIre>nxe83G<)F{YS02XukEHhfypA*zpaUCdU)nj;n^Kh!gH^=-Rhe~I6*qc^`$JVj;QPr}IbTOd~(cwhdUIL%(KhM<)nt_!OpuvoNeI{ia0At+F9x>grd8Hz#yL$eQy zjVR55K9W^Nd>un<(P3FqcrxTEL(#oTL|W6f+jiCGpsK~mN4Y8S$g2O8YIQ6iwwV5S zFITH?x|7+^sZf=h9pm*}Fwxn%N#ttoC{$j40&8X;c~+0OIdIo4t@9Xop>Kjcz|y#i zqrA(7G#7UqGYh5bupERsG2!kt%9s+PJsybQYL4mjSHjK$q2wZfop&m1POH@G7IgY9 ztE2A5Gk8!W@4hr59W7aEQx0@Q2^1hJ7u6ousB%%gldc0|#2}}v3^>EhADvVC4kZik z=Veu&2%zsB@+{?1;Je=D(Ef=Ao{Mf0ps`Q2%5dNOPH;p`@!Y`3^5KWtYR`t{>ifdI(Jy3((J0dl+S0*vTc?M0-sV`KQS+e zA&^hZGdluDjt(ui+k)DH6?D|n`kU{w+noqwpCZC`+E;wXIr}4kXUbkFXG~ z9l(oJThWw9frWPdJT2DlpK|)&P(FRwAq{0aNaUO40#z~UUHJ5%d^n1p;dmA7Prk%_t?stB8xtoR{YYAE z+Pxj}c3d&f!)4)Tszc^q|8N|$uSWU~y`5>3m>A$MSFCNpi&s>xvK-!gnlCBh#V*dW zsFG3|5dt7QRFmNp`fst?>cteMgqKM=tS?`8k0bdCEAl(Kurk^l9x>IDfU>QTTJ*J3 zhuDuh+Twd8x2bPjXI;S~EhZ*dy-^r@gi2iAhiO{korKv`j-@r2Y;B%ihlBMrtQ7LK z#4mQD_cy2p8L{mgAv*BcfT8hn@rV9kcXC`115oJ!J zCQPl1{)O_T=pX+bqw><+Ag{c$qm7XsdBby+ci_R0-g<94R)u9)&3_f@KS4UTQkY{! zne*ItN<)eA{$!3xXb_F8c3!GuK)~HvYV&i+%I(JD^ibyxKhw8;uUAA=PXEhl`#YR78_EG*L7uo11KYJ#9Z3QhfnU+>7@8&^+#OLC zILl@YcC$wN%z|p$#v9{csU}e@yTY+9mpO?MFQ*{U0X+Qrg?mg|fVU^QCrmSv++DCw zY|mxCX&R_k6JEa4r^G;Rr5_P|JZ=19in(zF@w~Aj+U3TJ=;7esXZFZOMxG)*@t)G% z(wwe^#O!#bb#Tm7cWU$Ci|92Qb81Eqw@y{=CaQ!qz87(DpkDky*f&1jM!{#_LvIRr zZ8Cx}E-y=QDi>|DOyLXUM`bMzMWv;}s`io&r_p`vHWb(2g*NW+?$AFu5mAGLs{Obu zPQ#XpEc>p#qfSgy-HKaN8^gN6hLwUOEikk=vw~?Oc6_^~Gat$c>_3&Bkt@)rbk= zC9WI;pXX3<^wXbs66Gx0^FE|CO!Iy2LIbuGQv+|H6dgus6{oAPEf<|R5MTEqR<# zNj>2wRuQwe777u(Z|Z_0mD+1BhF{4Inb`hQD@mVTTM}rRh;7G7uGW;?vuI7?U-}r~ z;ruv{&j^1~F68`nM=N(GXGh5Gu4x`wtp`zh6?6Pck1;eWSZDnef=9%`g{qR_*7d9U z(I}P;7U^I0&hbr)z;0MLDdEQyvdEExOU2@GT8~pmcTE>Bc_N1>@8ZDPCY@1_${LL& z~{8}TTZj%~z5jQ8AnYLrqdYjAIM|VRM1uyQNia!Vaa;95M zC|$F)%zU~)Nb%*`Q6W7K_Dvj2i5-=2G?nL1ZG+4nBRfF`U5m=HUxZ{eyUxyW8`K=~ zzXtoS@2hDx-39@eMd=TzxF<2np~mVgWkM3CdKwQ|v3NoXaLZR*|M!UUbHxwkVXO$sBT2HI$n2D1Oy54r<+*KBQq$J7cQ{P(z#9X#&p~MY6Uu0= z0&$PhyOFk$d|Z5-NXDQ>=Cv0Uu6x4gb&U%p4B zC$>fzXd+|EU8F;4EEROJQNITtOGsDxx1_Lr_}XLXE3}e6F8kw`U$n#iI&$dzgzcCl zDY!la92;bi$S5F42zy*wB%`X0y;vVgAPYlPa;$@NRvh?VHap*^o`nA*ugXO8?@>CC z-{Sth0vpjdN98pk_TDcYyo)MaP*>;ol%HpNve1EnArGS_P&Y#M@Q z&_3b<(Fv49?aab5O%v&?YB}TY{jaX(b#EHzxun0e&mQL*ezLtDU;MI*ca!lDy7fAZ z{dfyd7pa2<{IWOlD+;SK)iO!jb(Z|Fg$K!VKNWPyaOHSdJGI3PD*j3yY<*MeEqPY> zg?Fgx;%wPbS&yXHs#_8_pKapaEGe4El-!Zus!I0`b4%_pct4|8m`8FG&@(y-W%IR; zJm}i#ay{0&KY1KL9e>__U{;Qd&VWr3?S@^fzO{sb?xa|?<2H`$3UXMF+}#=+ zlF~y&*>#W$3^mWqQRvaz99Hv6|15!nI1#1!nicorsISSesi=s4s_$88Ty&gQbac(5 z;Wz_MAy8}77pyYOF!1nGDBt$FNxrz z_{hDKkDvY<__JShk4$}gZQi$LMU;FQBvo2h(={v9Bkm)Z64}7SUPa zS*N~4%${orV-JCVP{f}3+7ZCHblT~I+KL`w5#6_09#u2-V<)uWMP2Wth@loI{{nVN zR&SVp;byV6G}dv<>L=g2E;o=B@qz>AV=^id$G`A1<&(>{NS;;Y`u~((VIWfF_R2d? z&hR;I3X8x#xGArPMty>_hzqtQy#gbSu>Oj>g$U54nMA1uBhPVpN7b$=3yMTb)nBRm zSyU<k7ct!hfgnPTwisg842?>E zrf}y2fdld;A+su|CB?r~@)xKyI+u$L3cKtehLD|`Xr^=0eD6MVxXPa+ai$ol>^0FT zw$AFllj`6^r>md2hT9->W6qM*XTh4VZAVWxt8$N_=B}~sKUsas3bvgQmjRz^-*a`j zY4GW3Tb1F6!Y9}^X<^#)HoB^|+^X_dwBJU|@jp@EzPfvA2`%$J;CXP4U;5ac~~ozjGOu9i^%o%Hj%uM6e-br z=ekaGf&}W#=uvqF>1lh?q@+bYA`jgK!z11<Hw|DGz2Hv>P=W$#H7Cu}sZLBT2Wg#s$u|&(?-lRr8 z+lTDsUcH3YWZ>M*?nPb8)PDX|!XN(UiUDIVYXxP$DRWP&6XBLm8IXldRUaO97-VsX z|C}6;*BYO!fNv&Wy7T0L`e9o0%5?aQ)?1o$1^hXy2mqlcn?){cEQLNw&Zg43*M?r^ zqaex^?^938(^upo-1D9@J!#=Q!s|hjm3k-76~`p~bbQ0}Y^k{ACpa+fz2SN@1AJC> z2~W=q{%0;#l>G;B)#vVoOtGT2M&r!lJ|3-}g{bTbHR27YCpybm9JVU$sIb{KSYlHQ8ggAk+$;h RU%=O2M^7JlbNJG&{{#5yp{W1> literal 0 HcmV?d00001 diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 4f02cb275..055b118c3 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -2295,6 +2295,14 @@ In many complex 3D Scenes, it may not be clear what or how to look at a particul The client will render a UI that presents the two commenting annotations in some form and allows the user to navigate between them. An active Camera is not provided (while there is a Camera in the Scene it has `behavior` "hidden", i.e., it is inactive: not usable). The commenting annotations are ordered; while the user might explore them freely in the Scene they might also go "forward" from the first to the second commenting annotation and "back" to the first from the second. In either case the above example instructs the client to activate the Camera when the user interacts with the comment. The user is free to move away but any interaction with that comment will bring them back to the specific viewpoint. (forward ref to chains of activation example) +Default camera: + +Camera for annotation + +Camera when annotation selected: + +Camera for annotation + ### Modifying resource properties From 62910867f1e661aadbddd7f521af7ba0003d9d92 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 15:23:39 -0400 Subject: [PATCH 183/192] Update model.md --- source/presentation/4.0/model.md | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 0796096ec..c3f61c143 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2737,26 +2737,22 @@ The `value` property is used in several situations to convey a value of a resour In the `metadata` and `requiredStatement` properties, the `value` property is used to record the text of the metadata field or statement. The value of the property in this case is a [language map](#language-of-property-values) represented as a JSON object, as previously described. -Many selector classes use `value` to convey a string representation of the selection definition, such as `FragmentSelector` and `WktSelector`. The `TextualBody` +Many selector classes use `value` to convey a string representation of the selection definition, such as `FragmentSelector` and `WktSelector`. The `TextualBody` similarly uses `value` to convey the string of the body of an Annotation. In these cases the value of `value` _MUST_ be a string. +Language Map `value`: +{% include api/code_header.html %} +```json-doc +{"value": { "en": [ "Example Description" ]}} +``` -### value (TextualBody) - -a `value` of a TextualBody follows the Web Annotation data model and _MUST NOT_ be a language mapped string. Instead the string value and the language of the string are represeted by separate properties. - -```json -{ - "body": { - "id": "https://example.org/iiif/presentation/examples/manifest-with-containers/bodies/koto-body", - "type": "TextualBody", - "value": "Koto with a cover being carried", - "language": "en", - "format": "text/plain" - } -} +Selector or TextualBody `value`: +{% include api/code_header.html %} +```json-doc +{ "value": "Example Textual Body" } ``` + ### via The `via` property of a resource _MAY_ be used to indicate one or more URIs which are the chain of sources from which the current resource was obtained. Each URI in the `via` list _MUST_ be different from the URI in `id`, but _MAY_ be the same as the URI in `canonical` if it is present. Recording `via` allows servers to provide the provenance chain of the resource, regardless of how many copy operations have occurred in the past. From 36f4d9e5025e5fc5332c13388296943e7e1d9c61 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 15:44:45 -0400 Subject: [PATCH 184/192] no more wktLiteral --- source/presentation/4.0/model.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index c3f61c143..cdfba86ac 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -553,10 +553,10 @@ A Point Selector _MAY_ have the following properties: [id](#id), [x](#x), [y](#y Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimensional geometries. This selector thus goes beyond what the Web Annotation's SvgSelector enables by incorporating the z axis, as well as additional types of selection such as MULTIPOLYGON. Additional types, such as CIRCULARSTRING may also be supported. -The text representation is given in the `wktLiteral` property of the selector. +The text representation is given in the `value` property of the selector. __Properties__
    -A WKT Selector _MUST_ have the following properties: [type](#type), and [wktLiteral](#wktLiteral).

    +A WKT Selector _MUST_ have the following properties: [type](#type), and [value](#value).

    A WKT Selector _MAY_ have the following properties: [id](#id) {: .note} @@ -564,7 +564,7 @@ A WKT Selector _MAY_ have the following properties: [id](#id) { "id": "https://example.org/selectors/2", "type": "WktSelector", - "wktLiteral": "POLYGON Z (0 0 0, 10 0.5 3.2 10 5.0 0, 0 0 0)" + "value": "POLYGON Z (0 0 0, 10 0.5 3.2 10 5.0 0, 0 0 0)" } ``` From ddadbbd3ca1fd219ea0c97d800e1a75241031964 Mon Sep 17 00:00:00 2001 From: Michael Appleby Date: Wed, 29 Oct 2025 15:53:49 -0400 Subject: [PATCH 185/192] First draft --- source/presentation/4.0/index.md | 38 ++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 06458cb27..dcf00f3fc 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -2713,22 +2713,56 @@ e.g., painting TextualBody on Canvas # Protocol +This section outlines recommendations and requirements related to URIs, HTTP requests, and authentication for IIIF resources. +## URI Recommendations + +While any HTTP(S) URI is technically acceptable for any of the resources in the API, there are several best practices for designing the URIs for the resources. + +* The URI _SHOULD_ use the HTTPS scheme, not HTTP. +* The URI _SHOULD NOT_ include query parameters or fragments. +* Once published, they _SHOULD_ be as persistent and unchanging as possible. +* Special characters _MUST_ be encoded. ## HTTP Requests and Responses -### URI Recommendations +This section describes the _RECOMMENDED_ request and response interactions for the API. The REST and simple HATEOAS approach is followed where an interaction will retrieve a description of the resource, and additional calls may be made by following links obtained from within the description. All of the requests use the HTTP GET method; creation and update of resources is not covered by this specification. It is _RECOMMENDED_ that implementations also support HTTP HEAD requests. ### Requests +Clients are only expected to follow links to Presentation API resources. Unlike [IIIF Image API][image-api] requests, or other parameterized services, the URIs for Presentation API resources cannot be assumed to follow any particular pattern. + ### Responses -### Authentication +The format for all responses is JSON, as described above. It is good practice for all resources with an HTTP(S) URI to provide their description when the URI is dereferenced. If a resource is [referenced][prezi30-terminology] within a response, rather than being [embedded][prezi30-terminology], then it _MUST_ be able to be dereferenced. + +If the server receives a request with an `Accept` header, it _SHOULD_ respond following the rules of [content negotiation][org-rfc-7231-conneg]. Note that content types provided in the `Accept` header of the request _MAY_ include parameters, for example `profile` or `charset`. + +If the request does not include an `Accept` header, the HTTP `Content-Type` header of the response _SHOULD_ have the value `application/ld+json` (JSON-LD) with the `profile` parameter given as the context document: `http://iiif.io/api/presentation/4/context.json`. + +{% include api/code_header.html %} +``` +Content-Type: application/ld+json;profile="http://iiif.io/api/presentation/4/context.json" +``` +{: .urltemplate} + +If the `Content-Type` header `application/ld+json` cannot be generated due to server configuration details, then the `Content-Type` header _SHOULD_ instead be `application/json` (regular JSON), without a `profile` parameter. + +{% include api/code_header.html %} +``` +Content-Type: application/json +``` +{: .urltemplate} +The HTTP server _MUST_ follow the [CORS requirements][org-w3c-cors] to enable browser-based clients to retrieve the descriptions. If the server receives a request with one of the content types above in the Accept header, it _SHOULD_ respond with that content type following the rules of [content negotiation][org-rfc-7231-conneg]. Recipes for enabling CORS and conditional Content-Type headers are provided in the [Apache HTTP Server Implementation Notes][notes-apache]. +Responses _SHOULD_ be compressed by the server as there are significant performance gains to be made for very repetitive data structures. +## Authentication +It may be necessary to restrict access to the descriptions made available via the Presentation API. As the primary means of interaction with the descriptions is by web browsers using XmlHttpRequests across domains, there are some considerations regarding the most appropriate methods for authenticating users and authorizing their access. The approach taken is described in the [Authentication][iiif-auth] specification, and requires requesting a token to add to the requests to identify the user. This token might also be used for other requests defined by other APIs. +It is possible to include Image API service descriptions within the Manifest, and within those it is also possible to include links to the Authentication API's services that are needed to interact with the image content. The first time an Authentication API service is included within a Manifest, it _MUST_ be the complete description. Subsequent references _SHOULD_ be just the URI of the service, and clients are expected to look up the details from the full description by matching the URI. Clients _MUST_ anticipate situations where the Authentication service description in the Manifest is out of date: the source of truth is the Image Information document, or other system that references the Authentication API services. # Accessibility From 3b7425e3043eebc5b0c0969add5ad77d49f47b9b Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Wed, 29 Oct 2025 15:06:44 -0500 Subject: [PATCH 186/192] Add Use Case 7: Scene with Audio --- source/presentation/4.0/index.md | 269 +++++++++++++++++-------------- 1 file changed, 148 insertions(+), 121 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 3662c3942..f5696858f 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1465,137 +1465,164 @@ A Scene or a Canvas may be treated as a content resource, referenced or describe --> -## Use Case 7: Another Complex Scene +## Use Case 7: Scene with Audio -What is it +This example is a Manifest with a single Scene with a duration. Multiple Audio Emitter Annotations are painted into the Scene, with positional emitters used to create a 3D audio experience. Some of the Audio Emitter Annotations are only painted into the Scene for a limited period of time, producing dynamic change in the sounds heard within the Scene. A commenting Annotation is also provided to highlight the instant in time when a change in sound occurs. -### More on Point and Fragment Selectors +A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). When using a URL fragment in place of a SpecificResource, the parameter `t` can be used to select the temporal region. Both patterns are used in this example. -A content resource may be annotated into a Scene for a period of time by use of a PointSelector that is temporally scoped by a [FragmentSelector](https://www.w3.org/TR/annotation-model/#fragment-selector). The FragmentSelector has a `value` property, the value of which follows the [media fragment syntax](https://www.w3.org/TR/media-frags/#naming-time) of `t=`. This annotation pattern uses the `refinedBy` property [defined by the W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#refinement-of-selection). +An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. In this example this is used for a comment Annotation. -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "id": "https://example.org/iiif/selectors/model1-glb-sr", - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "id": "https://example.org/uuid/9fbd580b-895b-41b9-974a-1553329037f2", - "type": "PointSelector", - "x": -1.0, - "y": -1.0, - "z": 3.0, - "refinedBy": { - "id": "https://example.org/uuid/3d0d097b-2b37-4a15-b6a5-506e417d5115", - "type": "FragmentSelector", - "value": "t=45,95" - } - } - ] - } -} -``` - -When using a URL fragment in place of a SpecificResource, the parameter `t` can be used to select the temporal region: +In this example, the audio content resources have durations that do not match the Scene's duration. The Annotation property [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) is used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. -```json -{ - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": "https://example.org/iiif/scene1#xyz=-1,-1,3&t=45,95" -} -``` - -An Annotation may target a specific point in time using a PointSelector's `instant` property. The property's value must be a positive floating point number indicating a value in seconds that falls within the Scene's duration. - -```json +```jsonc { - "id": "https://example.org/iiif/3d/anno1", - "type": "Annotation", - "motivation": ["painting"], - "body": { - "id": "https://example.org/iiif/assets/model1.glb", - "type": "Model" - }, - "target": { - "type": "SpecificResource", - "source": [ - { - "id": "https://example.org/iiif/scene1", - "type": "Scene" - } - ], - "selector": [ - { - "type": "PointSelector", - "x": -1.0, - "y": -1.0, - "z": 3.0, - "instant": 45.0 + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://example.org/iiif/3d/model_origin.json", + "type": "Manifest", + "label": { "en": ["Use Case 7: Scene with Audio"] }, + "items": [ + { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene", + "label": { "en": ["Positional Audio Symphony Hall Experience"] }, + "duration": 60, + "items": [ + { + "id": "https://example.org/iiif/3d/anno1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/audio/1", + "type": "AmbientAudio", + "source": { + "id": "https://example.org/iiif/assets/symphony_hall_ambience.mp3", + "type": "Audio", + "format": "audio/mp3" + }, + "volume": { + "id": "https://example.org/iiif/value/1", + "type": "UnitValue", + "unit": "relative", + "quantity": 0.1 } - ] + }, + "target": "https://example.org/iiif/scene1" + }, + { + "id": "https://example.org/iiif/3d/anno2", + "type": "Annotation", + "motivation": ["painting"], + "timeMode": "trim", + "body": { + "id": "https://example.org/iiif/audio/2", + "type": "PointAudio", + "source": { + "id": "https://example.org/iiif/assets/orchestra_percussion_120s.mp3", + "type": "Audio", + "format": "audio/mp3" + }, + "volume": { + "id": "https://example.org/iiif/value/2", + "type": "UnitValue", + "unit": "relative", + "quantity": 0.2 + } + }, + "target": { + "id": "https://example.org/iiif/selectors/anno2", + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "id": "https://example.org/uuid/9fbd580b-895b-41b9-974a-1553329037f2", + "type": "PointSelector", + "x": -3.0, + "y": 0.0, + "z": -2.0, + "refinedBy": { + "id": "https://example.org/uuid/3d0d097b-2b37-4a15-b6a5-506e417d5115", + "type": "FragmentSelector", + "value": "t=0,30" + } + } + ] + } + }, + { + "id": "https://example.org/iiif/3d/anno3", + "type": "Annotation", + "motivation": ["painting"], + "timeMode": "loop", + "body": { + "id": "https://example.org/iiif/audio/3", + "type": "SpotAudio", + "source": { + "id": "https://example.org/iiif/assets/orchestra_tuba_10s.mp3", + "type": "Audio", + "format": "audio/mp3" + }, + "angle": 45.0, + "volume": { + "id": "https://example.org/iiif/value/3", + "type": "UnitValue", + "unit": "relative", + "quantity": 0.3 + }, + "lookAt": "https://example.org/iiif/scene1" + }, + "target": "https://example.org/iiif/scene1#xyz=3,0,-2&t=30,60" + } + ], + "annotations": [ + { + "id": "https://example.org/iiif/3d/commenting", + "type": "Annotation", + "motivation": ["commenting"], + "bodyValue": "This is the point when the percussion stops playing and the tuba begins playing.", + "target": { + "type": "SpecificResource", + "source": [ + { + "id": "https://example.org/iiif/scene1", + "type": "Scene" + } + ], + "selector": [ + { + "type": "PointSelector", + "instant": 30.0 + } + ] + } + }, + ], } + ] } ``` -### Time mode - -The Annotation's [`timeMode` property](https://iiif.io/api/presentation/3.0/#timemode) can be used to indicate the desired behavior when the duration of the content resource that is not equal to the temporal region targeted by the annotation. - -It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. - - -An annotation that targets a Scene using a PointSelector without any temporal refinement implicitly targets the Scene's entire duration. - - -### Audio and 3D - - -AmbientAudio (everywhere) -PointAudio (sphere) -SpotAudio (cone) - - source: Audio (id, type, format, profile, duration, label) - volume: UnitValue (value: 0.3, unit: relative) - angle: degrees of the cone, per SpotLight - -Ambient and Point can be painted on to Canvas -hidden on audio = inaudible - - -All resources that can be added to a Scene have an implicit (e.g. Lights, Cameras) or explicit (e.g. Models, Scenes), local coordinate space. If a resource does not have an explicit coordinate space, then it is positioned at the origin of its coordinate space. In order to add a resource with its local coordinate space into a Scene with its own coordinate space, these spaces must be aligned. This done by aligning the origins of the two coordinate spaces. - -"Exclude Audio" - - - - - - - - - - - +> +**Key Points** +* The Scene has a duration of 60 seconds. +* The Scene has three different Audio Emitter Annotations painted into the Scene---AmbientAudio, PointAudio, and SpotAudio. Each Audio Emitter uses the `volume` property to specify audio volume. +* AmbientAudio targets the Scene via a reference to the Scene URI, which implicitly targets the Scene's entire duration. +* PointAudio targets the Scene with a PointSelector to paint the Audio Emitter at a specific point in 3D space, and that PointSelector is temporally scoped by a FragmentSelector to target the first 30 seconds of the Scene duration. +* SpotAudio targets the Scene via a URL fragment to demonstrate an alternate approach to target a point and range of time in the Scene. It uses the `lookAt` property to point the Audio Emitter cone toward the Scene origin. +* The content resources for PointAudio and SpotAudio use the property `timeMode` to specify different ways of handling mismatches between content resource audio length and Scene duration. +* A commenting Annotation targets the Scene at the instant corresponding to 30 seconds of the Scene duration to highlight the point at which PointAudio stops playing and SpotAudio begins playing. +* It is an error to select a temporal region of a Scene that does not have a `duration`, or to select a temporal region that is not within the Scene's temporal extent. A Canvas or Scene with a `duration` may not be annotated as a content resource into a Scene that does not itself have a `duration`. +{: .note} +__Definitions__
    +Classes: [Manifest](#model/Manifest), [Scene](#model/Scene), [SpecificResource](#model/SpecificResource), [PointSelector](#model/PointSelector), [FragmentSelector](#model/FragmentSelector), [AmbientAudio](#model/AmbientAudio), [PointAudio](#model/PointAudio), [SpotAudio](#model/SpotAudio)

    +Properties: [duration](#model/duration), [volume](#model/volume), [angle](#model/angle), [lookAt](#model/lookAt), [timeMode](#model/timeMode) +{: .note} # Nesting (more about Containers as Content Resources) @@ -1684,7 +1711,7 @@ Manifest ## Annotation Page -Annotation Pages are used to group Annotations. In cases where many annotations are present, such as when transcription, translation, and commentary are associated with a manuscript, it can be useful to separate these annotations into groups that can facilitate improved user interactions in a client. +Annotation Pages are used to group Annotations. In cases where many annotations are present, such as when transcription, translation, and commentary are associated with a manuscript, it can be useful to separate these annotations into groups that can facilitate improved user interactions in a client. Each Annotation Page can be embedded or externally referenced. Clients should process the Annotation Pages and their items in the order given in the Container. Publishers may choose to expedite the processing of embedded Annotation Pages by ordering them before external pages, which will need to be dereferenced by the client. Order can be significant, however. Annotations are assigned an ascending [z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) from the first annotation encountered. Annotations with a higher z-index will render in front of those with a lower z-index when displayed on a Canvas. @@ -1814,7 +1841,7 @@ It is important to be able to position the textual body of an annotation within An Annotation with the motivation `linking` is used to create links between resources, both within the Manifest or to external content on the web, including other IIIF resources. Examples include linking to the continuation of an article in a digitized newspaper in a different Canvas, or to an external web page that describes the diagram in the Canvas. A client typically renders the links as clickable "Hotspots" - but can offer whatever accessible affordance as appropriate. The user experience of whether the linked resource is opened in a new tab, new window or by replacing the current view is up to the implementation. -The resource the user should be taken to is the `body` of the annotation, and the region of the Container that the user clicks or otherwise activates to follow the link is the `target`: +The resource the user should be taken to is the `body` of the annotation, and the region of the Container that the user clicks or otherwise activates to follow the link is the `target`: ```jsonc { From aa680349b15f3336269061911b7355e3349e0edb Mon Sep 17 00:00:00 2001 From: Julie Winchester Date: Wed, 29 Oct 2025 15:17:02 -0500 Subject: [PATCH 187/192] Update UnitValue to QuantityValue --- source/presentation/4.0/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index f5696858f..2cc2668cc 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -1501,10 +1501,10 @@ In this example, the audio content resources have durations that do not match th "format": "audio/mp3" }, "volume": { - "id": "https://example.org/iiif/value/1", - "type": "UnitValue", + "id": "https://example.org/iiif/quantity/1", + "type": "Quantity", "unit": "relative", - "quantity": 0.1 + "quantityValue": 0.1 } }, "target": "https://example.org/iiif/scene1" @@ -1523,10 +1523,10 @@ In this example, the audio content resources have durations that do not match th "format": "audio/mp3" }, "volume": { - "id": "https://example.org/iiif/value/2", - "type": "UnitValue", + "id": "https://example.org/iiif/quantity/2", + "type": "Quantity", "unit": "relative", - "quantity": 0.2 + "quantityValue": 0.2 } }, "target": { @@ -1569,10 +1569,10 @@ In this example, the audio content resources have durations that do not match th }, "angle": 45.0, "volume": { - "id": "https://example.org/iiif/value/3", - "type": "UnitValue", + "id": "https://example.org/iiif/quantity/3", + "type": "Quantity", "unit": "relative", - "quantity": 0.3 + "quantityValue": 0.3 }, "lookAt": "https://example.org/iiif/scene1" }, From e3b15aa963dcb217323b324e9646a32663df380e Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 16:17:04 -0400 Subject: [PATCH 188/192] UnitQuantityMeasureAmountExtentValue --- source/presentation/4.0/model.md | 89 +++++++++++++++++--------------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index cdfba86ac..d2aa4711e 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -836,9 +836,9 @@ Spot Lights _MAY_ have the following additional properties: [lookAt](#lookAt) "color": "#FFFFFF", "intensity": { "id": "https://example.org/iiif/spotlight/1/value", - "type": "UnitValue", + "type": "Quantity", "unit": "relative", - "value": 0.5 + "quantityValue": 0.5 } } ``` @@ -923,9 +923,9 @@ Spot Audio Emitters _MAY_ have the following additional properties: [lookAt](#lo "angle": 45.0, "volume": { "id": "https://example.org/iiif/value/1", - "type": "UnitValue", + "type": "Quantity", "unit": "relative", - "value": 1.0 + "quantityValue": 1.0 } } ``` @@ -1065,24 +1065,24 @@ Services will also have specific requirements as to additional properties based {: .note} -#### Unit Value -{: #UnitValue} +#### Quantity +{: #Quantity} -> `"type": "UnitValue"` +> `"type": "Quantity"` -A UnitValue expresses a quantity through a numerical value and associated unit of measurement. The value of `unit` _MUST_ be drawn from the list of possible units, or a registered extension. +A Quantity expresses a quantity through a numerical value and associated unit of measurement. The value of `unit` _MUST_ be drawn from the list of possible units, or a registered extension. __Properties__
    -A Unit Value _MUST_ have the following properties: [type](#type), [value](#value), and [unit](#unit).

    -A Unit Value _MAY_ have the following properties: [id](#id) and [label](#label). +A Quantity _MUST_ have the following properties: [type](#type), [quantityValue](#value), and [unit](#unit).

    +A Quantity _MAY_ have the following properties: [id](#id) and [label](#label). {: .note} {% include api/code_header.html %} ```json { "id": "https://example.org/iiif/unit/2", - "type": "UnitValue", - "value": 1.0, + "type": "Quantity", + "quantityValue": 1.0, "unit": "m" } ``` @@ -1522,11 +1522,11 @@ A floating point number giving the time of the point in seconds from the beginni ### intensity {: #intensity} -This property sets the strength or brightness of a Light. The `value` of the referenced UnitValue indicates the desired intensity on a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). If this property is not specified, then the default intensity value is client-dependent. +This property sets the strength or brightness of a Light. The `value` of the referenced Quantity indicates the desired intensity on a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). If this property is not specified, then the default intensity value is client-dependent. -The value of this proerty _MUST_ be a UnitValue. -The `unit` property of the UnitValue _MUST_ be `relative`. -The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. +The value of this property _MUST_ be a Quantity. +The `unit` property of the Quantity _MUST_ be `relative`. +The `value` property of the Quantity _MUST_ be between 0.0 and 1.0. * A Light _SHOULD_ have the `intensity` property.
    Clients _SHOULD_ process the `intensity` property on a Light. @@ -1535,8 +1535,8 @@ The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. { "intensity": { "id": "https://example.org/iiif/intensity/1", - "type": "UnitValue", - "value": 0.5, + "type": "Quantity", + "quantityValue": 0.5, "unit": "relative"} } ``` @@ -2088,14 +2088,15 @@ The value of the quality parameter in the IIIF Image API URL structure, as recor { "quality": "default" } ``` -### quantity +### quantityValue +{: #quantityValue} -The `quantity` property of a Unit Value conveys its numerical component. +The `quantityValue` property of a Quantity conveys its numerical component. -The value _MUST_ be a floating point number. +The value of `quantityValue` _MUST_ be a floating point number. -* A UnitValue _MUST_ have the `quantity` property.
    - Clients _MUST_ process the `quantity` property on a Unit Value. +* A Quantity _MUST_ have the `quantity` property.
    + Clients _MUST_ process the `quantity` property on a Quantity. {% include api/code_header.html %} ``` json-doc @@ -2386,26 +2387,27 @@ The value _MUST_ be a string, and the value _MUST_ be a URI. ### spatialScale {: #spatialScale} -A single UnitValue that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `quantity` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. +A single Quantity that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `quantityValue` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. To assert a `spatialScale` for a Content Resource, the resource _MUST_ first be painted into a Container and the `spatialScale` is asserted on that Container. For example, a 3d model would be painted into a Scene, and then `spatialScale` is asserted on the Scene. + * A Canvas _MAY_ have the `spatialScale` property.
    + Clients _SHOULD_ process `spatialScale` on a Canvas. + * A Scene _MAY_ have the `spatialScale` property.
    + Clients _SHOULD_ process `spatialScale` on a Scene. + {% include api/code_header.html %} ``` json-doc { "type": "Scene", "spatialScale": { - "type": "UnitValue", - "quantity": 22.0, + "type": "Quantity", + "quantityValue": 22.0, "unit": "m" } } ``` - * A Canvas _MAY_ have the `spatialScale` property.
    - Clients _SHOULD_ process `spatialScale` on a Canvas. - * A Scene _MAY_ have the `spatialScale` property.
    - Clients _SHOULD_ process `spatialScale` on a Scene. ### start {: #start} @@ -2555,7 +2557,7 @@ The value _MUST_ be an array of JSON objects. ### temporalScale {: #temporalScale} -A single UnitValue that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `quantity` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. +A single Quantity that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `quantityValue` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. To assert a `temporalScale` for a Content Resource, the resource _MUST_ first be painted into a Container with a `duration` and the `temporalScale` is asserted on that Container. For example, an Audio file is painted into a Timeline, and then `temporalScale` is asserted on the Timeline. @@ -2572,8 +2574,8 @@ To assert a `temporalScale` for a Content Resource, the resource _MUST_ first be { "type": "Canvas", "temporalScale": { - "type": "UnitValue", - "quantity": 1000, + "type": "Quantity", + "quantityValue": 1000, "unit": "s" } } @@ -2717,7 +2719,7 @@ For compatibility with previous versions, clients _SHOULD_ accept `Sound` as a s ### unit -The unit of measurement of a quantity expressed by a UnitValue. +The unit of measurement of a quantity expressed by a Quantity. The value _MUST_ be a string value. This specification defines the values in the table below. Others may be defined externally as an [extension][prezi30-ldce]. @@ -2727,9 +2729,14 @@ The value _MUST_ be a string value. This specification defines the values in th | s | seconds | | relative | relative | -* A UnitValue _MUST_ have the `unit` property +* A Quantity _MUST_ have the `unit` property.
    + Clients _SHOULD_ process the `unit` property on Quantity instances. + +{% include api/code_header.html %} +``` json-doc +{ "unit": "m" } +``` -FIXME: possible values are 'm' and 's' and 'relative'. Is relative always 0-1.0, or context-dependent (see def of intensity)? Allow extensions? ### value @@ -2805,18 +2812,18 @@ The value _MUST_ be a string. ### volume {: #volume} -The volume property represents the relative volume of an audio source. The `value` of the specified UnitValue represents the desired volume on a linear scale from 0.0 (silence) to 1.0 (maximum volume). If this property is not specified, then the default volume value is client-dependent. +The volume property represents the relative volume of an audio source. The `quantityValue` of the specified Quantity represents the desired volume on a linear scale from 0.0 (silence) to 1.0 (maximum volume). If this property is not specified, then the default volume value is client-dependent. -The value of this property _MUST_ be a UnitValue. -The `unit` property of the UnitValue _MUST_ be `relative`. -The `value` property of the UnitValue _MUST_ be between 0.0 and 1.0. +The value of this property _MUST_ be a Quantity. +The `unit` property of the Quantity _MUST_ be `relative`. +The `value` property of the Quantity _MUST_ be between 0.0 and 1.0. * Audio resource types _SHOULD_ have the `volume` property.
    Clients _SHOULD_ process the `volume` property on an Audio resource. {% include api/code_header.html %} ``` json-doc -{ "volume": { "unit": "relative", "value": 0.5 } } +{ "volume": { "type": "Quantity", "unit": "relative", "quantityValue": 0.5 } } ``` From f61a0e2072e7b0adfe94c7e5b27c65e6db806c43 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 16:42:41 -0400 Subject: [PATCH 189/192] styleClass/stylesheet --- source/presentation/4.0/model.md | 33 +++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index d2aa4711e..a62b319d3 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2488,14 +2488,41 @@ The value _MUST_ be an array of JSON objects. Each item _MUST_ have the `id` and ### styleClass {: #styleClass} -The name of a CSS class to apply when rendering the Specific Resource it is associated with. +The name of a CSS class to apply when rendering the Specific Resource the style class is associated with. This might change the color of the text, the background color, add borders to the element, change the font size or family, or any other CSS-based styling. The class definition is given using the `stylesheet` property, defined below, which can be used on an Annotation. While Specific Resources _MAY_ appear outside of Annotations, `styleClass` is not valid in these circumstances as there will not be a corresponding `stylesheet` to define the style. If the stylesheet does not define the class given in `styleClass`, then the class _MUST_ be ignored. -FIXME: Get rid of styles completely??? +The value of the `styleClass` _MUST_ be a string. + +For more information about `styleClass`, see the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#styles). + +* A Specific Resource _MAY_ have the `styleClass` property.
    + Clients _SHOULD_ process the `styleClass` property. + +{% include api/code_header.html %} +``` json-doc +{ "styleClass": "red" } +``` ### stylesheet {: #stylesheet} -FIXME: Delete??? +The `stylesheet` property conveys either a reference to an external CSS stylesheet document, or carries an embedded stylesheet. This stylesheet is used to resolve CSS classes for processing the `styleClass` directive on Specific Resources, described above. + +The value for `stylesheet` _MUST_ be a JSON object. If the stylesheet is referenced, then the JSON object _MUST_ have the `id` and `type` properties. Conversely, if the stylesheet's content is embedded, then it _MUST_ have the `type` and `value` properties, and _MUST NOT_ have the `id` property. The value of `type` _MUST_ be "CssStylesheet". + +For more information about `stylesheet`, see the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#styles). + +* An Annotation _MAY_ have the `stylesheet` property.
    + Clients _SHOULD_ process the `stylesheet` property on Annotations. + +{% include api/code_header.html %} +``` json-doc +{ "stylesheet": + { + "type": "CssStylesheet", + "value": ".red { color: red }" + } +} +``` ### summary From a12d21be86d0446422f839e09fbcef63d8421a5f Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 29 Oct 2025 16:44:03 -0400 Subject: [PATCH 190/192] Update model.md --- source/presentation/4.0/model.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index a62b319d3..8b630addd 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -2946,10 +2946,6 @@ __Incompatibility Warning__
    The definition of `label` in the Web Annotation specification does not produce JSON conformant with the structure defined in this specification for languages. Given the absolute requirement for internationalized labels and the strong desire for consistently handling properties, the `label` property on Annotation model classes does not conform to the string requirement of the Web Annotation Data Model. This [issue has been filed with the W3C][github-webanno-437] and will hopefully be addressed in a future version of the standard. {: .warning} - -### FIXME: value, value, and value - - The following properties are defined by both, and the IIIF representation is more specific than the Web Annotation Data Model but are not in conflict, or are never used on the same resource: * `homepage`: In IIIF the home page of a resource is represented as a JSON object, whereas in the Web Annotation Data Model it can also be a string. From ec1ebfea8891a710ede0382b9704651996e6dd6a Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Nov 2025 13:58:28 -0500 Subject: [PATCH 191/192] Fixes for Julie, thank you! --- source/presentation/4.0/model.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 8b630addd..021e39ee0 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1525,8 +1525,8 @@ A floating point number giving the time of the point in seconds from the beginni This property sets the strength or brightness of a Light. The `value` of the referenced Quantity indicates the desired intensity on a linear scale between 0.0 (no brightness) and 1.0 (as bright as the client will render). If this property is not specified, then the default intensity value is client-dependent. The value of this property _MUST_ be a Quantity. -The `unit` property of the Quantity _MUST_ be `relative`. -The `value` property of the Quantity _MUST_ be between 0.0 and 1.0. +The value of the `unit` property of the Quantity _MUST_ be `relative`. +The value of the `quantityValue` property of the Quantity _MUST_ be between 0.0 and 1.0. * A Light _SHOULD_ have the `intensity` property.
    Clients _SHOULD_ process the `intensity` property on a Light. @@ -2387,7 +2387,7 @@ The value _MUST_ be a string, and the value _MUST_ be a URI. ### spatialScale {: #spatialScale} -A single Quantity that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `quantityValue` 0.00008 represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. +A single Quantity that defines a real-world scale factor for the coordinate units of a Canvas or Scene. For a Canvas, this defines the physical distance corresponding to the length of a single Canvas coordinate unit. A Canvas with a `width` of 5000 and a `spatialScale` with `quantityValue` of 0.00008 and a `unit` of `m` represents a physical space 0.4 meters wide. For a Scene, this defines the physical distance corresponding to the XYZ coordinate units, or in other words, the physical distance length of a unit vector in the 3D coordinate space. The value of `unit` _MUST_ be a length unit. In this specification, the only length unit defined is `m`, i.e., meters. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `m`. To assert a `spatialScale` for a Content Resource, the resource _MUST_ first be painted into a Container and the `spatialScale` is asserted on that Container. For example, a 3d model would be painted into a Scene, and then `spatialScale` is asserted on the Scene. @@ -2399,10 +2399,10 @@ To assert a `spatialScale` for a Content Resource, the resource _MUST_ first be {% include api/code_header.html %} ``` json-doc { - "type": "Scene", + "type": "Canvas", "spatialScale": { "type": "Quantity", - "quantityValue": 22.0, + "quantityValue": 0.00008, "unit": "m" } } @@ -2584,7 +2584,7 @@ The value _MUST_ be an array of JSON objects. ### temporalScale {: #temporalScale} -A single Quantity that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `quantityValue` 1000 represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. +A single Quantity that defines a multiplier or scale factor for the `duration` property of a Container, indicating that one second in "Container time" represents some other real world duration. A Canvas with a `duration` of 450 seconds and a `temporalScale` with `quantityValue` of 1000 and a `unit` of `s` represents a real-world duration of 450,000 seconds (5.2 days), for example a time-lapse video of a growing plant. The value of `unit` _MUST_ be a time unit. In this specification, the only time unit defined is `s`, i.e., seconds. Unless other values are defined externally as an [extension][prezi30-ldce], the value of `unit` _SHOULD_ always be `s`. To assert a `temporalScale` for a Content Resource, the resource _MUST_ first be painted into a Container with a `duration` and the `temporalScale` is asserted on that Container. For example, an Audio file is painted into a Timeline, and then `temporalScale` is asserted on the Timeline. @@ -2602,7 +2602,7 @@ To assert a `temporalScale` for a Content Resource, the resource _MUST_ first be "type": "Canvas", "temporalScale": { "type": "Quantity", - "quantityValue": 1000, + "quantityValue": 1000.0, "unit": "s" } } From ef95d1fe7bb962c040f968dd282bed83fb566ae9 Mon Sep 17 00:00:00 2001 From: Rob Sanderson Date: Wed, 19 Nov 2025 14:01:28 -0500 Subject: [PATCH 192/192] Forward ref --- source/presentation/4.0/model.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index 021e39ee0..b9de672cd 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -1070,7 +1070,7 @@ Services will also have specific requirements as to additional properties based > `"type": "Quantity"` -A Quantity expresses a quantity through a numerical value and associated unit of measurement. The value of `unit` _MUST_ be drawn from the list of possible units, or a registered extension. +A Quantity expresses a quantity through a numerical value and associated unit of measurement. The value of `unit` _MUST_ be drawn from the list of possible units, or a registered extension. The definition of `unit` defines the [list of possible units](#unit). __Properties__
    A Quantity _MUST_ have the following properties: [type](#type), [quantityValue](#value), and [unit](#unit).

Dk8qHDHcAD=SOI@E)vn+4UY-5*gQ#Z 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