<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.2.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-ocm-open-cloud-mesh-01" category="std" consensus="true" submissionType="IETF">
  <front>
    <title>Open Cloud Mesh</title>

    <author initials="G." surname="Lo Presti" fullname="Giuseppe Lo Presti">
      <organization>CERN</organization>
      <address>
        <email>giuseppe.lopresti@cern.ch</email>
        <uri>http://cern.ch/lopresti</uri>
      </address>
    </author>
    <author initials="M. B." surname="de Jong" fullname="Michiel de Jong">
      <organization>Ponder Source</organization>
      <address>
        <email>michiel@pondersource.org</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>
    <author initials="M." surname="Baghbani" fullname="Mahdi Baghbani">
      <organization>Ponder Source</organization>
      <address>
        <email>mahdi@pondersource.org</email>
        <uri>https://pondersource.com</uri>
      </address>
    </author>
    <author initials="M." surname="Nordin" fullname="Micke Nordin">
      <organization>SUNET</organization>
      <address>
        <email>kano@sunet.se</email>
        <uri>https://code.smolnet.org/micke</uri>
      </address>
    </author>

    <date year="2026" month="January" day="20"/>

    <area>Applications and Real-Time</area>
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 38?>

<t>Open Cloud Mesh (OCM) is a server federation protocol that is used to
notify a Receiving Party that they have been granted access to some
Resource.  It has similarities with authorization flows such as
OAuth, as well as with social internet protocols such as ActivityPub
and email.</t>

<t>A core use case of OCM is when a user (e.g., Alice on System A) wishes
to share a resource (e.g., a file) with another user (e.g., Bob on
System B) without transferring the resource itself or requiring Bob to
log in to System A.</t>

<t>While this scenario is illustrative, OCM is designed to support a
broader range of interactions, including but not limited to file
transfers.</t>

<t>Open Cloud Mesh handles interactions only up to the point where the
Receiving Party is informed of their access to the Resource.  Actual
Resource access is subsequently managed by other protocols, such as
WebDAV.</t>



    </abstract>



  </front>

  <middle>


<?line 60?>

<section anchor="introduction"><name>Introduction</name>

<t>Open Cloud Mesh was initially conceived of in 2015 and has been deployed
since 2016.  OCM has been implemented by several platforms, including
CERNBox, Nextcloud, OpenCloud, ownCloud, and Seafile.</t>

<t>The goal of OCM is to provide a secure, scalable, and flexible
infrastructure for securely sharing and collaborating on resources and
has seen wide adoption, not least in the academic sector.</t>

<t>The core idea of OCM is to make it simple for users to do the right
thing.  This is achieved by providing a protocol that abstracts away
security and authentication details from the users to the servers acting
on behalf of the users.  Another important point of the protocol is the
invitation mechanism that lets users connect over established human
relationships and use those connections to establish contact between
their respective OCM servers.</t>

</section>
<section anchor="terms"><name>Terms</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 [RFC2119] [RFC8174] when, and only when,
they appear in all capitals, as shown here.</t>

<t>We define the following concepts, with some non-normative references to
related concepts from OAuth [RFC6749] and elsewhere:</t>

<t><list style="symbols">
  <t><strong>Resource</strong> - The piece of data or interaction to which access is
being granted, including but not limited to: a file or folder, a video
call, a contact, a printer queue, etc.</t>
  <t><strong>Remote Resource</strong> - A Resource provided by the Sending Server.</t>
  <t><strong>Shared Resource</strong> - A Resource shared by an OCM Server, becoming a
Remote Resource if accepted by the Invite Receiver OCM Server.</t>
  <t><strong>Share</strong> - A policy rule stating that certain actors have specific
access rights to a Resource; it MAY also refer to a record in a
database representing this rule.</t>
  <t><strong>Sending Party</strong> - A person or party who is authorized to create
Shares; similar to "Resource Owner" in OAuth [RFC6749], identified by
its OCM Address.</t>
  <t><strong>Receiving Party</strong> - A person, group or party who is granted access
to the Resource through the Share; similar to "Requesting Party / RqP"
in OAuth-UMA, identified by its OCM Address.</t>
  <t><strong>Share Creation Notification</strong> - A server-to-server request from the
sending server to the receiving server, notifying the receiving server
that a Share has been created.</t>
  <t><strong>Sending Server</strong> - The server that:
  <list style="symbols">
      <t>holds the Resource ("file server" or "Entreprise File Sync and Share
(EFSS) server" role),</t>
      <t>provides access to it (by exposing at least one "API"),</t>
      <t>takes the decision to create the Share based on user interface
gestures from the Sending Party (the "Authorization Server" role in
OAuth [RFC6749]),</t>
      <t>takes the decision about authorizing attempts to access the Resource
(the "Resource Server" role in OAuth [RFC6749]),</t>
      <t>sends out Share Creation Notifications when appropriate (see below).</t>
    </list></t>
  <t><strong>Receiving Server</strong> - The server that:
  <list style="symbols">
      <t>receives Share Creation Notifications (see below),</t>
      <t>actively or passively notifies the receiving user or group of any
incoming Share Creation Notification,</t>
      <t>acts as an API client, allowing the receiving user to access the
Resource through an API (e.g., WebDAV [RFC4918]) of the sending
server.</t>
    </list></t>
  <t><strong>Sending Gesture</strong> - A user interface interaction from the Sending
Party to the Sending Server, conveying the intention to create a
Share.</t>
  <t><strong>Share Creation</strong> - The addition of a Share to the database state of
the Sending Server, in response to a successful Sending Gesture or for
another reason.</t>
  <t><strong>Sharing User</strong> - A user providing access to a Resource through a
Share.</t>
  <t><strong>FQDN</strong> - Fully Qualified Domain Name, such as <spanx style="verb">"cloud.example.org"</spanx>.</t>
  <t><strong>OCM Server</strong> - A server that supports OCM.</t>
  <t><strong>OCM API Discovery</strong> - Process of evaluating properties of a Remote
Resource, after establishing contact with an OCM Server.</t>
  <t><strong>Discovering Server</strong> - A server that tries to obtain information in
OCM API Discovery.</t>
  <t><strong>Discoverable Server</strong> - A server that tries to supply information in
OCM API Discovery.</t>
  <t><strong>Federation</strong> - A group of OCM Providers that have established
mutual trust and agree on certain policies for interaction.  A
Federation MAY be facilitated by a Directory Service.</t>
  <t><strong>FQDN</strong> - Fully Qualified Domain Name, such as <spanx style="verb">"cloud.example.com"</spanx>.</t>
  <t><strong>Invite Acceptance Gesture</strong> - Gesture from the Invite Receiver to
the Invite Receiver OCM Server, supplying the Invite Token as well as
the OCM Address of the Invite Sender, effectively allowlisting the
Invite Sender OCM Server for sending Share Creation Notifications to
the Invite Receiver OCM Server.</t>
  <t><strong>Invite Acceptance Response</strong> - HTTP response to the Invite
Acceptance Request.</t>
  <t><strong>Invite Acceptance Request</strong> - API call from the Invite Receiver OCM
Server to the Invite Sender OCM Server, supplying the Invite Token as
well as the OCM Address of the Invite Receiver, effectively
allowlisting the Invite Sender OCM Server for sending Share Creation
Notifications to the Invite Receiver OCM Server.</t>
  <t><strong>Invite Creation Gesture</strong> - Gesture from the Invite Sender to the
Invite Sender OCM Server, resulting in the creation of an Invite
Token.</t>
  <t><strong>Invite Message</strong> - Out-of-band message used to establish contact
between parties and servers in the Invite Flow, containing an Invite
Token (see below) and the Invite Sender's OCM Address.</t>
  <t><strong>Invite Receiver</strong> - The party receiving an Invite, identified by its
OCM Address.</t>
  <t><strong>Invite Receiver OCM Server</strong> - The server holding an address book
used by the Invite Receiver, to which details of the Invite Sender are
to be added.</t>
  <t><strong>Invite Sender</strong> - The party sending an Invite, identified by its
OCM Address.</t>
  <t><strong>Invite Sender OCM Server</strong> - The server holding an address book
used by the Invite Sender, to which details of the Invite Receiver are
to be added.</t>
  <t><strong>Invite String</strong> - A base64 encoded string containing an Invite Token
and the FQDN of an Invite Sender OCM Server joined by an <spanx style="verb">@</spanx>-sign.</t>
  <t><strong>Invite Token</strong> - A hard-to-guess string used in the Invite Flow,
generated by the Invite Sender OCM Server and linked uniquely to the
Invite Sender's OCM Address.</t>
  <t><strong>OCM Address</strong> - identifies a user or group "at" an OCM Server.
The OCM Address contains a server specific Party identifier, a host
locating the OCM Server and an optional port.  The OCM Address is not a
URI as it does not have scheme and the identifier may contain reserved
characters.  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  ocm-address = identifier "@" host [ ":" port]
]]></artwork></figure>
  <vspace blankLines='1'/>
The identifier is an opaque, case-sensitive UTF-8 string.  It is
  separated from the host by the last "@" in the OCM Address.  It is
  possible to have multiple @-signs in a OCM-address, e.g. when an
  email address is the local part of the address like
  <spanx style="verb">nomen.nescio@example.org@ocm.example.org</spanx>.  <vspace blankLines='1'/>
host is an IP literal encapsulated within square brackets, an IPv4
  address in dotted decimal form, or a registered name as described in
  [RFC3986].  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  host = IP-literal / IPv4address / reg-name
]]></artwork></figure>
  <vspace blankLines='1'/>
The optional port subcomponent can be used to specify a port to use
  for discovery (see Discovery Process).  <vspace blankLines='1'/>
The OCM Server MUST be discoverable at the given host and optional
  port via the Well-Known [RFC8615] path <spanx style="verb">/.well-known/ocm</spanx>.  The OCM
  Address MUST NOT contain a path.</t>
  <t><strong>OCM API Discovery</strong> - Process of evaluating properties of a Remote
Resource, after establishing contact with an OCM Server.</t>
  <t><strong>OCM Server</strong> - A server that has the OCM Provider function.</t>
  <t><strong>Discovering Server</strong> - A server that tries to obtain information in
OCM API Discovery.</t>
  <t><strong>OCM Notification</strong> - A message from the Receiving Server to the
Sending Server or vice versa, using the OCM Notifications endpoint.</t>
  <t><strong>Receiving Party</strong> - A person, group or party who is granted access
to the Resource through the Share; similar to "Requesting Party / RqP"
in OAuth-UMA, identified by its OCM Address.</t>
  <t><strong>Receiving Server</strong> - The server that:
  <list style="symbols">
      <t>receives Share Creation Notifications (see below),</t>
      <t>actively or passively notifies the receiving user or group of any
incoming Share Creation Notification,</t>
      <t>acts as an API client, allowing the receiving user to access the
Resource through an API (e.g., WebDAV [RFC4918]) of the sending
server.</t>
    </list></t>
  <t><strong>Remote Resource</strong> - A Resource provided by the Sending Server.</t>
  <t><strong>Resource</strong> - The piece of data or interaction to which access is
being granted, including but not limited to: a file or folder, a video
call, a contact, a printer queue, etc.</t>
  <t><strong>Sending Gesture</strong> - A user interface interaction from the Sending
Party to the Sending Server, conveying the intention to create a
Share.</t>
  <t><strong>Sending Party</strong> - A person or party who is authorized to create
Shares; similar to "Resource Owner" in OAuth [RFC6749], identified by
its OCM Address.</t>
  <t><strong>Sending Server</strong> - The server that:
  <list style="symbols">
      <t>holds the Resource for instance, a file server,</t>
      <t>provides access to it (by exposing at least one "API"),</t>
      <t>takes the decision to create the Share based on user interface
gestures from the Sending Party (the "Authorization Server" role in
OAuth [RFC6749]),</t>
      <t>takes the decision about authorizing attempts to access the Resource
(the "Resource Server" role in OAuth [RFC6749]),</t>
      <t>sends out Share Creation Notifications when appropriate (see below).</t>
    </list></t>
  <t><strong>Share</strong> - A policy rule stating that certain actors have specific
access rights to a Resource; it MAY also refer to a record in a
database representing this rule.</t>
  <t><strong>Share Creation</strong> - The addition of a Share to the database state of
the Sending Server, in response to a successful Sending Gesture or for
another reason.</t>
  <t><strong>Share Creation Notification</strong> - A server-to-server request from the
sending server to the receiving server, notifying the receiving server
that a Share has been created.</t>
  <t><strong>Share Name</strong> - A human-readable string, provided by the Sending
Party or the Sending Server, to help the Receiving Party understand
which Resource the Share grants access to.</t>
  <t><strong>Share Permissions</strong> - protocol-specific allowances granted to the
Receiving Party on the modes of accessing the Resource.</t>
  <t><strong>Share Requirements</strong> - Protocol-specific restrictions on the modes
of accessing the Resource.</t>
  <t><strong>Shared Resource</strong> - A Resource shared by an OCM Server, becoming a
Remote Resource if accepted by the Invite Receiver OCM Server.</t>
  <t><strong>Sharing User</strong> - A user providing access to a Resource through a
Share.</t>
  <t><strong>Trusted Server</strong> - An OCM Server that is considered trustworthy by
  another OCM Server, based on out-of-band information, federation
  membership or prior interactions, SHOULD be recorded in an internal
  registry of trusted servers, that SHOULD be updated over time based
  on new information.  The registry SHOULD include the FQDN of the
  trusted server and the Public Key used for HTTP Signatures.  It MAY
  also include additional metadata such as the inviteAcceptDialog URL
  or supported capabilities.</t>
  <t><strong>WAYF Page</strong> - A Where-Are-You-From page is a discovery service used
to identify the OCM Server of an Invite Receiver.</t>
</list></t>

<section anchor="functions"><name>Functions</name>

<t>Open Cloud Mesh defines distinct functions.  It is not necessary for an
implementation to provide all of them.  In fact, it may be useful to
have separate implementations for different functions.</t>

<section anchor="ocm-provider"><name>OCM Provider</name>

<t>An OCM Provider is an entity that can take on the two <em>roles</em> of a
<em>Sending Server</em> and a <em>Receiving Server</em>.  An OCM Provider MUST be a
<em>Discoverable Server</em> and SHOULD be able to receive <em>Notifications</em>.</t>

</section>
<section anchor="ocm-directory-service"><name>OCM Directory Service</name>

<t>An OCM Directory Service is an entity that exposes information about a
<em>Federation</em> of OCM Providers.</t>

</section>
</section>
<section anchor="roles"><name>Roles</name>

<t>Open Cloud Mesh defines two distinct roles that an OCM Provider MUST
take on: the <em>Sending Server</em> role and the <em>Receiving Server</em> role.</t>

<section anchor="sending-server"><name>Sending Server</name>

<t>A Sending Server is an OCM Provider that holds Resources and exposes
APIs to allow access to them.  It allows its users to create <em>Shares</em>
to give other users access to those Resources.  A Sending Server MAY
provide its users with the ability to generate <em>Invites</em> to establish
contact with other users on other OCM Providers.  When doing so it MAY
provide a <em>WAYF Page</em> to facilitate the Invite Flow.  The WAYF page MAY
be limited to a set of trusted OCM Providers, for instance those in the
same <em>Federation</em>.</t>

</section>
<section anchor="receiving-server"><name>Receiving Server</name>

<t>A Receiving Server is an OCM Provider that receives <em>Share</em> Creation
Notifications from Sending Servers, notifies its users about incoming
<em>Shares</em>, and acts as an API client to allow its users to access Remote
Resources.  It MAY provide its users with an <em>Address Book</em> of
<em>Contacts</em> and the ability to accept <em>Invites</em>.</t>

<t>In Appendix D, an object model is presented as a non-normative guide for
implementers to understand the relationships between these terms.</t>

</section>
</section>
</section>
<section anchor="general-flow"><name>General Flow</name>

<t>The lifecycle of an Open Cloud Mesh Share starts with prerequisites such
as establishing trust, establishing contact, and OCM API Discovery.</t>

<t>Then the share creation involves the Sending Party making a Sending
Gesture to the Sending Server, the Sending Server carrying out the
actual Share Creation, and the Sending Server sending a Share Creation
Notification to the Receiving Server.</t>

<t>After this, the Receiving Server MAY notify the Receiving Party and/or
the Sending Server, and will act as an API client through which the
Receiving Party can access the Resource.  The Receiving Party or
the Sending Party MAY then update or delete the Share: the respective
Server MAY send a Notification to the other party about the change.</t>

</section>
<section anchor="establishing-contact"><name>Establishing Contact</name>

<t>Before the Sending Server can send a Share Creation Notification to the
Receiving Server, it MUST establish the Receiving Party's OCM
Address (containing the Receiving Server's FQDN, and the Receiving
Party's identifier), among other things.  Some steps may preceed the
Sending Gesture, allowing the Sending Party to establish (with some
level of trust) the OCM Address of the Receiving Party.  In other cases,
establishing the OCM Address of the Receiving Party happens as part of
the Sending Gesture.</t>

<section anchor="direct-entry"><name>Direct Entry</name>

<t>The simplest way for this is if the Receiving Party shares their OCM
Address with the Sending Party through some out-of-band means, and the
Sending Party enters this string into the user interface of the Sending
Server, by means of typing or pasting into an HTML form, or clicking a
link to a URL that includes the string in some form.</t>

</section>
<section anchor="public-link-flow"><name>Public Link Flow</name>

<t>An interface for anonymously viewing a Resource on the Sending Server
MAY allow any internet user to type or paste an OCM address into an HTML
form, as a Sending Gesture.  This means that the Sending Party and the
Receiving Party could be the same person, so contact between them does
not need to be explicitly established.</t>

</section>
<section anchor="public-invite-flow"><name>Public Invite Flow</name>

<t>Similarly, an interface on the Sending Server MAY allow any internet
user to type or paste an OCM address into an HTML form, as a Sending
Gesture for a given Resource, without itself providing a way to access
that particular Resource.  A link to this interface could then for
instance be shared on a mailing list, allowing all subscribers to
effectively request access to the Resource by making a Sending Gesture
to the Sending Server with their own OCM Address.</t>

</section>
<section anchor="invite-flow"><name>Invite Flow</name>

<section anchor="rationale"><name>Rationale</name>

<t>Many methods for establishing contact allow unsolicited contact with the
prospective Receiving Party whenever that party's OCM Address is known.
The Invite Flow requires the Receiving Party to explicitly accept it
before it can be used, which establishes bidirectional trust between the
two parties involved.</t>

<t>OCM Servers MAY enforce a policy to only accept Shares between such
trusted contacts, or MAY display a warning to the Receiving Party when a
Share Creation Notification from an unknown Sending Party is received</t>

</section>
<section anchor="steps"><name>Steps</name>

<t><list style="symbols">
  <t>the Invite Sender OCM Server generates a unique Invite Token and helps
the Invite Sender to create the Invite Message</t>
  <t>the Invite Sender uses some out-of-band communication to send the
Invite Message, containing the Invite Token and the Invite Sender OCM
Server FQDN, to the Invite Receiver</t>
  <t>the Invite Receiver navigates to the Invite Receiver OCM Server and
makes the Invite Acceptance Gesture.  This step MAY be facilitated if
the Invite Sender OCM Server implements a WAYF Page, such that the
Invite Message would include a link to it for the Invite Receiver to
navigate to: the Invite Receiver would then be able to indicate their
OCM Server and proceed with the Invite Acceptance Gsture without
manually copying the Invite Token.</t>
  <t>the Invite Receiver OCM Server discovers the OCM API of the Invite
Sender OCM Server using generic OCM API Discovery (see section below)</t>
  <t>the Invite Receiver OCM Server sends the Invite Acceptance Request to
the Invite Sender OCM Server</t>
</list></t>

</section>
<section anchor="invite-acceptance-request-details"><name>Invite Acceptance Request Details</name>

<t>Whereas the precise syntax of the Invite Message and the Invite
Acceptance Gesture will differ between implementations, the Invite
Acceptance Request SHOULD be a HTTP POST request:</t>

<t><list style="symbols">
  <t>to the <spanx style="verb">/invite-accepted</spanx> path in the Invite Sender OCM Server's OCM
API</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP request header</t>
  <t>its request body containing a JSON document representing an object
with the following string fields:
  <list style="symbols">
      <t>REQUIRED: <spanx style="verb">recipientProvider</spanx> - FQDN of the Invite Receiver OCM
Server.</t>
      <t>REQUIRED: <spanx style="verb">token</spanx> - The Invite Token.  The Invite Sender OCM Server
SHOULD recall which Invite Sender OCM Address this token was linked
to.</t>
      <t>REQUIRED: <spanx style="verb">userID</spanx> - The Invite Receiver's identifier at their OCM
Server.</t>
      <t>REQUIRED: <spanx style="verb">email</spanx> - Non-normative / informational; an email address
for the Invite Receiver.  Not necessarily at the same FQDN as their
OCM Server.</t>
      <t>REQUIRED: <spanx style="verb">name</spanx> - Human-readable name of the Invite Receiver, as a
suggestion for display in the Invite Sender's address book</t>
    </list></t>
  <t>using TLS</t>
  <t>using httpsig [RFC9421]</t>
</list></t>

<t>The Invite Receiver OCM Server SHOULD apply its own policies for
trusting the Invite Sender OCM Server before making the Invite
Acceptance Request.</t>

<t>Since the Invite Flow does not require either Party to type or remember
the <spanx style="verb">userID</spanx>, this string does not need to be human-memorable.  Even if
the Invite Receiver has a memorable username at the Invite Receiver OCM
Server, this <spanx style="verb">userID</spanx> that forms part of their OCM Address does not need
to match it.</t>

<t>Also, a different <spanx style="verb">userID</spanx> could be given out to each contact, to avoid
correlation of identities.</t>

<t>If the Invite Sender OCM Server implements a WAYF Page, such a page MAY
include a fixed list of servers, in addition to, or instead of, a
free-text input where any OCM Server can be entered.  This is especially
useful if the Invite Sender is part of a federation of associated OCM
Servers.  In order to populate the list of associated OCM Servers, the
Invite Sender's server MAY make use of a Directory Service, which is
expected to follow the specification detailed in Appendix C.</t>

<t>Implementors that provide a WAYF Page SHOULD make the URL for the API
endpoint of such a Directory Service configurable, allowing the OCM
Server to be part of a network of associated OCM Servers.  The
configuration mechanism MAY allow an OCM Server to be part of multiple
networks, thus displaying a union of multiple lists in its WAYF Page.</t>

</section>
<section anchor="invite-acceptance-response-details"><name>Invite Acceptance Response Details</name>

<t>The Invite Acceptance Response SHOULD be a HTTP response:</t>

<t><list style="symbols">
  <t>in response to the Invite Acceptance Request</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP response header</t>
  <t>its response body containing a JSON document representing an object
with the following string fields:
  <list style="symbols">
      <t>REQUIRED: <spanx style="verb">userID</spanx> - the Invite Sender's identifier at their OCM
Server</t>
      <t>REQUIRED: <spanx style="verb">email</spanx> - non-normative / informational; an email address
for the Invite Sender.  Not necessarily at the same FQDN as their
OCM Server</t>
      <t>REQUIRED: <spanx style="verb">name</spanx> - human-readable name of the Invite Sender, as a
suggestion for display in the Invite Receiver's address book</t>
    </list></t>
</list></t>

<t>A 200 response status means the Invite Acceptance Request was
successful.
A 400 response status means the Invite Token is invalid or does not
exist.
A 403 response status means the Invite Receiver OCM Server is not
trusted to accept this Invite.
A 409 response status means the Invite was already accepted.</t>

<t>The Invite Sender OCM Server SHOULD verify the HTTP Signature on the
Invite Acceptance Request and apply its own policies for trusting the
Invite Receiver OCM Server before processing the Invite Acceptance
Request and sending the Invite Acceptance Response.</t>

<t>As with the <spanx style="verb">userID</spanx> in the Invite Acceptance Request, the one in the
Response also doesn't need to be human-memorable, doesn't need to match
the Invite Sender's username at their OCM Server.</t>

</section>
<section anchor="addition-into-address-books"><name>Addition into address books</name>

<t>Following these step, both servers MAY display the <spanx style="verb">name</spanx> of the other
party as a trusted or allowlisted contact, and enable selecting them as
a Receiving Party.  OCM Servers MAY enforce a policy to only accept
Share Creation Notifications from such trusted contacts, or MAY display
a warning to users when a Share Creation Notification from an unknown
party is received.</t>

<t>Both servers MAY also allowlist each other as a server with which at
least one of their users wishes to interact.</t>

<t>In addition, if the identity provider of either server supports the
registration of external users, it may happen that the just received
email contact from the other party matches an external user already
known in the local identity provider, and therefore already present
in the address book.  In such a case, implementers MAY support linking
of the two identities belonging to that same user, so that when a Share
Creation gesture is made to that recipient, both a regular share and an
OCM Share Creation Notification are issued.</t>

<t>Note that Invites act symmetrically, so once contact has been
established, both the Invite Sender and the Invite Receiver MAY take on
either the Sending Party or the Receiving Party role in subsequent
Share Creation events.</t>

<t>Both parties MAY delete the other party from their address book at any
time without notifying them.</t>

</section>
<section anchor="invite-format"><name>Invite format</name>
<t>To accept an invite, two pieces of information are required: a <spanx style="verb">token</spanx>
and a <spanx style="verb">provider</spanx>.  There are two recognized formats:</t>

<t><list style="symbols">
  <t><strong>Invite string format:</strong>
A base64-encoded string containing the token and the provider’s FQDN,
joined by an <spanx style="verb">@</spanx> sign.  Example:  <vspace blankLines='1'/>
If the <spanx style="verb">token</spanx> is <spanx style="verb">a55a966e-15c1-4cb9-a39d-4e4c54399baf</spanx> and the
<spanx style="verb">provider</spanx> is <spanx style="verb">cloud.example.org</spanx>, the combined string is
<spanx style="verb">a55a966e-15c1-4cb9-a39d-4e4c54399baf@cloud.example.org</spanx>,
which when base64-encoded becomes
<spanx style="verb">YTU1YTk2NmUtMTVjMS00Y2I5LWEzOWQtNGU0YzU0Mzk5YmFmQG15LWNsb3VkLXN0b
3JhZ2Uub3Jn</spanx>.  <vspace blankLines='1'/>
When parsing an invite string, implementors must base64-decode it,
then split on the last <spanx style="verb">@</spanx> sign, taking care to allow multiple <spanx style="verb">@</spanx>
characters in the token part.</t>
  <t><strong>Link format:</strong>
If the inviting OCM Server supports a WAYF page, the invite may be
provided as a link with the token as a request parameter.  Example:  <vspace blankLines='1'/>
<spanx style="verb">https://cloud.example.org/wayf?token=
a55a966e-15c1-4cb9-a39d-4e4c54399baf</spanx></t>
</list></t>

<t>Implementations MUST be able to accept invites in the invite string
format.  This format is considered canonical.  The link format is only
useful if the Receiving OCM Server exposes the <spanx style="verb">inviteAcceptDialog</spanx>
in its Discovery endpoint.  Implmentations SHOULD support the link
format when they implement a WAYF Page that leverages those
<spanx style="verb">inviteAcceptDialog</spanx> targets.</t>

</section>
<section anchor="security-advantages"><name>Security Advantages</name>

<t>It is important to underscore the value of the Invite in this scenario,
as it provides four important security advantages.  First of all, if the
Receiving Server blocks Share Creation Notifications from Sending
Parties who are not in the address book of the Receiving Party, then
this protects the Receiving Party from receiving unsolicited Shares.  An
attacker could still send the Receiving Party an unsolicited Share, but
they would first need to convince the Receiving Party through an
out-of-band communication channel to accept their invite.  In many use
cases, the Receiving Party has had other forms of contact with the
Sending Party (e.g., in-person or email back-and-forth).  The
out-of-band Invite Message thus leverages the filters and context which
the Receiving Party may already benefit from in that out-of-band
communication.  For instance, a careful Receiving Party MAY choose to
only accept Invites that reach them via a private or moderated
messaging platform.</t>

<t>Second, when the Receiving Party accepts the Invite, the Receiving
Server knows that the Sending Server they are about to interact with is
trusted by the Sending Party, which in turn is trusted by the Receiving
Party, which in turn is trusted by them.  In other words, one of their
users is requesting the allowlisting of a server they wish to interact
with, in order to interact with a party they know out-of-band.  This
gives the Receiving Server reason to put more trust in the Sending
Server than it would put into an arbitrary internet-hosted server.</t>

<t>Third, equivalently, the Sending Server knows it is essentially
registering the Receiving Server as an API client at the request of the
Receiving Party, to whom the right to request this has been traceably
delegated by the Sending Party, which is one of its registered users.</t>

<t>Fourth, related to the second one, it removes the partial 'open relay'
problem that exists when the Sending Server is allowed to include any
Receiving Server FQDN in the Sending Gesture.  Without the use of
Invites, a Distributed Denial of Service attack could be organised if
many internet users collude to flood a given OCM Server with Share
Creation Notifications which will be hard to distinguish from
legitimate requests without human interaction.  An unsolicited (invalid)
Invite Acceptance Request is much easier to filter out than an
unsolicited (possibly valid, possibly invalid) Share Creation
Notification Request, since the Invite Acceptance Request needs to
contain an Invite Token that was previously uniquely generated at the
Invite Sender OCM server.</t>

</section>
</section>
</section>
<section anchor="ocm-api-discovery"><name>OCM API Discovery</name>

<section anchor="introduction-1"><name>Introduction</name>

<t>After establishing contact as discussed in the previous section, the
Sharing User MAY send the Share Creation Gesture to the Sending Server.
The Sharing User MUST provide the following information:</t>

<t><list style="symbols">
  <t>Resource to be shared</t>
  <t>Protocol to be offered for access</t>
  <t>Sending Party's identifier</t>
  <t>Receiving Party's identifier</t>
  <t>Receiving Server FQDN</t>
  <t>OPTIONAL: Share Requirements</t>
  <t>OPTIONAL: Share Name</t>
  <t>OPTIONAL: Share Permissions</t>
</list></t>

<t>The next step is for the Sending Server to additionally discover:</t>

<t><list style="symbols">
  <t>if the Receiving Server is trusted</t>
  <t>if the Receiving Server supports OCM</t>
  <t>if so, which version and with which optional functionality</t>
  <t>at which URL</t>
  <t>the public key the Receiving Server will use for HTTP Signatures (if
any)</t>
</list></t>

<t>The Sending Server MAY first perform denylist and allowlist checks on
the FQDN.</t>

<t>If a finite allowlist of Receiving Servers exists on the Sending Server
side, then this list MAY already contain all necessary information.</t>

<t>If the FQDN passes the denylist and/or allowlist checks, but no details
about its OCM API are known, the Sending Server can use the following
process to try to fetch this information from the Receiving Server.</t>

<t>This process MAY be influenced by a VPN connection and/or IP
allowlisting.</t>

<t>When OCM API Discovery can occur in preparation of a Share Creation
Notification, the Sending Server takes on the 'Discovering Server' role
and the Receiving Server plays the role of 'Discoverable Server'.</t>

</section>
<section anchor="process"><name>Process</name>

<t>At the start of the process, the Discovering Server has either an OCM
Address, or just an FQDN from for instance the <spanx style="verb">recipientProvider</spanx>
field of an Invite Acceptance Request.</t>

<t>Step 1: In case it has an OCM Address, it SHOULD first extract <spanx style="verb">&lt;fqdn&gt;</spanx>
from it (the part after the last <spanx style="verb">@</spanx> sign).
Step 2: The Discovering Server SHOULD attempt OCM API Discovery via a
HTTP GET request to <spanx style="verb">https://&lt;fqdn&gt;/.well-known/ocm</spanx>.
Step 3: If that results in a valid HTTP response with a valid JSON
response body within reasonable time, go to step 7.
Step 4: If not, try a HTTP GET with <spanx style="verb">https://&lt;fqdn&gt;/ocm-provider</spanx> as
the URL instead.
Step 5: If that results in a valid HTTP response with a valid JSON
response body within reasonable time, go to step 7.
Step 6: If not, fail.  Implementations MAY fallback to HTTP instead
of HTTPS in testing setups and retry steps 2-5, in particular when
an optional port is given in the address.
Step 7: The JSON response body is the data that was discovered.</t>

</section>
<section anchor="fields"><name>Fields</name>

<t>The JSON response body offered by the Discoverable Server SHOULD
contain the following information about its OCM API:</t>

<t><list style="symbols">
  <t>REQUIRED: enabled (boolean) - Whether the OCM service is enabled at
this endpoint</t>
  <t>REQUIRED: apiVersion (string) - The OCM API version this endpoint
supports.  Example: <spanx style="verb">"1.2.2"</spanx></t>
  <t>REQUIRED: endPoint (string) - The URI of the OCM API available at
this endpoint.  Example: <spanx style="verb">"https://cloud.example.org/ocm"</spanx></t>
  <t>OPTIONAL: provider (string) - A friendly branding name of this
endpoint.  Example: <spanx style="verb">"MyCloudStorage"</spanx></t>
  <t>REQUIRED: resourceTypes (array) - A list of all resource types this
server supports in both the Sending Server role and the Receiving
Server role, with their access protocols.  Each item in this list
MUST itself be an object containing the following fields:
  <list style="symbols">
      <t>name (string) - A supported resource type (file, calendar,
contact, ...).
Implementations MUST offer support for at least one
resource type, where <spanx style="verb">file</spanx> is the commonly supported
one.  Each resource type is identified by its <spanx style="verb">name</spanx>:
the list MUST NOT contain more than one resource type
object per given <spanx style="verb">name</spanx>.</t>
      <t>shareTypes (array of string) -
The supported recipient share types.  MUST contain
<spanx style="verb">"user"</spanx> at a minimum, plus optionally <spanx style="verb">"group"</spanx> and
<spanx style="verb">"federation"</spanx>.
Example: <spanx style="verb">["user"]</spanx></t>
      <t>protocols (object) - The supported protocols for accessing Shared
Resources of this type.
Implementations that offer <spanx style="verb">file</spanx> Resources MUST
support at least <spanx style="verb">webdav</spanx>,
any other combination of Resources and protocols is
optional.  Example:
<spanx style="verb">json
        {
          "webdav": "/remote/dav/ocm/",
          "webapp": "/app/ocm/",
          "talk": "/apps/spreed/api/"
        }
</spanx>
Fields:
      <list style="symbols">
          <t>webdav (string) - The top-level WebDAV [RFC4918] path at this
endpoint.  In order to access a Remote Resource, implementations
SHOULD use this path as a prefix (see sharing examples).</t>
          <t>webapp (string) - The top-level path for web apps at this
endpoint.  In order to access a remote web app, implementations
SHOULD use this path as a prefix (see sharing examples).</t>
          <t>ssh (string) - The top-level address in the form <spanx style="verb">host:port</spanx>
of an endpoint that supports ssh and scp with a public/private
key based authentication.</t>
          <t>Any additional protocol supported for this Resource type MAY be
advertised here, where the value MAY correspond to
a top-level URI to be used for that protocol.</t>
        </list></t>
    </list></t>
  <t>OPTIONAL: capabilities (array of string) - The optional capabilities
supported by this OCM Server.
As implementations MUST accept Share Creation Notifications
to be compliant, it is not necessary to expose that as a
capability.
Example: <spanx style="verb">["exchange-token", "webdav-uri"]</spanx>.  The array MAY
include one or more of the following items:
_ <spanx style="verb">"enforce-mfa"</spanx> - to indicate that this OCM Server can apply a
Sending Server's MFA requirements for a Share on their behalf.
_ <spanx style="verb">"exchange-token"</spanx> - to indicate that this OCM Server exposes a
[RFC6749]-compliant endpoint, which allows to exchange a secret
received in the protocol properties of a Share Creation Notification
for a short-lived bearer token.
_ <spanx style="verb">"http-sig"</spanx> - to indicate that this OCM Server supports
[RFC9421] HTTP Message Signatures and advertises public keys in the
format specified by [RFC7517] at the <spanx style="verb">/.well-known/jwks.json</spanx>
endpoint for signature verification.
_ <spanx style="verb">"invites"</spanx> - to indicate the server would support acting as an
Invite Sender or Invite Receiver OCM Server.  This might be useful
for suggesting to a user that existing contacts might be upgraded
to the more secure (and possibly required) invite flow.
_ <spanx style="verb">"notifications"</spanx> - to indicate that this OCM Server handles
notifications to exchange updates on shares and invites.
_ <spanx style="verb">"invite-wayf"</spanx> - to indicate that this OCM Server exposes a WAYF
Page to facilitate the Invite flow.
_ <spanx style="verb">"webdav-uri"</spanx> - to indicate that this OCM Server can append a
relative URI to the path listed for WebDAV [RFC4918] in the
appropriate <spanx style="verb">resourceTypes</spanx> entry <spanx style="verb">"protocol-object"</spanx> - to
indicate that this OCM Server can receive a Share Creation
Notification whose <spanx style="verb">protocol</spanx> object contains one property per
supported protocol instead of containing the standard <spanx style="verb">name</spanx> and
<spanx style="verb">options</spanx> properties.</t>
  <t>OPTIONAL: criteria (array of string) - The criteria for accepting a
Share Creation Notification.
As all Receiving Servers SHOULD require the use of TLS in API
calls, it is not necessary to expose that as a criterium.
Example: <spanx style="verb">["http-request-signatures"]</spanx>.  The array MAY include
for instance:
_ <spanx style="verb">"http-request-signatures"</spanx> - to indicate that API requests
without http signatures will be rejected.
_ <spanx style="verb">"token-exchange"</spanx> - to indicate that API requests without
token exchange will be rejected (see the <xref target="code-flow">Code Flow</xref>
section).
_ <spanx style="verb">"denylist"</spanx> - some servers MAY be blocked based on their IP
address
_ <spanx style="verb">"allowlist"</spanx> - unknown servers MAY be blocked based on their IP
address
_ <spanx style="verb">"invite"</spanx> - an invite MUST have been exchanged between the
sender and the receiver before a Share Creation Notification can be
sent</t>
  <t>DEPRECATED: publicKey (object) - Use public keys at
<spanx style="verb">/.well-known/jwks.json</spanx> instead for RFC 9421 support.</t>
  <t>OPTIONAL: inviteAcceptDialog (string) - URL path of a web page where
a user can accept an invite, when query parameters <spanx style="verb">"token"</spanx> and
<spanx style="verb">"providerDomain"</spanx> are provided.  Implementations that offer the
<spanx style="verb">"invites"</spanx> capability SHOULD provide this URL as well in order to
enhance the UX of the Invite Flow.  If for example
<spanx style="verb">"/index.php/apps/sciencemesh/accept"</spanx> is specified here then a WAYF
Page SHOULD redirect the end-user to <spanx style="verb">/index.php/apps/sciencemesh/
accept?token=zi5kooKu3ivohr9a&amp;providerDomain=cloud.example.org</spanx>.</t>
  <t>OPTIONAL: tokenEndPoint (string) - URL of the token endpoint where the
Sending Server can exchange a secret for a short-lived bearer token.
Implementations that offer the <spanx style="verb">"exchange-token"</spanx> capability MUST
provide this URL as well.
Example: <spanx style="verb">"https://cloud.example.org/ocm/token"</spanx>.</t>
</list></t>

</section>
</section>
<section anchor="share-creation-notification"><name>Share Creation Notification</name>

<t>To create a Share, the Sending Server SHOULD make a HTTP POST request</t>

<t><list style="symbols">
  <t>to the <spanx style="verb">/shares</spanx> path in the Receiving Server's OCM API</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP request header</t>
  <t>its request body containing a JSON document representing an object
with the fields as described below</t>
  <t>using TLS</t>
  <t>using httpsig [RFC9421]</t>
</list></t>

<section anchor="fields-1"><name>Fields</name>

<t><list style="symbols">
  <t>REQUIRED shareWith (string)
OCM Address of the user, group or federation the provider
wants to share the Resource with.  This MUST be known
in advance, either via a previous Invitation or through
other means.
Example: "51dc30ddc473d43a6011e9ebba6ca770@geant.org"</t>
  <t>REQUIRED name (string)
Name of the Resource (file or folder).
Example: "resource.txt"</t>
  <t>OPTIONAL description (string)
Optional description of the Resource (file or folder).
Example: "This is the Open API Specification file (in YAML
format) of the Open Cloud Mesh API."</t>
  <t>REQUIRED providerId (string)
Opaque value to identify the Shared Resource at the provider side.
This MUST be unique per Resource and per share, such that multiple
shares of a given Resource are guaranteed to get different values.
Example: 7c084226-d9a1-11e6-bf26-cec0c932ce01</t>
  <t>REQUIRED owner (string) -
OCM Address of the user who owns the
Resource.
Example: "6358b71804dfa8ab069cf05ed1b0ed2a@apiwise.nl"</t>
  <t>REQUIRED sender (string) -
OCM Address of the user that wants to share
the Resource.
Example: "527bd5b5d689e2c32ae974c6229ff785@apiwise.nl"</t>
  <t>OPTIONAL ownerDisplayName (string)
Display name of the owner of the Resource
Example: "Dimitri"</t>
  <t>OPTIONAL senderDisplayName (string)
Display name of the user that wants to share the Resource
Example: "John Doe"</t>
  <t>REQUIRED shareType (string)
SHOULD have a value of "user", "group", or "federation", to
indicate that the first part of the <spanx style="verb">shareWith</spanx> OCM Address refers
to a Receiving Party who is a single user of the Receiving Server,
a group of users at the Receiving Server, or a group of users that
spans multiple OCM Servers belonging to a federation as exposed by
a Directory Service, including at least one user at the Receiving
Server.
In the federation case, OCM Servers MAY resolve the actual
recipients by either querying external AAI systems, or exchanging
the groups' metadata between themselves.  Such exchange is out of
scope for this version of the this specification.
Alternatively, the Receiving Server MAY hold the federated groups'
metadata and act as an OCM proxy, forwarding the OCM requests to
the actual members of the federation.</t>
  <t>REQUIRED resourceType (string)
Resource type (file, folder, calendar, contact, ...).  If the
Resource is a folder, implementations SHOULD advertise it as
<spanx style="verb">folder</spanx> rather than <spanx style="verb">file</spanx>, in order to streamline the processing
by the Receiving Server.</t>
  <t>OPTIONAL expiration (integer)
The expiration time for the OCM share, in seconds
of UTC time since Unix epoch.  If omitted, it is assumed that the
share does not expire.  A sender server MAY use it to signal that
the resource represents a cached copy of a dataset that was made
available for an efficient data transfer to the destination server.</t>
  <t>REQUIRED protocol (object)
JSON object with specific options for each protocol.
The supported protocols are: - <spanx style="verb">webdav</spanx>, to access the data -
<spanx style="verb">webapp</spanx>, to access remote web applications - <spanx style="verb">ssh</spanx>, to access
the data via a public/private key pair.
Other custom protocols might be added in the future.
In case a single protocol is offered, there are three ways to
specify this object:
Option 1: Set the <spanx style="verb">name</spanx> field to the name of the protocol,
and put the protocol details in a field named <spanx style="verb">options</spanx>.
Option 2: Set the <spanx style="verb">name</spanx> field to the name of the protocol,
and put the protocol details in a field carrying the name of
the protocol.
Option 3: Set the <spanx style="verb">name</spanx> field to <spanx style="verb">multi</spanx>, and put the
protocol details in a field carrying the name of the protocol.
Option 1 using the <spanx style="verb">options</spanx> field is now deprecated.
Implementations are encouraged to transition to the new
optional properties defined below, such that this field
may be removed in a future major version of the spec.
When specifying more than one protocol as different ways to
access the Share, the <spanx style="verb">name</spanx> field needs to be set to <spanx style="verb">multi</spanx>.
If <spanx style="verb">multi</spanx> is given, one or more protocol
endpoints are expected to be defined according to the
optional properties specified below.
Otherwise, at least <spanx style="verb">webdav</spanx> is expected to be
supported, and its options MAY be given in the opaque
<spanx style="verb">options</spanx> payload for compatibility with v1.0
implementations (see examples).  Note though that this
format is deprecated.
Warning: client implementers should be aware that v1.1+
servers MAY support both <spanx style="verb">webdav</spanx> and <spanx style="verb">multi</spanx>, but v1.0
servers MAY only support <spanx style="verb">webdav</spanx>.</t>
  <t>Protocol details for <spanx style="verb">webdav</spanx> MAY contain:
  <list style="symbols">
      <t>OPTIONAL accessTypes (array of strings) - The type of access
being granted to the remote resource.  If omitted, it defaults to
<spanx style="verb">['remote']</spanx>.  A subset of: - <spanx style="verb">remote</spanx> signals the recipient that
the resource is available for remote access and interactive
browsing.  - <spanx style="verb">datatx</spanx> signals the recipient that the resource is
available for data transfer.  If no expiration is given, the share
is suitable e.g. for sync use-cases, whereas if an expiration date
is set, the above clause MAY apply and the recipient SHOULD notify
the sender upon completing the data transfer, in order to ease
cache operations on the Sending Server.  The recipient MAY delegate
a third-party service to execute the data transfer on their behalf.</t>
      <t>REQUIRED uri (string)
A URI to access the Remote Resource.  The URI
SHOULD be relative, in which case the prefix
exposed by the <spanx style="verb">/.well-known/ocm</spanx> endpoint MUST
be used.  Absolute URIs are deprecated.</t>
      <t>REQUIRED sharedSecret (string)
A secret to be used to access the Resource, such as
a bearer token.  To prevent leaking it in logs it
MUST NOT appear in any URI.</t>
      <t>OPTIONAL permissions (array of strings) -
The permissions granted to the sharee.  A subset
of: - <spanx style="verb">read</spanx> allows read-only access including
download of a copy.  - <spanx style="verb">write</spanx> allows create, update, and delete
rights on the Resource.  - <spanx style="verb">share</spanx> allows re-share rights on the
Resource.</t>
      <t>OPTIONAL requirements (array of strings) -
The requirements that the sharee MUST fulfill to
access the Resource.  A subset of: - <spanx style="verb">must-use-mfa</spanx> requires the
consumer to be MFA-authenticated.  This MAY be used if the
recipient provider exposes the <spanx style="verb">enforce-mfa</spanx>
capability.  - <spanx style="verb">must-exchange-token</spanx> requires the recipient to
exchange the given <spanx style="verb">sharedSecret</spanx> via a signed HTTPS request
to the Sending Server's {tokenEndPoint} [RFC6749].
This MAY be used if the recipient provider exposes the
<spanx style="verb">exchange-token</spanx> capability.</t>
      <t>OPTIONAL size (integer)
The size of the resource to be transferred, useful
especially in case of <spanx style="verb">datatx</spanx> access type.</t>
    </list></t>
  <t>Protocol details for <spanx style="verb">webapp</spanx> MAY contain:
  <list style="symbols">
      <t>REQUIRED uri (string)
A URI to a client-browsable view of the Shared
Resource, such that users MAY use the web
applications available at the site.  The URI SHOULD
be relative, in which case the prefix exposed by
the <spanx style="verb">/.well-known/ocm</spanx> endpoint MUST be used.
Absolute URIs are deprecated.</t>
      <t>REQUIRED viewMode (string)
The permissions granted to the sharee.  A subset of: - <spanx style="verb">view</spanx>
allows access to the web app in view-only mode.  - <spanx style="verb">read</spanx> allows
read and download access via the web app.  - <spanx style="verb">write</spanx> allows full
editing rights via the web app.</t>
      <t>OPTIONAL sharedSecret (string)
An optional secret to be used to access the remote
web app, for example in the form of a bearer token.</t>
    </list></t>
  <t>Protocol details for <spanx style="verb">ssh</spanx> MAY contain:
  <list style="symbols">
      <t>OPTIONAL accessTypes (array of strings) - The type of access
being granted to the remote resource.  If omitted, it defaults to
<spanx style="verb">['remote']</spanx>.  A subset of: - <spanx style="verb">remote</spanx> signals the recipient that
the resource is available for remote access, e.g. via sshfs.
      <list style="symbols">
          <t><spanx style="verb">datatx</spanx> signals the recipient to transfer the resource
from the given URI via scp.  The recipient MAY delegate a
third-party service to execute the data transfer on their behalf.</t>
        </list></t>
      <t>REQUIRED uri (string)
The full address to be used for ssh or scp access, in the form
<spanx style="verb">username@host.fqdn:port/resource/path</spanx>, where the <spanx style="verb">username</spanx> is
chosen by the Sending Server and does not necessarily need to match
the recipient's OCM Address.  Authentication is expected to take
place via public/private key: the Receiving Server MUST reply to
such a Share Creation Notification by sending back their public
key, for the Sender Server to authorize access to the Resource.</t>
    </list></t>
</list></t>

</section>
<section anchor="response"><name>Response</name>

<t>The Share Creation Notification Response SHOULD be a HTTP response:</t>

<t><list style="symbols">
  <t>in response to the Share Creation Notification Request</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP response header</t>
</list></t>

<t>A 201 response status means the Share Creation Notification Request was
successful.  In this case, the response body MUST contain a JSON
document representing an object with the following string fields:
  - REQUIRED: <spanx style="verb">recipientDisplayName</spanx> - the Recipient's display name.
  - OPTIONAL: <spanx style="verb">recipientPublicKeys</spanx> - the Recipient's public key(s).
    This property MUST be returned when the protocol of the incoming
    share was <spanx style="verb">ssh</spanx>.
A 400 response status means some parameters were invalid or missing.
A 401 response status means the Sender cannot be authenticated as
a trusted service.
A 403 response status means the Sender is not authorized to create
shares.
A 501 response status means either the Receiver does not support
incoming external shares, or the share type or the resource type
are not supported.
A 503 response status means that the Receiver is temporary unavailable.</t>

</section>
<section anchor="decision-to-discard"><name>Decision to Discard</name>

<t>The Receiving Server MAY discard the notification if any of the
following hold true:</t>

<t><list style="symbols">
  <t>the HTTP Signature is missing but the Sending Server does expose a
keypair discoverable from the FQDN part of the <spanx style="verb">sender</spanx> field in the
request body</t>
  <t>the HTTP Signature is missing</t>
  <t>the HTTP Signature is not valid</t>
  <t>no keypair is trusted or discoverable from the FQDN part of the
<spanx style="verb">sender</spanx> field in the request body</t>
  <t>the keypair used to generate the HTTP Signature doesn't match the one
trusted or discoverable from the FQDN part of the <spanx style="verb">sender</spanx> field
in the request body</t>
  <t>the Sending Server is denylisted</t>
  <t>the Sending Server is not allowlisted</t>
  <t>the Sending Party is not trusted by the Receiving Party (e.g., no
Invite was exchanged and/or the Sending Party's OCM Address does not
appear in the Receiving Party's address book)</t>
  <t>the Receiving Server is unable to act as an API client for (any of)
the protocol(s) listed for accessing the Resource</t>
  <t>an initial check shows that the Resource cannot successfully be
accessed through (any of) the protocol(s) listed</t>
</list></t>

</section>
<section anchor="receiving-party-notification"><name>Receiving Party Notification</name>

<t>If the Share Creation Notification is not discarded by the Receiving
Server, they MAY notify the Receiving Party passively by adding the
Share to some inbox list, and MAY also notify them actively through for
instance a push notification or an email message.</t>

<t>They could give the Receiving Party the option to accept or reject the
share, or add the share automatically and only send an informational
notification that this happened.</t>

</section>
</section>
<section anchor="share-acceptance-notification"><name>Share Acceptance Notification</name>

<t>In response to a Share Creation Notification, the Receiving Server MAY
discover the OCM API of the Sending Server, starting from the <spanx style="verb">&lt;fqdn&gt;</spanx>
part of the <spanx style="verb">sender</spanx> field in the Share Creation Notification.</t>

<t>If the OCM API of the Sending Server is successfully discovered, the
Receiving Server MAY make a HTTP POST request</t>

<t><list style="symbols">
  <t>to the <spanx style="verb">/notifications</spanx> path in the Sending Server's OCM API</t>
  <t>using <spanx style="verb">application/json</spanx> as the <spanx style="verb">Content-Type</spanx> HTTP request header</t>
  <t>its request body containing a JSON document representing an object
with the fields as described below</t>
  <t>using TLS</t>
  <t>using httpsig [RFC9421]</t>
</list></t>

<section anchor="fields-2"><name>Fields</name>

<t><list style="symbols">
  <t>REQUIRED notificationType (string) - in a Share Acceptance
Notification it MUST be one of:
  <list style="symbols">
      <t>'SHARE_ACCEPTED'</t>
      <t>'SHARE_DECLINED'</t>
    </list></t>
  <t>REQUIRED providerId (string) - copied from the Share Creation
Notification for the Share this notification is about</t>
  <t>OPTIONAL resourceType (string) - copied from the Share Creation
Notification for the Share this notification is about</t>
  <t>OPTIONAL notification (object) - optional additional parameters,
depending on the notification and the resource type</t>
</list></t>

<t>For example, a notification MAY be sent by a recipient to let the
provider know that the recipient declined a share.  In this case, the
provider site MAY mark the share as declined for its user(s).
Similarly, it MAY be sent by a provider to let the recipient know that
the provider removed a given share, such that the recipient MAY clean
it up from its database.  A notification MAY also be sent to let a
recipient know that the provider removed that recipient from the list
of trusted users, along with any related share.  The recipient MAY
reciprocally remove that provider from the list of trusted users, along
with any related share.</t>

<t>Notifications from Sending Server to Receiving Server SHOULD use
httpsig [RFC9421] so the Receiving Server can authenticate the origin
of the notification.  Receiving Servers SHOULD decline notifications
from Sending Servers without httpsig as it can't identify where the
notification is coming from.</t>

</section>
</section>
<section anchor="resource-access"><name>Resource Access</name>

<t>To access the Resource, the Receiving Server MAY use multiple ways,
depending on the body of the Share Creation Notification and the
protocol required for access.  The procedure is as follows:</t>

<t><list style="numbers" type="1">
  <t>The receiver MUST extract the OCM Server FQDN from the <spanx style="verb">sender</spanx>
field of the received share, and MUST query the
<xref target="ocm-api-discovery">Discovery</xref> endpoint at that address: let
<spanx style="verb">&lt;sender-ocm-path&gt;</spanx> be the <spanx style="verb">resourceTypes[0].protocols.webdav</spanx> value
to be used later, if defined.</t>
  <t>If <spanx style="verb">protocol.name</spanx> is <spanx style="verb">multi</spanx>, the receiver MUST inspect the
<spanx style="verb">protocol.{protocolName}</spanx> properties corresponding to the protocol
of concern, and act according to its semantics.  For the specific
case where <spanx style="verb">protocol.webdav</spanx> is available and the receiver wants
to use it, the following steps are to be followed.</t>
  <t>The <spanx style="verb">protocol.webdav.requirements</spanx> MUST be inspected:
3.1. If it includes <spanx style="verb">must-exchange-token</spanx>, the receiver MUST make a
 signed POST request to the path in the Sending Server’s
 {tokenEndPoint}, to exchange the <spanx style="verb">protocol.webdav.sharedSecret</spanx>
 token for a short-lived bearer token, and only use that bearer
 token to access the Resource (See the <xref target="code-flow">Code Flow</xref>
 section).  If the <spanx style="verb">must-exchange-token</spanx> requirement is not present
 and the Discovery endpoint inspected at step 1. exposes the
 <spanx style="verb">token-exchange</spanx> capability, the receiver MAY attempt to perform
 the token exchange as above, but it MUST fall back to the following
 steps should the process fail.
3.2. If it includes <spanx style="verb">must-use-mfa</spanx>, the Receiving Server MUST ensure
 that the Receiving Party has been authenticated with MFA, or prompt
 the consumer in order to elevate their session, if applicable.</t>
  <t>The <spanx style="verb">protocol.webdav.uri</spanx> property MUST now be inspected: if it's a
complete URI, the receiver MUST make a HTTP PROPFIND request against
it to access the Remote Resource, otherwise it is to be taken as an
identifier <spanx style="verb">&lt;id&gt;</spanx>, in which case the receiver MUST make a HTTP
PROPFIND request to: <spanx style="verb">https://&lt;sender-host&gt;&lt;sender-ocm-path&gt;/&lt;id&gt;</spanx>
in order to access to the Remote Resource.  The receiver MUST pass
an <spanx style="verb">Authorization: bearer</spanx> header with either the short-lived bearer
token obtained in step 3.1., if applicable, or the
<spanx style="verb">protocol.webdav.sharedSecret</spanx> value.</t>
  <t>Otherwise, if <spanx style="verb">protocol.name</spanx> is <spanx style="verb">webdav</spanx> the receiver SHOULD inspect
the <spanx style="verb">protocol.options</spanx> property: if <spanx style="verb">protocol.options.sharedSecret</spanx>
is defined, then the receiver SHOULD make a HTTP PROPFIND request to
<spanx style="verb">https://&lt;sharedSecret&gt;:@&lt;sender-host&gt;&lt;sender-ocm-path&gt;</spanx>.  Note that
this access method, based on Basic Auth, is <em>deprecated</em> and may be
removed in a future release of the Protocol.  If a secret cannot be
identified (e.g. because <spanx style="verb">protocol.options</spanx> is undefined), then
the receiver SHOULD discard the share as invalid.</t>
</list></t>

<t>In all cases, in case the Shared Resource is a folder and the Receiving
Server accesses a Resource within that shared folder, it SHOULD append
its relative path to that URL.  In other words, the Sending Server
SHOULD support requests to URLs such as
<spanx style="verb">https://&lt;sender-host&gt;&lt;sender-ocm-path&gt;/path/to/resource.txt</spanx>.</t>

</section>
<section anchor="code-flow"><name>Code Flow</name>

<t>This section defines the procedure for issuing short-lived bearer access
tokens for use by the Receiving Server when accessing a resource shared
through OCM.  The mechanism is aligned with the OAuth 2.0
<em>authorization_code</em> grant type but is performed entirely as a
server to server interaction between the Sending and Receiving Servers.
No user interaction or redirect is involved. [RFC6749]</t>

<section anchor="token-request"><name>Token Request</name>

<t>To obtain an access token, the Receiving Server MUST send an HTTP POST
request to the Sending Server’s {tokenEndPoint} as discovered in the
OCM provider metadata, following section 4.4.2 of [RFC6749].  The
request payload MUST be in <spanx style="verb">x-www-form-urlencoded</spanx> form, as shown
in the following example (with line breaks in the Signature headers
for display purposes only):</t>

<t>```
POST {tokenEndPoint} HTTP/1.1
Host: cloud.example.org
Date: Wed, 05 Nov 2025 14:00:00 GMT
Content-Type: application/x-www-form-urlencoded
Digest: SHA-256=ok6mQ3WZzKc8nb7s/Jt2yY1uK7d2n8Zq7dhl3Q0s1xk=
Content-Length: 101
Signature-Input:
  sig1=("@method" "@target-uri" "content-digest" "date");
  created=1730815200;
  keyid="receiver.example.org#key1";
  alg="rsa-sha256"
Signature: sig1=:bM2sV2a4oM8pWc4Q8r9Zb8bQ7a2vH1kR9xT0yJ3uE4wO5lV6bZ1cP
  2rN3qD4tR5hC=:</t>

<t>grant_type=authorization_code&amp;
client_id=receiver.example.org&amp;
code=my_secret_code
```</t>

<t>The request MUST be signed using an HTTP Message Signature
[RFC9421].  The <spanx style="verb">client_id</spanx> identifies the Receiving Server and MUST be
set to its fully qualified domain name.  The <spanx style="verb">code</spanx> parameter carries
the authorization secret that was issued by the Sending Server in the
Share Creation Notification.  It is allowed to send the additional
parameters defined in [RFC6749] for the <spanx style="verb">authorization_code</spanx> grant type,
but they MUST be ignored.</t>

</section>
<section anchor="token-response"><name>Token Response</name>

<t>If the request is valid and the code is accepted, the Sending Server
MUST respond with HTTP 200 OK and a OAuth-compliant JSON object
containing the issued token:</t>

<t><spanx style="verb">
{
  "access_token": "8f3d3f26-f1e6-4b47-9e3e-9af6c0d4ad8b",
  "token_type": "Bearer",
  "expires_in": 300
}
</spanx></t>

<t>The <spanx style="verb">access_token</spanx> is an opaque bearer credential with no internal
structure visible to the Receiving Server.  The token authorizes the
Receiving Server to access the shared resource using the appropriate
transport protocol (e.g., WebDAV).  The <spanx style="verb">expires_in</spanx> value indicates
the token lifetime in seconds.  No <spanx style="verb">refresh_token</spanx> is issued, instead
the same request to the {tokenEndPoint} MUST be repeated before the
<spanx style="verb">access_token</spanx> has expired, to recieve a new <spanx style="verb">access_token</spanx> that can
then be used in the same manner.</t>

</section>
<section anchor="error-responses"><name>Error Responses</name>

<t>If the request is invalid, the Sending Server MUST return an HTTP 400
response with a JSON object containing an OAuth 2.0 error code
[RFC6749]:
<spanx style="verb">
{ "error": "invalid_request" }
</spanx></t>

<t>Permitted error codes are <spanx style="verb">invalid_request</spanx>, <spanx style="verb">invalid_client</spanx>,
<spanx style="verb">invalid_grant</spanx>, <spanx style="verb">unauthorized_client</spanx> and <spanx style="verb">unsupported_grant_type</spanx>.</t>

</section>
</section>
<section anchor="share-deletion"><name>Share Deletion</name>

<t>A <spanx style="verb">"SHARE_ACCEPTED"</spanx> notification followed by a <spanx style="verb">"SHARE_UNSHARED"</spanx>
notification is equivalent to a <spanx style="verb">"SHARE_DECLINED"</spanx> notification.</t>

<t>Note that the Sending Server MAY at any time revoke access to a
Resource (effectively undoing or deleting the Share) without notifying
the Receiving Server.</t>

</section>
<section anchor="share-updating"><name>Share Updating</name>

<t>Some implementations have experimented with a
<spanx style="verb">"RESHARE_CHANGE_PERMISSION"</spanx>notification, but the payload and side
effects such a notification may have are out of scope of this version
of this specification.
The Receiving Party sending such a notification has no way of knowing
if the Sending Party understood and processed the reshare request
or not.</t>

</section>
<section anchor="resharing"><name>Resharing</name>

<t>The <spanx style="verb">"REQUEST_RESHARE"</spanx> and <spanx style="verb">"RESHARE_UNDO"</spanx> notification types MAY be
used by the Receiving Server to persuade the Sending Server to share the
same Resource with another Receiving Party.
The details of the payload and side effects such a notification may
have are out of scope of this version of this specification.
Note that the Receiving Party sending such a notification has no way of
knowing if the Sending Party understood and processed the reshare
request or not.  In all cases, the Receiving Server MUST NOT reshare
a Resource without an explicit grant from the Sending Server.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="well-known-uri-for-the-discovery"><name>Well-Known URI for the Discovery</name>

<t>The following value is to be registered in the "Well-Known URIs"
registry (using the template from [RFC5785]):
   URI suffix: ocm
   Change controller: IETF
   Specification document(s): the present Draft, once in RFC form
   Related information: N/A</t>

</section>
<section anchor="jscontact-types-registry"><name>JSContact Types Registry</name>

<t>The following entry is to be registered in the "JSContact Types"
registry (using the template from [RFC9553]):
   Type Name: ocmAddress
   Intended Usage: common
   Since Version: 1.0
   Until Version: N/A
   Change Controller: IETF
   Reference or Description:</t>

<t>An object representing an OCM address.  The object contains:</t>

<figure><artwork><![CDATA[
 - "address" (String, required): The OCM federated address in format
   "user@provider" where provider is the FQDN of an OCM-capable
   server.
 - "trusted" (Boolean, optional): Whether shares from this address
   are automatically accepted. Default: false.
 - "source" (String, optional): How this address was established.
   See "JSContact Enum Values" registry for allowed values.
 - "label" (String, optional): Human-readable label for this
   address.
]]></artwork></figure>

</section>
<section anchor="jscontact-properties-registry"><name>JSContact Properties Registry</name>

<t>The following entry is to be registered in the "JSContact Properties"
registry (using the template from [RFC9553]):
   Property Name: ietf.org:ocmAddresses
   Property Type: String[ocmAddress]
   Property Context: Card
   Intended Usage: common
   Since Version: 1.0
   Until Version: N/A
   Change Controller: IETF
   Reference or Description:</t>

<t>A map of OCM addresses for a contact. The keys are arbitrary
   identifiers (e.g., "primary", "work") and the values are ocmAddress
   objects as defined in the JSContact Types Registry.</t>

</section>
<section anchor="jscontact-enum-values-registry"><name>JSContact Enum Values Registry</name>

<t>The following entries are to be registered in the "JSContact Enum
Values" registry (using the template from [RFC9553]).
   Property Name: ietf.org:ocmAddresses/source
   Context: Card
   Since Version: 1.0
   Until Version: N/A
   Change Controller: IETF
   Reference or Description:</t>

<t>Values indicating how an OCM address was established.</t>

<t>Initial Contents:
   +==============+==========================================+
   | Enum Value   | Reference/Description                    |
   +==============+==========================================+
   | invite       | Address established via OCM invite flow  |
   |--------------|------------------------------------------|
   | share        | Address established by receiving a share |
   |--------------|------------------------------------------|
   | direct entry | Address added directly by the user       |
   |--------------|------------------------------------------|</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="trust"><name>Trust</name>

<t>There are several areas that are not covered by this specification.
Most importantly we do not provide a way of establishing trust between
servers, even though some features of the protocol rely on trust, such
as the <spanx style="verb">mfa-enforced</spanx> requirement.</t>

<t>Trust needs to be established out of band, but there are some features
of the protocol that <em>can</em> be used to assist operators in establishing
trust.  For instance, invite flow can be used to establish that users
know and have out of band connections with other users on an OCM server.</t>

<t>Further more the Directory Service feature can be used to establish a
trusted federation, where a central authority can be trusted to
implement measures for auditing and adding only trusted servers into the
discovery service.</t>

<section anchor="httpsig"><name>httpsig</name>

<t>It is RECOMMENDED to use signed messages, "httpsig" [RFC9421], to
verify that an OCM server is the server you expect it to be, and SHOULD
be done unless you have a niche use case.</t>

</section>
</section>
<section anchor="legacy-shared-secrets"><name>Legacy shared secrets</name>

<t>The legacy format of an OCM Share Notification with shared secrets is
only provided for backwards compatibility with existing implementations.
Implementers SHOULD NOT use it and prefer short-lived tokens instead.</t>

</section>
<section anchor="code-flow-1"><name>Code Flow</name>

<t>All <spanx style="verb">{tokenEndPoint}</spanx> requests MUST be transmitted over HTTPS and
signed using HTTP Signatures.  Bearer tokens MUST be treated as
confidential and never logged, persisted beyond their lifetime, or
transmitted over unsecured channels.</t>

</section>
</section>
<section anchor="references"><name>References</name>

<section anchor="normative-references"><name>Normative References</name>

<t>[RFC2119] Bradner, S. "<eref target="https://datatracker.ietf.org/doc/html/rfc2119">Key words for use in RFCs to Indicate
Requirement Levels</eref>",
March 1997.</t>

<t>[RFC3986] Berners-Lee, T., Fielding, R. and Masinter, L.
"<eref target="https://datatracker.ietf.org/doc/html/rfc3986">Uniform Resource Identifier (URI): Generic Syntax
</eref>", January 2005</t>

<t>[RFC4918] Dusseault, L. M. "<eref target="https://datatracker.ietf.org/html/rfc4918/">HTTP Extensions for Web Distributed
Authoring and Versioning</eref>",
June 2007.</t>

<t>[RFC6749] Hardt, D. (ed), "<eref target="https://datatracker.ietf.org/html/rfc6749">The OAuth 2.0 Authorization Framework</eref>", October 2012.</t>

<t>[RFC7515] Jones, M., Bradley, J., Sakimura, N., "<eref target="https://datatracker.ietf.org/doc/html/rfc7515">JSON Web Signature
(JWS)</eref>", May 2015.</t>

<t>[RFC7517] Jones, M., "<eref target="https://datatracker.ietf.org/doc/html/rfc7517">JSON Web Key (JWK)</eref>", May 2015.</t>

<t>[RFC8032] Josefsson, S., Liusvaara, I., "<eref target="https://datatracker.ietf.org/doc/html/rfc8032">Edwards-Curve Digital
Signature Algorithm (EdDSA)</eref>", January 2017.</t>

<t>[RFC8174] Leiba, B. "<eref target="https://datatracker.ietf.org/html/rfc8174">Ambiguity of Uppercase vs Lowercase in RFC 2119
Key Words</eref>", May 2017.</t>

<t>[RFC8615] Nottingham, M. "<eref target="https://datatracker.ietf.org/doc/html/rfc8615">Well-Known Uniform Resource Identifiers
(URIs)</eref>", May 2019</t>

<t>[RFC9421] Backman, A., Richer, J. and Sporny, M. "<eref target="https://tools.ietf.org/html/rfc9421">HTTP Message
Signatures</eref>", February 2024.</t>

<t>[RFC9553] Stepanek, R., Loffredo, M., "<eref target="https://datatracker.ietf.org/doc/html/rfc9553">JSContact: A JSON
Representation of Contact Data</eref>, May 2024"</t>

</section>
</section>
<section anchor="appendix-a-multi-factor-authentication"><name>Appendix A: Multi-factor Authentication</name>

<t>If a Receiving Server exposes the capability <spanx style="verb">enforce-mfa</spanx>, it
indicates that it will try and comply with a MFA requirement set on a
Share.  If the Sending Server trusts the Receiving Server, the Sending
Server MAY set the requirement <spanx style="verb">mfa-enforced</spanx> on a Share, which the
Receiving Server MUST honor.  A compliant Receiving Server that signals
that it is MFA-capable MUST NOT allow access to a Resource protected
with the <spanx style="verb">mfa-enforced</spanx> requirement, if the Receiving Party has not
provided a second factor to establish their identity with greater
confidence.</t>

<t>Since there is no way to guarantee that the Receiving Server will
actually enforce the MFA requirement, it is up to the Sending Server to
establish a trust with the Receiving Server such that it is reasonable
to assume that the Receiving Server will honor the MFA requirement.
This establishment of trust will inevitably be implementation
dependent, and can be done for example using a pre approved allow list
of trusted Receiving Servers.  The procedure of establishing trust is
out of scope for this specification: a mechanism similar to the
<eref target="https://sciencemesh.io">ScienceMesh</eref> integration for the
<xref target="invite-flow">Invite</xref> capability may be envisaged.</t>

</section>
<section anchor="appendix-b-jwks-and-http-signature-examples"><name>Appendix B: JWKS and HTTP Signature Examples</name>

<section anchor="jwks-endpoint"><name>JWKS Endpoint</name>

<t>An OCM Server that advertises the <spanx style="verb">http-sig</spanx> capability MUST expose its
public keys at <spanx style="verb">/.well-known/jwks.json</spanx> in the format specified by
[RFC7517].  Here is an example response from
<spanx style="verb">https://sender.example.org/.well-known/jwks.json</spanx>:</t>

<t><spanx style="verb">json
{
  "keys": [
    {
      "kty": "OKP",
      "crv": "Ed25519",
      "kid": "sender.example.org#key1",
      "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo"
    }
  ]
}
</spanx></t>

</section>
<section anchor="signing-a-request-sender"><name>Signing a Request (Sender)</name>

<t>Given a Share Creation Notification request:</t>

<t>```
POST /ocm/shares HTTP/1.1
Host: receiver.example.org
Date: Fri, 16 Jan 2026 13:37:00 GMT
Content-Type: application/json
Content-Digest: sha-256=:LkpHyFOVbBDPxc7YbHDOWNzAv88qWuVfLNf4TUf9Uo8=:</t>

<t>{
  "shareWith": "marie@receiver.example.org",
  "name": "spec.yaml",
  "providerId": "7c084226-d9a1-11e6-bf26-cec0c932ce01",
  "owner": "einstein@sender.example.org",
  "sender": "einstein@sender.example.org",
  "ownerDisplayName": "Albert Einstein",
  "senderDisplayName": "Albert Einstein",
  "shareType": "user",
  "resourceType": "file",
  "protocol": {
    "name": "multi",
    "webdav": {
      "uri": "spec.yaml",
      "sharedSecret": "hfiuhworzwnur98d3wjiwhr",
      "permissions": ["read", "write"]
    }
  }
}
```</t>

<t>The signature base is constructed according to [RFC9421] (with line
breaks in @signature-params for display purposes only):</t>

<t><spanx style="verb">
"@method": POST
"@target-uri": https://receiver.example.org/ocm/shares
"content-digest": sha-256=:&lt;digest-value&gt;=:
"@signature-params": ("@method" "@target-uri" "content-digest");
    created=&lt;timestamp&gt;;
    keyid="sender.example.org#key1";
    alg="ed25519"
</spanx></t>

<t>Sign this base using for example Ed25519 ([RFC8032]) to produce the
signature, then add headers (line breaks for display purposes only):</t>

<t><spanx style="verb">
Signature-Input: sig1=("@method" "@target-uri" "content-digest");
  created=&lt;timestamp&gt;;
  keyid="sender.example.org#key1";
  alg="ed25519"
Signature: sig1=:&lt;signature-value&gt;=:
</spanx></t>

</section>
<section anchor="verifying-a-signature-receiver"><name>Verifying a Signature (Receiver)</name>

<t>To verify an incoming signed request:</t>

<t><list style="numbers" type="1">
  <t>Extract the provider domain from the <spanx style="verb">sender</spanx> field in the
request body</t>
  <t>Fetch the public key from
<spanx style="verb">https://&lt;provider-domain&gt;/.well-known/jwks.json</spanx></t>
  <t>Extract <spanx style="verb">keyid</spanx> from <spanx style="verb">Signature-Input</spanx> header and find the key
matching the <spanx style="verb">kid</spanx> value in the [RFC7517] response</t>
  <t>Reconstruct the signature base from the request using the
components listed in <spanx style="verb">Signature-Input</spanx> as specified in [RFC9421]</t>
  <t>Verify the signature using the appropriate algorithm
(e.g., Ed25519 [RFC8032])</t>
</list></t>

</section>
<section anchor="validating-the-payload"><name>Validating the Payload</name>

<t>Following the validation of the signature, the host SHOULD also confirm
the validity of the payload, that is ensuring that the actions implied
in the payload actually initiated on behalf of the source of the
request.</t>

<t>As an example, if the payload is about initiating a new share, the file
owner has to be an account from the instance at the origin of the
request.</t>

</section>
</section>
<section anchor="appendix-c-directory-service"><name>Appendix C: Directory Service</name>

<t>A third-party Directory Service is a back-end service used to federate
multiple OCM Servers and facilitate the Invite flow.  It is expected to
expose, via anonymous HTTPS GET, a signed JWS document [RFC7515], where
the signing key MUST be made available offline and the payload MUST
adhere to the following format:</t>

<t><list style="symbols">
  <t>REQUIRED: <spanx style="verb">federation</spanx> - a human-readable name for the list of OCM
Servers exposed by the Directory Service</t>
  <t>REQUIRED: <spanx style="verb">servers</spanx> - a JSON array of objects to describe the list
of OCM Servers with the following string fields:
  <list style="symbols">
      <t>REQUIRED: <spanx style="verb">url</spanx> - an absolute URL identifying the
OCM Server.  It MUST:
      <list style="symbols">
          <t>include scheme: either <spanx style="verb">https://</spanx> or
(for testing purposes) <spanx style="verb">http://</spanx></t>
          <t>include host (either a FQDN or an IP address)</t>
          <t>MAY include a non-default port</t>
          <t>MUST NOT include a base path (e.g., <spanx style="verb">/ocm</spanx>)</t>
          <t>MUST NOT include userinfo, query, or fragment</t>
        </list></t>
      <t>REQUIRED: <spanx style="verb">displayName</spanx> - a human-readable name
for the OCM Server
Example:</t>
    </list></t>
</list></t>

<t><spanx style="verb">json
{
  "payload": {
    "federation": "The ScienceMesh Directory",
    "servers": [
      {
        "url": "https://ocm-server-1.example.org",
        "displayName": "OCM Server 1"
      },
      {
        "url": "https://ocm-server-2.example.org:4443",
        "displayName": "OCM Server 2"
      },
      {
        "url": "http://192.168.1.1:8080",
        "displayName": "OCM Server 3"
      }
    ]
  },
  "protected": {"alg": "RS256"},
  "signature": "..."
}
</spanx></t>

</section>
<section anchor="appendix-d-object-models"><name>Appendix D: Object models</name>

<t>An implementor of OCM MAY choose any internal object model to represent
an <em>Address Book</em>, a <em>Contact</em>, an <em>Invite</em>, a <em>Provider</em>, a <em>Share</em>,
and a <em>User</em>.  The following diagrams are provided to clarify
the concepts and their relationships, as a guide for implementors.</t>

<section anchor="address-book"><name>Address Book</name>

<t>An <em>OCM Provider</em> MAY offer its <em>Users</em> an address book tool, where OCM
Addresses can be stored over time in a labeled and/or searchable way.
This decouples the act by which the OCM Address string is passed into
the Sending Server's database from the selection of the <em>Receiving
Party</em> in preparation for Share Creation.</t>

<t>The Address Book entity maintains a collection of contacts for a user
within the OCM provider.  It serves as the primary mechanism for
managing federated relationships between users across different OCM
Servers. <em>Contacts</em> may be added to the Address Book through the Invite
flow or direct entry.  It provides a convenient way for users to
organize and access their federated contacts, and MAY allow users to
generate <em>Invites</em>.</t>

<t><spanx style="verb">
+-----------------+
|  Address Book   |
|                 |
| - owner: User   |--------+
| - contacts: []  |        |
+-----------------+        |
       |                   |
       | contains          | generates
       | 0..*              |
       v                   v
+-----------------+  +----------------+
|    Contact      |  |    Invites     |
+-----------------+  +----------------+
</spanx>
### Properties</t>

<t><list style="symbols">
  <t><strong>owner</strong>: Reference to the User who owns this address book</t>
  <t><strong>contacts</strong>: Array of Contact objects stored in the address book</t>
</list></t>

<section anchor="relationships"><name>Relationships</name>

<t><list style="symbols">
  <t>An Address Book belongs one or more Users.</t>
  <t>An Address Book contains zero or more Contacts.</t>
  <t>An Address Book MAY allow its owner to generate Invites.</t>
</list></t>

</section>
</section>
<section anchor="contact"><name>Contact</name>
<t>A Contact represents a federated user relationship established through
the OCM protocol.  Contacts are stored in <em>Address Books</em> and may be
created through the Invite process or via direct entry.  A Contact MAY
of course contain much more detailed information about the referenced
user such as if it was added via <em>Invites</em> or direct entry.</t>

<t><spanx style="verb">
+-----------------+
|    Contact      |
+-----------------+
| - addedDate     |
| - email         |
| - name          |
| - provider      |
| - userID        |
+-----------------+
       ^
       | referenced by
       |
+-----------------+
|  Address Book   |
+-----------------+
</spanx>
### Properties</t>

<t><list style="symbols">
  <t><strong>addedDate</strong>: Timestamp of when contact was added</t>
  <t><strong>email</strong>: Contact email address (informational)</t>
  <t><strong>name</strong>: Human-readable display name</t>
  <t><strong>userID</strong>: The identifier of the contact at their OCM Server</t>
  <t><strong>provider</strong>: The FQDN of the contact's OCM Server</t>
</list></t>

<section anchor="relationships-1"><name>Relationships</name>

<t><list style="symbols">
  <t>A Contact may be referenced by one or more Address Books.</t>
</list></t>

</section>
</section>
<section anchor="invite"><name>Invite</name>

<t>The Invite entity represents the bidirectional trust establishment
mechanism in OCM.  It facilitates secure contact exchange between users
on different OCM Servers.</t>

<t>```
+-----------------+
|     Invite      |
+-----------------+
| - acceptedTime  |
| - createdTime   |
| - sender: User  |
| - token         |
+-----------------+
       |
       | generated by
       v
+-----------------+
|   Address Book  |
+-----------------+</t>

<t>```
### Properties</t>

<t><list style="symbols">
  <t><strong>acceptedTime</strong>: Timestamp of invite acceptance (if accepted)</t>
  <t><strong>createdTime</strong>: Timestamp of invite creation</t>
  <t><strong>sender</strong>: Reference to the User who sent the Invite</t>
  <t><strong>token</strong>: Unique, hard-to-guess string generated by Invite Sender
           OCM Server</t>
</list></t>

<section anchor="relationships-2"><name>Relationships</name>

<t><list style="symbols">
  <t>An Invite is generated by an Address Book entry action.</t>
  <t>An Invite is associated with exactly one User as the sender.</t>
</list></t>

</section>
</section>
<section anchor="provider"><name>Provider</name>

<t>The Provider entity represents an OCM Server's capabilities and
configuration as discovered through the OCM API Discovery process.  It
represents both the Sending Server and Receiving Server roles, and an
implementor might find it useful to have a Provider object model to
store the discovered information about federation peers or other remote
OCM Providers.</t>

<t><spanx style="verb">
            +-----------------------+
            |      Provider         |
            |    (OCM Server)       |
            +-----------------------+
            | - apiVersion          |
            | - enabled             |
            | - endPoint            |
            | - inviteAcceptDialog  |
            | - provider            |
            | - publicKey           |
            | - tokenEndpoint       |
            +-----------------------+
                   |
                   | exposes
                   |
         +---------+---------+----------------------+
         |                   |                      |
         v                   v                      v
+------------------+  +------------------+   +------------------+
| ResourceTypes[]  |  | Capabilities[]   |   |    Criteria[]    |
+------------------+  +------------------+   +------------------+
| - name           |  | - enforce-mfa    |   | - allowlist      |
| - shareTypes[]   |  | - exchange-token |   | - denylist       |
| - protocols{}    |  | - invite-wayf    |   | - http-signatures|
+------------------+  | - invites        |   | - invite         |
       |              | - webdav-uri     |   | - token-exchange |
       |              +------------------+   +------------------+
       | supports
       v
+------------------+
|   Protocols      |
+------------------+
| - ssh            |
| - webapp         |
| - webdav         |
| - ...            |
+------------------+
</spanx></t>

<section anchor="properties"><name>Properties</name>

<t><list style="symbols">
  <t><strong>apiVersion</strong>: Version string of supported OCM API</t>
  <t><strong>capabilities</strong>: Optional features supported</t>
  <t><strong>criteria</strong>: Requirements for accepting Share Creation Notifications</t>
  <t><strong>enabled</strong>: Boolean indicating if OCM service is active</t>
  <t><strong>endPoint</strong>: Base URI for OCM API endpoints</t>
  <t><strong>provider</strong>: Friendly branding name</t>
  <t><strong>publicKey</strong>: Optional public key for HTTP signatures</t>
  <t><strong>resourceTypes</strong>: Array of supported resource types with protocols</t>
</list></t>

</section>
</section>
<section anchor="share"><name>Share</name>

<t>The Share entity represents a policy granting access to a <em>Resource</em>
from a Sending Party to a Receiving Party.</t>

<t><spanx style="verb">
+-----------------+                      +------------------+
|  Sending Party  |                      | Receiving Party  |
+-----------------+                      +------------------+
       |                                        |
       | creates                                | accesses
       v                                        v
+------------------+     notification    +------------------+
|     Share        |--------------------&gt;| Receiving Server |
+------------------+                     +------------------+
| - expiration     |                            |
| - name           |                            | mediates access to
| - owner          |                            v
| - protocol       |                     +------------------+
| - providerId     |                     | Resource (remote)|
| - requirements[] |                     +------------------+
| - resourceType   |
| - sender         |
| - shareType      |
| - shareWith      |
| - state          |
+------------------+
       |
       | governs access to
       v
+-----------------+
|    Resource     |
+-----------------+
</spanx></t>

<section anchor="properties-1"><name>Properties</name>

<t><list style="symbols">
  <t><strong>expiration</strong>: Optional expiration timestamp</t>
  <t><strong>name</strong>: Human-readable name of the shared Resource</t>
  <t><strong>owner</strong>: OCM Address of the Resource owner</t>
  <t><strong>protocol</strong>: Access protocol name and details (webdav, ssh, webapp)</t>
  <t><strong>providerId</strong>: Unique identifier for the Share at the provider</t>
  <t><strong>requirements</strong>: Array of access requirements (must-use-mfa,
                  must-exchange-token)</t>
  <t><strong>resourceType</strong>: Type of resource (file, folder, calendar, etc.)</t>
  <t><strong>sender</strong>: OCM Address of the party creating the Share</t>
  <t><strong>shareType</strong>: Type of recipient (user, group, federation)</t>
  <t><strong>shareWith</strong>: OCM Address of the Receiving Party</t>
  <t><strong>state</strong>: Current state of the Share (accepted, pending, deleted)</t>
</list></t>

<section anchor="share-states"><name>Share States</name>

<t><list style="symbols">
  <t><strong>Accepted</strong>: Share accepted, Resource accessible</t>
  <t><strong>Deleted</strong>: Share removed or expired</t>
  <t><strong>Pending</strong>: Awaiting acceptance by Receiving Party</t>
</list></t>

</section>
</section>
<section anchor="relationships-3"><name>Relationships</name>

<t><list style="symbols">
  <t>A Share is created by a User (local).</t>
  <t>A Share is received by a User (remote).</t>
  <t>A Share governs access to a Resource.</t>
</list></t>

</section>
</section>
<section anchor="user"><name>User</name>

<t>The User entity represents the party in OCM who can send and receive
Shares and Invites and manage Contacts, and interact with Resources.</t>

<t><spanx style="verb">
                     +-----------------------+
                     |        User           |
                     +-----------------------+
                     | - email               |
                     | - name                |
                     | - ocmAddress          |
                     | - uid                 |
                     +-----------------------+
                            |
                  +---------+---------+
                  |                   |
                  | owns              | participates in
                  v                   v
         +------------------+  +------------------+
         |  Address Book    |  |    Shares        |
         +------------------+  +------------------+
         | - contacts[]     |  | - receiving[]    |
         +------------------+  | - sending[]      |
                  |            +------------------+
                  |
                  | issues
                  v
         +------------------+
         |    Invites       |
         +------------------+
         | - sent[]         |
         +------------------+
</spanx></t>

<section anchor="properties-2"><name>Properties</name>

<t><list style="symbols">
  <t><strong>email</strong>: User's email address</t>
  <t><strong>name</strong>: Human-readable display name</t>
  <t><strong>ocmAddress</strong>: Full OCM Address</t>
  <t><strong>uid</strong>: Unique identifier within the OCM Provider</t>
</list></t>

</section>
<section anchor="relationships-4"><name>Relationships</name>

<t><list style="symbols">
  <t>A User owns one or more Address Book(s).</t>
  <t>A User issues zero or more Invites.</t>
  <t>A User participates in zero or more Shares as Sending or Receiving
Party.</t>
</list></t>

</section>
</section>
<section anchor="resource"><name>Resource</name>

<t>The Resource entity represents the data or service being shared between
OCM Providers.  It is the target of Shares and is accessed by the
Receiving Party through the Sending Server's API.  In general a Resource
is a much more complex entity, but for the purpose of OCM we only need
to model a few key properties.</t>

<t><spanx style="verb">
+-----------------+
|    Resource     |
+-----------------+
| - location      |
| - owner: User   |
| - resourceID    |
| - type          |
+-----------------+
       ^
       |
       | accessed via
       |
       v
+------------------+
|     Share        |
+------------------+
</spanx></t>

<section anchor="properties-3"><name>Properties</name>

<t><list style="symbols">
  <t><strong>location</strong>: URI or path to access the Resource</t>
  <t><strong>owner</strong>: Reference to the User who owns the Resource</t>
  <t><strong>resourceID</strong>: Unique identifier of the Resource</t>
  <t><strong>type</strong>: Type of Resource (file, folder, calendar, etc.)</t>
</list></t>

</section>
</section>
</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Our deepest thanks and appreciation go to the people who started the
work on what would become this specification in 2015.  In particular we
want to thank (in alphabetical order) Guido Aben, Russell Albert,
Holger Angenent, David Antoš, Hrachya Astsatryan, Kurt Bauer,
Charles du Jeu, Andreas Eckey, David Gillard, Andranik Hayrapetyan Wahi,
Dimitri van Hees, Christoph Herzog, David Jericho, Frank Karlitschek,
Christian Kracher, Ralph Krimmel, Massimo Lamanna, Simon Leinen,
Jari Miettinen, Jakub Moscicki, Frederik Orellana, Vlad Roman,
Christian Schmitz, Woojin Seok, Rogier Spoor, Christian Sprajc,
Peter Szegedi, Ron Trompert, Benedikt Wegmann and Jonathan Xu.</t>

<t>We would also like to thank Ishank Arora, Gianmaria Del Monte,
Jörn Friedrich Dreyer, Richard Freitag, Hugo González Labrador,
Matthias Kraus, Maxence Lange, Lovisa Lugnegård, Sandro Mesterheide,
Antoon Prins and Björn Schießle for their direct contributions
to the specification.</t>

<t>Over the years many more people have been involved in the development
of OCM.  We would like to thank all of them for their contributions,
including Jean-Thomas Acquaviva, Samuel Alfageme Sainz,
Karsten Asshauer, Miroslav Bauer, Felix Böhm, Maciej Brzeźniak,
Diogo Castro, Gavin Charles Kennedy, Jarosław Czub, Milan Danecek,
Michael D'Silva, Lukasz Dutka, Pedro Ferreira, Renato Furter,
Klaas Freitag, Raman Ganguly, Eva Gergely, Hilary Goodson, Daniel Halbe,
Dave Heyns, Jan Holesovsky, Jan Hornicek, Carina Kemp, Fergus Kerins,
Andreas Klotz, Matthias Knoll, Christian Kracher, Mario Lassnig,
Claudius Laumanns, Anthony Leroy, Patrick Maier, Vladislav Makarenko,
Anna Manou, Rita Meneses, Zheng Meyer-Zhao, Crystal Michelle Chua,
Yoann Moulin, Daniel Müller, Frederik Müller, Rasmus Munk,
Michał Orzechowski, Jacek Pawel Kitowski, Iosif Peterfi,
Alessandro Petraro, Rene Ranger, Angelo Romasanta, David Rousse,
Carla Sauvanaud, Klaus Scheibenberger, Marcin Sieprawski,
Tilo Steiger, C.D. Tiwari, Alejandro Unger and Tom Wezepoel.</t>

</section>


  </middle>

  <back>








  </back>

<!-- ##markdown-source:
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
wA/H6kk/XqWcwU0yHMfXg66UMtM+tey1tWJpWJTHQS7lxRVtvpePMDYYYLyn
LZqNf/8afDKmwxB09k3nfkFlVO7DR2Rp9zvdlmfjxYKehf+ueaiKZ1f6SHm/
BAk7GcO/0/ud4Mk/K4j031f2QOP2MUx17l3lix6XJKjXweU8orhSxoZ/vs/O
M+4KX9Ji1V4ycy3tSYYRKZHVHYoXr6bsZIWFTdLPkjgmxgq5FUphJLQSQMP6
ldBwSIDwIEb9lV+5Ct4yffvfaRElloVYtwKvzDvzaNCoB2iY3kdSHwgErCHY
qPGwOxWOT+GHo4W1uZMF4L74SWQQtAdwab+w5a7CeZCt/Pp0tkeuO/S2EsRp
wGVZ0ZRZ4vE1FjXHaZCBKx93/lNy+mASBQpmY07woxc9rKCkwYYmW2NPY+0J
pn4gLvjF8Nr4bVi+3n/aiUUqFKZlLU/poGwUjiOm7KdFr3HGRtrqAyvlz9I4
4zJ1jZJ3nAJOXjAqcMaxyRbOFYLhs+rkM1dz6VGgAbbo5RPfWxYpsHBx7zMe
uAqh2tDJ1F/w3SaSnCfcgmxBPOQCLguJhuzNJ3GHosiDnFY5ZfVkEo67jaN6
mfZ7gLNXBxqMxAkwXBKB0cf6f1pIM+e+whCu805gaHQCAmGL/fbsBtgzpOY2
KbxGW8CzcSdvUG0iY8MLnd1WzkS9dv8GMoiMrLWcAp31ZjTeMIHnCw460eWi
hIz9LO62UD3+sk7KVGPlTX3AnlGPTHN6MEvPQKiMh4HEmAvJg+HzgCM/ebT7
5JN6qsI2CT/fXJV9yonwpG9uLmUDtimU2+M0uFKJZGlZqK2YzQ48e+NzOC+Z
PKJ6oyi0Xq0vvarlS8htZqtDyqZo9D9HVErLGOei8sz4/giLyyIea7lMhJnO
EzdzB/6DMoZ6PjT+blvDdSZYw07QkPnM4m67DhQ6nhHfyupduiz9ckUpsqpJ
XR6u30o4D7egh/FKX3mwKP4mMhKBs65Wn79Ojzt9DSuhklN0CGecbCK3Atuu
4J6TEHDcyIZIY8nar9o9CNS9AWa+FSgr23rHLO0KlMQ3b4NTa2w2TJ9hHzX0
3wJ/H+hMg5qOxl5Y4Sor1CqCq8n1q7dZfnXtjurdobtQ4uhZ7h/wtQdrdRyr
dnkW2AEmjddenPYBFfQXfBYjs4nrydWJ2nPTtm+TpzlF1blnMRGXUu5OjiLu
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
YrbObk1rN15mu2sjtcnlT2Kx6K7a443GURpptrlxO4iHmMpxwjbWPfDSvcrO
67vg69uJ17bUWcVGCFx4WTAytWm8Nj235LgtjgRUwRhrfBot8hmQruCF6Ffi
EKupzRDguqFAintrSFFDOdbdAMRbs3IpUWp1E6ZTjm0Pg9AITDf58asD0okB
KMCCW7qNFgkCyGbJtVy3KSYCkN+auJtoUmQefdhvP5XLIh3UzOkoEgUnE8dK
0RxP50tC28jDvv4kioZ4+v7k1dG7Q3sM40ss/0FL4hyF9SFkXU42vZH8j1R9
fuj+ymxxHL+57+B36fj3g7bogrUQ4ggNIKt83yt8K/cPOg1/37iM7tOUBEez
4pr1c7WFxoUgoYUnonNmBgdiw+cy9cIRBqLiMoF41vomc4ks68iHqPpyqDad
TGSxNdJQ230UXGBtjI0v0370qO/HMaftt6beNAH2RbwTyoo0wMO+Xi/fstoP
h5ffm/w2tSHstk56c9qNhMneUG/XvSl+v//tZioYuADpWJaV2gAQ0CCnOTZ3
1OIez+MyHZGPt4uAX7gAlQvis7aBW2ukPUj4iQQT4SI1XIIZvK1VYH1MwREZ
szEZm+9RjGsL5smqK7jclp5Yzl8d4NP3n1glUvxi0ix1NjMSiasxUFbk9RKV
vVywlrKx6lxnOy5XY/Ry3LVDE2+YSymzUbpcWyliw5DUViIxoJKmoB9O37a0
D2pKCFGtf5uXYodjlDYK9K68A//3fpXbAATMYB+wtdLe6VLlXu5xofLSXVkk
8pPCXpZLksyawoYEvBBP4Hga3Pw1aXDSUdUa5GNn0pD2GGo5BrVBeNk8wcs4
LefczIbFL2tEe4+kbvb6O9FvY5+1XaCw8luOvmGfId3gpV75CbY4rkAqmXFT
5Ki0Gqv8y+v64mdz2n1DYmoomX1Qijln1X+dzNJSyYQbjmMm6rjvohDJmCf9
VjRYANVDZrImzhzbv0rW2oiR2asV2xpRo5qU2pRMG8GRQTVwdQRKSihbDjRt
tOuL7UJGD/sP+3vIQlyMJTdZc80gOWvEielm8Ll3c3ODPdnmvWUxk0aeAwqw
oRbz6JrJIht2o3Nq5NcWEQTp9UPQdq9sFVDn3uMrroz83vSLZcGiJMrJ26DP
YhVYEu3rKEF03t/t70avsaCoaVRGiQ6Bx+6bj3hJ7DwChn1t9nb2Hpndh/s7
O/B/5rvj88i3Me/7wY73W5cfHaZYUm8fmM1Bb+/R42/yq8fzPzz4+Mcv34+e
ZsMn5f031d7qx93l90/Ge9nTP/7yZDydPfjDTrn7+eobO9nbJLuspvtmd2c3
stjoHWWLJeXogT6z+81W51u+STqm8y03eKQac6YzklHGBAp8gVHWne1/hjc5
AGD8ze6TBztPdx/t7ez8Mzud0/E3HeXnPo5+A7/tdvCheHYJj5QxRlzDwjoO
sH0GaH94vFf+sBc/zI+fLj6OHv7hafHsj8Onwz88ifeuX+9enT77fL6zevNg
+fLhzftHsx8eD/+4O0KBa6949+CXw4fV6aPpi29gQ4kBXCAD+KbJH/5LxM7E
C4C4DWD4HZ76Zr664JuPXiIaic49d67SsaiGS20L215CMrLWLlVmLRADd5uu
6eFmTSFw+UoyGt497GP5ZQnskW7iMRU24ugYnQRAHzirMyUQYtlWnCbAjI3C
1Pxcbka9JixNmMMmjxFcf1WtEZntxuQM4pEXBKO5cDC45SHWID9o7uPA4/Pd
SKIjXPwOYD63bQ0sk9WIsCM1OtleXRx8o8ICt+wtxcUoQmD99pbQN67DS7yI
Nh/OhHn/PRta+Kry6qd62chRrQKhoJx4kHAlLJfd4Uvggisw7ZvO08mD8QOs
ZTLBqiYPhw+f9J4lD5Les3jyeLQzfhiPnw6pLjbXGaNzgO89p7ubf+F87/Ii
xREf7OxEf3YUPvAnZMtOJnmAev8DrYy5bR+vO5O2hbilZVUsR1y6NMUinonT
Wmrp8UZqOV+JzkphRmW7pzBU7EQ0s3KES3X1ylVGFBpKgpXLC+fQBy53ua3H
xGFDVBJbwYOPCoMIxyyhnHuXjE9SOpoNJ/D61MMY72XXNgIhoDFht3Yv128c
F322SLj3IJfSQ5zU9mXKFTZS9q5S1/E0oXIlWXJT30Q61yDCR6TL2HwHvi4J
sDl2bi3kuLwsirywx6VsOy8ilrdW95KDQZ01lSU+BCKrd2jxU/N9r2rmJDyT
ECjEgy1b2OfDAWSMPyJtCzQXAmDHCD1T4zIMs/bGYSvjoPYKaPn2K+bNg25k
vyFWg48sMxcQp89x+ugyszFoF+4C8iumHWKGEsUGHJhBJ/Ssdgahq0nNn+wP
06c/vKP/wtMNv4PrusnRBvqKemlrE7Anx6tQ09KnDK3n2YrrTBTJdX7lx9vG
kTMcJpNJolEgoOvl5JgoOCNLDyahYNt6VziCBLWxVtbgkPYBU7zwueiMQlJq
acVUoQdjmYuUcoGFEcfRoHP6kjHw4vXBu+9eXpy8PD0+Ojs7ev+uM8iC2AuN
rFMRlYrBw6Uc8bpUDQs3CHVqLg+EBbippIsUdNFuDZK7HunnWi2X8xYTngZF
t02I5x347A1nIqCbEbGShoEYPAz33a6oiSZ3bLARS+RP5ow30Thgo2Ae9VVx
EX65CDro1n95dn4hqOwIqVvUfnh3+L5OudzjRWraL72Uyzaejo2al7F0VWz6
EW09p4h4VKCmAyisXteQyJjVXA8tkFDbWnPL1kZ32lqzZmvDk/WrNzmSTTa/
epOt9iWbTEYJz4ayXqPExFEdpGYfQYxw7jN1LhUxzEVY1LppAl0dHbw7MKCa
IOYlF5numY+YhfU91a/F7BAV9rxGoeeB4id3s9ptvW67cpN1whHLjvQULlZm
y8kI6AlAjx3DjLfKoydPH33apv4fCEi5nEzSz/smH5GX4AX7BfCGKgCWpNg3
Ry/PsWxprUSfxgFtldv7YlAhj4c5LOJJhSUiRiQ9YD1adUGcin/dbyRq3t0/
IAS9OXshXVA5E+lUVlNHDBfi3oSY2kh3RcyzR48eCGIosga9j4SXA1tEGDu5
oh1qbD6gzrMvTYYIO1ScSPptgTJKNRXMBxAcZ+5bXKtD8osWJJ8mVMJjRCHg
h67GIgjJkkvGIkQ9+gqNF7FNgUGM1YqG8wAY0tSR5zpm64xih7rWM769b9uD
uVpaXtsR3jYeyHCFuG/VZNIRf6k1oUiJR3KKc1MSGLdHnquZdgCxhY0UNgnQ
ANiecyu0rg0uAuC0J5rUT5RzmJZenWd2uDWDIEW56QNSKf9sH71cZeJm5lPv
IcWb9zXFubh5OIZYO/hq9iRSQRLQ38tsOTc/UMXGjrFUONFOoYBcV86RoZjF
w2S2Bgjs1dzD1EZyPNOTtqKaXbl2yAuP1Ilzof8tzpUb7lccrhP1l/EBS5Nq
graIfXfSqGmBe46tSYyRn9xTn4KHyBr0Gbb1BeYt/B0cVbhaqbygdzITbWUi
Fd7Yq8gFvqnwlLSdDz1zpWpyHdD15vAzdXHJi6vOttXhmYz4Eg8YFnMBCcK0
Rgd8ZR2/rZOOR8MbaSdN/JCGjeSDQ0aNY3EH+unflX7uu9zMBmH8h2y/IEx0
a85/uakx6iYXYbrliH0xb3Knrn/6Jvirfdz0h0WBzJ+8XaSPFvj7HuSm5e9P
f5PZpdS+DGmTKry1UyIm4sbrfSKz/6kX/NU+bvrj10Wy3jj7cCUOOnba8Bt/
m9nFLcLs1c3Oher4R05NQMInz4qH+b9mdtIrsdFMyuyxLpGe41VLJ1mK3pUJ
Zv7M8N+xZIloypm6SrTvVU0JOM5LKlKVFxXIx7CcG8w2kkAYrsgeqzYXNL6n
6169T+KiwgTta/JFkaOMsjMmibTAqBWBM+TfQk0MB+IA2Egj3ueTuCc1PMZB
kA5mYNDEfukznxxEERoCe7UqsyLJByeqg0NIuxjF2UWQ4V+WFH9K1YnygkQp
Hw0RQS+xaJpO0g2OAneQsCPat40rOEEqFN0IpNB5a/B6eHPMpzhruU4FhUra
FrOkxrxaFvSA1JpLmvVsFQXrAYsjDbZ1VVI1PRxuQDwPSGtsYapWOpC+VOWR
tX9gQmNJ20/X51IKM3CnKgkNxaQcL/szISxLhTkbM+kSQ+EA/EbDXqOI7fen
L1+8Pz5++e7w5aHG7onHQzJ3gDI78k7HxfRSIWRqXbWSQ+NjU8Vg+bTKl5KO
LiE8Q4n/lGIfWCiPygJnM+QS+LgUZs7SETMIUmj5ln6bXMajlZqI2a8hHY1n
/JNUmLPyt1iawn5DVCk0GAMz9gmn2pmDMI8hYVgqt2yrhWe7YNXMVv3oyK9e
J2EAqHNLrVXW6BPq+eq538Xhbltjk7HW8+wfgGo/qNmUBy6sQK3LZBgXuyjl
FnFJHWxHErizwlxJVKKee8GG/niJ5hvDqZqk6hvAVWTIQLEw1SXaqdHew0l6
w2SVs6CWFta0jqFDUQO6Zca9weDMTtFKPUNRnu1VcmMz837HCvR1EvyANLm3
u/vsk3lexOMMQznO+qbzE3aXocgMG7/AmjnxviOx/0enXhjjW+ytWH7a0mAM
qo1RwP4Df1CJ6/44H92fVvPZ/WIywmm3O93oOC5GU7P77NmTPsPz4NnTxwBP
UgA4Ze9tAgs/B2GWEntIxTnts9cvLsmv0jVv+1Hnpw9ZSmVOrDnmyIWqbX04
PQKF6DvMdU1H5mwFtPY5+gpgESYA1ryJsyXmQu/t7DxiaLkj2OEShEjUEhEY
c4woJPp4+RlEstIW0v2YDNGAA7Iv3BHJOJLYM2FNIkvCx1sgU6hw7vuIwzdL
4AAAk6KQ/YOv4eQBQId90Acwuqjz07kfH2KCyDfzCp2NqCV82oruNDtOgjh5
D3x+CEje29ndk/mfPNp99Mm8Ab4EHPAYNg+pa4ZlK97Ah7P4Kp0vi7hr3qGS
8hN5OhA1ziO89ebj2fZX7A9OiLAcx7g3u48cHE8COLzJqIHSm4/fb9+23to8
T1rmebrzYA/nKZNJWeKtdQZzvU2X5XUc4zqPaOqXY+KFvRdL4OxAB5dpFc+c
o98czC7xZpvOzdbL8eHZwVdBhiCEFLqr1PB098nDT3BA0yGA8hxp82A+TC+X
yImxXPYCGA9Fi12X5m1+Ix/EFIfHNEJcfUR2cEfCxBk9NFlAHiNZwFWCbH8a
z7t8Uny75PpDXEZ4isuvoQqczwPjWeQiDcxzeG+O1qID2JtTvCoLpE6+WkEu
zVZd7xxLzILbLA8TVY4pEA0c4DQ4+atkWMiO7D0URJByas6qZBFnyRVyNCCX
fDIBNp47QhXtd98ccG2RUzXh2ebTqh8fAia+hlhw/m3Fy97DDl0YBxS5l342
B/vmGLMwepMYRbhafRzyd8ZNy7hfCc/rsxQUxcNAwci6j1n4SStuIofaDoue
c6yXI17QWmtXqjeM8ifHV7g4+7p7BCW79oiRwCkbeR690ubSuelqKkFus0W1
xWurP547xOVZXlCanAtwaHp5KJaSy0dFio6UOtqq4dOrVYnWE9/L6I4J6hMU
PR7ZOMD12kxXfSZtQfJYssDKcLH48o1QQk2RQOmE5RmV6S5J2CmspEOSM9tP
WCNKrQsHa09o25o2f5DGRwJtRNxMYYZpELQeerRGGlrPf7loj+tDodtTNkST
tOhqTOxSI3lc1HFzqsAQsYa2nN8GN9NAG7B9jjO18BCxabohv5uCcEgFd6kK
eCgjS44brZrODKtCpAj45d8k8AqlZQ7+oBRQIqN6TmUzcLOe6dauiqPc73sB
bceOQOPfByBc2GrJCa5az/unM25Vh62ZHFv1+tf103ybYmguiyAVOfqJK3R8
2vqNtJylXByf/UgR9QR+RgZOaoHjdM/3DUgAJNzXa59IYxwWnumhl5KCA5pE
5ifxSSbdtTZApsOn/ZYbPee0HE0KelfYsHFTu0YJ8mw0UXZSDmzXazlg5H9k
ArBBJWgXdZHSHBsd9LFrn5pDrfCfHG6FoHb2zU/kPfhX8SF0rqoVxpm8//6E
Aqjou1Fxjd+9HO89erT7zH1/lY7x+yYEHAtpn/uMT+3u/vLjwY/ff35RTH44
u3hyvvr4h9fvL59MR9cn8SI9nhU3R3F8Mnr94TTv0It/hv/9pPFasHG4n3wE
tMrXFldw2o6i7ygRenMtNtEO/ThY6vgn/qRaDGxbxKSEwb4q0q7ZfYziGV65
j83ug/0HT24PgyXU688a/QqzU/Tr/turxevVq/c/DJ8fnnwePflx+Prw/cd3
Xw6unz795ePyh8nbd5OH5x8mzz7kTzH0k7bQtlZCBM/jIk2+bYObQ+EwXpK2
C3sLrOL5jL92hQzwx7u0E+P3qPkVvpKQlp5m3zbpgJ/k7+/0aL0DF750MAON
pDIv5V1/zDs9qW2v8Alua4Vf+xmw+At2wrEIIXsefMunwmKO8lmFrKVZtX0I
PaJF2sQv/eKnxOAj00m6nIJ+9uUmWxbPno4f3Pyc3kwL94JXRhWPaAcdf+T5
wWqlnU/2fPzZj2d0vdSHJPSXlPVGUYr11gtOdnax5ZGLLf/WDtWjwFXWeDfG
ldsY632Oyw8irfeNcqs28vROYVQPyfYOyO/4qx65u34PZ6DTABMev3OwN0V5
uzjv36FZBq7E+eL3/IOEeq9jbvwQhXonwhd5J5BN8a1Ju8DXtn+RCxs1W1bb
3KYIoSIfL0cSBKTrkpwsrPAjEf5my88DuHVb6jHxXxkRH4TC11B0BwSF6GmE
wf/O7Z/dVOX2P5BNlfm9u8m3tJzdNiWQiOGVyhpJPQKx6zlmv9tHy43N2LcR
ChJF3sjYrxeIC+ua7fVBCdQKau7O5zvZ+GlwOlGPJ/r9mlsZs74VvgGhdMAw
DWpbZ9MYUcCZpOL7hTdwWqrqpg7UwRUOovG99JUzoKgUgWmtp4llEGymDhmI
RY1iwPpoNZkVZFSs+S7lyDDTpQF07HdzkZB3rvDzqC+bXJu7NcYZSYkNKji3
+MT1JLmDxKSDkayxDcg84ZA4rCijLmvxmtNTXtOd4NQZTD2zmXBYDIUUoWIe
2bfF6OLF3XVFyyg5k5nnErUiFh8Miv+ADE33sRF7qhdx1baKMx65xq+FkDVE
qRQo2wJi8IEvKFqVUEfWYj46Mh8qDJ4uXVcgvP8ibmiJqiO7xTgzK1/6YW+u
4hkvi+uUNGHyRPMX+00fEsYG+6WPm04mym1Er0MP8ym0NLL6mjREKWpt1xiz
nouiutZTOXIONZu04dUGjliW73IJ/izPVnPs5ssOg+9ennddXf43H89cJSxr
IhX3VqSUhFi+8vI0sBGcVzoin0yIkWsQh582FsVjLrtSS8AXrWHfr4i1bwbO
xUbN7c00jBWi/lkacqi1cABZkbHoqvUMaW5WMJ+42HgyssHauuEacQKQa9kv
O21kNCLGr0BTW+HmArrLYkazAlm6YvVvbbUajzt58/BuI14pmoIKhVFhAtBy
pwlGkUhOuOXdA/TOsCS2RYhL2LmlN+w2P4pP1kYknrEl48US/kZVAI9ONPJj
W95BO5W+h9GxWU+qoxuqGCsPqcHIPUm8mdJwhQ0OqLT/9ro3UObFoMsuV5ih
rPVJEV/OuURFgOBxWJi4lZZoHr91o2QJafvZmpophO2kaa+NLDWEToxnM3C0
p3K2UJvVVJ2uSiL3jORp2ThMEObne7sN5UJeGYc6g6f873bkqT93v2amPX+m
/YcPHz6423R7d5wOZtt9ttffffy0D+rp/tOdpzt3m+CBnYD+i1rDn62GQ3wP
N6UDNyu+eHqGuYr8gL0J8Yd+v99RNSNg60Aw7znOFLsxzEoypljjVl7ocacC
ZNOcCvdmK5tApUGq9DIn9mjhFDgvFxor8zzPry6Q+16IhRw/wO/Mz/mXE5G1
+BMZAS66ESemXXyAfboQC5hjNOM0viTNJnZhq1z5eRajUEJ8nIoJLapSuXRa
SCI83OPTdFFS8m5sLpcY5EKp5G71EobpL4MQdIEosQBzxzVs3UepjgRseUEc
zqska9AvofETyLptrJuaC8sKkwDZjay5WzGHibo6t2WC/lk6yDfxSuyWYxAC
l2gdUyEFbwFrEA/q4ApzxjzzuOS8Krg4m+bZe662nJMbSoBk5ItbF65QAZms
LxBmoABU5axlMDTocPXUAKdGTNYoY1OsM0VYzry5JN5Swy+RHUa2/EFi/Mxv
viroXJdaO1PiLj2TJ9Z9Ba4YUztoFyodUIZNqpdu1KMiL/0mjbiJ1jirlA0b
LzZODhCT+z9YrpYQcCJNRDFCpAi6YDNeiayLcZJdJ1kqDSI1FKCgThzAt2Bl
XxKpmaXZh0DtbnWKRb9ALs5rB7HFp+Vklhd9VkH/qRGe9k/Rn0y4Kox4+5Op
/+F3Pe6yvm8+cHTcn/xBehYsuB0+YcCdfbNlVvej/qMxY/CjRs97P9oS26V7
bKff/+2aMa5bJrhuB63x5T8xQtQtqADTl4LhTUttGQ83AyOfXAA3CpIXF4Tg
i4t9L6pVKI9wjq3Y4ZEyDIJHtkRv6w7gAAcqByrUKg8Ke5IjF4xBIJ36Zweh
AkYZEAj3Xy+D5qPEK/stD9uN+5IUuX1cD1nbG46eqU8oqUF+QXVBOLN0GSg6
sMsMekK7M0MBnT5bCOIM5SRHHhPSejQKKgcdWtwFd2IZlLwRG00Le7D1ubDL
LOg2NS7hFoFVNYldLosysb0w5ug6I/xxplmYwSOKJRsJhHjGEa1bSrpwBSyK
dmamhjBYFtFgWxtZRv00rHmuxzOhsd5jI1yGO2QtpBrVvrMGIu87XNDR4Ubm
okf+f3eMwWFEm3JtALrJD9ueW3eE7YLxFJ6rmQ5PItWkkTPqdoFeIozgC4pV
RpGezq2gVPg2vYIIwzdq6Sh+wxJ6jhFGwKDJwEVvyd2vALENAS4aT4/A93UT
dATNI/LelQLY8tIaLmKXZhswe1sSMJPgaPE5l+uVRA45SyJseOcdIRqmTMNc
+5h9qYE7OPLK/GRS/QeuZ2ehoDJFFFGrW6FF+gI5IsLcO1+GcJV5Np8bhf+2
cyOJUkhBSvvCWfgr+Y5NpXon83dcO+BOZ8S7Y5XD+kek9YakdYRnpH2O9WfE
W1zjmEi4deyK3G+lE4sPJn4PE+veH2m9bXyesbT5YuXqyk6Ww/e4mgW89iFL
QWXvGpCBx70q710uPSncx5xuL/tDrW5If7cfkkxfx4bB/qhx1hC1MbBnxKJ4
7U3QCPJR6ioxglJMyQ14yGi5scZCk7+ATpiqQXzGTmwTysYpi30v/b3SOeIp
8Sgbc5DK5VI0h7DEk38nal1/V41Trkc6kZE3JTXObgk9aauMZYp8lohojHW2
PR14jg0E2V6fVtLlEqlAArvtmmvKcES3Ps0fFKuq37zOmGIWCQX0FxLfL+0E
fW1T2YRPHs0jVDusKnji30lwN/on2T215TZqu/Wpu84I7GiRShyt933jqYQC
ecYB0bc9xWHim5/iY8zdAw7TeJZftj21qKOhdayF9ufa+JTGsC884H4Nvlpf
tfNIQN8tb7iZ2v61bvJWLarlu3CuVtWo/a22+6BVxWEdr+3r6E82vo5LXn8S
ZeqFx0jwS4KcRU10tRdpTN+23jVfD0Nd4mQYesaLqzQWhp7rgqTYo7tX4xks
vDRCUJXYjqDtlow/gq31/a9/9mCQqKubeDXxYdDgJwmVXYcHN0Lprc37ukkD
NRrBRzmmAl3RwQhhAeS1I3zNXtgRpJZNuUn4EOlDC4aWupC1u4w9Nf2lRbI4
bGPb+BJWXPuy3++Hr7dOJJ7yFkHHsk0UIpSDitiAwX1avsfrIAPSjXcS8L33
2tbDpt/Z90Qa4vPB8o3XAVwL7C/IZ7IhIqtkLYTZNw4jWf9+4mw6selU6hOk
AjzyKvN0eheNjVpcQ295rbRdNpSKV0UKP2I8ZhHz9W51F8u3Ayz4vv6cE4mc
w5jHD4rqB+YQh/GgyYl4wOx55DA3KkXitfJskYbMIgdgVlyRhNy5XiDxhXK6
C+77ENfqqUi0ca2WzFoFwrT+rTsk4VRr74FGuPJmi90d5m5nCev/fDsfyfXl
xsfpQS2ku8m81/q37gaDv6AqzrrF8arOglTm5nO93u//1BRN13Hslr+1/IzK
r1kQNyO5zbJyyxtmnoxT2gJLx87ye8dBroOrbeMba5fp9XRa/7aTJMwWy9jb
vGS/SwNczV85d9DXKdSz3dShAND4EiNBgy+ruArsWxtPjqeUo7qR+bthkbzW
wmCRsm6mDReWI6+A5XpUZyPPNlmhiOY0UiYslB3auX2fVq7pExpbgw/pdUG0
RJycMWHJi6aiptVSfmuLL/IuXv1dueq3g1vnaOxUet8iFrbiqrVTknvFEVZw
rcj++L+bLb/XQrdN4DctbSy2GxcYWTik7bu9tLYwSqhrK4WPsAzfOIZ/JdWo
v10zerRgmUN92Ejil8vjN5Wuw6m16dMWWsC6cOXly0XX03u33ctI/2v3N7hv
+J1KDKYvlgUZ1Pi8BN2FtlxhVOlE1OVyf2gUQmLW8n1nZMZjej6Qd3Bs2VY7
iiU0qROOOSj4ziEP6l7RCvYUOUrVL+m5E4aC6OAmTu3tL1ar4aqx1HWmUZ4G
o4TFd0AVGMlUszXDxlrb/fA527nIe1A4oP9kg3t4yU1s9sFXWcKhQdqNqkwr
bC4lUxl6uqX+91hh4dQx9s+rU4y9Ill86Vw+bJnRouUsdSlIbUaRTew65Jr1
u0H+PpSBdaBVK/8Vo9e9GBtHb7mGb3vcVdG50+PLdNz8/m+y1A2DtRopWp7b
6NwNniPnZu07pL4UWA9JJWnW8l67b7cFTAflZtGVQK55gazHV+i8uY5fN49z
nLN5Q40Atg6OWj1umUeFFPvGOhx7f5thc++0jkP1htvsWLegvmauOgpMFbcs
M0Qccihd6x3eXS/0qPcNecW9MnS+fZWzzZ1a0myXs5l/A7I/Ll0jfdQCYZxB
fs2lQYyNDsw65xm1vbSP8n6FjnjrTLdP1U5b+Liy+NIql7lXCxXQrxrsb1wT
Qu1dL3dt+w2DMUqGwqLYuDBMuAsISY5alii0n2vgMNUpo7wJFBe8S8g2r7HR
tFFd1fXdEY24qYOTIy5eyo6YmXd3RhQQ7fzx3E3qsyyOSxWpMCmRqhqBd5Nw
kRwseYQZr+xlwFCFG7JouCZ7tzkS7yDm4yFB+cFVFWuN4wm0HnauiyPRqjbr
55AfnbPdKS8W/ddp3Ph5g3Wvrl9/pdFNV0zH7PSIepBJq5yWHnRfGXdTe9Fh
rf1Q13QadirWBOvTO8r0FPE5wqyVWTK+ZCUjit4vsep1sqAK76BHXDH1Y8JG
gk5A3PrL3LYOTHJq6Yn+TuzczbV7IyxQgjkON9SLgfrJDZNRPk9ako6RK1CR
DjoczC+WmHd8A+PEmdSZB0AwbMHEs8U0hhOM9T+5t9i2+Q54YG4Ohthg5hRL
vACb5ITBbvQ6n10C3g4yPHWYiH0Yw4GHz1X+b/+ja16D1DhdxeagrMq4KlZY
auL7ZVGZ5/EScBa9AMLBAMrx0rxJll14b0xV1F6OrrBOCg/2XToDeMf8a5yl
V+Z1vCriRVLBeOZjPE270WE6T6siNddYTD5Bj+KLaZGWVb6YYkbwl/xSR3uD
xW+meRdLvcCivwcA0grj2a8QHHwnhTG+R8BxV08RI/Axnc+TGRaLAM1jnpu3
MVbDj7vmDD5lWFYElt+N3sQAw3GaYG0PRNeb+Go5NMd5OUpHVynOidoXrOB9
AViMcYAfZjFo2zlW4fDmPxtNYUFfuuZjnv8M+3KW5FghI79EKj1b5HmhK6Sn
F0X886gbnVALj7MvyWUyTvHxzJxjOz/cKvMc+9KnV5X5mFwi8ER3b/Isxt03
/7IEBvYxEWqirJ1ZepU46jgq6T8HRY61XL6DaTFtNsaS9bBAUBBg9X/5n0VG
BuIx4tgcFsmKcAgfsGkXrD6tYtiJ10sg8e/y7Mtf/scs+QLIHBbxGJYUHccV
UDAQAOB/idVq4s90ut+iwo3VQTCB3bxdXmbJ5V/+T6SJM1gFXHnHCZbNnCZw
lrsRUh8s/aSgoFZY5fOfCTJAapr85f+Y2aSO1MZQUeVmrEdE1nU5fbVyfdH7
a+l/t0riokRVacUXihxT8kxTf0Vt5aRxe2OsC5UvKKKFbxY4jhbbIaKx+Dbz
obkHZwBgN+IUBbwA3yQg4pxPgYDgDhz9sgQiv0a6jOfLBM/pJEbeA5/T7Es3
AnIHRGVwIGE78QgCtRZ5OYuv5UiaV8kMawL85X9OsTJNPEqTn83z4kvyb/9X
lsZXeNJy2LwXcVkVcIi+g+kyo8f4+yQDGsMCRzEM+m//Lb4xL74shzgJEDsc
wAxudBjjGAkCoDu8d5bOENq3y6u4/GIOl9UVfDpJcEtfJQXQCxLbaQJECl8A
40Cm8f0shrVaYjrFowiAZJdLbBb+8jo23yUgYOCH11hhYQWklo+pIhFAkMK8
r2NgX7AU3K/XyQoQSinprzEWIb8ur1b6uchSBBiLoKZZDOubLxBDxeUSF4v0
hdTGPOv7WY4H1pFwls9m/im1POUYRkMWUpZZegmnfoa1+WDEtzHKqwgNUPA0
B+p6C+IcAHMCvBMYCLyY4vvIMlLas+P4Cm7e7CpHMADA4zjLl3jgQD47hvNO
Jdz/OE2ATo7xLPb+OI1h114UK7hO4NxixZ8ZUO6L6TLuRj/myBaOgSZTh6vj
v/zfWMHV4132m9O4nAPYx8tM9/Tf/htwti8J8NebEvndmxjQB+DfwEDfp5V8
e5SX6cQQs5oA7z7Amn18jOG7Ika6gi2HaxhPfdGl22WWE5OE57C7GLPy0xxv
I0AgUF8MFL4E7g+ohCsGMFricU9SuLWGSA2M9hGy0hSE2Zggic5TGPesSlJ6
4EX/sG/O05sYyxQAVD8zUB8QCuIj5/kcTu2XZJEnM+AHINdQml30/wIQN4Lm
FkABAA==

-->

</rfc>

