<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-toutain-t2trg-coreconf-m2m-01" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="coreconf-m2m">CORECONF for Machine-to-Machine Communication</title>
    <seriesInfo name="Internet-Draft" value="draft-toutain-t2trg-coreconf-m2m-01"/>
    <author fullname="Laurent Toutain">
      <organization>IMT Atlantique</organization>
      <address>
        <email>laurent.toutain@imt-atlantique.fr</email>
      </address>
    </author>
    <date year="2026" month="September" day="16"/>
    <area>IRTF</area>
    <workgroup>Thing-to-Thing Research Group (T2TRG)</workgroup>
    <keyword>CORECONF</keyword>
    <keyword>CoMI</keyword>
    <keyword>YANG</keyword>
    <keyword>CBOR</keyword>
    <keyword>CoAP</keyword>
    <keyword>M2M</keyword>
    <keyword>IoT</keyword>
    <keyword>constrained devices</keyword>
    <keyword>SID</keyword>
    <abstract>
      <?line 92?>

<t>The document addresses the specific challenges of M2M interactions where both
endpoints may be constrained nodes, and explores the use of CORECONF primitives.</t>
      <t>This document describes the use of CORECONF (CoAP Management Interface) for
Machine-to-Machine (M2M) communication in constrained IoT environments. It
defines a YANG data model enabling remote management and configuration of
constrained devices using CoAP, CBOR, and YANG SID identifiers. The
serialization in CBOR of this data model limits the payload size. It documents
also how the YANG data model can interact with common IoT ontologies such as
SOSA or SAREF. The same CORECONF/SID serialization also enables full
interoperability between constrained devices and AI agents, by exposing
device actions and data through an MCP (Model Context Protocol) server
without requiring an intermediate, device-specific translation layer.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-toutain-t2trg-coreconf-m2m/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        T2TRG Research Group mailing list (<eref target="mailto:t2trg@irtf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/t2trg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/t2trg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ltn22/coreconf-m2m"/>.</t>
    </note>
  </front>
  <middle>
    <?line 109?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document proposes a YANG data model designed for constrained devices and
low-power networks. By combining YANG's strong typing with CBOR's compact binary
serialization and CoAP's lightweight transport, the model enables efficient
Machine-to-Machine (M2M) data exchange while remaining within the bandwidth and
energy budgets of constrained environments. SCHC header compression <xref target="RFC8724"/>
may further be used to reduce the overhead of IPv6, UDP, and CoAP headers on the
most constrained links.</t>
      <t>Some data models and protocols already exist for M2M communication in IoT
environments, but none is fully adapted to the constraints of low-power networks
in terms of message size, energy consumption, and interaction patterns. This
section reviews the main existing approaches and explains why a new model is
needed.</t>
      <t>SenML <xref target="RFC8428"/> has become a widely adopted format for Machine-to-Machine
(M2M) data exchange in IoT environments, enabling constrained devices to report
sensor measurements and time series in JSON or CBOR. However, SenML is primarily
a data serialization format: it structures payloads but does not enforce strong
type checking, schema validation, or support for configuration and remote
operations.</t>
      <t>SenML is also part of the LwM2M framework <xref target="OMA-LwM2M"/>, which defines a broader
device management protocol built on CoAP and SenML for operator-to-device
interactions. However, LwM2M relies on periodic reporting and registration
messages that impose a non-trivial overhead, particularly on Low-Power Wide-Area
Networks (LPWANs) <xref target="RFC8376"/> where bandwidth and energy budgets are severely
constrained.</t>
      <t>In some ways, SenML may be described by a YANG Data Model
<xref target="I-D.gudi-t2trg-senml-as-coreconf"/>, but the integration in the YANG ecosystem
remains limited.</t>
      <t>The CORECONF protocol stack  using YANG <xref target="RFC7950"/> for Data Modeling,  CoAP
<xref target="RFC7252"/> for data transport, and CBOR <xref target="RFC8949"/> and YANG SID identifiers
<xref target="I-D.ietf-core-sid"/> for the compact data serialization provides the richer
foundation that SenML lacks: a strongly typed data model, schema validation, and
support for full CRUD operations and actions. However, CORECONF has so far been
designed for operator-to-device management, leaving peer-to-peer M2M
communication — where both endpoints may themselves be constrained nodes —
largely unaddressed.</t>
      <t>Some YANG Data Models have been defined for telemetry. <xref target="RFC9232"/> introduces
Network Telemetry used to collect vast amounts of data to supervise a network.
<xref target="RFC8639"/> allows subscribing to a datastore filtered through XPath and
receiving notifications. <xref target="I-D.birkholz-yang-core-telemetry"/> proposes to extend
telemetry to CORECONF, but using a traditional approach. None of these
attempt to limit the size of the exchanged data, which is essential on
the constrained links this document targets.</t>
      <t>This document adopts a different approach. The goal is to define a YANG Data
Model that will benefit from CBOR serialization to optimize the bandwidth to
extend CORECONF for M2M use cases over low-power links. The data model turns
around transducers held by a device. A transducer is the abstract
representation of a sensor and/or an actuator, transforming an analog value
into a digital value, or a digital value into a physical action. This
document focuses on transducer management: resource discovery, value
polling, statistical computation, threshold alerts, and time-series history
notifications. This is an
early-stage work; future revisions will explore other categories of measurements
and interaction patterns.</t>
      <t>Beyond its use as a wire format, the structure defined by the YANG Data
Model can be mapped into a Semantic Web ontology, giving each container,
list, and leaf a counterpart class or property that common IoT ontologies
such as SOSA or SensorThings already understand. <xref target="extending-ontology-to-coreconf-m2m"/>
details this mapping and how it lets a device modeled with coreconf-m2m
be integrated into an existing ontology-based deployment without a
device-specific adaptation layer.</t>
      <section anchor="use-cases">
        <name>Use Cases</name>
        <t>The targeted use cases are remote sensors installed in the field and connected
with LPWAN or Satellite connectivity. SCHC <xref target="RFC8724"/> <xref target="RFC8824"/> is used to
compress headers such as IPv6, UDP and CoAP for CORECONF traffic. The payload
results from the serialization of the datastore in CBOR.</t>
        <t>The model covers the following use cases:</t>
        <ul spacing="normal">
          <li>
            <t>resource discovery: sensors or actuators, regrouped under the name
transducers, are discovered with their characteristics (units, precision)</t>
          </li>
          <li>
            <t>simple query: each transducer can be individually queried or set.</t>
          </li>
          <li>
            <t>statistical computation: the sensor can compute some statistical values, such
as mean, variance, min and max. They can be reset.</t>
          </li>
          <li>
            <t>alert notification: when a value reaches a threshold (minimum and maximum) a
notification message is sent</t>
          </li>
          <li>
            <t>time series: values are collected by the device and sent when a limit is
reached (number of samples, duration, message size)</t>
          </li>
        </ul>
      </section>
      <section anchor="data-representation">
        <name>Data Representation</name>
        <t>CBOR is designed to be concise to represent numerical information since it is
directly coded in binary and not represented in ASCII. CBOR also uses binary
representation to encode structures such as Maps and Arrays. The length of a
numerical value depends on its value; for instance, numbers between -24 and 23
are coded on a single byte, values between -255 and 255 on two bytes,...</t>
        <t>Nevertheless, some representations may be less efficient numerically or less
precise. CBOR defines three IEEE 754 encodings on 3, 5, or 9 bytes. The smallest
representation introduces a close to 1% error. CBOR also provides a decimal
fraction type (tag 4) encoding a value as a <tt>[exponent, mantissa]</tt> pair, which
avoids floating-point rounding. However, this representation requires the
exponent (the divider) to be repeated alongside every individual quantity,
adding overhead for each encoded value.</t>
        <t>The assumption leading to this YANG module is to avoid floating-point numbers
for their size or precision and rely on integers with a precision parameter
indicating, if positive, the number of digits after the decimal point, or the
power of 10 if negative.</t>
        <t>The module also introduces the notion of time series to record several
measurements during a period of time and send them in a single message using a
notification. Time series values may further be compressed depending on the
nature of the data. This version proposes a compression based on delta encoding:
instead of transmitting absolute values, each sample is encoded as the
difference from the previous one, which significantly reduces the CBOR payload
size for slowly-varying measurements.</t>
        <t>The device can also send an alert when a measured value reaches a threshold,
allowing the receiver to react promptly without waiting for a scheduled report.</t>
        <t>Since the targeted networks are constrained in bandwidth, measurements are expected
to be reported infrequently, so the second is chosen as the time unit. To limit the
size of the timestamps, they are expressed as the number of seconds elapsed since
the equipment was started, rather than as an absolute date and time. If the
equipment is able to do so, it can indicate its startup epoch to reconstitute
an absolute time.</t>
      </section>
      <section anchor="requirements-language">
        <name>Requirements Language</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 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.</t>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The following terminology is used in this document:</t>
      <t>CORECONF: : CoAP Management Interface, as defined in <xref target="I-D.ietf-core-comi"/>.</t>
      <t>M2M: : Machine-to-Machine communication, referring to direct data exchanges
between devices without human intervention.</t>
      <t>SID: : YANG Schema Item iDentifier, a compact numeric identifier for YANG data
nodes, as defined in <xref target="I-D.ietf-core-sid"/>.</t>
      <t>Constrained Device: : A device with limited processing, memory, and energy
resources, as characterized in <xref target="RFC7228"/>.</t>
      <t>Device: : A piece of equipment containing one or more transducers.</t>
      <t>Transducer: : an interface between the analog and digital world. Transducers are
sensors reporting values or actuators having an action on the physical world.</t>
      <t>Quantity: : values manipulated by transducers.</t>
      <t>Value: : other information stored in the datastore including quantities</t>
    </section>
    <section anchor="yang-modules-needed-for-coreconf-m2m">
      <name>YANG Modules needed for coreconf-m2m</name>
      <t>coreconf-m2m YANG module is a framework: it defines the generic structure of a CORECONF
server hosting one or several transducers, a generic name for a sensor or
an actuator, but it does not define the transducers themselves. Each
transducer is identified by a unique identity, and if several transducers
report the same kind of measurement, several instances of the same
identity have to be defined.</t>
      <t>A device manufacturer using coreconf-m2m MUST therefore define, or reuse,
a YANG module describing the transducers embedded in its device, as
identities extending the base "transducer-type" identity defined in
coreconf-m2m (see <xref target="identities-data-model"/>).</t>
      <section anchor="identities-data-model">
        <name>Identities Data Model</name>
        <t>The identity data model defines all the transceivers that may be used inside the
hosts, this can be a generic data model or a model specific to the hosts. This
module indicates default parameters used for that transceiver (units, precision,
nature). These values are mandatory and may be overridden by the coreconf-m2m.</t>
        <t>A manufacturer module defines the concrete transducer-type identities for a
given product family; coreconf-m2m only defines the base "transducer-type"
identity that these modules extend. The ATMOS41 weather station example
used throughout this document is defined this way, in a separate "atmos"
module that imports coreconf-m2m and extends its base identity with
atmospheric and weather-related transducer types.</t>
        <t>coreconf-m2m defines the template for identities extensions. <xref target="fig-identity-template"/>
gives an example of an identity definition, where "ccm2m" refers to the
coreconf-m2m module.</t>
        <figure anchor="fig-identity-template">
          <name>Example of an identity definition using the coreconf-m2m extensions</name>
          <artwork align="left"><![CDATA[
  identity air-temperature {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "Cel";
    ccm2m:default-precision "2";
    description "Air temperature measurement (°C).";
  }
]]></artwork>
        </figure>
        <t>Identity names and descriptions SHOULD be explicit, since this information
may be used by a human, e.g. through an interface, or by an AI agent, to
formulate requests.</t>
      </section>
      <section anchor="overview-of-the-coreconf-m2m-module">
        <name>Overview of the coreconf-m2m Module</name>
        <t>The coreconf-m2m module is organized into three sub-modules:</t>
        <ul spacing="normal">
          <li>
            <t>"bootstrap" contains the context needed by the client to interact with the
server and its transducers. It mainly contains the time reference and the
transducer list. These values cannot be changed by the client (config
false); only a reboot, which also resets the communications, allows
their modification
            </t>
            <ul spacing="normal">
              <li>
                <t>"characteristics" contains stable information describing the host. This
information may be necessary for some ontologies such as <xref target="SOSA"/> and
<xref target="SAREF"/>. These values may be modified during runtime, and</t>
              </li>
            </ul>
          </li>
          <li>
            <t>"transducers" contains the runtime values of all the sensors and
actuators maintained by the host. It also contains parameters to control
notifications issued by the device.</t>
          </li>
          <li>
            <t>an RPC, now limited to resetting all statistics</t>
          </li>
          <li>
            <t>two notification types: one to collect time-series history, and one to alert
when a quantity reaches a minimum or maximum threshold.</t>
          </li>
        </ul>
        <t><xref target="fig-cf-m2m-tree"/> in <xref target="annex-tree"/> gives an overview of the module YANG tree.</t>
        <section anchor="bootstrap-sub-tree">
          <name>Bootstrap Sub-Tree</name>
          <figure anchor="fig-bootstrap-tree">
            <name>bootstrap sub-tree</name>
            <artwork align="center"><![CDATA[
module: coreconf-m2m
  +--ro bootstrap
     +--ro reference-epoch?   uint64
     +--ro uptime             uint64
     +--ro minimal-step?      uint32
     +--ro inventory* [type]
        +--ro type                  identityref
        +--ro unit-override?        string
        +--ro precision-override?   uint8
        +--ro category-override?    enumeration
]]></artwork>
          </figure>
          <t>The bootstrap sub-tree contains information determined at bootstrap:</t>
          <ul spacing="normal">
            <li>
              <t>reference-epoch: the absolute time at bootstrap, if a reference time source
(battery-powered clock, GPS, ...) is available on the device. This leaf is
absent if no reference time is available.</t>
            </li>
            <li>
              <t>uptime: the number of seconds elapsed since bootstrap. A client can combine
reference-epoch and uptime to estimate clock drift or propagation delay.</t>
            </li>
            <li>
              <t>minimal-step: the minimum number of seconds between two transceiver
readings. For instance, if a node updates its reading every 2 minutes,
querying it more frequently only increases battery drain without yielding
fresher data.</t>
            </li>
            <li>
              <t>inventory: the list of transducers known to the device, identified by
their "type" and their configuration overrides (see
<xref target="transducer-sub-tree"/>).</t>
            </li>
          </ul>
          <t>These values can only change on a reboot, which also resets the
communications and forces the client into a new bootstrap phase to
recover the data.</t>
        </section>
        <section anchor="characteristics-sub-tree">
          <name>Characteristics Sub-Tree</name>
          <figure anchor="fig-characteristics-tree">
            <name>characteristics sub-tree</name>
            <artwork align="center"><![CDATA[
module: coreconf-m2m
  +--rw characteristics
     +--rw geo-location
     |  +--rw reference-frame
     |  |  +--rw alternate-system?    string {alternate-systems}?
     |  |  +--rw astronomical-body?   string
     |  |  +--rw geodetic-system
     |  |     +--rw geodetic-datum?    string
     |  |     +--rw coord-accuracy?    decimal64
     |  |     +--rw height-accuracy?   decimal64
     |  +--rw (location)?
     |  |  +--:(ellipsoid)
     |  |  |  +--rw latitude?    decimal64
     |  |  |  +--rw longitude?   decimal64
     |  |  |  +--rw height?      decimal64
     |  |  +--:(cartesian)
     |  |     +--rw x?           decimal64
     |  |     +--rw y?           decimal64
     |  |     +--rw z?           decimal64
     |  +--rw velocity
     |  |  +--rw v-north?   decimal64
     |  |  +--rw v-east?    decimal64
     |  |  +--rw v-up?      decimal64
     |  +--rw timestamp?         yang:date-and-time
     |  +--rw valid-until?       yang:date-and-time
     +--rw name?                string
     +--rw version?             string
     +--rw identifier?          string
     +--rw description?         string
     +--rw manufacturer?        string
     +--rw model?               string
     +--rw hosted-by?           string
     +--rw installation-time?   uint64
]]></artwork>
          </figure>
          <t>This sub-tree contains stable information about the device that is not
expected to change across reboots:</t>
          <ul spacing="normal">
            <li>
              <t>geo-location: the fixed geographic position of the device, set once at
deployment and not expected to change during normal operation. The module
reuses the "ietf-geo-location" YANG module <xref target="RFC9179"/>, of which only the
"ellipsoid" choice is normally needed. Note that its coordinates are typed as
"decimal64", encoded in CBOR as a tagged array containing an exponent and
a mantissa. This encoding was not chosen for transducer values, in order
to avoid repeating the exponent (called "precision" in this model) with
every quantity.  </t>
              <t>
If the device is mobile, its coordinates should instead
be exposed through a transducer.</t>
            </li>
            <li>
              <t>name: a human-readable name for the device.</t>
            </li>
            <li>
              <t>version: the firmware or software version running on the device.</t>
            </li>
            <li>
              <t>identifier: a unique identifier for the device, such as a serial number
or EUI.</t>
            </li>
            <li>
              <t>description: a free-text description of the device, its purpose, or its
deployment context.</t>
            </li>
            <li>
              <t>manufacturer: the name of the device manufacturer.</t>
            </li>
            <li>
              <t>model: the commercial model name or number of the device.</t>
            </li>
            <li>
              <t>hosted-by: an identifier of the platform hosting this device, when
applicable.</t>
            </li>
            <li>
              <t>installation-time: the absolute date and time (Unix epoch, in seconds)
at which the device was installed or commissioned. Unlike
bootstrap/reference-epoch, this is an absolute value, not a reference
point for the device's internal clock.</t>
            </li>
          </ul>
        </section>
        <section anchor="transducer-sub-tree">
          <name>Transducer Sub-Tree</name>
          <figure anchor="fig-transducer-tree">
            <name>transducer sub-tree (type, quantity and statistics)</name>
            <artwork align="center"><![CDATA[
module: coreconf-m2m
  +--rw transducers
     +--rw transducer* [type]
        +--rw type                       identityref
        +--ro quantity
        |  +--ro value?              int64
        |  +--ro timestamp?          uint64
        |  +--ro timestamp-source?   enumeration
        +--ro statistics
           +--ro min?            int64
           +--ro max?            int64
           +--ro mean?           int64
           +--ro median?         int64
           +--ro stdev?          uint64
           +--ro sample-count?   uint64
]]></artwork>
          </figure>
          <t>The transducers sub-tree contains the list of transducers (i.e., sensors and
actuators) maintained by the device, listed in "/bootstrap/inventory". A
transducer is identified by its "type", the same identityref used in the
"/bootstrap/inventory" entry.</t>
          <t>This branch holds two kinds of information: "quantity" carries the values
manipulated by the transducer, while "notification-parameters" configures
notifications through which the device can proactively inform the client.</t>
          <t>Quantity contains:</t>
          <ul spacing="normal">
            <li>
              <t>"value": the raw integer value, computed as
<tt>value = measurement * 10^precision</tt>,</t>
            </li>
            <li>
              <t>"timestamp": the relative time of the measurement, in seconds,</t>
            </li>
            <li>
              <t>the entity in charge of the timestamp, which can be the device itself or the
receiver.</t>
            </li>
          </ul>
          <t>"statistics" is a sibling of "quantity" and holds the main statistics
locally computed for a specific transducer, accumulated over a window of
samples rather than tied to the current measurement. Statistics can be
reset for a single transducer via the "reset-stats" action, or for all
transducers at once via the "reset-stats" RPC.</t>
          <figure anchor="fig-notification-parameters-tree">
            <name>notification-parameters sub-tree</name>
            <artwork align="center"><![CDATA[
module: coreconf-m2m
  +--rw transducers
     +--rw transducer* [type]
        +--rw notification-parameters
           +--rw history
           |  +--ro active?        boolean
           |  +--rw step?          uint32
           |  +--rw precision?     uint8
           |  +--rw max-samples?   uint32
           |  +--rw time-period?   uint32
           |  +--rw encoding?      encoding-type
           |  +--rw max-payload?   uint32
           +--rw sensor-alert
           |  +--ro active?       boolean
           |  +--rw t-min?        int32
           |  +--rw t-max?        int32
           |  +--rw hysteresis?   uint8
           |  +--rw dampening?    uint32
           +--rw check-interval?   uint16
]]></artwork>
          </figure>
          <t>Notification Parameters supports two kinds of notifications:</t>
          <ul spacing="normal">
            <li>
              <t>"sensor-alert" will send a notification when the measured quantity reaches one
or two limits, minimal and maximal, or goes back to a value between these two
bounds. To avoid fluctuations, two mechanisms are in place:
              </t>
              <ul spacing="normal">
                <li>
                  <t>"hysteresis" defines a percentage, by default 5% around the limit, so if a
maximum limit is set to 100, an alert message will be triggered when the
quantity is higher than 105 and another alert will be sent when the
quantity becomes lower than 95%. The value is sent in the notification
message, so the client is able to know the state of the alert.</t>
                </li>
                <li>
                  <t>"dampening" limits the number of messages sent. When a crossing is
suppressed because of dampening, the notification eventually sent
MUST carry a <tt>None</tt> value, so the client can distinguish a dampened
event from an actual measured value.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>"history" builds time series:
              </t>
              <ul spacing="normal">
                <li>
                  <t>"step" parameter defines at which interval samples are taken.</t>
                </li>
                <li>
                  <t>"precision" allows overriding the quantity precision defined in the
transducer. By default the precision is the one associated with the
transducer for "quantity".</t>
                </li>
                <li>
                  <t>"encoding" indicates how information is stored in the time series:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>"direct": all the values are stored with the precision.</t>
                    </li>
                    <li>
                      <t>"delta": the first value is the reference and the following ones are the
difference with the previous. This allows limiting the size of the
message since CBOR encodes small numbers more efficiently.</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>A notification is sent when a number of measurements is reached, either:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>the number of samples in the time series reaches "max-samples",</t>
                    </li>
                    <li>
                      <t>"max-payload" is based on the size of the time series. Since small
numbers take less space than large numbers in CBOR, a time series may
contain a different number of samples.</t>
                    </li>
                    <li>
                      <t>the "time-period" after which the collection should be sent.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>"check-interval" controls how often a CON (confirmable) notification is
sent instead of NON (non-confirmable), for both the history and
sensor-alert streams of this transducer: 0 (default) disables it, so
all notifications are NON; 1 makes every notification CON; N sends one
CON every N notifications, all others being NON.</t>
            </li>
          </ul>
          <t>The read-only <tt>active</tt> flag in both notification types is set when one or more
clients observe a notification. Parameters are common to all observations of a
particular transducer.</t>
        </section>
      </section>
      <section anchor="notifications">
        <name>Notifications</name>
        <t>As seen in the previous section, each transducer has a
"notification-parameters" branch holding its notification settings. A
client MAY FETCH this branch to retrieve its content and check the current
status of the notification (e.g., the "active" flag).</t>
        <t>A client wishing to start a notification MAY first send an iPATCH to
configure its parameters. Parameters changed while a notification is
already active take effect immediately. These parameters are global to
the transducer: a modification impacts every notification currently
active for that transducer, regardless of which client configured it.</t>
        <t>Notification is started by sending a FETCH+Observe request on the notification
stream resource (<tt>/s</tt>), with a body identifying the SID of the transducer to
observe. Multiple clients may observe the same transducer simultaneously; each
receives an independent copy of every notification.</t>
        <t>The notification ends when either:</t>
        <ul spacing="normal">
          <li>
            <t>the client explicitly sends a termination message (a GET/FETCH with the
Observe option set to 1, i.e. deregister, using the same token as the
original observation), or</t>
          </li>
          <li>
            <t>the client sends a RST in response to a notification, or</t>
          </li>
          <li>
            <t>the server sends Confirmable notifications and does not receive an
acknowledgment, or</t>
          </li>
          <li>
            <t>an ICMPv6 unreachable message is received by the
server in response to the IPv6/UDP/CoAP packet carrying the
notification's token.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="coreconf-overview-in-the-m2m-context">
      <name>CORECONF Overview in the M2M Context</name>
      <section anchor="coap-methods-mapping">
        <name>CoAP Methods Mapping</name>
        <t>CORECONF defines mappings for all CoAP methods, but this document uses only two:</t>
        <ul spacing="normal">
          <li>
            <t>FETCH is used instead of GET to retrieve values from the YANG Data Model.
Unlike GET, FETCH carries a body specifying the exact SIDs to retrieve,
enabling precise and bandwidth-efficient queries. Combined with the CoAP
Observe option, FETCH also serves to subscribe to notification streams.</t>
          </li>
          <li>
            <t>iPATCH is used instead of PUT or POST to modify quantities and notification
parameters. It supports partial updates: only the specified nodes are
modified, leaving others unchanged, following the merge semantics of
<xref target="RFC7396"/>. Setting a node to an empty value with iPATCH is the preferred
way to clear a parameter, making DELETE unnecessary for datastore
modifications.</t>
          </li>
        </ul>
        <t>The recommended CoAP Content-Format for all exchanges is Content-Format
140 (<tt>application/yang-data+cbor;id=sid</tt> <xref target="RFC9254"/>), used uniformly
for FETCH request bodies (which carry the list of SIDs to retrieve),
response bodies, and iPATCH payloads, where data nodes are identified
by their SID.</t>
        <t>Using a single content format ensures maximum interoperability with CORECONF
implementations and keeps the payloads as compact as possible. Limiting
exchanges to a single well-known packet format also benefits SCHC
compression <xref target="RFC8724"/>: the fewer distinct header patterns in use, the more
efficiently SCHC rules can compress the CoAP headers, reducing overhead on the
most constrained links.</t>
        <t>FETCH and iPATCH requests MUST be sent as Non-Confirmable (NON) CoAP messages.
This leaves the application free to implement its own retransmission strategy
and timer management, which is essential on constrained networks where the
default CoAP confirmable retransmission behavior may be inappropriate or
wasteful.</t>
        <t>For notification streams (Observe), Confirmable (CON) messages MAY be used. A
CON notification allows the server to detect that the observer is no longer
reachable when no ACK is received, and to cancel the Observe subscription
accordingly. A RST response from the client is also a valid way to signal that
the subscription should be terminated.</t>
      </section>
      <section anchor="sid-allocations">
        <name>SID Allocations</name>
        <t>The coreconf-m2m model is intended to be assigned in the IETF experimental
SID space, with a model entry point of 62000. <xref target="annex-sid"/> gives the
complete SID mapping for this model.</t>
        <t>The atmos module, however, cannot be assigned SIDs in the IETF or another
SDO space, unless this commercial module is itself standardized. For
commercial modules, we assume that a registrar allocates SIDs and
implements the constraints defined in <xref target="I-D.ietf-core-comi"/>. In this
example, we assume that the registrar owns a 10 million SID mega-range.
<xref target="annex-atmos-yang"/> gives the atmos.yang model, and <xref target="annex-atmos-sid"/>
gives the corresponding SID mapping, composed of the identities
representing the transducers.</t>
      </section>
    </section>
    <section anchor="coreconf-traffic">
      <name>CORECONF Traffic</name>
      <t>This section illustrates different traffic patterns used in coreconf-m2m.</t>
      <section anchor="resource-discovery">
        <name>Resource Discovery</name>
        <t>The client does not know the transducers managed by the device. It sends a FETCH
on "/bootstrap" (SID 62002) as shown in
<xref target="fig-resource-discovery"/>.</t>
        <figure anchor="fig-resource-discovery">
          <name>Resource discovery: FETCH request and response (SCHC Rule 0)</name>
          <artwork align="left"><![CDATA[
  CoAP Request:
  Non-Confirmable, FETCH, MID:39919
    Token: 2aaf
    Opt #1: Uri-Path: c
    Opt #2: Content-Format: 140 (application/yang-data+cbor;id=sid)
    Opt #3: Accept: 140 (application/yang-data+cbor;id=sid)

  Payload: 3 bytes
    19 F2 32  # unsigned(62002) : /bootstrap

  CoAP Response:
  Non-Confirmable, 2.05 Content, MID:57745
    Token: 2aaf
    Opt #1: Content-Format: 140 (application/yang-data+cbor;id=sid)

  Payload: 118 bytes
    {62002:
      {7: 1788334280, 8: 30172, 6: 120,
       1: [{3: 10000010}, {3: 10000008}, {3: 10000011}, {3: 10000002},
           {3: 10000014}, {3: 10000016}, {3: 10000015}, {3: 10000012},
           {3: 10000001}, {3: 10000013}, {3: 10000003}, {3: 10000009},
           {3: 10000006}, {3: 10000004}]}}
]]></artwork>
        </figure>
        <t>In the request, the payload <tt>19 F2 32</tt> is the CBOR encoding of the unsigned
integer 62002, which is the SID of "/bootstrap". In the response, the outer
key 62002 identifies the bootstrap branch, and the inner keys are delta
SIDs relative to 62002, as defined in <xref target="RFC9254"/>: 7 (reference-epoch), 8
(uptime), 6 (minimal-step), and 1 (the "inventory" list). Each entry in
the inventory list is itself a map whose key 3 is a delta SID relative to
the list SID (62003), i.e. "type", carrying the identity SID of one
transducer known to the device; no override is present here, meaning every
transducer uses the default-unit, default-precision and default-category
declared on its identity.</t>
        <t>The client MUST have access to the corresponding YANG files to discover the
transducers' default parameters, indicating the unit, the precision and
the nature of the transducer.</t>
        <figure anchor="fig-transducer-list">
          <name>Decoded transducer inventory from resource discovery response</name>
          <artwork align="left"><![CDATA[
 coreconf-m2m:bootstrap
    reference-epoch  1788334280  (2026-09-02 09:31:20)   ← origin of every timestamp in the model
    uptime           30172 s
    minimal-step     120 s   ← floor for history/step

  coreconf-m2m:bootstrap/inventory — SID → module → YANG defaults resolution
        SID  Identity                           Module         Unit      Prec.  Category
  ────────────────────────────────────────────────────────────────────────────────────────────
   10000010  atmos:solar-radiation              atmos          W/m2          0  sensor
   10000008  atmos:precipitation                atmos          mm            3  sensor
   10000011  atmos:strike-count                 atmos          count         0  sensor
   10000002  atmos:average-distance             atmos          km            0  sensor
   10000014  atmos:wind-direction               atmos          deg           0  sensor
   10000016  atmos:wind-speed                   atmos          m/s           2  sensor
   10000015  atmos:wind-gust                    atmos          m/s           2  sensor
   10000012  atmos:tilt                         atmos          deg           1  sensor
   10000001  atmos:air-temperature              atmos          Cel           1  sensor
   10000013  atmos:vapor-pressure               atmos          kPa           2  sensor
   10000003  atmos:barometric-pressure          atmos          kPa           2  sensor
   10000009  atmos:relative-humidity            atmos          %RH           1  sensor
   10000006  atmos:humidity-sensor-temperature  atmos          Cel           1  sensor
   10000004  atmos:compass-heading              atmos          deg           0  sensor
  ────────────────────────────────────────────────────────────────────────────────────────────
  * override sent by the device; without a star, default value read from the YANG module.
    The inventory completed this way stays local: bootstrap is config false and is never sent back.
Connected. 14 sensor(s) discovered, minimal step 120 s.

    #  Type                         Unit     Prec.  Filter
  ──────────────────────────────────────────────────────────────────────────────
    1  solar-radiation              W/m2         0  [type='atmos:solar-radiation']
    2  precipitation                mm           3  [type='atmos:precipitation']
    3  strike-count                 count        0  [type='atmos:strike-count']
    4  average-distance             km           0  [type='atmos:average-distance']
    5  wind-direction               deg          0  [type='atmos:wind-direction']
    6  wind-speed                   m/s          2  [type='atmos:wind-speed']
    7  wind-gust                    m/s          2  [type='atmos:wind-gust']
    8  tilt                         deg          1  [type='atmos:tilt']
    9  air-temperature              Cel          1  [type='atmos:air-temperature']
   10  vapor-pressure               kPa          2  [type='atmos:vapor-pressure']
   11  barometric-pressure          kPa          2  [type='atmos:barometric-pressure']
   12  relative-humidity            %RH          1  [type='atmos:relative-humidity']
   13  humidity-sensor-temperature  Cel          1  [type='atmos:humidity-sensor-temperature']
   14  compass-heading              deg          0  [type='atmos:compass-heading']

]]></artwork>
        </figure>
      </section>
      <section anchor="querying-a-quantity">
        <name>Querying a quantity</name>
        <t>A specific quantity may be requested through a FETCH. <xref target="fig-query-value"/> shows
the exchange for the current value of air-temperature.</t>
        <figure anchor="fig-query-value">
          <name>FETCH request and response for air-temperature current value (SCHC Rule 0)</name>
          <artwork align="left"><![CDATA[
  CoAP Request:
  Non-Confirmable, FETCH, MID:12229
    Token: 2dae
    Opt #1: Uri-Path: c
    Opt #2: Content-Format: 140 (application/yang-data+cbor;id=sid)
    Opt #3: Accept: 140 (application/yang-data+cbor;id=sid)

  Payload: 9 bytes
    [62077, 10000001]

  CoAP Response:
  Non-Confirmable, 2.05 Content, MID:57779
    Token: 2dae
    Opt #1: Content-Format: 140 (application/yang-data+cbor;id=sid)

  Payload: 6 bytes
    {62077: 196}
]]></artwork>
        </figure>
        <t>The FETCH body <tt>[62077, 10000001]</tt> is a CORECONF instance-identifier: the
first element (62077) is the SID of "/transducers/transducer/quantity/value",
followed by the list key value identifying the transducer (type=10000001,
i.e. atmos:air-temperature). The response carries only that leaf: the
value 196, combined with the precision=1 declared on the air-temperature
identity, decodes to 19.6°C. Fetching the "value" leaf directly, rather
than the whole "quantity" sub-tree, avoids returning timestamp and
timestamp-source when only the current reading is needed.</t>
        <t><xref target="fig-query-stats"/> shows the FETCH for the full statistics table of the same
transducer:</t>
        <figure anchor="fig-query-stats">
          <name>FETCH request and response for air-temperature statistics (SCHC Rule 0)</name>
          <artwork align="left"><![CDATA[
  CoAP Request:
  Non-Confirmable, FETCH, MID:18878
    Token: 5420
    Opt #1: Uri-Path: c
    Opt #2: Content-Format: 140 (application/yang-data+cbor;id=sid)
    Opt #3: Accept: 140 (application/yang-data+cbor;id=sid)

  Payload: 9 bytes
    [62081, 10000001]

  CoAP Response:
  Non-Confirmable, 2.05 Content, MID:32290
    Token: 5420
    Opt #1: Content-Format: 140 (application/yang-data+cbor;id=sid)

  Payload: 21 bytes
    {62081: {4: 196, 1: 217, 2: 203, 3: 202, 6: 7, 5: 8}}
]]></artwork>
        </figure>
        <t>The FETCH body <tt>[62081, 10000001]</tt> requests the statistics sub-tree (SID
62081) for air-temperature (10000001). In the response, the inner map
keys are delta SIDs relative to 62081, each encoding the difference
between consecutive SIDs to minimize CBOR size. The six values correspond
to the statistics leaves: min (196), max (217), mean (203), median (202),
stdev (7), and sample-count (8), all scaled by the transducer precision
except sample-count.</t>
        <t>The client decodes the response and displays the statistics as shown in
<xref target="fig-stats-display"/>:</t>
        <figure anchor="fig-stats-display">
          <name>Decoded statistics for air-temperature</name>
          <artwork align="left"><![CDATA[
  [9] Statistics — air-temperature:
    min:     19.6 Cel
    max:     21.7 Cel
    mean:    20.3 Cel
    median:  20.2 Cel
    σ:       0.7 Cel
    n:       8
]]></artwork>
        </figure>
      </section>
      <section anchor="notification">
        <name>Notification</name>
        <t>The client first sends an iPATCH to configure the history notification
parameters for the air-temperature transducer, as shown in
<xref target="fig-notification-config"/>.</t>
        <figure anchor="fig-notification-config">
          <name>iPATCH to configure history notification parameters for air-temperature (SCHC Rule 1)</name>
          <artwork align="left"><![CDATA[
  CoAP Request:
  Non-Confirmable, iPATCH, MID:42310
    Token: 248e
    Opt #1: Uri-Path: c
    Opt #2: Content-Format: 140 (application/yang-data+cbor;id=sid)

  Payload: 22 bytes
    {[62060, 10000001]: {62060: {6: 120, 4: 10, 2: 1}}}

  CoAP Response:
  Non-Confirmable, 2.04 Changed, MID:65147
    Token: 248e
]]></artwork>
        </figure>
        <t>The iPATCH key <tt>[62060, 10000001]</tt> is an instance-identifier targeting the
notification-parameters/history node (SID 62060) for air-temperature (type
10000001). The value <tt>{62060: {6: 120, 4: 10, 2: 1}}</tt> sets three history
parameters using delta SIDs relative to 62060: step=120 s, max-samples=10,
and encoding=delta (value 1).</t>
        <t>An iPATCH is used the same way to configure a sensor-alert: the client
sets the low and high thresholds, and activates the alert, as shown in
<xref target="fig-alert-config"/>.</t>
        <figure anchor="fig-alert-config">
          <name>iPATCH to configure sensor-alert thresholds for air-temperature (SCHC Rule 1)</name>
          <artwork align="left"><![CDATA[
  CoAP Request:
  Non-Confirmable, iPATCH, MID:42312
    Token: 2490
    Opt #1: Uri-Path: c
    Opt #2: Content-Format: 140 (application/yang-data+cbor;id=sid)

  Payload: 24 bytes
    {[62068, 10000001]: {62068: {1: true, 4: 350, 5: 50}}}

  CoAP Response:
  Non-Confirmable, 2.04 Changed, MID:65150
    Token: 2490
]]></artwork>
        </figure>
        <t>The iPATCH key <tt>[62068, 10000001]</tt> targets the notification-parameters/
sensor-alert node (SID 62068) for air-temperature. The value
<tt>{62068: {1: true, 4: 350, 5: 50}}</tt> sets three leaves using delta SIDs
relative to 62068: active=true (delta 1), t-max=350 (delta 4), and
t-min=50 (delta 5). Since air-temperature has precision=1 (as in
<xref target="fig-query-value"/>), these raw integers represent 35.0 Cel and
5.0 Cel: the device raises an alert once the temperature leaves that
range.</t>
        <t>The client then initiates an Observe subscription with a FETCH on the
notification stream resource <tt>/s</tt>, as shown in <xref target="fig-notification-observe"/>.</t>
        <figure anchor="fig-notification-observe">
          <name>FETCH+Observe subscription on `/s` and history notification for air-temperature (SCHC Rule 2)</name>
          <artwork align="left"><![CDATA[
  CoAP Request:
  Non-Confirmable, FETCH, MID:42311
    Token: 248f
    Opt #1: Observe: 0
    Opt #2: Uri-Path: s
    Opt #3: Content-Format: 140 (application/yang-data+cbor;id=sid)
    Opt #4: Accept: 140 (application/yang-data+cbor;id=sid)

  Payload: 9 bytes
    [62048, 10000001]

CoAP Response (subscription acknowledgment):
  Non-Confirmable, 2.05 Content, MID:65148
    Token: 248f
    Opt #1: Observe: 0
    Opt #2: Content-Format: 140 (application/yang-data+cbor;id=sid)

  Payload: 1 byte
    {}

CoAP Notification:
  Non-Confirmable, 2.05 Content, MID:65149
    Token: 248f
    Opt #1: Observe: 1
    Opt #2: Content-Format: 140 (application/yang-data+cbor;id=sid)

  Payload: 16 bytes
    {62048: [189, 14, -3, 1, 5, 7, 3, 2, 1, 2]}
]]></artwork>
        </figure>
        <t>The FETCH body <tt>[62048, 10000001]</tt> subscribes directly to the
time-series "values" leaf-list (SID 62048) for air-temperature, rather
than the whole time-series entry: since the subscription is already
transducer-specific, echoing the "type" back in every notification would
only repeat what the client already knows. The server acknowledges with
an empty map <tt>{}</tt>. The notification then carries the values list under
its absolute SID, <tt>[189, 14, -3, 1, 5, 7, 3, 2, 1, 2]</tt>, using delta
encoding: 189 is the absolute reference (18.9°C, precision=1), and each
subsequent value is the difference from the previous one.</t>
        <t>The client decodes the delta-encoded time-series values and displays the result
as shown in <xref target="fig-notification-decoded"/>:</t>
        <figure anchor="fig-notification-decoded">
          <name>Decoded air-temperature time-series from history notification</name>
          <artwork align="left"><![CDATA[
  [9] air-temperature: 18.9 Cel  (09:57:42)
  [9] air-temperature: 20.3 Cel  (09:59:42)
  [9] air-temperature: 20.0 Cel  (10:01:42)
  [9] air-temperature: 20.1 Cel  (10:03:42)
  [9] air-temperature: 20.6 Cel  (10:05:42)
  [9] air-temperature: 21.3 Cel  (10:07:42)
  [9] air-temperature: 21.6 Cel  (10:09:42)
  [9] air-temperature: 21.8 Cel  (10:11:42)
  [9] air-temperature: 21.9 Cel  (10:13:42)
  [9] air-temperature: 22.1 Cel  (10:15:42)
]]></artwork>
        </figure>
        <t>The whole batch of samples is decoded from a single notification message.
Since the device timestamp is not carried in this payload, the client
reconstructs one from the configured "step" (120 s): the last sample is
stamped with the local time at which the notification was received, and
earlier samples are stepped back by 120 s each, oldest first.</t>
      </section>
    </section>
    <section anchor="from-cbor-sid-to-textual-identifiers">
      <name>From CBOR/SID to Textual Identifiers</name>
      <t>The examples throughout this document use CBOR payloads keyed by SIDs
(<tt>application/yang-data+cbor;id=sid</tt>), which is the compact
representation intended for constrained links. Ontologies generally use a
textual representation, and interacting with a human user likewise
requires presenting the information with understandable identifiers (see
the example in <xref target="fig-transducer-list"/>).</t>
      <t>To perform this translation, the recipient of a coreconf-m2m message
needs access to the .sid file and, in some cases, the YANG file, in order
to recover the transducers' default values. <xref target="I-D.toutain-core-sid-encoding"/>
defines a way to use DNS to locate a SID and a YANG file.</t>
      <t>An experimental service running with the "sid.yt" suffix has been
deployed. It allows finding the SID and YANG files associated with a
specific SID.</t>
    </section>
    <section anchor="interconnection-with-an-ontology">
      <name>Interconnection with an Ontology</name>
      <t>The goal of coreconf-m2m is to discover the resources managed by the
device and to provide a lightweight transport for information coming
from a sensor or dedicated to an actuator; it is not itself an
ontology. This section discusses how the elements it
carries relate to some existing ontologies and APIs, so that a gateway or
application can align them with a richer semantic model when needed, once
translated to textual identifiers as described in
<xref target="from-cbor-sid-to-textual-identifiers"/>.</t>
      <section anchor="extending-ontology-to-coreconf-m2m">
        <name>Extending Ontology to coreconf-m2m</name>
        <t>Before looking at how YANG information can be included into an existing
ontology, it may also be important to enrich the ontology with
coreconf-m2m information concerning the device's CORECONF capabilities;
this may be helpful for future interactions with the device.</t>
        <t>This document therefore assumes a
small <tt>ccm2m:</tt> extension vocabulary, applicable regardless of which
ontology (SOSA, SAREF, SensorThings, ...) a device or transducer is
otherwise mapped to. <xref target="annex-ccm2m-ontology"/> gives its full definition,
as an OWL ontology in Turtle.</t>
        <t>The ccm2m ontology defines a single datatype, <tt>ccm2m:SID</tt>: a non-negative
integer that uniquely identifies a YANG node, identity, or feature within
a SID file, used instead of a plain xsd:nonNegativeInteger so that the
nature of the value is self-documenting.</t>
        <t>It defines properties attached to a sosa:Platform, giving the
coordinates needed to reach and query the device:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ccm2m:coapEndpoint</tt> is the CoAP access address of the device (e.g.
<tt>coap://[::1]</tt>);</t>
          </li>
          <li>
            <t><tt>ccm2m:accessProtocol</tt> is the default applicative protocol used on
that platform (e.g. <tt>"coreconf"</tt>);</t>
          </li>
          <li>
            <t><tt>ccm2m:bootstrapSid</tt> is the SID used at bootstrap to discover the YANG
model exposed by the platform (see <xref target="resource-discovery"/>); it is
multi-valued, since several bootstrap SIDs are possible.</t>
          </li>
        </ul>
        <t>It also defines properties attached to a sosa:Sensor, tying it back to
its YANG identity:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ccm2m:type</tt> carries the transducer's identity SID (see
<xref target="fig-transducer-list"/>);</t>
          </li>
          <li>
            <t><tt>ccm2m:id</tt> is the instance identifier of the sensor on its platform,
distinguishing multiple sensors of the same type;</t>
          </li>
          <li>
            <t><tt>ccm2m:precision</tt> and <tt>ccm2m:outputUnit</tt> carry the default-precision
and default-unit declared on that identity, or their overrides (see
<xref target="transducer-sub-tree"/>), and are declared once rather than repeated
on every observation.</t>
          </li>
        </ul>
        <t>Finally, it models the applicative operations that can be performed on a
device or transducer, i.e. its CORECONF capabilities, deliberately kept
outside SOSA/SSN's Sampling/Sensing semantics:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ccm2m:Control</tt> is an applicative operation exposed over CORECONF/CoAP
(a single-value read, a history-buffer notification subscription, or a
threshold-alert notification subscription), linked to a Platform or
Sensor via <tt>ccm2m:hasControl</tt>. Its <tt>ccm2m:controlType</tt> names the
operation (e.g. <tt>"read-single"</tt>, <tt>"subscribe-history"</tt>,
<tt>"reset-all-stat"</tt>), <tt>ccm2m:targetSid</tt> gives the SID of the YANG
leaf/container it targets, and <tt>ccm2m:coapMethod</tt>, <tt>ccm2m:coapPath</tt>,
and <tt>ccm2m:contentFormat</tt> describe how to invoke it over CoAP;</t>
          </li>
          <li>
            <t><tt>ccm2m:SetupNotification</tt> is a Control that configures notification
parameters on a transducer before subscribing (an iPATCH on <tt>/c</tt>); its
<tt>ccm2m:hasParam</tt> links to one or more <tt>ccm2m:NotificationParam</tt>, each
giving, via <tt>ccm2m:paramName</tt> and <tt>ccm2m:paramSid</tt>, the YANG leaf name
and SID of one configurable parameter (e.g. "step", "encoding"; see
<xref target="fig-notification-parameters-tree"/>).</t>
          </li>
        </ul>
        <t>Without these properties, a graph would describe what a platform
observes, but not how to obtain the corresponding coreconf-m2m data, nor
how to act on it. The following subsections use this <tt>ccm2m:</tt> vocabulary
to bridge the elements of coreconf-m2m to specific ontologies.</t>
      </section>
      <section anchor="sosa">
        <name>SOSA</name>
        <t>The Sensor, Observation, Sample, and Actuator (SOSA) ontology is
maintained jointly by the W3C and the Open Geospatial Consortium (OGC),
as part of the broader SSN
(Semantic Sensor Network) ontology <xref target="SOSA"/>. It defines a sosa:Platform
as an entity that hosts other objects,
such as sensors, actuators, or samplers. The device described by the
"characteristics" sub-tree (<xref target="characteristics-sub-tree"/>) maps to a
sosa:Platform, and each of its transducers maps to a sosa:Sensor or a
sosa:Actuator hosted by that platform.</t>
        <t>SOSA also defines a sosa:Sampler type, but it corresponds more to
sample-taking than to measurement, so it may be present in the ontology
without requiring a link with the coreconf-m2m YANG data model.</t>
        <t><xref target="fig-sosa-platform"/> shows a generic, abstract example of such a
platform, expressed in the Turtle RDF syntax, independently of any
particular naming scheme.</t>
        <figure anchor="fig-sosa-platform">
          <name>Generic Turtle example of a sosa:Platform hosting a sosa:Sensor</name>
          <artwork align="left"><![CDATA[
@prefix sosa: <http://www.w3.org/ns/sosa/> .

<platform> a sosa:Platform ;
    sosa:hosts <object> .

<object> a sosa:Sensor ;
    sosa:isHostedBy <platform> ;
    sosa:observes <property> .
]]></artwork>
        </figure>
        <section anchor="instantiating-from-yang">
          <name>Instantiating from YANG</name>
          <t>To turn this generic pattern into a concrete graph, the platform's IRI
can be derived from the device's DNS name, e.g. <tt>station.example.com</tt>,
and the IRI of each hosted object can in turn be derived from that name
and from its entry in "/bootstrap/inventory", e.g.
<tt>station.example.com/sensor/air-temperature</tt>.</t>
          <t><xref target="fig-object-iri-cddl"/> gives the CDDL <xref target="RFC8610"/> for constructing such
an object IRI from the platform's DNS name and an inventory entry, using
the ".cat" control operator <xref target="RFC9165"/> to express the concatenation of
its text fragments.</t>
          <figure anchor="fig-object-iri-cddl">
            <name>CDDL for a sosa object IRI derived from the platform's DNS name</name>
            <artwork align="left"><![CDATA[
category = "sensor" / "actuator"

object-iri = platform-name
             .cat "/"
             .cat category
             .cat "/"
             .cat transducer-name

platform-name = tstr
transducer-name = tstr
]]></artwork>
          </figure>
          <t>For example, with <tt>platform-name = "station.example.com"</tt>, <tt>category =
"sensor"</tt>, and <tt>transducer-name = "air-temperature"</tt>, the resulting
object-iri is <tt>station.example.com/sensor/air-temperature</tt>, matching the
example already given above. <xref target="fig-sosa-instance"/> shows this
instantiation in Turtle.</t>
          <figure anchor="fig-sosa-instance">
            <name>Concrete instantiation of the sosa:Platform/sosa:Sensor pattern for air-temperature, with ccm2m: properties bridging back to the YANG/SID data</name>
            <artwork align="left"><![CDATA[
@prefix sosa:  <http://www.w3.org/ns/sosa/> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ccm2m: <https://ccm2m.example/ns#> .
@prefix unit:  <http://qudt.org/vocab/unit/> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix geo:   <http://www.w3.org/2003/01/geo/wgs84_pos#> .

<https://station.example.com> a sosa:Platform ;
    sosa:hosts <https://station.example.com/sensor/air-temperature> ;
    geo:lat "48.1173"^^xsd:decimal ;
    geo:long "-1.6778"^^xsd:decimal ;
    ccm2m:accessProtocol "coreconf" ;
    ccm2m:coapEndpoint "coap://[2001:db8::1]"^^xsd:anyURI ;
    ccm2m:bootstrapSid "62002"^^ccm2m:SID .

<https://station.example.com/sensor/air-temperature> a sosa:Sensor ;
    sosa:isHostedBy <https://station.example.com> ;
    sosa:observes <https://station.example.com/property/air-temperature> ;
    ccm2m:type "10000001"^^ccm2m:SID ;
    ccm2m:precision 1 ;
    ccm2m:outputUnit unit:DEG_C .

<https://station.example.com/property/air-temperature> a sosa:ObservableProperty ;
    rdfs:label "air-temperature" ;
    sosa:isObservedBy <https://station.example.com/sensor/air-temperature> .
]]></artwork>
          </figure>
          <t>The <tt>ccm2m:</tt> properties used above are not part of SOSA; see
<xref target="extending-ontology-to-coreconf-m2m"/> for their meaning. SOSA has no
native geo-location property either; <tt>geo:lat</tt>/<tt>geo:long</tt>, from the
lightweight W3C Basic Geo (WGS84) vocabulary, are commonly paired with
SOSA for this purpose, and correspond to
"characteristics/geo-location" (<xref target="characteristics-sub-tree"/>) in the
YANG model.</t>
        </section>
        <section anchor="control">
          <name>Control</name>
          <t>A sosa:Sensor or sosa:Actuator is not limited to being observed or
acted upon: the actions actually available on the corresponding
transducer are attached to it as <tt>ccm2m:Control</tt> instances, via
<tt>ccm2m:hasControl</tt>. These cover reading the current value
("read-single"), reading or resetting its statistics ("read-stat",
"reset-stat", "reset-all-stat"), configuring and subscribing to history
or threshold-alert notifications ("subscribe-history", "subscribe-threshold"),
and, for an actuator, writing a new value ("instant-write").</t>
          <t><xref target="fig-ccm2m-instance"/> shows the air-temperature sosa:Sensor with its
<tt>ccm2m:Control</tt> instances attached via <tt>ccm2m:hasControl</tt>, using the
SIDs introduced in <xref target="querying-a-quantity"/> and <xref target="notification"/>.</t>
          <figure anchor="fig-ccm2m-instance">
            <name>ccm2m:Control instances attached to the air-temperature sosa:Sensor</name>
            <artwork align="left"><![CDATA[
@prefix sosa:  <http://www.w3.org/ns/sosa/> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ccm2m: <https://ccm2m.example/ns#> .
@prefix unit:  <http://qudt.org/vocab/unit/> .
@prefix ex:    <https://station.example.com/sensor/air-temperature/> .

ex: a sosa:Sensor ;
    sosa:isHostedBy <https://station.example.com> ;
    sosa:observes <https://station.example.com/property/air-temperature> ;
    ccm2m:type "10000001"^^ccm2m:SID ;
    ccm2m:precision 1 ;
    ccm2m:outputUnit unit:DEG_C ;
    ccm2m:hasControl ex:control/read-single ,
                      ex:control/reset-stat ,
                      ex:control/setup-history ,
                      ex:control/subscribe-history .

ex:control/read-single a ccm2m:Control ;
    ccm2m:controlType "read-single" ;
    ccm2m:coapMethod "FETCH" ;
    ccm2m:coapPath "/c" ;
    ccm2m:targetSid "62077"^^ccm2m:SID .

ex:control/reset-stat a ccm2m:Control ;
    rdfs:label "reset statistics" ;
    ccm2m:controlType "reset-stat" ;
    ccm2m:coapMethod "POST" ;
    ccm2m:coapPath "/c" ;
    ccm2m:targetSid "62078"^^ccm2m:SID .

ex:control/setup-history a ccm2m:SetupNotification ;
    ccm2m:controlType "setup-history" ;
    ccm2m:coapMethod "iPATCH" ;
    ccm2m:coapPath "/c" ;
    ccm2m:targetSid "62060"^^ccm2m:SID ;
    ccm2m:hasParam ex:control/setup-history/step ,
                   ex:control/setup-history/encoding .

ex:control/setup-history/step a ccm2m:NotificationParam ;
    ccm2m:paramName "step" ;
    ccm2m:paramSid "62066"^^ccm2m:SID .

ex:control/setup-history/encoding a ccm2m:NotificationParam ;
    ccm2m:paramName "encoding" ;
    ccm2m:paramSid "62062"^^ccm2m:SID .

ex:control/subscribe-history a ccm2m:Control ;
    rdfs:label "start history notifications" ;
    ccm2m:controlType "subscribe-history" ;
    ccm2m:coapMethod "FETCH+Observe" ;
    ccm2m:coapPath "/s" ;
    ccm2m:targetSid "62048"^^ccm2m:SID .
]]></artwork>
          </figure>
          <t><tt>ex:control/read-single</tt> is the same as described in <xref target="fig-query-value"/>
(SID 62077, "/transducers/transducer/quantity/value"). <tt>ex:control/reset-stat</tt>
is the same as the "reset-stats" action (SID 62078,
"/transducers/transducer/reset-stats"), invoked with a POST to reset the
statistics of this single transducer, as opposed to the "reset-all-stat"
control on the platform which resets every transducer at once via the
top-level "reset-stats" RPC. <tt>ex:control/setup-history</tt> is the same as
the iPATCH described in <xref target="fig-notification-config"/> (SID 62060,
"/transducers/transducer/notification-parameters/history"), with its two
configurable parameters "step" (SID 62066) and "encoding" (SID 62062);
it only configures the notification and does not itself start it.
<tt>ex:control/subscribe-history</tt> is the control that actually starts the
history stream: it is the same as the FETCH+Observe described in
<xref target="fig-notification-observe"/> (SID 62048, "/history/time-series/values").
A client that already knows this graph can therefore issue the
corresponding CoAP requests without a
separate FETCH+parse round trip on the YANG/SID files.</t>
          <t><tt>ccm2m:Control</tt> has no dedicated "stop" instance: as described in
<xref target="notifications"/>, a subscription started by <tt>subscribe-history</tt> ends when
the client explicitly deregisters (a GET/FETCH with the Observe option
set to 1, using the same token as <tt>subscribe-history</tt>), or when the server
stops receiving acknowledgments for its Confirmable notifications. No
separate SID-targeted control is needed for this, since it operates at
the CoAP transport level rather than on a specific YANG resource.</t>
          <t>"category" is one of the two roles a transducer can be given, taken from
its default-category (or category-override, see
<xref target="identities-data-model"/>). A transducer whose category is
"sensor-actuator" yields two object IRIs, one under each role, since it
is instantiated as both a sosa:Sensor and a sosa:Actuator.</t>
        </section>
        <section anchor="storing-transducer-quantities">
          <name>Storing Transducer Quantities</name>
          <t>Each value received from a transducer, whether from a plain FETCH or
decoded from a history notification, is stored as a sosa:Observation.
SOSA distinguishes two timestamps: sosa:phenomenonTime, when the device
actually took the measurement, and sosa:resultTime, when the result was
obtained (here, stored) by the client.</t>
          <t>For a plain FETCH of "quantity",
"timestamp-source" indicates which one to use as phenomenonTime: if it
is "source", the device's own "timestamp" is used; if it is "receiver",
the device did not supply one, and the receiver's own local time at
reception is used instead.  For a single FETCH the two nearly coincide.</t>
          <t>For a history notification, phenomenonTime is reconstructed per sample
from "step" as described in <xref target="notifications"/>, while resultTime is the
single instant at which the whole batch was received. <xref target="fig-sosa-observations"/>
shows three such observations, taken from the air-temperature values
already decoded in <xref target="fig-notification-decoded"/>: all three share the
same resultTime, since they were delivered together in one notification.</t>
          <figure anchor="fig-sosa-observations">
            <name>Three dated sosa:Observation instances, decoded from a history notification</name>
            <artwork align="left"><![CDATA[
@prefix sosa: <http://www.w3.org/ns/sosa/> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
@prefix ex:   <https://station.example.com/sensor/air-temperature/> .

ex:observation/1 a sosa:Observation ;
    sosa:madeBySensor ex: ;
    sosa:observedProperty <https://station.example.com/property/air-temperature> ;
    sosa:hasSimpleResult "18.9"^^xsd:decimal ;
    sosa:phenomenonTime "2026-09-02T09:57:42Z"^^xsd:dateTime ;
    sosa:resultTime "2026-09-02T10:15:45Z"^^xsd:dateTime .

ex:observation/2 a sosa:Observation ;
    sosa:madeBySensor ex: ;
    sosa:observedProperty <https://station.example.com/property/air-temperature> ;
    sosa:hasSimpleResult "20.3"^^xsd:decimal ;
    sosa:phenomenonTime "2026-09-02T09:59:42Z"^^xsd:dateTime ;
    sosa:resultTime "2026-09-02T10:15:45Z"^^xsd:dateTime .

ex:observation/3 a sosa:Observation ;
    sosa:madeBySensor ex: ;
    sosa:observedProperty <https://station.example.com/property/air-temperature> ;
    sosa:hasSimpleResult "20.0"^^xsd:decimal ;
    sosa:phenomenonTime "2026-09-02T10:01:42Z"^^xsd:dateTime ;
    sosa:resultTime "2026-09-02T10:15:45Z"^^xsd:dateTime .
]]></artwork>
          </figure>
        </section>
        <section anchor="storing-actuator-commands">
          <name>Storing Actuator Commands</name>
          <t>A value written to a transducer via the "instant-write" control (see
<xref target="control"/>) is not an observation: it is a command sent to the device,
not a measurement received from it. SOSA models this with sosa:Actuation
rather than sosa:Observation: sosa:hasResult carries the value that was
written, sosa:actsOnProperty identifies the actuatable property that was
acted upon, and sosa:resultTime is when the command was issued by the
client — there is no phenomenonTime, since nothing was measured.</t>
          <t>None of the ATMOS41 transducers used throughout this document is an
actuator (all declare <tt>default-category: "sensor"</tt>), so
<xref target="fig-sosa-actuation"/> illustrates the pattern with a fictitious
device instead: a pump whose rotation speed is set through an
"instant-write" command.</t>
          <figure anchor="fig-sosa-actuation">
            <name>Fictitious sosa:Actuation setting a pump's rotation speed to 1500 rpm, with its ccm2m: data</name>
            <artwork align="left"><![CDATA[
@prefix sosa:  <http://www.w3.org/ns/sosa/> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix ccm2m: <https://ccm2m.example/ns#> .
@prefix unit:  <http://qudt.org/vocab/unit/> .
@prefix ex:    <https://pump.example.com/actuator/rotation-speed/> .

ex: a sosa:Actuator ;
    sosa:isHostedBy <https://pump.example.com> ;
    sosa:actsOnProperty <https://pump.example.com/property/rotation-speed> ;
    ccm2m:type "PPPPPP"^^ccm2m:SID ;
    ccm2m:precision 0 ;
    ccm2m:outputUnit unit:REV-PER-MIN ;
    ccm2m:hasControl ex:control/instant-write .

ex:control/instant-write a ccm2m:Control ;
    ccm2m:controlType "instant-write" ;
    ccm2m:coapMethod "iPATCH" ;
    ccm2m:coapPath "/c" ;
    ccm2m:targetSid "62077"^^ccm2m:SID .

ex:actuation/1 a sosa:Actuation ;
    sosa:madeByActuator ex: ;
    sosa:actsOnProperty <https://pump.example.com/property/rotation-speed> ;
    sosa:hasResult "1500"^^xsd:integer ;
    sosa:resultTime "2026-09-07T14:22:10Z"^^xsd:dateTime .
]]></artwork>
          </figure>
          <t>"PPPPPP" is a placeholder: this pump does not exist in the atmos module
used throughout this document, so its identity has no real SID (unlike
10000001 for air-temperature, defined in atmos). <tt>ccm2m:targetSid</tt>,
however, is the real SID 62077 for "/transducers/transducer/quantity/value":
this leaf is defined in coreconf-m2m itself, not in a device-specific
module, so it is the same structural node used to read air-temperature's
current value in <xref target="control"/> — writing to it with an iPATCH, targeting
this pump's own instance via its (fictitious) type, is the write
counterpart of that same "read-single" FETCH.</t>
          <t>The pattern is otherwise symmetrical to <xref target="fig-sosa-observations"/>:
sosa:Observation, sosa:observedProperty and sosa:hasSimpleResult become
sosa:Actuation, sosa:actsOnProperty and sosa:hasResult, and
sosa:madeBySensor becomes sosa:madeByActuator.</t>
        </section>
      </section>
      <section anchor="sensorthings">
        <name>SensorThings</name>
        <t>Unlike SOSA/SSN, the OGC SensorThings API <xref target="SensorThings"/> is not a
Semantic Web ontology: it is a structured, relational-like data model,
exposed through a REST API inspired by OData, using plain JSON rather
than RDF or JSON-LD. It defines a fixed set of entity types (Thing,
Location, HistoricalLocation, Datastream, Sensor, ObservedProperty,
Observation, FeatureOfInterest, and, for actuation, Actuator, Task, and
TaskingCapability) linked by navigation properties, much like foreign
keys between tables; most implementations are in fact backed by a
relational database. Queries use OData-style <tt>$filter</tt>, <tt>$expand</tt>, and
<tt>$select</tt>, rather than SPARQL. Its data model is nonetheless closely
related to SOSA/SSN's concepts (Datastream/Sensor/Observation mirror
sosa:Sensor/sosa:Observation), so the mapping from coreconf-m2m largely
follows the same pattern as <xref target="SOSA"/>, but produces structured, tabular
entities rather than RDF triples.</t>
        <section anchor="example">
          <name>Example</name>
          <t><xref target="fig-st-thing"/>, <xref target="fig-st-sensor"/>, and <xref target="fig-st-observations"/>
transpose the SOSA example of <xref target="control"/> and <xref target="fig-sosa-observations"/>
into SensorThings JSON entities, using the same station.example.com
platform and air-temperature transducer. SensorThings has no equivalent
of RDF's open, arbitrary predicates, so the <tt>ccm2m:</tt> extension is added
as ancillary data instead: each entity's <tt>properties</tt> field is a
free-form JSON object, into which the same <tt>ccm2m:</tt> keys used in the
SOSA examples are placed as ordinary object members.</t>
          <figure anchor="fig-st-thing">
            <name>A coreconf-m2m platform as a SensorThings Thing</name>
            <artwork align="left"><![CDATA[
GET /Things(1)

{
  "@iot.id": 1,
  "name": "station.example.com",
  "description": "CORECONF-M2M platform station.example.com",
  "properties": {
    "ccm2m:accessProtocol": "coreconf",
    "ccm2m:bootstrapSid": 62002,
    "ccm2m:coapEndpoint": "coap://[2001:db8::1]"
  }
}
]]></artwork>
          </figure>
          <t>A Thing's <tt>properties</tt> bag is where the <tt>ccm2m:</tt> extension lives: there
is no dedicated Thing property for a CoAP endpoint or a bootstrap SID, so
they are carried as ancillary data instead, the same role played by
ccm2m:coapEndpoint and ccm2m:bootstrapSid on a sosa:Platform.</t>
          <t>Unlike sosa:hosts, which links a sosa:Platform directly to the
sosa:Sensor instances it hosts, SensorThings has no direct
Thing-to-Sensor navigation link: a Sensor is only reachable through the
Datastream that uses it. Finding the sensors (and, symmetrically, the
actuators) associated with a Thing therefore takes an extra hop:</t>
          <figure anchor="fig-st-navigation">
            <name>Reaching a Thing's Sensor via its Datastream</name>
            <artwork align="left"><![CDATA[
GET /Things(1)/Datastreams

{
  "value": [
    { "@iot.id": 1, "name": "station.example.com/air-temperature",
      "Sensor@iot.navigationLink":
        "http://.../Datastreams(1)/Sensor" }
  ]
}
]]></artwork>
          </figure>
          <t>i.e. Thing → Datastream → Sensor, rather than Thing → Sensor directly.
The symmetric path for actuation is Thing → TaskingCapability →
Actuator, via <tt>/Things(1)/TaskingCapabilities</tt> and
<tt>/TaskingCapabilities(x)/Actuator</tt>.</t>
          <t>Unlike SOSA, SensorThings has a dedicated entity for geo-location:
Location, reached via <tt>Thing/Locations</tt> (a Thing can have more than
one, and a Location can be shared by several Things).</t>
          <figure anchor="fig-st-location">
            <name>A Thing's Location, the SensorThings equivalent of the geo:lat/geo:long pair used with SOSA</name>
            <artwork align="left"><![CDATA[
GET /Things(1)/Locations

{
  "value": [{
    "@iot.id": 1,
    "name": "station.example.com location",
    "encodingType": "application/vnd.geo+json",
    "location": {
      "type": "Point",
      "coordinates": [-1.6778, 48.1173]
    }
  }]
}
]]></artwork>
          </figure>
          <t>This corresponds to the same "characteristics/geo-location"
(<xref target="characteristics-sub-tree"/>) as the geo:lat/geo:long pair used in
<xref target="fig-sosa-instance"/>. HistoricalLocations additionally tracks changes
of Location over time, for a mobile device.</t>
          <figure anchor="fig-st-sensor">
            <name>The air-temperature Sensor and its Datastream</name>
            <artwork align="left"><![CDATA[
GET /Sensors(1)

{
  "@iot.id": 1,
  "name": "air-temperature",
  "description": "air-temperature on station.example.com",
  "encodingType": "application/pdf",
  "metadata": "https://metergroup.com/documents/ATMOS41-Manual.pdf",
  "properties": {
    "ccm2m:type": 10000001,
    "ccm2m:precision": 1
  }
}

GET /Datastreams(1)

{
  "@iot.id": 1,
  "name": "station.example.com/air-temperature",
  "description": "air-temperature measured by station.example.com",
  "observationType":
    "http://www.opengis.net/def/observationType/OGC-OM/2.0/OM_Measurement",
  "unitOfMeasurement": {
    "definition": "http://qudt.org/vocab/unit/DEG_C",
    "name": "http://qudt.org/vocab/unit/DEG_C",
    "symbol": "Cel"
  }
}
]]></artwork>
          </figure>
          <t>A Sensor's <tt>encodingType</tt>/<tt>metadata</tt> pair describes its datasheet, not
its identity: <tt>metadata</tt> is a URL to that document (or the document
itself, for a text-based encodingType), and <tt>encodingType</tt> says what
format it is in — <tt>application/pdf</tt> and SensorML are the two most common
in practice. The Sensor's <tt>ccm2m:type</tt> plays the same role as on a sosa:Sensor.
Unlike SOSA, where <tt>ccm2m:outputUnit</tt> had to be added because SOSA has no
native concept of unit, a Datastream already carries <tt>unitOfMeasurement</tt>
natively (a QUDT IRI, symbol, and name), so no <tt>ccm2m:</tt> property is
needed for it here. An ObservedProperty entity (not shown), linked from
the Datastream, plays the role of sosa:ObservableProperty.</t>
          <figure anchor="fig-st-observations">
            <name>Three dated Observations, the SensorThings equivalent of fig-sosa-observations</name>
            <artwork align="left"><![CDATA[
GET /Datastreams(1)/Observations?$top=3&$orderby=phenomenonTime desc

{
  "value": [
    {
      "@iot.id": 1,
      "phenomenonTime": "2026-09-02T09:57:42Z",
      "resultTime": "2026-09-02T10:15:45Z",
      "result": 18.9
    },
    {
      "@iot.id": 2,
      "phenomenonTime": "2026-09-02T09:59:42Z",
      "resultTime": "2026-09-02T10:15:45Z",
      "result": 20.3
    },
    {
      "@iot.id": 3,
      "phenomenonTime": "2026-09-02T10:01:42Z",
      "resultTime": "2026-09-02T10:15:45Z",
      "result": 20.0
    }
  ]
}
]]></artwork>
          </figure>
          <t>These are the same three samples as <xref target="fig-sosa-observations"/>: <tt>result</tt>
plays the role of sosa:hasSimpleResult, already a plain JSON number
rather than a typed literal, and phenomenonTime/resultTime carry the
same distinction as sosa:phenomenonTime/sosa:resultTime — all three
share one resultTime, since they were delivered together in one history
notification, while phenomenonTime is reconstructed per sample from
"step".</t>
          <t>For actuation, SensorThings has a separate set of entities (the
"Tasking Core" profile): Actuator, TaskingCapability, and Task, mirroring
Sensor, Datastream, and Observation respectively. <xref target="fig-st-actuation"/>
transposes the fictitious pump of <xref target="fig-sosa-actuation"/> into these
entities.</t>
          <figure anchor="fig-st-actuation">
            <name>Actuator, TaskingCapability, and Task, the SensorThings equivalent of fig-sosa-actuation</name>
            <artwork align="left"><![CDATA[
GET /Actuators(1)

{
  "@iot.id": 1,
  "name": "rotation-speed",
  "description": "rotation-speed actuator on pump.example.com",
  "encodingType": "application/pdf",
  "metadata": "https://pump.example.com/docs/pump-datasheet.pdf",
  "properties": {
    "ccm2m:type": "PPPPPP"
  }
}

GET /TaskingCapabilities(1)

{
  "@iot.id": 1,
  "name": "pump.example.com/rotation-speed",
  "description": "Set the pump's rotation speed",
  "taskingParameters": {
    "type": "object",
    "properties": {
      "rotation-speed": { "type": "integer" }
    }
  },
  "properties": {
    "ccm2m:targetSid": 62077
  }
}

GET /TaskingCapabilities(1)/Tasks

{
  "value": [{
    "@iot.id": 1,
    "creationTime": "2026-09-07T14:22:10Z",
    "taskingParameters": { "rotation-speed": 1500 }
  }]
}
]]></artwork>
          </figure>
          <t>The Actuator plays the same role as the Sensor of <xref target="fig-st-sensor"/>,
including the same <tt>application/pdf</tt>/<tt>metadata</tt> pattern for its
datasheet. <tt>ccm2m:targetSid</tt> on the TaskingCapability plays the role of
<tt>ccm2m:targetSid</tt> on the SOSA <tt>ccm2m:Control</tt> for "instant-write": both
name the SID to iPATCH to actually issue the command. A Task's
<tt>taskingParameters</tt> plays the role of sosa:hasResult, and <tt>creationTime</tt>
of sosa:resultTime; as with the Sensor's <tt>ccm2m:type</tt>, "PPPPPP" is a
placeholder, since this pump has no real identity SID.</t>
        </section>
      </section>
      <section anchor="saref">
        <name>SAREF</name>
        <t>To be defined.</t>
      </section>
    </section>
    <section anchor="mcp">
      <name>MCP</name>
      <t>CORECONF/CoAP and the SensorThings/FROST database are both, in essence,
REST-style interfaces: a small set of operations (read, write, query,
subscribe) applied to addressable resources. Each can therefore be
documented as a set of typed, named operations and exposed to an AI
agent as an MCP (Model Context Protocol) server, rather than requiring
the agent to construct raw CoAP/CBOR or FROST query requests itself.</t>
      <t>This document's companion implementation uses two such servers, kept
separate because they act on two different things: one performs live
CoAP actions against the physical device, the other queries and edits
the structured historical data already stored in FROST.</t>
      <t>The "coreconf-m2m" MCP server wraps live device actions, each tool
resolving what it needs (the platform's CoAP endpoint, the sensor's
identity/instance SIDs, the target field SID) from the FROST database
before issuing the corresponding CoAP request:</t>
      <ul spacing="normal">
        <li>
          <t><tt>read_instant(hostname, sensor)</tt> — FETCH the current value, already
scaled by the sensor's ccm2m:precision;</t>
        </li>
        <li>
          <t><tt>read_stat(hostname, sensor)</tt> — FETCH accumulated statistics
(min/max/mean/median/stdev/sample-count), scaled;</t>
        </li>
        <li>
          <t><tt>start_history_notify(hostname, sensor, step_ms, max_samples,
check_interval)</tt> — iPATCH to configure, then FETCH+Observe to start, a
history-notification subscription; incoming samples are written to
FROST as Observations as they arrive;</t>
        </li>
        <li>
          <t><tt>stop_history_notify(hostname, sensor)</tt> — cancel a running
subscription;</t>
        </li>
        <li>
          <t><tt>list_active_history_subscriptions()</tt> — list every subscription
currently running, across clients.</t>
        </li>
      </ul>
      <t>The "frost-sensorthings" MCP server wraps the SensorThings REST API
itself, generically (not tied to the ccm2m ontology), respecting FROST's
own query syntax, on any of the entity sets of <xref target="sensorthings"/>:</t>
      <ul spacing="normal">
        <li>
          <t><tt>list_service_capabilities()</tt> — the entity sets this FROST-Server
instance exposes;</t>
        </li>
        <li>
          <t><tt>query_entities(entity_set, filter, expand, select, orderby, top,
skip, count)</tt> — list/filter an entity set, e.g. <tt>query_entities(
"Observations", filter="phenomenonTime gt 2026-07-01T00:00:00Z",
orderby="phenomenonTime desc", top=20)</tt>;</t>
        </li>
        <li>
          <t><tt>get_entity(entity_set, entity_id, expand, select)</tt> — get one entity
by its @iot.id;</t>
        </li>
        <li>
          <t><tt>get_related(entity_set, entity_id, relation, ...)</tt> — navigate a
relationship, e.g. <tt>get_related("Things", 1, "Datastreams")</tt> (see
<xref target="fig-st-navigation"/>);</t>
        </li>
        <li>
          <t><tt>create_entity</tt>, <tt>update_entity</tt>, <tt>delete_entity</tt> — write access.</t>
        </li>
      </ul>
      <t>Because both servers resolve identities (SIDs, hostnames, sensor names)
against the same FROST database, an agent can freely mix tools from
both — e.g. list a Thing's Datastreams via <tt>get_related</tt>, then call
<tt>read_instant</tt> for one of them — without separately tracking SID files
or CoAP endpoints itself.</t>
      <t><xref target="fig-mcp-flow"/> illustrates this with a concrete question: "what is the
temperature right now in Rennes?" The agent first uses FROST to turn
"Rennes" into a device and a sensor, then uses coreconf-m2m to read that
sensor live; the result is written back to FROST as it comes in, so a
later question about the same value would find it already there instead
of triggering a new CoAP exchange.</t>
      <figure anchor="fig-mcp-flow">
        <name>Answering "what is the temperature right now in Rennes?" by combining the frost-sensorthings and coreconf-m2m MCP servers</name>
        <artwork align="left"><![CDATA[
Device            MCP CoreCONF        MCP Frost           LLM
|                 |                   |                   |
                                        query_entities("Things",
                                         filter: near Rennes)
|                 |                   <-------------------|
|                 |                   |                   |
                                        Thing, ccm2m:coapEndpoint
|                 |                   |------------------->
|                 |                   |                   |
                                        get_related(Thing,
                                         "Datastreams")
|                 |                   <-------------------|
|                 |                   |                   |
                                        Sensor SID, precision
|                 |                   |------------------->
|                 |                   |                   |
                    read_instant(hostname, sensor)
|                 <---------------------------------------|
|                 |                   |                   |
                    resolve endpoint/SIDs
|                 |------------------->                   |
|                 |                   |                   |
                    endpoint, type SID
|                 <-------------------|                   |
|                 |                   |                   |
  FETCH quantity/value
<-----------------|                   |                   |
|                 |                   |                   |
  2.05 Content (raw value)
|----------------->                   |                   |
|                 |                   |                   |
                    create Observation
                     (store result)
|                 |------------------->                   |
|                 |                   |                   |
                    scaled value + unit
|                 |--------------------------------------->
|                 |                   |                   |
]]></artwork>
      </figure>
      <t>The LLM then answers the user directly from the value returned in the
last step, e.g. "It's 19.6 C in Rennes".</t>
      <t>It should be noted that the LLM selects the appropriate sensor from its
name, "air-temperature": without the mapping between the identityref
SID and the associated name, the LLM would not have been able to
retrieve the information. More exhaustively, the LLM may also have
access to the YANG data model describing the device, and use its
descriptions to gain a better understanding of the device.</t>
    </section>
    <section anchor="compression">
      <name>Compression</name>
      <section anchor="sid-translation">
        <name>SID translation</name>
        <t>Official YANG SIDs <xref target="I-D.ietf-core-sid"/> are globally unique integers,
but that global scope makes them larger than strictly necessary on a
link where only two endpoints ever talk to each other and no
third-party CORECONF implementation needs to be interoperable with.
<xref target="I-D.toutain-core-private-sid-translation"/> defines a mechanism for
such closed deployments: each official SID is transformed, purely
arithmetically, into a small negative integer, as a "private SID",
which encodes in a smaller CBOR sequence.</t>
        <t>The transformation is:</t>
        <artwork><![CDATA[
privateSID = (offset - 1) - (current_sid - entry_point)
]]></artwork>
        <t>where <tt>entry_point</tt> is the lowest SID officially allocated to the
YANG Data Model the SID belongs to, and <tt>offset</tt> is a non-positive
integer that shifts the model's private range so that it does not
overlap with another translated model's range. With <tt>offset</tt> = 0, the
node at <tt>entry_point</tt> maps to -1, the next one to -2, and so on:
<tt>offset</tt> lets a second, third, etc. model be translated in the same
session by shifting each one's private range further into negative
territory, without changing the formula itself or which module a
given negative SID belongs to. Both endpoints MUST share the same
<tt>entry_point</tt> and <tt>offset</tt> per model for the translation to be
consistent.</t>
        <t>More generally, a coreconf-m2m deployment involves at least two kinds
of YANG Data Models translated together: the coreconf-m2m model
itself, together with augmentations it may receive, and one
or more device-description models, such as atmos in this document's
examples. If coreconf-m2m is eventually standardized as an IETF model,
its SIDs will sit in the low thousands, while device-description
models, being commercial and vendor-specific, are expected to be
assigned SIDs in a Registrar's block or a Private Enterprise Number
range <xref target="RFC9371"/> both starting much higher. The device-description
model SHOULD therefore be given the smaller offset (typically 0, the
deepest range), and the coreconf-m2m model the larger one (or not translated). <xref target="annex-private-sid"/>
works out this recommendation on two concrete examples.</t>
        <t>A SID that falls outside every configured (<tt>entry_point</tt>, <tt>offset</tt>)
pair is simply sent as its official value, without breaking any SID that is left out.</t>
      </section>
      <section anchor="schc">
        <name>SCHC</name>
        <t>The traffic profile given in <xref target="coap-methods-mapping"/> recommends
limiting exchanges to FETCH and iPATCH. This limits the number of
rules needed to compress coreconf-m2m traffic with SCHC <xref target="RFC8724"/>.
<xref target="annex-schc-rules"/> gives an example where two rules are used to
cover the bidirectional traffic for FETCH and iPATCH (Rules 0 and 1).
Another rule is related to notifications, carrying an Observe option
(Rule 2).</t>
        <t>It is important to also cover error messages. The example defines one
generic CoAP rule to cover any TYPE and CODE, without options,
corresponding to error notifications (Rule 3), and one rule for ICMP
traffic, to inform the server that the client is no longer active
(Rule 4).</t>
      </section>
    </section>
    <section anchor="conclusion">
      <name>Conclusion</name>
      <t>This document has shown that it is possible to seamlessly interconnect
a YANG data model to the ontologies used by domain professionals.</t>
      <ol spacing="normal" type="1"><li>
          <t>Devices cannot directly use such an ontology representation
themselves, since it is too verbose for a constrained device.</t>
        </li>
        <li>
          <t>RESTCONF and NETCONF, using JSON or XML, are also too verbose, so
the benefit of mapping directly from them to an ontology is limited.</t>
        </li>
        <li>
          <t>CORECONF is constrained, and this constrained representation is what
lets a device benefit from the ontology mapping without paying its
verbosity cost.</t>
        </li>
        <li>
          <t>The ontology is used to store all the information concerning the
systems.</t>
        </li>
        <li>
          <t>CORECONF uses the ontology information to form its requests.</t>
        </li>
        <li>
          <t>Naming is very important, and DNS will play an important role in
automatically mapping a SID into a name.</t>
        </li>
        <li>
          <t>Names are used both to form names in the ontology and to allow an
LLM to identify resources.</t>
        </li>
        <li>
          <t>Interoperability is possible since coreconf-m2m offers a strict data
representation of the information, and allows a systematic
conversion into the ontology.</t>
        </li>
      </ol>
      <t>Based on the coreconf-m2m model, a device manufacturer only has to
publish its data model, with its identityref identities, for that
device to be included into the ontology and be understood by humans or
by an LLM.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>CORECONF operations over CoAP MUST be secured using either DTLS <xref target="RFC6347"/> or
OSCORE <xref target="RFC8613"/>. In M2M scenarios where a central manager is absent, the
trust model requires particular attention.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="yang-module-registration">
        <name>YANG Module Registration</name>
        <t>This document registers the following YANG module in the "YANG Module Names"
registry <xref target="RFC7950"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="center">Name</th>
              <th align="center">Namespace</th>
              <th align="center">Prefix</th>
              <th align="center">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">coreconf-m2m</td>
              <td align="center">urn:ietf:params:xml:ns:yang:coreconf-m2m</td>
              <td align="center">cm2m</td>
              <td align="center">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sid-range-allocation">
        <name>SID Range Allocation</name>
        <t>This document requests the SID range starting at entry-point TBD with a size of
100, as defined in <xref target="I-D.ietf-core-sid"/>.</t>
        <t>Transducer identites  MUST be sperated from this document and defined in
anjother YANG module.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC7252">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
              <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7252"/>
          <seriesInfo name="DOI" value="10.17487/RFC7252"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed:.plus,.cat, and.det for the construction of constants;.abnf/.abnfb for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and.feature for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <reference anchor="RFC8724">
          <front>
            <title>SCHC: Generic Framework for Static Context Header Compression and Fragmentation</title>
            <author fullname="A. Minaburo" initials="A." surname="Minaburo"/>
            <author fullname="L. Toutain" initials="L." surname="Toutain"/>
            <author fullname="C. Gomez" initials="C." surname="Gomez"/>
            <author fullname="D. Barthel" initials="D." surname="Barthel"/>
            <author fullname="JC. Zuniga" initials="JC." surname="Zuniga"/>
            <date month="April" year="2020"/>
            <abstract>
              <t>This document defines the Static Context Header Compression and fragmentation (SCHC) framework, which provides both a header compression mechanism and an optional fragmentation mechanism. SCHC has been designed with Low-Power Wide Area Networks (LPWANs) in mind.</t>
              <t>SCHC compression is based on a common static context stored both in the LPWAN device and in the network infrastructure side. This document defines a generic header compression mechanism and its application to compress IPv6/UDP headers.</t>
              <t>This document also specifies an optional fragmentation and reassembly mechanism. It can be used to support the IPv6 MTU requirement over the LPWAN technologies. Fragmentation is needed for IPv6 datagrams that, after SCHC compression or when such compression was not possible, still exceed the Layer 2 maximum payload size.</t>
              <t>The SCHC header compression and fragmentation mechanisms are independent of the specific LPWAN technology over which they are used. This document defines generic functionalities and offers flexibility with regard to parameter settings and mechanism choices. This document standardizes the exchange over the LPWAN between two SCHC entities. Settings and choices specific to a technology or a product are expected to be grouped into profiles, which are specified in other documents. Data models for the context and profiles are out of scope.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8724"/>
          <seriesInfo name="DOI" value="10.17487/RFC8724"/>
        </reference>
        <reference anchor="RFC8824">
          <front>
            <title>Static Context Header Compression (SCHC) for the Constrained Application Protocol (CoAP)</title>
            <author fullname="A. Minaburo" initials="A." surname="Minaburo"/>
            <author fullname="L. Toutain" initials="L." surname="Toutain"/>
            <author fullname="R. Andreasen" initials="R." surname="Andreasen"/>
            <date month="June" year="2021"/>
            <abstract>
              <t>This document defines how to compress Constrained Application Protocol (CoAP) headers using the Static Context Header Compression and fragmentation (SCHC) framework. SCHC defines a header compression mechanism adapted for Constrained Devices. SCHC uses a static description of the header to reduce the header's redundancy and size. While RFC 8724 describes the SCHC compression and fragmentation framework, and its application for IPv6/UDP headers, this document applies SCHC to CoAP headers. The CoAP header structure differs from IPv6 and UDP, since CoAP uses a flexible header with a variable number of options, themselves of variable length. The CoAP message format is asymmetric: the request messages have a header format different from the format in the response messages. This specification gives guidance on applying SCHC to flexible headers and how to leverage the asymmetry for more efficient compression Rules.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8824"/>
          <seriesInfo name="DOI" value="10.17487/RFC8824"/>
        </reference>
        <reference anchor="RFC9254">
          <front>
            <title>Encoding of Data Modeled with YANG in the Concise Binary Object Representation (CBOR)</title>
            <author fullname="M. Veillette" initials="M." role="editor" surname="Veillette"/>
            <author fullname="I. Petrov" initials="I." role="editor" surname="Petrov"/>
            <author fullname="A. Pelov" initials="A." surname="Pelov"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>YANG (RFC 7950) is a data modeling language used to model configuration data, state data, parameters and results of Remote Procedure Call (RPC) operations or actions, and notifications.</t>
              <t>This document defines encoding rules for YANG in the Concise Binary Object Representation (CBOR) (RFC 8949).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9254"/>
          <seriesInfo name="DOI" value="10.17487/RFC9254"/>
        </reference>
        <reference anchor="RFC9363">
          <front>
            <title>A YANG Data Model for Static Context Header Compression (SCHC)</title>
            <author fullname="A. Minaburo" initials="A." surname="Minaburo"/>
            <author fullname="L. Toutain" initials="L." surname="Toutain"/>
            <date month="March" year="2023"/>
            <abstract>
              <t>This document describes a YANG data model for the Static Context Header Compression (SCHC) compression and fragmentation Rules.</t>
              <t>This document formalizes the description of the Rules for better interoperability between SCHC instances either to exchange a set of Rules or to modify the parameters of some Rules.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9363"/>
          <seriesInfo name="DOI" value="10.17487/RFC9363"/>
        </reference>
        <reference anchor="I-D.ietf-core-comi">
          <front>
            <title>CoAP Management Interface (CORECONF)</title>
            <author fullname="Michel Veillette" initials="M." surname="Veillette">
              <organization>Trilliant Networks Inc.</organization>
            </author>
            <author fullname="Peter Van der Stok" initials="P." surname="Van der Stok">
              <organization>consultant</organization>
            </author>
            <author fullname="Alexander Pelov" initials="A." surname="Pelov">
              <organization>IMT Atlantique</organization>
            </author>
            <author fullname="Andy Bierman" initials="A." surname="Bierman">
              <organization>YumaWorks</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   This document describes a network management interface for
   constrained devices and networks, called CoAP Management Interface
   (CORECONF).  The Constrained Application Protocol (CoAP) is used to
   access datastore and data node resources specified in YANG, or SMIv2
   converted to YANG.  CORECONF uses the YANG to CBOR mapping and
   converts YANG identifier strings to numeric identifiers for payload
   size reduction.  CORECONF extends the set of YANG based protocols,
   NETCONF and RESTCONF, with the capability to manage constrained
   devices and networks.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-comi-21"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8376">
          <front>
            <title>Low-Power Wide Area Network (LPWAN) Overview</title>
            <author fullname="S. Farrell" initials="S." role="editor" surname="Farrell"/>
            <date month="May" year="2018"/>
            <abstract>
              <t>Low-Power Wide Area Networks (LPWANs) are wireless technologies with characteristics such as large coverage areas, low bandwidth, possibly very small packet and application-layer data sizes, and long battery life operation. This memo is an informational overview of the set of LPWAN technologies being considered in the IETF and of the gaps that exist between the needs of those technologies and the goal of running IP in LPWANs.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8376"/>
          <seriesInfo name="DOI" value="10.17487/RFC8376"/>
        </reference>
        <reference anchor="RFC9179">
          <front>
            <title>A YANG Grouping for Geographic Locations</title>
            <author fullname="C. Hopps" initials="C." surname="Hopps"/>
            <date month="February" year="2022"/>
            <abstract>
              <t>This document defines a generic geographical location YANG grouping. The geographical location grouping is intended to be used in YANG data models for specifying a location on or in reference to Earth or any other astronomical object.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9179"/>
          <seriesInfo name="DOI" value="10.17487/RFC9179"/>
        </reference>
        <reference anchor="RFC9371">
          <front>
            <title>Registration Procedures for Private Enterprise Numbers (PENs)</title>
            <author fullname="A. Baber" initials="A." surname="Baber"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="March" year="2023"/>
            <abstract>
              <t>This document describes how Private Enterprise Numbers (PENs) are registered by IANA. It shows how to request a new PEN and how to modify a current PEN. It also gives a brief overview of PEN uses.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9371"/>
          <seriesInfo name="DOI" value="10.17487/RFC9371"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="October" year="2014"/>
            <abstract>
              <t>This specification defines the JSON merge patch format and processing rules. The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7396"/>
          <seriesInfo name="DOI" value="10.17487/RFC7396"/>
        </reference>
        <reference anchor="RFC8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="J. Arkko" initials="J." surname="Arkko"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML). Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model. A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8428"/>
          <seriesInfo name="DOI" value="10.17487/RFC8428"/>
        </reference>
        <reference anchor="RFC9232">
          <front>
            <title>Network Telemetry Framework</title>
            <author fullname="H. Song" initials="H." surname="Song"/>
            <author fullname="F. Qin" initials="F." surname="Qin"/>
            <author fullname="P. Martinez-Julia" initials="P." surname="Martinez-Julia"/>
            <author fullname="L. Ciavaglia" initials="L." surname="Ciavaglia"/>
            <author fullname="A. Wang" initials="A." surname="Wang"/>
            <date month="May" year="2022"/>
            <abstract>
              <t>Network telemetry is a technology for gaining network insight and facilitating efficient and automated network management. It encompasses various techniques for remote data generation, collection, correlation, and consumption. This document describes an architectural framework for network telemetry, motivated by challenges that are encountered as part of the operation of networks and by the requirements that ensue. This document clarifies the terminology and classifies the modules and components of a network telemetry system from different perspectives. The framework and taxonomy help to set a common ground for the collection of related work and provide guidance for related technique and standard developments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9232"/>
          <seriesInfo name="DOI" value="10.17487/RFC9232"/>
        </reference>
        <reference anchor="RFC8639">
          <front>
            <title>Subscription to YANG Notifications</title>
            <author fullname="E. Voit" initials="E." surname="Voit"/>
            <author fullname="A. Clemm" initials="A." surname="Clemm"/>
            <author fullname="A. Gonzalez Prieto" initials="A." surname="Gonzalez Prieto"/>
            <author fullname="E. Nilsen-Nygaard" initials="E." surname="Nilsen-Nygaard"/>
            <author fullname="A. Tripathy" initials="A." surname="Tripathy"/>
            <date month="September" year="2019"/>
            <abstract>
              <t>This document defines a YANG data model and associated mechanisms enabling subscriber-specific subscriptions to a publisher's event streams. Applying these elements allows a subscriber to request and receive a continuous, customized feed of publisher-generated information.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8639"/>
          <seriesInfo name="DOI" value="10.17487/RFC8639"/>
        </reference>
        <reference anchor="I-D.ietf-core-sid">
          <front>
            <title>YANG Schema Item iDentifier (YANG SID)</title>
            <author fullname="Michel Veillette" initials="M." surname="Veillette">
              <organization>Trilliant Networks Inc.</organization>
            </author>
            <author fullname="Alexander Pelov" initials="A." surname="Pelov">
              <organization>IMT Atlantique</organization>
            </author>
            <author fullname="Ivaylo Petrov" initials="I." surname="Petrov">
              <organization>Google Switzerland GmbH</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Michael Richardson" initials="M." surname="Richardson">
              <organization>Sandelman Software Works</organization>
            </author>
            <date day="22" month="December" year="2023"/>
            <abstract>
              <t>   YANG Schema Item iDentifiers (YANG SID) are globally unique 63-bit
   unsigned integers used to identify YANG items, as a more compact
   method to identify YANG items that can be used for efficiency and in
   constrained environments (RFC 7228).  This document defines the
   semantics, the registration, and assignment processes of YANG SIDs
   for IETF managed YANG modules.  To enable the implementation of these
   processes, this document also defines a file format used to persist
   and publish assigned YANG SIDs.


   // The present version (–24) is intended to address the remaining
   // IESG comments.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-sid-24"/>
        </reference>
        <reference anchor="I-D.gudi-t2trg-senml-as-coreconf">
          <front>
            <title>SenML is CORECONF (almost)</title>
            <author fullname="Manoj G" initials="M." surname="G">
              <organization>Institut MINES TELECOM; IMT Atlantique</organization>
            </author>
            <author fullname="Laurent Toutain" initials="L." surname="Toutain">
              <organization>Institut MINES TELECOM; IMT Atlantique</organization>
            </author>
            <author fullname="Alex Fernandez" initials="A." surname="Fernandez">
              <organization>Institut MINES TELECOM; IMT Atlantique</organization>
            </author>
            <author fullname="Jean-Marie BONNIN" initials="J." surname="BONNIN">
              <organization>Institut MINES TELECOM; IMT Atlantique</organization>
            </author>
            <date day="7" month="October" year="2024"/>
            <abstract>
              <t>   SenML is one of the data formats used by the Internet-of-Things (IoT)
   devices to send simple sensor readings and device parameters over the
   network.  However, a lack of a YANG model for SenML means it cannot
   be used by the applications which already use YANG for data modeling
   and validation.  Furthermore, some of the encoding formats and tools
   available for YANG models, cannot be used by the devices sending data
   in SenML format.  This document provides one of the ways to model
   SenML data in YANG.  Additionally, SenML data is encoded into
   CORECONF format using this YANG model to concisely represent the
   data.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-gudi-t2trg-senml-as-coreconf-00"/>
        </reference>
        <reference anchor="I-D.birkholz-yang-core-telemetry">
          <front>
            <title>Concise YANG Telemetry</title>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Eric Voit" initials="E." surname="Voit">
              <organization>Cisco Systems</organization>
            </author>
            <date day="16" month="July" year="2018"/>
            <abstract>
              <t>   This document defines CoAP operations that implement the capabilities
   of YANG Datastore Subscriptions and YANG Customized Subscriptions for
   the CoAP Management Interface (CoMI).  The '/s' resource, as defined
   in CoMI, is extended analogously to include a set of sub-resources,
   each of them representing an observable resource identified by its
   subscription-id.  Specific additions include but are not limited to
   new FETCH Body definitions and simplified subtree subscriptions to
   intermediate data nodes in YANG datastore modules using SID.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-birkholz-yang-core-telemetry-01"/>
        </reference>
        <reference anchor="I-D.toutain-core-sid-encoding">
          <front>
            <title>YANG SID Discovery Using the Domain Name System</title>
            <author fullname="Sandoche Balakrichenan" initials="S." surname="Balakrichenan">
              <organization>Afnic</organization>
            </author>
            <author fullname="Alexander Pelov" initials="A." surname="Pelov">
              <organization>IMT Atlantique</organization>
            </author>
            <author fullname="Laurent Toutain" initials="L." surname="Toutain">
              <organization>IMT Atlantique</organization>
            </author>
            <date day="1" month="July" year="2026"/>
            <abstract>
              <t>   CORECONF is an interface for managing YANG-modeled data using CBOR.
   It replaces verbose YANG schema item identifiers with compact 64-bit
   integers called Schema Item iDentifiers (SIDs).  Interpreting a SID
   requires two resources: the YANG module definition and the SID
   dictionary (the .sid file) that maps each integer to the
   corresponding YANG schema item.  Pre-loading every possible YANG
   module and its SID dictionary is not practical as the set of deployed
   modules grows; a dynamic discovery mechanism is therefore needed.
   This document specifies a DNS reverse-lookup mechanism analogous to
   ip6.arpa that maps a SID to a DNS name under the sid.yt. tree (where
   "yt" stands for YANG Tracker).  Resolving that name returns TXT
   records pointing to the authoritative repository for the
   corresponding YANG module.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-toutain-core-sid-encoding-00"/>
        </reference>
        <reference anchor="I-D.toutain-core-private-sid-translation">
          <front>
            <title>Private SID Translation for CORECONF</title>
            <author fullname="Laurent Toutain" initials="L." surname="Toutain">
              <organization>IMT Atlantique</organization>
            </author>
            <date day="31" month="May" year="2026"/>
            <abstract>
              <t>   This document describes a mechanism for translating privately
   assigned YANG SID values to globally allocated SIDs, enabling
   constrained devices to use compact local identifiers while remaining
   interoperable with standard CORECONF implementations.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-toutain-core-private-sid-translation-00"/>
        </reference>
        <reference anchor="SCHC-TOWARD-9363BIS">
          <front>
            <title>Toward RFC 9363bis: Changes to the SCHC YANG Data Model</title>
            <author initials="L." surname="Toutain">
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="OMA-LwM2M" target="https://www.openmobilealliance.org/release/LightweightM2M/V1_2-20201110-A/OMA-TS-LightweightM2M_Core-V1_2-20201110-A.pdf">
          <front>
            <title>Lightweight Machine to Machine Technical Specification: Core</title>
            <author>
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="SOSA" target="https://www.w3.org/TR/vocab-ssn/">
          <front>
            <title>Semantic Sensor Network Ontology</title>
            <author>
              <organization/>
            </author>
            <date year="2017"/>
          </front>
        </reference>
        <reference anchor="SensorThings" target="https://www.ogc.org/standard/sensorthings/">
          <front>
            <title>OGC SensorThings API Part 1: Sensing</title>
            <author>
              <organization/>
            </author>
            <date year="2016"/>
          </front>
        </reference>
        <reference anchor="SAREF" target="https://saref.etsi.org/">
          <front>
            <title>SAREF: the Smart Applications REFerence ontology</title>
            <author>
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
        <reference anchor="RFC7228">
          <front>
            <title>Terminology for Constrained-Node Networks</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="M. Ersue" initials="M." surname="Ersue"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <date month="May" year="2014"/>
            <abstract>
              <t>The Internet Protocol Suite is increasingly used on small devices with severe constraints on power, memory, and processing resources, creating constrained-node networks. This document provides a number of basic terms that have been useful in the standardization work for constrained-node networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7228"/>
          <seriesInfo name="DOI" value="10.17487/RFC7228"/>
        </reference>
        <reference anchor="RFC6347">
          <front>
            <title>Datagram Transport Layer Security Version 1.2</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
            <date month="January" year="2012"/>
            <abstract>
              <t>This document specifies version 1.2 of the Datagram Transport Layer Security (DTLS) protocol. The DTLS protocol provides communications privacy for datagram protocols. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. The DTLS protocol is based on the Transport Layer Security (TLS) protocol and provides equivalent security guarantees. Datagram semantics of the underlying transport are preserved by the DTLS protocol. This document updates DTLS 1.0 to work with TLS version 1.2. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6347"/>
          <seriesInfo name="DOI" value="10.17487/RFC6347"/>
        </reference>
        <reference anchor="RFC8613">
          <front>
            <title>Object Security for Constrained RESTful Environments (OSCORE)</title>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="J. Mattsson" initials="J." surname="Mattsson"/>
            <author fullname="F. Palombini" initials="F." surname="Palombini"/>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <date month="July" year="2019"/>
            <abstract>
              <t>This document defines Object Security for Constrained RESTful Environments (OSCORE), a method for application-layer protection of the Constrained Application Protocol (CoAP), using CBOR Object Signing and Encryption (COSE). OSCORE provides end-to-end protection between endpoints communicating using CoAP or CoAP-mappable HTTP. OSCORE is designed for constrained nodes and networks supporting a range of proxy operations, including translation between different transport protocols.</t>
              <t>Although an optional functionality of CoAP, OSCORE alters CoAP options processing and IANA registration. Therefore, this document updates RFC 7252.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8613"/>
          <seriesInfo name="DOI" value="10.17487/RFC8613"/>
        </reference>
      </references>
    </references>
    <?line 1851?>

<section anchor="annex-tree">
      <name>Module Tree</name>
      <figure anchor="fig-cf-m2m-tree">
        <name>coreconf-m2m module tree</name>
        <artwork align="center"><![CDATA[
module: coreconf-m2m
  +--ro bootstrap
  |  +--ro reference-epoch?   uint64
  |  +--ro uptime             uint64
  |  +--ro minimal-step?      uint32
  |  +--ro inventory* [type]
  |     +--ro type                  identityref
  |     +--ro unit-override?        string
  |     +--ro precision-override?   uint8
  |     +--ro category-override?    enumeration
  +--rw characteristics
  |  +--rw geo-location
  |  |  +--rw reference-frame
  |  |  |  +--rw alternate-system?    string {alternate-systems}?
  |  |  |  +--rw astronomical-body?   string
  |  |  |  +--rw geodetic-system
  |  |  |     +--rw geodetic-datum?    string
  |  |  |     +--rw coord-accuracy?    decimal64
  |  |  |     +--rw height-accuracy?   decimal64
  |  |  +--rw (location)?
  |  |  |  +--:(ellipsoid)
  |  |  |  |  +--rw latitude?    decimal64
  |  |  |  |  +--rw longitude?   decimal64
  |  |  |  |  +--rw height?      decimal64
  |  |  |  +--:(cartesian)
  |  |  |     +--rw x?           decimal64
  |  |  |     +--rw y?           decimal64
  |  |  |     +--rw z?           decimal64
  |  |  +--rw velocity
  |  |  |  +--rw v-north?   decimal64
  |  |  |  +--rw v-east?    decimal64
  |  |  |  +--rw v-up?      decimal64
  |  |  +--rw timestamp?         yang:date-and-time
  |  |  +--rw valid-until?       yang:date-and-time
  |  +--rw name?                string
  |  +--rw version?             string
  |  +--rw identifier?          string
  |  +--rw description?         string
  |  +--rw manufacturer?        string
  |  +--rw model?               string
  |  +--rw hosted-by?           string
  |  +--rw installation-time?   uint64
  +--rw transducers
     +--rw transducer* [type]
        +--rw type                       identityref
        +--ro quantity
        |  +--ro value?              int64
        |  +--ro timestamp?          uint64
        |  +--ro timestamp-source?   enumeration
        +--ro statistics
        |  +--ro min?            int64
        |  +--ro max?            int64
        |  +--ro mean?           int64
        |  +--ro median?         int64
        |  +--ro stdev?          uint64
        |  +--ro sample-count?   uint64
        +--rw notification-parameters
        |  +--rw history
        |  |  +--ro active?        boolean
        |  |  +--rw step?          uint32
        |  |  +--rw precision?     uint8
        |  |  +--rw max-samples?   uint32
        |  |  +--rw time-period?   uint32
        |  |  +--rw encoding?      encoding-type
        |  |  +--rw max-payload?   uint32
        |  +--rw sensor-alert
        |  |  +--ro active?       boolean
        |  |  +--rw t-min?        int32
        |  |  +--rw t-max?        int32
        |  |  +--rw hysteresis?   uint8
        |  |  +--rw dampening?    uint32
        |  +--rw check-interval?   uint16
        +---x reset-stats

  rpcs:
    +---x reset-stats

  notifications:
    +---n history
    |  +--ro last?          boolean
    |  +--ro time-series* [type]
    |     +--ro type        identityref
    |     +--ro values*     int64
    |     +--ro internal
    |        +--ro last-update?     uint64
    |        +--ro start-time?      uint64
    |        +--ro messages-sent?   uint64
    +---n sensor-alert
       +--ro target* [type]
          +--ro type     identityref
          +--ro value?   int64
]]></artwork>
      </figure>
    </section>
    <section anchor="annex-yang">
      <name>Complete YANG Module</name>
      <figure anchor="fig-yang-module">
        <name>Complete coreconf-m2m YANG module</name>
        <sourcecode markers="true" name="coreconf-m2m@2026-09-01.yang"><![CDATA[
module coreconf-m2m {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:coreconf-m2m";
  prefix ccm2m;

  import ietf-geo-location {
    prefix geo;
    reference "RFC 9179";
  }

  organization "IETF";
  contact
    "Internet Engineering Task Force (IETF)
     https://www.ietf.org/";

  description
    "YANG data model for a generic M2M CoMI weather station.
     This model defines the operational state data for sensor readings.";

  revision 2026-09-01 {
    description
      "Move container statistics out of container quantity, making it a
       sibling of quantity under list transducer. Statistics accumulate
       over a window and are not part of the current measurement, so
       nesting them under quantity conflated two different lifetimes and
       cost one extra level of delta encoding on every statistics access.
       This reverts the nesting introduced in revision 2026-03-29.";
  }

  revision 2026-08-28 {
    description
      "Rename the 'states' container to 'bootstrap', since it holds
       operational data determined once at bootstrap time.
       Split the transducer list: unit-override, precision-override and
       category-override are moved out of /transducers/transducer into a
       new /bootstrap/inventory list (also keyed by type). This list
       describes the fixed configuration of each transducer instance,
       determined at bootstrap and not expected to change afterwards,
       separately from the transducer's runtime data (quantity,
       statistics, notification parameters) which stays in
       /transducers/transducer.
       Hoist check-interval from notification-parameters/history and
       notification-parameters/sensor-alert to notification-parameters:
       it was defined identically in both containers, and a single
       CON/NON cadence now applies to both notification streams.";
  }

  revision 2026-08-24 {
    description
      "Remove type from list keys; id alone now identifies a transducer
       instance, distinguishing multiple actuators of the same type. This
       reduces the key size.
       Add a reference-epoch leaf in the state container; other epochs in
       the model are relative to this one.
       Move all concrete transducer-type identities (solar-radiation,
       precipitation, air-temperature, relative-humidity,
       barometric-pressure, vapor-pressure, wind-speed, wind-direction,
       wind-gust, north-wind-speed, east-wind-speed, strike-count,
       average-distance, tilt, x-orientation, y-orientation,
       humidity-sensor-temperature, compass-heading) out of coreconf-m2m and
       into the new atmos module; coreconf-m2m now only defines the base
       transducer-type identity, which product-specific modules extend.
       Rename transducer/unit and transducer/precision to unit-override and
       precision-override (both now optional, no default): they only need
       to be set when they differ from the default-unit/default-precision
       extension declared on the transducer's type identity.
       Add default-unit and default-precision extensions, for use by
       product-specific modules (e.g. atmos) annotating the transducer-type
       identities they define.
       Add SOSA/SAREF-aligned leafs to the characteristics container
       (description, manufacturer, model, hosted-by, installation-time);
       move uptime back into states, as bootstrap operational data.
       Add default-category extension, for product-specific modules to mark
       each transducer-type identity as 'sensor', 'actuator' or
       'sensor-actuator', and a matching category-override leaf on the
       transducer list for per-instance overrides.
       Remove u-timestamp: all timestamps are now second-resolution only;
       sub-second precision would require a model update.
       Change history/step units from milliseconds to seconds, for the
       same reason.
       Add minimal-step leaf in states and a must constraint requiring
       history/step >= states/minimal-step.
       Move geo-location from states into characteristics: it is
       configuration data set once at deployment, not runtime state.
       Make states/uptime mandatory.
       Revert the id-based key: transducer, transducers-list/time-series
       and sensor-alert/target are again keyed on type alone, and the id
       leaf is removed from all three lists (only one transducer per
       type is supported).";
  }

  revision 2026-06-07 {
    description
      "Add humidity-sensor-temperature and compass-heading transducer-type identities.";
  }

  revision 2026-05-26 {
    description
      "Add check-interval leaf to history and sensor-alert notification parameters.";
  }

  revision 2026-03-29 {
    description
      "Move container statistics inside container quantity.";
  }

  revision 2026-03-25 {
    description
      "Add dampening leaf to sensor-alert notification parameters.";
  }

  revision 2026-03-23 {
    description
      "Make active leaf config false (reflects observe subscription state).
       Add must constraint t-min < t-max on sensor-alert.
       Add timestamp-source enum in quantity to indicate timestamp origin
       (source = timestamped by the sensor, receiver = timestamped on receipt).";
  }

  revision 2026-03-22 {
    description
      "Rename branch measurement to transducer
       (container, list, identity, notification).";
  }

  revision 2026-03-08 {
    description
      "Module renamed to coreconf-m2m for generic M2M CoMI use.";
  }

  revision 2026-03-02 {
    description
      "Major update for CoMI compliance:
       - Added multi-sensor support (id key).
       - Measurements are now configurable (writable).
       - Added standard deviation (stdev).
       - Added uptime to state.
       - Removed tilt from fixed state (now a measurement type).
       - Removed legacy RPCs (subscribe, get-stats) in favor of CoMI/Observe.
       - Cleaned up measurement lists and notifications.";
  }

  revision 2026-02-27 {
    description
      "Initial revision for testing.";
  }

  /* ------------------------------------------------------------------ */
  /* Extensions                                                           */
  /* ------------------------------------------------------------------ */

  extension default-unit {
    argument "senml-unit";
    description
      "Recommended default value for a transducer's unit-override leaf,
       expressed as a SenML (RFC 8428) unit string. Applied by
       product-specific modules to the transducer-type identities they
       define. Intended as guidance for clients populating
       /transducers/transducer/unit-override; not enforced by the schema.";
  }

  extension default-precision {
    argument "decimal-places";
    description
      "Recommended default value for a transducer's precision-override leaf
       (number of decimal places, i.e. real value = raw_value * 10^-precision)
       when using the default-unit. Applied by product-specific modules to
       the transducer-type identities they define. Intended as guidance for
       clients populating /transducers/transducer/precision-override; not
       enforced by the schema.";
  }

  extension default-category {
    argument "category";
    description
      "Recommended default value for a transducer's category-override leaf.
       Extension arguments are plain strings and cannot be constrained to
       an enumeration by the YANG language itself; the value SHOULD be one
       of the category-override enums: 'sensor' (the transducer-type
       identity represents an observed property), 'actuator' (it
       represents a property acted upon), or 'sensor-actuator' (both).
       Applied by
       product-specific modules to the transducer-type identities they
       define, since this role is a property of the measurement type, not
       of the device as a whole (a device can carry a mix of sensor- and
       actuator-typed transducers).
       For example, in the SOSA/SSN ontology 'sensor' corresponds to
       sosa:Sensor/sosa:ObservableProperty and 'actuator' to
       sosa:Actuator; in SAREF they correspond to the SensingFunction and
       ActuatingFunction classes respectively.";
  }

  /* ------------------------------------------------------------------ */
  /* Measurement-type identity hierarchy                                  */
  /* ------------------------------------------------------------------ */

  identity transducer-type {
    description
      "Base identity for all measurement types. Concrete transducer types
       are defined by product-specific modules, e.g. atmos.";
  }

  /* ------------------------------------------------------------------ */
  /* Typedefs                                                             */
  /* ------------------------------------------------------------------ */

  typedef encoding-type {
    type enumeration {
      enum direct {
        value 0;
        description "Value is encoded directly as an integer.";
      }
      enum delta {
        value 1;
        description "Value is encoded as a delta from the previous value.";
      }
    }
    description "Encoding used for the measurement values.";
  }

  /* ------------------------------------------------------------------ */
  /* Shared grouping used by notifications                                */
  /* ------------------------------------------------------------------ */

  grouping transducers-list {
    list time-series {
      key "type";
      description
        "List of measurements included in this notification.";

      leaf type {
        type identityref {
          base transducer-type;
        }
        description "The type of measurement (e.g., air-temperature).";
      }

      leaf-list values {
        type int64;
        ordered-by user;
        description
          "List of encoded measurement values.";
      }
    }
  }

  /* ------------------------------------------------------------------ */
  /* State data                                                           */
  /* ------------------------------------------------------------------ */

  container bootstrap {
    config false;
    description
      "Operational data determined once at bootstrap time.";

    leaf reference-epoch {
      type uint64;
      units "seconds";
      description
        "Epoch timestamp used as the reference point for the device's
         internal clock. Other epoch/timestamp values in this model are
         relative to this reference epoch.";
    }

    leaf uptime {
      type uint64;
      units "seconds";
      mandatory true;
      description "Time elapsed since the last boot.";
    }

    leaf minimal-step {
      type uint32;
      units "seconds";
      description
        "Minimum interval at which the underlying system refreshes
         transducer values, i.e. the smallest meaningful value for
         history/step. Determined by the hardware/firmware and not
         configurable (e.g. an atmospheric station may have a
         minimal-step of 120 seconds).";
    }

    list inventory {
      key "type";
      description
        "List of transducers known to the device, with their
         per-instance configuration overrides. Determined once at
         bootstrap and not expected to change afterwards.";

      leaf type {
        type identityref {
          base transducer-type;
        }
        description "The type of measurement.";
      }

      leaf unit-override {
        type string;
        description
          "Unit of measurement (e.g., 'Cel', 'm/s', '%'), overriding the
           default-unit extension declared on the transducer's type identity
           (if any). When absent, clients should use that identity's
           default-unit; if the identity declares no default-unit, the unit
           is undefined.";
      }

      leaf precision-override {
        type uint8;
        description
          "Number of decimal places for the measurement value
           (real value = raw_value * 10^-precision), overriding the
           default-precision extension declared on the transducer's type
           identity (if any). Applies to the current measurement value
           (polling/iPATCH), not to the time-series encoding in
           notifications. When absent, clients should use that identity's
           default-precision; if the identity declares no default-precision,
           the precision is undefined.";
      }

      leaf category-override {
        type enumeration {
          enum sensor {
            description "The transducer represents an observed property.";
          }
          enum actuator {
            description "The transducer represents a property acted upon.";
          }
          enum sensor-actuator {
            description
              "The transducer both observes and can be acted upon
               (e.g. a setpoint that also reports the measured value).";
          }
        }
        description
          "Role of this transducer instance, overriding the
           default-category extension declared on the transducer's type
           identity (if any). When absent, clients should use that
           identity's default-category; if the identity declares no
           default-category, the role is undefined.";
      }
    }
  }

  /* ------------------------------------------------------------------ */
  /* Device Characteristics                                               */
  /* ------------------------------------------------------------------ */

  container characteristics {
    description
      "Static descriptive information about the device.";

    uses geo:geo-location {
      description
        "Fixed geographic position of the weather station.
         Populated once at deployment; not expected to change
         during normal operation.";
      refine "geo-location/reference-frame/geodetic-system/geodetic-datum" {
        default "wgs-84";
      }
    }

    leaf name {
      type string;
      description "Human-readable name of the device.";
    }

    leaf version {
      type string;
      description "Firmware or software version of the device.";
    }

    leaf identifier {
      type string;
      description "Unique identifier of the device (e.g., serial number or EUI).";
    }

    leaf description {
      type string;
      description
        "Free-text description of the device, its purpose or its
         deployment context. For example, in SOSA/SSN this corresponds to
         rdfs:comment on the sosa:Sensor/sosa:Platform individual, and in
         SAREF to saref:hasDescription.";
    }

    leaf manufacturer {
      type string;
      description
        "Name of the device manufacturer. For example, in SAREF this
         corresponds to saref:hasManufacturer.";
    }

    leaf model {
      type string;
      description
        "Commercial model name/number of the device. For example, in
         SAREF this corresponds to saref:hasModel.";
    }

    leaf hosted-by {
      type string;
      description
        "Identifier of the platform hosting this device, when applicable.
         Left as an opaque string here; resolution to an actual platform
         resource is deployment-specific. For example, in SOSA this
         corresponds to the sosa:isHostedBy relation
         (device -> sosa:Platform).";
    }

    leaf installation-time {
      type uint64;
      units "seconds";
      description
        "Absolute Unix epoch timestamp (UTC) at which the device was
         installed/commissioned. Unlike bootstrap/reference-epoch, this is
         an absolute epoch value, not a relative reference point for the
         device's internal clock.";
    }
  }

  /* ------------------------------------------------------------------ */
  /* Measurements Configuration & Data                                    */
  /* ------------------------------------------------------------------ */

  container transducers {
    // config true (default);
    description
      "Current measurement values accessible via polling or configuration.";

    list transducer {
      key "type";
      description
        "List of available measurements.";

      leaf type {
        type identityref {
          base transducer-type;
        }
        description "The type of measurement.";
      }

      container quantity {
        config false;
        description "Operational state for this transducer.";

        leaf value {
          type int64;
          description
            "The current raw integer value of the transducer.";
        }

        leaf timestamp {
          type uint64;
          units "seconds";
          description "Epoch timestamp (seconds) of the last transducer update.";
        }

        leaf timestamp-source {
          type enumeration {
            enum source {
              value 0;
              description
                "The timestamp was generated by the sensor itself.";
            }
            enum receiver {
              value 1;
              description
                "The timestamp was applied by the receiver upon message arrival.";
            }
          }
          description
            "Indicates the origin of the timestamp associated with this measurement.";
        }
      }

      container statistics {
        config false;
        description "Read-only accumulated statistics for this measurement.";

        leaf min {
          type int64;
          description "Minimum value observed since last reset.";
        }

        leaf max {
          type int64;
          description "Maximum value observed since last reset.";
        }

        leaf mean {
          type int64;
          description "Mean value observed since last reset.";
        }

        leaf median {
          type int64;
          description
            "Estimated median value observed since last reset.
             This median is computed incrementally from the current stored
             statistics and the newest sample, without keeping full history.";
        }

        leaf stdev {
          type uint64;
          description
            "Standard deviation of values observed since last reset.
             Scaled by same precision as value.";
        }

        leaf sample-count {
          type uint64;
          description "Number of samples used for statistics calculation.";
        }
      }

      container notification-parameters {
        description
          "Configuration parameters controlling how this transducer
           is reported in CoMI notification streams.";

        container history {
          description "Parameters for the history time-series stream.";

          leaf active {
            type boolean;
            config false;
            description
              "Read-only. True when a FETCH+Observe subscription is active on /s
               for this transducer history stream. False when no observer is registered.";
          }

          leaf step {
            type uint32;
            units "seconds";
            must ". >= /bootstrap/minimal-step or not(/bootstrap/minimal-step)" {
              error-message
                "step must be greater than or equal to bootstrap/minimal-step.";
            }
            description
              "Time interval between samples in the notification stream.
               Must be at least bootstrap/minimal-step, the system's minimum
               refresh interval.";
          }

          leaf precision {
            type uint8;
            default 1;
            description
              "Number of decimal places for values encoded in time-series notifications.
               Real value = raw_value * 10^-precision.";
          }

          leaf max-samples {
            type uint32;
            description "Maximum number of samples kept in the time-series buffer.";
          }

          leaf time-period {
            type uint32;
            units "seconds";
            description "Duration of the time window covered by the history buffer.";
          }

          leaf encoding {
            type encoding-type;
            default "delta";
            description "Encoding used for the values list in notifications.";
          }

          leaf max-payload {
            type uint32;
            units "bytes";
            description
              "Maximum size in bytes of the encoded time-series payload in
               a single history notification.  When the encoded buffer would
               exceed this limit, the notification is sent early (before
               max-samples or time-period is reached).  0 means no size limit.";
          }

        }

        container sensor-alert {
          description "Parameters for threshold-based sensor-alert notifications.";

          must "not(t-min and t-max) or t-min < t-max" {
            error-message "t-min must be strictly less than t-max.";
          }

          leaf active {
            type boolean;
            config false;
            description
              "Read-only. True when a FETCH+Observe subscription is active on /s
               for this transducer sensor-alert stream. False when no observer is registered.";
          }

          leaf t-min {
            type int32;
            description
              "Minimum threshold value. A sensor-alert is raised when the
               transducer value falls below this value.";
          }

          leaf t-max {
            type int32;
            description
              "Maximum threshold value. A sensor-alert is raised when the
               transducer value exceeds this value.";
          }

          leaf hysteresis {
            type uint8 {
              range "0..100";
            }
            default 5;
            units "percent";
            description
              "Hysteresis applied to threshold crossings, expressed as a
               percentage of the threshold value.";
          }

          leaf dampening {
            type uint32;
            default 0;
            units "milliseconds";
            description
              "Minimum time that must elapse between two consecutive sensor-alert
               notifications for the same transducer.  A new alert is suppressed
               until the dampening period has expired since the last sent alert.
               0 (default) means no dampening.";
          }
        }

        leaf check-interval {
          type uint16;
          default 0;
          description
            "Controls how often a CON (confirmable) notification is sent
             instead of NON (non-confirmable), for both the history and
             sensor-alert streams of this transducer.
             0 = disabled, all notifications are NON.
             1 = every notification is CON.
             N = one CON every N notifications, all others are NON.";
        }
      }

      action reset-stats {
        description
          "Reset the accumulated statistics (min, max, mean, median, stdev)
           for this measurement. Counters restart from the next sample received.";
      }
    }
  }

  /* ------------------------------------------------------------------ */
  /* RPCs                                                                 */
  /* ------------------------------------------------------------------ */

  rpc reset-stats {
    description
      "Reset the accumulated statistics for all measurements.
       The counters restart from the next sample received after the call.";
  }

  /* ------------------------------------------------------------------ */
  /* Notifications                                                        */
  /* ------------------------------------------------------------------ */

  notification history {
    description
      "Measurement event sent to observers of the notification stream.
       To receive this, a CoLA/CoMI client must Observe the stream resource.";

    leaf last {
      type boolean;
      default "false";
      description "True if this is the last notification for the current series.";
    }

    uses transducers-list {
      augment "time-series" {
        container internal {
          description "Internal operational state for this time-series entry.";
          leaf last-update {
            type uint64;
            units "seconds";
            description "Epoch timestamp of the last sample appended to this time-series.";
          }
          leaf start-time {
            type uint64;
            units "seconds";
            description "Epoch timestamp of the first sample; set when the Observe subscription is created.";
          }
          leaf messages-sent {
            type uint64;
            description "Number of notification messages sent for this time-series since the Observe subscription was created.";
          }
        }
      }
    }
  }

  notification sensor-alert {
    description
      "Alert notification when a value exceeds a threshold.";

    list target {
      key "type";
      description "Measurement instances that triggered this alert.";

      leaf type {
        type identityref {
          base transducer-type;
        }
      }

      leaf value {
        type int64;
        description "The measurement value that triggered this alert.";
      }
    }
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="annex-sid">
      <name>SID File (CSV)</name>
      <t>The following table lists the SID assignments for the coreconf-m2m module
(assignment range: 62000-62399, revision 2026-09-01). The transducer-type
identities defined by manufacturer modules such as atmos are assigned
separately and are not yet included in this table.</t>
      <figure anchor="fig-sid-csv">
        <name>SID assignments for coreconf-m2m (CSV format)</name>
        <artwork align="left"><![CDATA[
SID,Namespace,Identifier
62000,module,coreconf-m2m
62001,identity,transducer-type
62002,data,/coreconf-m2m:bootstrap
62003,data,/coreconf-m2m:bootstrap/inventory
62004,data,/coreconf-m2m:bootstrap/inventory/category-override
62005,data,/coreconf-m2m:bootstrap/inventory/precision-override
62006,data,/coreconf-m2m:bootstrap/inventory/type
62007,data,/coreconf-m2m:bootstrap/inventory/unit-override
62008,data,/coreconf-m2m:bootstrap/minimal-step
62009,data,/coreconf-m2m:bootstrap/reference-epoch
62010,data,/coreconf-m2m:bootstrap/uptime
62011,data,/coreconf-m2m:characteristics
62012,data,/coreconf-m2m:characteristics/description
62013,data,/coreconf-m2m:characteristics/geo-location
62014,data,/coreconf-m2m:characteristics/geo-location/height
62015,data,/coreconf-m2m:characteristics/geo-location/latitude
62016,data,/coreconf-m2m:characteristics/geo-location/longitude
62017,data,/coreconf-m2m:characteristics/geo-location/reference-frame
62018,data,/coreconf-m2m:characteristics/geo-location/reference-frame/alternate-system
62019,data,/coreconf-m2m:characteristics/geo-location/reference-frame/astronomical-body
62020,data,/coreconf-m2m:characteristics/geo-location/reference-frame/geodetic-system
62021,data,/coreconf-m2m:characteristics/geo-location/reference-frame/geodetic-system/coord-accuracy
62022,data,/coreconf-m2m:characteristics/geo-location/reference-frame/geodetic-system/geodetic-datum
62023,data,/coreconf-m2m:characteristics/geo-location/reference-frame/geodetic-system/height-accuracy
62024,data,/coreconf-m2m:characteristics/geo-location/timestamp
62025,data,/coreconf-m2m:characteristics/geo-location/valid-until
62026,data,/coreconf-m2m:characteristics/geo-location/velocity
62027,data,/coreconf-m2m:characteristics/geo-location/velocity/v-east
62028,data,/coreconf-m2m:characteristics/geo-location/velocity/v-north
62029,data,/coreconf-m2m:characteristics/geo-location/velocity/v-up
62030,data,/coreconf-m2m:characteristics/geo-location/x
62031,data,/coreconf-m2m:characteristics/geo-location/y
62032,data,/coreconf-m2m:characteristics/geo-location/z
62033,data,/coreconf-m2m:characteristics/hosted-by
62034,data,/coreconf-m2m:characteristics/identifier
62035,data,/coreconf-m2m:characteristics/installation-time
62036,data,/coreconf-m2m:characteristics/manufacturer
62037,data,/coreconf-m2m:characteristics/model
62038,data,/coreconf-m2m:characteristics/name
62039,data,/coreconf-m2m:characteristics/version
62040,data,/coreconf-m2m:history
62041,data,/coreconf-m2m:history/last
62042,data,/coreconf-m2m:history/time-series
62043,data,/coreconf-m2m:history/time-series/internal
62044,data,/coreconf-m2m:history/time-series/internal/last-update
62045,data,/coreconf-m2m:history/time-series/internal/messages-sent
62046,data,/coreconf-m2m:history/time-series/internal/start-time
62047,data,/coreconf-m2m:history/time-series/type
62048,data,/coreconf-m2m:history/time-series/values
62049,data,/coreconf-m2m:reset-stats
62050,data,/coreconf-m2m:reset-stats/input
62051,data,/coreconf-m2m:reset-stats/output
62052,data,/coreconf-m2m:sensor-alert
62053,data,/coreconf-m2m:sensor-alert/target
62054,data,/coreconf-m2m:sensor-alert/target/type
62055,data,/coreconf-m2m:sensor-alert/target/value
62056,data,/coreconf-m2m:transducers
62057,data,/coreconf-m2m:transducers/transducer
62058,data,/coreconf-m2m:transducers/transducer/notification-parameters
62059,data,/coreconf-m2m:transducers/transducer/notification-parameters/check-interval
62060,data,/coreconf-m2m:transducers/transducer/notification-parameters/history
62061,data,/coreconf-m2m:transducers/transducer/notification-parameters/history/active
62062,data,/coreconf-m2m:transducers/transducer/notification-parameters/history/encoding
62063,data,/coreconf-m2m:transducers/transducer/notification-parameters/history/max-payload
62064,data,/coreconf-m2m:transducers/transducer/notification-parameters/history/max-samples
62065,data,/coreconf-m2m:transducers/transducer/notification-parameters/history/precision
62066,data,/coreconf-m2m:transducers/transducer/notification-parameters/history/step
62067,data,/coreconf-m2m:transducers/transducer/notification-parameters/history/time-period
62068,data,/coreconf-m2m:transducers/transducer/notification-parameters/sensor-alert
62069,data,/coreconf-m2m:transducers/transducer/notification-parameters/sensor-alert/active
62070,data,/coreconf-m2m:transducers/transducer/notification-parameters/sensor-alert/dampening
62071,data,/coreconf-m2m:transducers/transducer/notification-parameters/sensor-alert/hysteresis
62072,data,/coreconf-m2m:transducers/transducer/notification-parameters/sensor-alert/t-max
62073,data,/coreconf-m2m:transducers/transducer/notification-parameters/sensor-alert/t-min
62074,data,/coreconf-m2m:transducers/transducer/quantity
62075,data,/coreconf-m2m:transducers/transducer/quantity/timestamp
62076,data,/coreconf-m2m:transducers/transducer/quantity/timestamp-source
62077,data,/coreconf-m2m:transducers/transducer/quantity/value
62078,data,/coreconf-m2m:transducers/transducer/reset-stats
62079,data,/coreconf-m2m:transducers/transducer/reset-stats/input
62080,data,/coreconf-m2m:transducers/transducer/reset-stats/output
62081,data,/coreconf-m2m:transducers/transducer/statistics
62082,data,/coreconf-m2m:transducers/transducer/statistics/max
62083,data,/coreconf-m2m:transducers/transducer/statistics/mean
62084,data,/coreconf-m2m:transducers/transducer/statistics/median
62085,data,/coreconf-m2m:transducers/transducer/statistics/min
62086,data,/coreconf-m2m:transducers/transducer/statistics/sample-count
62087,data,/coreconf-m2m:transducers/transducer/statistics/stdev
62088,data,/coreconf-m2m:transducers/transducer/type
]]></artwork>
      </figure>
    </section>
    <section anchor="annex-atmos-yang">
      <name>atmos YANG Module</name>
      <figure anchor="fig-atmos-yang">
        <name>atmos.yang module</name>
        <sourcecode markers="true" name="atmos@2026-08-24.yang"><![CDATA[
module atmos {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:atmos";
  prefix atmos;

  import coreconf-m2m {
    prefix ccm2m;
  }

  organization "METER Group, Inc.";
  contact
    "Technical Support
     https://www.metergroup.com/";

  description
    "Atmospheric/weather transducer-type identities for use with the
     coreconf-m2m generic M2M CoMI data model.";

  revision 2026-08-24 {
    description
      "Initial revision. Extracted all concrete transducer-type identities
       from coreconf-m2m: atmospheric/weather (solar-radiation,
       precipitation, air-temperature, relative-humidity,
       barometric-pressure, vapor-pressure, wind-speed, wind-direction,
       wind-gust, north-wind-speed, east-wind-speed), lightning
       (strike-count, average-distance), orientation (tilt, x-orientation,
       y-orientation, compass-heading), and humidity-sensor-temperature.
       coreconf-m2m now only defines the base transducer-type identity;
       atmos is the product-specific module extending it.
       Applied the ccm2m:default-unit and ccm2m:default-precision
       extensions (defined in coreconf-m2m) to each identity, to advertise
       the recommended SenML (RFC 8428) unit and decimal precision for a
       transducer of that type.";
  }

  /* ------------------------------------------------------------------ */
  /* Environmental                                                        */
  /* ------------------------------------------------------------------ */

  identity solar-radiation {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "W/m2";
    ccm2m:default-precision "0";
    description "Solar radiation measurement (W/m2).";
  }

  identity precipitation {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "mm";
    ccm2m:default-precision "1";
    description "Precipitation measurement (mm).";
  }

  identity air-temperature {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "Cel";
    ccm2m:default-precision "2";
    description "Air temperature measurement (°C).";
  }

  identity relative-humidity {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "%RH";
    ccm2m:default-precision "1";
    description "Relative humidity measurement (%).";
  }

  identity barometric-pressure {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "Pa";
    ccm2m:default-precision "0";
    description "Barometric pressure measurement (kPa).";
  }

  identity vapor-pressure {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "Pa";
    ccm2m:default-precision "0";
    description "Vapor pressure measurement (kPa).";
  }

  /* ------------------------------------------------------------------ */
  /* Wind                                                                 */
  /* ------------------------------------------------------------------ */

  identity wind-speed {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "m/s";
    ccm2m:default-precision "1";
    description "Horizontal wind speed measurement (m/s).";
  }

  identity wind-direction {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "deg";
    ccm2m:default-precision "0";
    description "Wind direction measurement (degrees).";
  }

  identity wind-gust {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "m/s";
    ccm2m:default-precision "1";
    description "Wind gust measurement (m/s).";
  }

  identity north-wind-speed {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "m/s";
    ccm2m:default-precision "1";
    description "North wind speed component (m/s).";
  }

  identity east-wind-speed {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "m/s";
    ccm2m:default-precision "1";
    description "East wind speed component (m/s).";
  }

  /* ------------------------------------------------------------------ */
  /* Lightning                                                            */
  /* ------------------------------------------------------------------ */

  identity strike-count {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "count";
    ccm2m:default-precision "0";
    description "Lightning strike count.";
  }

  identity average-distance {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "km";
    ccm2m:default-precision "1";
    description "Average lightning distance (km).";
  }

  /* ------------------------------------------------------------------ */
  /* Orientation                                                          */
  /* ------------------------------------------------------------------ */

  identity tilt {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "deg";
    ccm2m:default-precision "1";
    description "Sensor tilt measurement (degrees).";
  }

  identity x-orientation {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    description "X-axis orientation (raw accelerometer data).";
  }

  identity y-orientation {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    description "Y-axis orientation (raw accelerometer data).";
  }

  identity compass-heading {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "deg";
    ccm2m:default-precision "0";
    description "Compass heading clockwise from north reference (degrees).";
  }

  /* ------------------------------------------------------------------ */
  /* Internal                                                             */
  /* ------------------------------------------------------------------ */

  identity humidity-sensor-temperature {
    base ccm2m:transducer-type;
    ccm2m:default-category "sensor";
    ccm2m:default-unit "Cel";
    ccm2m:default-precision "2";
    description "Internal temperature of the humidity sensor (°C).";
  }
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="annex-atmos-sid">
      <name>atmos SID File (CSV)</name>
      <t>The following table illustrates the SID assignments for the atmos module,
assuming a registrar-owned range with an illustrative entry point of
10000000 (out of a 10 million SID mega-range assumed for this example).
These SIDs are commercial/vendor assignments, not IETF or SDO ones, and
are provided here for illustration only.</t>
      <figure anchor="fig-atmos-sid-csv">
        <name>SID assignments for atmos (CSV format, illustrative)</name>
        <artwork align="left"><![CDATA[
SID,Namespace,Identifier
10000000,module,atmos
10000001,identity,air-temperature
10000002,identity,average-distance
10000003,identity,barometric-pressure
10000004,identity,compass-heading
10000005,identity,east-wind-speed
10000006,identity,humidity-sensor-temperature
10000007,identity,north-wind-speed
10000008,identity,precipitation
10000009,identity,relative-humidity
10000010,identity,solar-radiation
10000011,identity,strike-count
10000012,identity,tilt
10000013,identity,vapor-pressure
10000014,identity,wind-direction
10000015,identity,wind-gust
10000016,identity,wind-speed
10000017,identity,x-orientation
10000018,identity,y-orientation
]]></artwork>
      </figure>
    </section>
    <section anchor="annex-ccm2m-ontology">
      <name>ccm2m Ontology</name>
      <figure anchor="fig-ccm2m-ontology">
        <name>The ccm2m: extension vocabulary, in Turtle/OWL</name>
        <artwork><![CDATA[
@prefix ccm2m:  <https://ccm2m.example/ns#> .
@prefix owl:    <http://www.w3.org/2002/07/owl#> .
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:    <http://www.w3.org/2001/XMLSchema#> .
@prefix sosa:   <http://www.w3.org/ns/sosa/> .
@prefix qudt:   <http://qudt.org/schema/qudt/> .
@prefix dcterms: <http://purl.org/dc/terms/> .

# ── Ontology header ───────────────────────────────────────────────────────────

<https://ccm2m.example/ns>
    a owl:Ontology ;
    rdfs:label   "CCM2M — CORECONF-M2M vocabulary for SOSA/SSN" ;
    rdfs:comment """Complementary vocabulary to SOSA/SSN for exposing
CORECONF/CoAP semantics (endpoints, applicative controls, bootstrap SIDs,
sensor identity/id) that have no direct equivalent in SOSA.""" ;
    dcterms:created  "2026-06-27"^^xsd:date ;
    owl:versionInfo  "0.2" .

# ── Datatype ──────────────────────────────────────────────────────────────────

ccm2m:SID
    a rdfs:Datatype ;
    rdfs:label   "SID" ;
    rdfs:comment """A CORECONF Schema Identifier (SID) — a non-negative integer
that uniquely identifies a YANG node, identity, or feature within a SID
file (RFC 9254). Using this datatype instead of xsd:nonNegativeInteger
makes the nature of the value self-documenting.""" .

# ── Classes ───────────────────────────────────────────────────────────────────

ccm2m:Control
    a owl:Class ;
    rdfs:label   "Control" ;
    rdfs:comment """An applicative operation exposed by a Platform over
CORECONF/CoAP: single-value read, history-buffer notification subscription,
or threshold-alert notification subscription.
Intentionally outside SOSA/SSN Sampling/Sensing semantics.""" .

ccm2m:SetupNotification
    a owl:Class ;
    rdfs:subClassOf ccm2m:Control ;
    rdfs:label   "SetupNotification" ;
    rdfs:comment """A Control that configures notification parameters on a
transducer before subscribing (iPATCH /c). Carries the target SID of the
notification-parameters container and the list of configurable parameters
with their individual SIDs.""" .

ccm2m:NotificationParam
    a owl:Class ;
    rdfs:label   "NotificationParam" ;
    rdfs:comment """A single configurable parameter within a
SetupNotification (e.g. 'step', 'encoding'). Carries the YANG leaf name
and its SID.""" .

# ── Object properties ─────────────────────────────────────────────────────────

ccm2m:hasControl
    a owl:ObjectProperty ;
    rdfs:label   "hasControl" ;
    rdfs:comment "Links a Platform or Sensor to a Control it exposes." ;
    rdfs:range   ccm2m:Control .

ccm2m:hasParam
    a owl:ObjectProperty ;
    rdfs:label   "hasParam" ;
    rdfs:comment "Links a SetupNotification to one of its configurable parameters." ;
    rdfs:domain  ccm2m:SetupNotification ;
    rdfs:range   ccm2m:NotificationParam .

ccm2m:outputUnit
    a owl:ObjectProperty ;
    rdfs:label   "outputUnit" ;
    rdfs:comment """Fixed output unit of a Sensor, declared once from the
'units' statement of the corresponding YANG leaf. Never repeated per
Observation.""" ;
    rdfs:domain  sosa:Sensor ;
    rdfs:range   qudt:Unit .

# ── Datatype properties — Platform ────────────────────────────────────────────

ccm2m:coapEndpoint
    a owl:DatatypeProperty ;
    rdfs:label   "coapEndpoint" ;
    rdfs:comment "CoAP access address of the resource (e.g. coap://[::1])." ;
    rdfs:domain  sosa:Platform ;
    rdfs:range   xsd:anyURI .

ccm2m:accessProtocol
    a owl:DatatypeProperty ;
    rdfs:label   "accessProtocol" ;
    rdfs:comment "Default applicative protocol on this Platform (e.g. 'coreconf')." ;
    rdfs:domain  sosa:Platform ;
    rdfs:range   xsd:string .

ccm2m:bootstrapSid
    a owl:DatatypeProperty ;
    rdfs:label   "bootstrapSid" ;
    rdfs:comment """SID used at bootstrap to discover the YANG model exposed
by the Platform. Multi-valued (several bootstrap SIDs are possible,
unordered). Discovered via DNS TXT record.""" ;
    rdfs:domain  sosa:Platform ;
    rdfs:range   ccm2m:SID .

# ── Datatype properties — shared (Platform and Control) ───────────────────────

ccm2m:coapMethod
    a owl:DatatypeProperty ;
    rdfs:label   "coapMethod" ;
    rdfs:comment """CoAP method to use (FETCH, FETCH+Observe, GET, iPATCH…).
Usable on a Platform (default) or on a Control (override).
Domain intentionally unconstrained.""" ;
    rdfs:range   xsd:string .

ccm2m:coapPath
    a owl:DatatypeProperty ;
    rdfs:label   "coapPath" ;
    rdfs:comment """CoAP URI path of the resource targeted by this Control
(e.g. '/c' for datastore, '/s' for stream/notification).""" ;
    rdfs:range   xsd:string .

ccm2m:contentFormat
    a owl:DatatypeProperty ;
    rdfs:label   "contentFormat" ;
    rdfs:comment """CoAP Content-Format used (e.g.
application/yang-data+cbor). Usable on a Platform (default) or on a
Control (override). Domain intentionally unconstrained.""" ;
    rdfs:range   xsd:string .

# ── Datatype properties — Control ─────────────────────────────────────────────

ccm2m:paramName
    a owl:DatatypeProperty ;
    rdfs:label   "paramName" ;
    rdfs:comment "YANG leaf name of this notification parameter (e.g. 'step', 'encoding')." ;
    rdfs:domain  ccm2m:NotificationParam ;
    rdfs:range   xsd:string .

ccm2m:paramSid
    a owl:DatatypeProperty ;
    rdfs:label   "paramSid" ;
    rdfs:comment "SID of this notification parameter's YANG leaf." ;
    rdfs:domain  ccm2m:NotificationParam ;
    rdfs:range   ccm2m:SID .

ccm2m:controlType
    a owl:DatatypeProperty ;
    rdfs:label   "controlType" ;
    rdfs:comment """Functional type of the Control. Current controlled values:
  'instant-write'     — single-value write (iPATCH /c, same SID as read-single),
  'read-single'       — single-value polling (FETCH /c),
  'read-stat'         — statistics polling (FETCH /c, statistics container),
  'reset-stat'        — reset statistics for one sensor (POST /c, per-sensor),
  'reset-all-stat'    — reset all sensors statistics (POST /c, platform-level),
  'subscribe-history'    — history-buffer notification subscription (Observe /s),
  'subscribe-threshold'  — threshold-alert notification subscription (Observe /s).""" ;
    rdfs:domain  ccm2m:Control ;
    rdfs:range   xsd:string .

ccm2m:targetSid
    a owl:DatatypeProperty ;
    rdfs:label   "targetSid" ;
    rdfs:comment "SID of the YANG leaf/container targeted by this Control." ;
    rdfs:domain  ccm2m:Control ;
    rdfs:range   ccm2m:SID .

# ── Datatype properties — Sensor ──────────────────────────────────────────────

ccm2m:type
    a owl:DatatypeProperty ;
    rdfs:label   "type" ;
    rdfs:comment """SID of the YANG identity describing the sensor type
(e.g. 100001 for air-temperature). Named 'type' to match the YANG leaf name.
Looked up from the device's .sid file.""" ;
    rdfs:domain  sosa:Sensor ;
    rdfs:range   ccm2m:SID .

ccm2m:id
    a owl:DatatypeProperty ;
    rdfs:label   "id" ;
    rdfs:comment """Instance identifier of the sensor on its Platform.
Distinguishes multiple sensors of the same type (default 0).""" ;
    rdfs:domain  sosa:Sensor ;
    rdfs:range   xsd:nonNegativeInteger .

ccm2m:precision
    a owl:DatatypeProperty ;
    rdfs:label   "precision" ;
    rdfs:comment """Number of decimal places for the raw integer value.
Real value = raw_value × 10^(-precision).
Declared once on the Sensor; not repeated per Observation.""" ;
    rdfs:domain  sosa:Sensor ;
    rdfs:range   xsd:integer .
]]></artwork>
      </figure>
    </section>
    <section anchor="annex-schc-rules">
      <name>SCHC Rule Set</name>
      <t>The following SCHC <xref target="RFC8724"/> Rule Set compresses the IPv6/UDP/CoAP
traffic exchanged with the ATMOS41 weather station used throughout
this document. These rules are just examples that can be adapted to
other scenarios. It is not the final version of this rule set and is
expected to change as the model evolves.</t>
      <t>The compression of IPv6 and UDP results in the port number being sent
as residue. Traffic Class and Flow Label are elided, and the
application and device IPv6 addresses are supposed to be known
(aaaa::2/64 and dddd::6/64, respectively).</t>
      <t>Field names (FID) are the identities defined by the "ietf-schc" YANG
module <xref target="RFC9363"/> <xref target="SCHC-TOWARD-9363BIS"/>, without their common
"fid-" prefix (e.g. "ipv6-version" for "fid-ipv6-version"), rather
than the plain-text FID names of <xref target="RFC8724"/> itself. CoAP options use
the Universal Option identity "coap-option" <xref target="SCHC-TOWARD-9363BIS"/>,
common to every option, with the actual option number given in
parentheses, rather than the twenty per-option FIDs deprecated by that
identity. Matching operators (MO) and compression/decompression
actions (CDA) are as defined in <xref target="RFC8724"/>; FL is the Field Length,
DI the Direction Indicator, and TV the Target Value (the Field
Position, FP, is omitted from the tables below for compactness; it
defaults to 1 unless a field is repeated, which does not happen in
this Rule Set).</t>
      <t>Below each rule table, the resulting residue format is given for the
Down (network to device) and Up (device to network) directions: the
ordered list of fields that still carry a residue after compression —
i.e. those whose CDA is not "not-sent", "compute-length", or
"compute-checksum" — together with the number of bits sent for that
field ("var" when the size is not fixed), followed by the total
residue size for that direction.</t>
      <section anchor="rule-0-used-to-fetch-a-single-value-bidirect">
        <name>Rule 0: Used to fetch a single value (bidirect)</name>
        <figure anchor="fig-schc-rule-0">
          <name>SCHC Rule 0 (RuleIDLength=5), with residue format</name>
          <artwork align="left"><![CDATA[
/---------------------+----------+----+-----------+---------+------------\
| FID                 | FL       | DI | TV        | MO      | CDA        |
+=====================+==========+====+===========+=========+============+
| ipv6-version        | 4        | bi | 6         | equal   | not-sent   |
| ipv6-trafficclass   | 8        | bi | 0         | ignore  | not-sent   |
| ipv6-flowlabel      | 20       | bi | 0         | ignore  | not-sent   |
| ipv6-payload-length | 16       | bi |           | ignore  | compute    |
| ipv6-nextheader     | 8        | bi | 17        | equal   | not-sent   |
| ipv6-hoplimit       | 8        | bi | 255       | ignore  | not-sent   |
| ipv6-devprefix      | 64       | bi | dddd::/64 | equal   | not-sent   |
| ipv6-deviid         | 64       | bi | ::6/64    | equal   | not-sent   |
| ipv6-appprefix      | 64       | bi | aaaa::/64 | equal   | not-sent   |
| ipv6-appiid         | 64       | bi | ::2/64    | equal   | not-sent   |
| udp-dev-port        | 16       | bi | 5683      | equal   | not-sent   |
| udp-app-port        | 16       | bi |           | ignore  | value-sent |
| udp-length          | 16       | bi | 0         | ignore  | compute    |
| udp-checksum        | 16       | bi | 0         | ignore  | compute    |
| coap-version        | 2        | bi | 1         | equal   | not-sent   |
| coap-type           | 2        | bi | 1         | equal   | not-sent   |
| coap-tkl            | 4        | bi | 0         | ignore  | value-sent |
| coap-code           | 8        | bi | 5,69      | match-  | mapping-   |
|                     |          |    |           | mapping | sent       |
| coap-mid            | 16       | bi | 0         | ignore  | value-sent |
| coap-token          | length-  | bi |           | ignore  | value-sent |
|                     | byte(16) |    |           |         |            |
| coap-option(11)     | var      | dw | "c"       | equal   | not-sent   |
| coap-option(12)     | var      | bi | 140       | equal   | not-sent   |
| coap-option(17)     | var      | dw | 140       | equal   | not-sent   |
\---------------------+----------+----+-----------+---------+------------/

Residue (Down): udp-app-port(16b) | coap-tkl(4b) | coap-code(1b) |
                coap-mid(16b) | coap-token(var)
  Total: 37b+var
Residue (Up):   udp-app-port(16b) | coap-tkl(4b) | coap-code(1b) |
                coap-mid(16b) | coap-token(var)
  Total: 37b+var
]]></artwork>
        </figure>
        <t>This rule is used for FETCH: the client sends one or more SID values,
potentially with keys, and receives a CORECONF structure in return.
Errors are handled by Rule 3 (empty message) and Rule 4 (ICMPv6
destination unreachable), not by this rule. The Content-Format is
always 140
(<tt>application/yang-data+cbor;id=sid</tt> <xref target="RFC9254"/>). Messages are
Non-Confirmable (NON), and the Token is mandatory to associate the
response with its query.</t>
        <t><xref target="fig-schc-rule-0-example"/> applies Rule 0 to two of the exchanges shown
earlier: the bootstrap discovery of <xref target="fig-resource-discovery"/> and the
air-temperature query of <xref target="fig-query-value"/>. Each message crosses two
SCHC instances: a compressor/decompressor at the constrained device and
its peer at the network edge, next to the application. Only the
residue fields of <xref target="fig-schc-rule-0"/> (<tt>app-port</tt>, <tt>coap-tkl</tt>,
<tt>coap-code</tt>, <tt>coap-mid</tt>, <tt>coap-token</tt> — 53 bits, plus the 5-bit RuleID)
cross the constrained link between the two SCHC instances; the full
IPv6/UDP/CoAP message, shown here with its CoAP method, MID, Token,
Content-Format, and payload (when small enough to display), is
exchanged unchanged on the Device-SCHC and SCHC-App segments. The
application port (<tt>app-port</tt>) is an arbitrary ephemeral port, chosen
here as 52344 for illustration.</t>
        <figure anchor="fig-schc-rule-0-example">
          <name>Rule 0 applied to a bootstrap discovery and an air-temperature query, across the two SCHC instances</name>
          <artwork align="left"><![CDATA[
Device            SCHC                SCHC                App

Bootstrap discovery -- request (Down):
|                 |                   |                   |
|                 |                   |<---- Pkt 64B -----|
|                 |  Rule 0/5         |                   |
|                 |  residue: 53b     |                   |
|                 |  payload: 3B      |                   |
|                 |<- 11B (pad 6b) ---|                   |
|<--- Pkt 64B ----|                   |                   |
  IPv6(40B)+UDP(8B)+CoAP(16B) = 64 B
  FETCH /bootstrap  MID=39919 Token=2aaf
  Payload: 19 F2 32 (3 B)

Bootstrap discovery -- response (Up):
|                 |                   |                   |
|--- Pkt 175B --->|                   |                   |
|                 |  Rule 0/5         |                   |
|                 |  residue: 53b     |                   |
|                 |  payload: 118B    |                   |
|                 |-- 126B (pad 6b) ->|                   |
|                 |                   |---- Pkt 175B ---->|
  IPv6(40B)+UDP(8B)+CoAP(127B) = 175 B
  2.05 Content  MID=39919 Token=2aaf
  Payload: 118 B (not shown)

Air-temperature query -- request (Down):
|                 |                   |                   |
|                 |                   |<---- Pkt 70B -----|
|                 |  Rule 0/5         |                   |
|                 |  residue: 53b     |                   |
|                 |  payload: 9B      |                   |
|                 |<- 17B (pad 6b) ---|                   |
|<--- Pkt 70B ----|                   |                   |
  IPv6(40B)+UDP(8B)+CoAP(22B) = 70 B
  FETCH /c  MID=12229 Token=2dae
  Payload: [62077, 10000001] (9 B)

Air-temperature query -- response (Up):
|                 |                   |                   |
|---- Pkt 63B --->|                   |                   |
|                 |  Rule 0/5         |                   |
|                 |  residue: 53b     |                   |
|                 |  payload: 6B      |                   |
|                 |-- 14B (pad 6b) -->|                   |
|                 |                   |----- Pkt 63B ---->|
  IPv6(40B)+UDP(8B)+CoAP(15B) = 63 B
  2.05 Content  MID=12229 Token=2dae
  Payload: {62077: 196} (6 B)
]]></artwork>
        </figure>
        <t>The compression ratio is best on small responses (bootstrap discovery
request: 64 -&gt; 11 bytes, 83%) and degrades as the payload grows, since
SCHC only compresses the fixed IPv6/UDP/CoAP header fields, not the
CoAP payload (bootstrap response: 175 -&gt; 126 bytes, 28%, dominated by
the 118-byte payload).</t>
        <t><xref target="fig-schc-rule-0-error-example"/> shows the other side of Rule 0: a
FETCH targeting a SID the device does not have. The 4.04 Not Found
response carries no payload and no Content-Format option, so it does
not match Rule 0's CODE mapping or its fixed Up-direction options; it
falls through to Rule 3 instead, where TYPE, TKL, CODE and MID are all
left uncompressed.</t>
        <figure anchor="fig-schc-rule-0-error-example">
          <name>A FETCH error: Rule 0 for the request, Rule 3 for the 4.04 response</name>
          <artwork align="left"><![CDATA[
Device            SCHC                SCHC                App

FETCH on a non-existent SID -- request (Down):
|                 |                   |                   |
|                 |                   |<---- Pkt 64B -----|
|                 |  Rule 0/5         |                   |
|                 |  residue: 53b     |                   |
|                 |  payload: 3B      |                   |
|                 |<- 11B (pad 6b) ---|                   |
|<--- Pkt 64B ----|                   |                   |
  IPv6(40B)+UDP(8B)+CoAP(16B) = 64 B
  FETCH /c  MID=12230 Token=2daf
  Payload: 19 F2 93 (SID 62099, 3 B)

4.04 Not Found, no options -- response (Up, Rule 3):
|                 |                   |                   |
|---- Pkt 54B --->|                   |                   |
|                 |  Rule 3/5         |                   |
|                 |  residue: 62b     |                   |
|                 |  payload: 0B      |                   |
|                 |--- 9B (pad 5b) -->|                   |
|                 |                   |----- Pkt 54B ---->|
  IPv6(40B)+UDP(8B)+CoAP(6B) = 54 B
  4.04 Not Found  MID=12230 Token=2daf
  Payload: (none)
]]></artwork>
        </figure>
      </section>
      <section anchor="rule-1-used-to-ipatch-ack-with-73-empty-coap-for-notification-in-up">
        <name>Rule 1: Used to iPatch, ack with 7/3. Empty CoAP for notification in UP</name>
        <figure anchor="fig-schc-rule-1">
          <name>SCHC Rule 1 (RuleIDLength=5), with residue format</name>
          <artwork align="left"><![CDATA[
/---------------------+----------+----+-----------+---------+------------\
| FID                 | FL       | DI | TV        | MO      | CDA        |
+=====================+==========+====+===========+=========+============+
| ipv6-version        | 4        | bi | 6         | equal   | not-sent   |
| ipv6-trafficclass   | 8        | bi | 0         | ignore  | not-sent   |
| ipv6-flowlabel      | 20       | bi | 0         | ignore  | not-sent   |
| ipv6-payload-length | 16       | bi |           | ignore  | compute    |
| ipv6-nextheader     | 8        | bi | 17        | equal   | not-sent   |
| ipv6-hoplimit       | 8        | bi | 255       | ignore  | not-sent   |
| ipv6-devprefix      | 64       | bi | dddd::/64 | equal   | not-sent   |
| ipv6-deviid         | 64       | bi | ::6/64    | equal   | not-sent   |
| ipv6-appprefix      | 64       | bi | aaaa::/64 | equal   | not-sent   |
| ipv6-appiid         | 64       | bi | ::2/64    | equal   | not-sent   |
| udp-dev-port        | 16       | bi | 5683      | equal   | not-sent   |
| udp-app-port        | 16       | bi |           | ignore  | value-sent |
| udp-length          | 16       | bi | 0         | ignore  | compute    |
| udp-checksum        | 16       | bi | 0         | ignore  | compute    |
| coap-version        | 2        | bi | 1         | equal   | not-sent   |
| coap-type           | 2        | bi | 1         | equal   | not-sent   |
| coap-tkl            | 4        | bi | 0         | ignore  | value-sent |
| coap-code           | 8        | dw | 7         | equal   | not-sent   |
| coap-code           | 8        | up |           | ignore  | value-sent |
| coap-mid            | 16       | bi | 0         | ignore  | value-sent |
| coap-token          | length-  | bi |           | ignore  | value-sent |
|                     | byte(16) |    |           |         |            |
| coap-option(11)     | var      | dw | "c"       | equal   | not-sent   |
| coap-option(12)     | var      | dw | 140       | equal   | not-sent   |
\---------------------+----------+----+-----------+---------+------------/

Residue (Down): udp-app-port(16b) | coap-tkl(4b) | coap-mid(16b) |
                coap-token(var)
  Total: 36b+var
Residue (Up):   udp-app-port(16b) | coap-tkl(4b) | coap-code(8b) |
                coap-mid(16b) | coap-token(var)
  Total: 44b+var
]]></artwork>
        </figure>
        <t>The request side of this rule does not change from Rule 0: the CoAP
CODE is fixed to 7 (iPATCH), and the request carries the SID(s) being
updated together with their new values, using the same Content-Format
140. The response, however, is simpler than a FETCH response: it is
only a success/failure notification, with no CORECONF structure in the
payload, so CODE is left uncompressed (<tt>value-sent</tt>) rather than
mapped as in Rule 0 — it carries 2.04 Changed on success, or a CoAP
error code (e.g. 4.00, 4.04) when the iPATCH itself fails; either way
the message still has the same structure (a bare CODE, no payload), so
this rule covers both cases. Rule 3, which is identical in both
directions (DI <tt>bi</tt> throughout, including CODE), is used instead when
the message does not follow this structure at all — an empty/generic
message such as an ACK with no code or an RST, in either direction. An
unreachable device is signaled out-of-band by an ICMPv6 destination
unreachable message, handled by Rule 4.</t>
        <t><xref target="fig-schc-rule-1-example"/> applies Rule 1 to the sensor-alert
configuration of <xref target="fig-alert-config"/>: the request, 83 bytes
uncompressed, crosses the constrained link as a 32-byte compressed
message (5-bit RuleID + 52-bit residue + the 24-byte iPATCH payload,
padded to a byte boundary). The response — 2.04 Changed, with no
payload — collapses to 9 bytes (5-bit RuleID + 60-bit residue,
padded), against 54 bytes uncompressed.</t>
        <figure anchor="fig-schc-rule-1-example">
          <name>Rule 1 applied to the sensor-alert configuration example</name>
          <artwork align="left"><![CDATA[
Device            SCHC                SCHC                App

Alert configuration -- request (Down):
|                 |                   |                   |
|                 |                   |<---- Pkt 83B -----|
|                 |  Rule 1/5         |                   |
|                 |  residue: 52b     |                   |
|                 |  payload: 24B     |                   |
|                 |<- 32B (pad 7b) ---|                   |
|<--- Pkt 83B ----|                   |                   |
  IPv6(40B)+UDP(8B)+CoAP(35B) = 83 B
  iPATCH /c  MID=42312 Token=2490
  Payload: {[62068,..]: {...}} (24 B)

Alert configuration -- response (Up):
|                 |                   |                   |
|---- Pkt 54B --->|                   |                   |
|                 |  Rule 1/5         |                   |
|                 |  residue: 60b     |                   |
|                 |  payload: 0B      |                   |
|                 |--- 9B (pad 7b) -->|                   |
|                 |                   |----- Pkt 54B ---->|
  IPv6(40B)+UDP(8B)+CoAP(6B) = 54 B
  2.04 Changed  MID=42312 Token=2490
  Payload: (none)
]]></artwork>
        </figure>
      </section>
      <section anchor="rule-2-used-for-notitifications-observe">
        <name>Rule 2: Used for notitifications (observe)</name>
        <figure anchor="fig-schc-rule-2">
          <name>SCHC Rule 2 (RuleIDLength=5), with residue format</name>
          <artwork align="left"><![CDATA[
/---------------------+--------+----+-----------+---------+------------\
| FID                 | FL     | DI | TV        | MO      | CDA        |
+=====================+========+====+===========+=========+============+
| ipv6-version        | 4      | bi | 6         | equal   | not-sent   |
| ipv6-trafficclass   | 8      | bi | 0         | ignore  | not-sent   |
| ipv6-flowlabel      | 20     | bi | 0         | ignore  | not-sent   |
| ipv6-payload-length | 16     | bi |           | ignore  | compute    |
| ipv6-nextheader     | 8      | bi | 17        | equal   | not-sent   |
| ipv6-hoplimit       | 8      | bi | 255       | ignore  | not-sent   |
| ipv6-devprefix      | 64     | bi | dddd::/64 | equal   | not-sent   |
| ipv6-deviid         | 64     | bi | ::6/64    | equal   | not-sent   |
| ipv6-appprefix      | 64     | bi | aaaa::/64 | equal   | not-sent   |
| ipv6-appiid         | 64     | bi | ::2/64    | equal   | not-sent   |
| udp-dev-port        | 16     | bi | 5683      | equal   | not-sent   |
| udp-app-port        | 16     | bi |           | ignore  | value-sent |
| udp-length          | 16     | bi | 0         | ignore  | compute    |
| udp-checksum        | 16     | bi | 0         | ignore  | compute    |
| coap-version        | 2      | bi | 1         | equal   | not-sent   |
| coap-type           | 2      | bi | 0,1       | match-  | mapping-   |
|                     |        |    |           | mapping | sent       |
| coap-tkl            | 4      | bi | 0         | ignore  | value-sent |
| coap-code           | 8      | dw | 5         | equal   | not-sent   |
| coap-code           | 8      | up | 69        | equal   | not-sent   |
| coap-mid            | 16     | bi | 0         | ignore  | value-sent |
| coap-token          | length | bi |           | ignore  | value-sent |
|                     | -byte( |    |           |         |            |
|                     | 16)    |    |           |         |            |
| coap-option(6)      | var    | bi |           | ignore  | value-sent |
| coap-option(11)     | var    | dw | "s"       | equal   | not-sent   |
| coap-option(12)     | var    | bi | 140       | equal   | not-sent   |
| coap-option(17)     | var    | dw | 140       | equal   | not-sent   |
\---------------------+--------+----+-----------+---------+------------/

Residue (Down): udp-app-port(16b) | coap-type(1b) | coap-tkl(4b) |
                coap-mid(16b) | coap-token(var) |
                coap-option(6)(var)
  Total: 37b+var
Residue (Up):   udp-app-port(16b) | coap-type(1b) | coap-tkl(4b) |
                coap-mid(16b) | coap-token(var) |
                coap-option(6)(var)
  Total: 37b+var
]]></artwork>
        </figure>
        <t>This rule is the same as Rule 0, except that the Uri-Path targets "/s"
instead of "/c", and an Observe option (option 6) is present in both
directions to carry the subscription/notification counter. CODE is
fixed per direction, not mapped: FETCH (5) Down for the subscription
request, 2.05 Content (69) Up for the acknowledgment and every
notification, so it contributes no residue at all. TYPE is restricted
to a two-value mapping, CON (0) or NON (1): an ACK or RST — which
carries no CODE and no Observe option — does not match this rule's
fixed fields and falls through to Rule 3 instead.</t>
        <t><xref target="fig-schc-rule-2-example"/> applies Rule 2 (and Rule 3 for the ACK)
to an Observe subscription on "/s" with three notifications: the first
two are Non-Confirmable, the third is Confirmable and is acknowledged
by an empty ACK, which does not match Rule 2's fixed CODE/Observe
structure and therefore falls through to Rule 3.</t>
        <figure anchor="fig-schc-rule-2-example">
          <name>Rule 2 applied to an Observe subscription with two NON and one CON notification</name>
          <artwork align="left"><![CDATA[
Device            SCHC                SCHC                App

1. Subscribe -- FETCH /s + Observe:0 (Down):
|                 |                   |                   |
|                 |                   |<---- Pkt 71B -----|
|                 |  Rule 2/5         |                   |
|                 |  residue: 53b     |                   |
|                 |  payload: 9B      |                   |
|                 |<- 17B (pad 6b) ---|                   |
|<--- Pkt 71B ----|                   |                   |
  IPv6(40B)+UDP(8B)+CoAP(23B) = 71 B
  FETCH  MID=42311 Token=248f  Observe:0
  Payload: [62048, 10000001] (9 B)

2. Subscription ack -- Observe:0, NON (Up):
|                 |                   |                   |
|---- Pkt 59B --->|                   |                   |
|                 |  Rule 2/5         |                   |
|                 |  residue: 53b     |                   |
|                 |  payload: 1B      |                   |
|                 |--- 9B (pad 6b) -->|                   |
|                 |                   |----- Pkt 59B ---->|
  IPv6(40B)+UDP(8B)+CoAP(11B) = 59 B
  2.05 Content  MID=65148 Token=248f  Observe:0
  Payload: {} (1 B)

3. Notification #1 -- Observe:1, NON (Up):
|                 |                   |                   |
|---- Pkt 75B --->|                   |                   |
|                 |  Rule 2/5         |                   |
|                 |  residue: 61b     |                   |
|                 |  payload: 16B     |                   |
|                 |-- 25B (pad 6b) -->|                   |
|                 |                   |----- Pkt 75B ---->|
  IPv6(40B)+UDP(8B)+CoAP(27B) = 75 B
  2.05 Content  MID=65149 Token=248f  Observe:1
  Payload: 16 B

4. Notification #2 -- Observe:2, NON (Up):
|                 |                   |                   |
|---- Pkt 75B --->|                   |                   |
|                 |  Rule 2/5         |                   |
|                 |  residue: 61b     |                   |
|                 |  payload: 16B     |                   |
|                 |-- 25B (pad 6b) -->|                   |
|                 |                   |----- Pkt 75B ---->|
  IPv6(40B)+UDP(8B)+CoAP(27B) = 75 B
  2.05 Content  MID=65150 Token=248f  Observe:2
  Payload: 16 B

5. Notification #3 -- Observe:3, CON (Up):
|                 |                   |                   |
|---- Pkt 75B --->|                   |                   |
|                 |  Rule 2/5         |                   |
|                 |  residue: 61b     |                   |
|                 |  payload: 16B     |                   |
|                 |-- 25B (pad 6b) -->|                   |
|                 |                   |----- Pkt 75B ---->|
  IPv6(40B)+UDP(8B)+CoAP(27B) = 75 B
  2.05 Content  MID=65151 Token=248f  Observe:3
  Payload: 16 B  -- CON, needs an ACK

6. ACK for #3's CON, empty (Down, Rule 3):
|                 |                   |                   |
|                 |                   |<---- Pkt 52B -----|
|                 |  Rule 3/5         |                   |
|                 |  residue: 46b     |                   |
|                 |  payload: 0B      |                   |
|                 |<-- 7B (pad 5b) ---|                   |
|<--- Pkt 52B ----|                   |                   |
  IPv6(40B)+UDP(8B)+CoAP(4B) = 52 B
  Empty ACK  MID=65151  TKL=0
  Payload: (none)
]]></artwork>
        </figure>
        <t>The notification stream ends when the client explicitly deregisters
with a FETCH carrying the same token and an Observe option set to 1,
when the client sends a RST, when a Confirmable notification receives
no ACK after a number of retransmission attempts, or when an ICMPv6
destination unreachable message is received for the client — all of
which the device
interprets as a lost subscriber.</t>
      </section>
      <section anchor="rule-3-empty-messages-eg-ack-with-empty-code-or-rst">
        <name>Rule 3: Empty messages (e.g., ACK with empty code, or RST)</name>
        <figure anchor="fig-schc-rule-3">
          <name>SCHC Rule 3 (RuleIDLength=5), with residue format</name>
          <artwork align="left"><![CDATA[
/---------------------+----------+----+-----------+---------+------------\
| FID                 | FL       | DI | TV        | MO      | CDA        |
+=====================+==========+====+===========+=========+============+
| ipv6-version        | 4        | bi | 6         | equal   | not-sent   |
| ipv6-trafficclass   | 8        | bi | 0         | ignore  | not-sent   |
| ipv6-flowlabel      | 20       | bi | 0         | ignore  | not-sent   |
| ipv6-payload-length | 16       | bi |           | ignore  | compute    |
| ipv6-nextheader     | 8        | bi | 17        | equal   | not-sent   |
| ipv6-hoplimit       | 8        | bi | 255       | ignore  | not-sent   |
| ipv6-devprefix      | 64       | bi | dddd::/64 | equal   | not-sent   |
| ipv6-deviid         | 64       | bi | ::6/64    | equal   | not-sent   |
| ipv6-appprefix      | 64       | bi | aaaa::/64 | equal   | not-sent   |
| ipv6-appiid         | 64       | bi | ::2/64    | equal   | not-sent   |
| udp-dev-port        | 16       | bi | 5683      | equal   | not-sent   |
| udp-app-port        | 16       | bi |           | ignore  | value-sent |
| udp-length          | 16       | bi | 0         | ignore  | compute    |
| udp-checksum        | 16       | bi | 0         | ignore  | compute    |
| coap-version        | 2        | bi | 1         | equal   | not-sent   |
| coap-type           | 2        | bi |           | ignore  | value-sent |
| coap-tkl            | 4        | bi |           | ignore  | value-sent |
| coap-code           | 8        | bi |           | ignore  | value-sent |
| coap-mid            | 16       | bi |           | ignore  | value-sent |
| coap-token          | length-  | bi |           | ignore  | value-sent |
|                     | byte(16) |    |           |         |            |
\---------------------+----------+----+-----------+---------+------------/

Residue (Down): udp-app-port(16b) | coap-type(2b) | coap-tkl(4b) |
                coap-code(8b) | coap-mid(16b) |
                coap-token(var)
  Total: 46b+var
Residue (Up):   udp-app-port(16b) | coap-type(2b) | coap-tkl(4b) |
                coap-code(8b) | coap-mid(16b) |
                coap-token(var)
  Total: 46b+var
]]></artwork>
        </figure>
        <t>Beyond empty ACKs and RSTs, this rule is also the fallback for an
error response to a FETCH (Rule 0) or an Observe exchange (Rule 2)
whose CODE is not 2.05 Content: since TYPE, TKL, CODE and MID are all
left uncompressed here, any CoAP error code (e.g. 4.04, 4.05, 5.00)
matches, and any diagnostic payload that may follow the header is
carried unchanged, exactly as for a normal FETCH response.</t>
      </section>
      <section anchor="rule-4-icmpv6-destination-unreachable-any-code">
        <name>Rule 4: ICMPv6 destination unreachable (any code)</name>
        <figure anchor="fig-schc-rule-4">
          <name>SCHC Rule 4 (RuleIDLength=5), with residue format</name>
          <artwork align="left"><![CDATA[
/---------------------+--------+----+-----------+---------+------------\
| FID                 | FL     | DI | TV        | MO      | CDA        |
+=====================+========+====+===========+=========+============+
| ipv6-version        | 4      | bi | 6         | equal   | not-sent   |
| ipv6-trafficclass   | 8      | bi | 0         | ignore  | not-sent   |
| ipv6-flowlabel      | 20     | bi | 0         | ignore  | not-sent   |
| ipv6-payload-length | 16     | bi |           | ignore  | compute    |
| ipv6-nextheader     | 8      | bi | 58        | equal   | not-sent   |
| ipv6-hoplimit       | 8      | bi | 255       | ignore  | not-sent   |
| ipv6-devprefix      | 64     | bi | dddd::/64 | equal   | not-sent   |
| ipv6-deviid         | 64     | bi | ::6/64    | equal   | not-sent   |
| ipv6-appprefix      | 64     | bi | aaaa::/64 | equal   | not-sent   |
| ipv6-appiid         | 64     | bi | ::2/64    | equal   | not-sent   |
| icmpv6-type         | 8      | bi | 1         | equal   | not-sent   |
| icmpv6-code         | 8      | bi |           | ignore  | value-sent |
| icmpv6-checksum     | 16     | bi | 0         | ignore  | compute    |
| unused              | 32     | bi |           | ignore  | not-sent   |
| ipv6-version        | 4      | bi | 6         | equal   | not-sent   |
| ipv6-trafficclass   | 8      | bi | 0         | ignore  | not-sent   |
| ipv6-flowlabel      | 20     | bi | 0         | ignore  | not-sent   |
| ipv6-payload-length | 16     | bi |           | ignore  | compute    |
| ipv6-nextheader     | 8      | bi | 17        | equal   | not-sent   |
| ipv6-hoplimit       | 8      | bi | 255       | ignore  | not-sent   |
| ipv6-devprefix      | 64     | bi | dddd::/64 | equal   | not-sent   |
| ipv6-deviid         | 64     | bi | ::6/64    | equal   | not-sent   |
| ipv6-appprefix      | 64     | bi | aaaa::/64 | equal   | not-sent   |
| ipv6-appiid         | 64     | bi | ::2/64    | equal   | not-sent   |
| udp-dev-port        | 16     | bi | 5683      | equal   | not-sent   |
| udp-app-port        | 16     | bi |           | ignore  | value-sent |
| udp-length          | 16     | bi | 0         | ignore  | compute    |
| udp-checksum        | 16     | bi | 0         | ignore  | compute    |
| payload             | var    | bi |           | ignore  | not-sent   |
\---------------------+--------+----+-----------+---------+------------/

Residue (Down): icmpv6-code(8b) | udp-app-port(16b)
  Total: 24b
Residue (Up):   icmpv6-code(8b) | udp-app-port(16b)
  Total: 24b
]]></artwork>
        </figure>
        <t>ICMPv6 Type is fixed to 1 (Destination Unreachable), but Code is left
uncompressed so that this rule covers every Destination Unreachable
reason (0: no route, 1: administratively prohibited, 3: address
unreachable, 4: port unreachable), not just the port-unreachable case
that triggers when the CORECONF UDP endpoint itself is down.</t>
      </section>
    </section>
    <section anchor="annex-private-sid">
      <name>Private SID Translation</name>
      <t><xref target="I-D.toutain-core-private-sid-translation"/> defines a mechanism for
translating official YANG SIDs into small negative integers ("private
SIDs"), each of which SHOULD end up encoding in a single CBOR byte
(range -1 to -24). Two modules are in use in this document: coreconf-m2m
(<tt>entry_point</tt> = 62000, official range of 400 SIDs) and atmos
(<tt>entry_point</tt> = 10000000, official range of 100 SIDs). Each module is
assigned a translation <tt>offset</tt>: the first module uses <tt>offset</tt> = 0,
and the second uses <tt>offset</tt> equal to the negative of the first
module's official range size, so that the two private ranges never
overlap.</t>
      <t>Which module goes first matters: the first module gets the deepest,
single-byte-encoding range, so it should be the one whose SIDs appear
most often on the wire. Applying the allocation strategy in
<xref target="I-D.toutain-core-private-sid-translation"/> to the resource discovery
exchange of <xref target="fig-resource-discovery"/> — which references fourteen
distinct atmos identityref values (one per discovered transducer)
against a single coreconf-m2m absolute SID (62002, the "/bootstrap"
node, appearing twice — once in the request, once as the response's
outer key) — the module with the higher count of on-wire absolute-SID
occurrences, atmos, is given <tt>offset</tt> = 0, and coreconf-m2m is shifted
by <tt>offset</tt> = -100. This is a property of the traffic pattern, not of
the modules themselves: a session dominated by coreconf-m2m structural
exchanges (e.g. repeated FETCH/iPATCH on notification-parameters)
would favor the opposite ordering.</t>
      <t>For SCHC to actually perform this compression, Rules 0, 1, and 2
(<xref target="annex-schc-rules"/>) each need an additional entry covering the CoAP
payload, using the <tt>sid-translation</tt> CDA defined in
<xref target="I-D.toutain-core-private-sid-translation"/> together with the
"fl-remaining" Field Length function <xref target="SCHC-TOWARD-9363BIS"/> — which
consumes whatever bytes are left in the packet, since the payload has
no fixed length. Since the Function Arguments MAY be repeated, both
models are covered by a single entry, shown in
<xref target="fig-sid-translation-entry"/>: <tt>entry_point</tt> = 10000000 (atmos) with
<tt>offset</tt> = 0, followed by <tt>entry_point</tt> = 62000 (coreconf-m2m) with
<tt>offset</tt> = -100.</t>
      <figure anchor="fig-sid-translation-entry">
        <name>Payload entry added to Rules 0, 1 and 2 for private SID translation of both models</name>
        <artwork align="left"><![CDATA[
/------------+--------------+----+-----+---------+-------------------\
| FID        | FL           | DI | TV  | MO      | CDA               |
+============+==============+====+=====+=========+===================+
| payload    | fl-remaining | bi |     | ignore  | sid-translation(  |
|            |              |    |     |         | 10000000, 0,      |
|            |              |    |     |         | 62000, -100)      |
\------------+--------------+----+-----+---------+-------------------/
]]></artwork>
      </figure>
      <section anchor="worked-example-atmos-first">
        <name>Worked Example (atmos first)</name>
        <t><xref target="fig-private-sid-example"/> shows <xref target="fig-resource-discovery"/> translated
with atmos <tt>offset</tt> = 0 and coreconf-m2m <tt>offset</tt> = -100. Delta keys
(the structural fields 7, 8, 6, 1, and 3 relative to their parent) keep
their magnitude but flip sign, per
<tt>p(child) - p(parent) = -(child - parent)</tt>; the coreconf-m2m absolute
SID 62002 becomes -103; and every atmos identityref value becomes its
private SID in the -2 to -17 range.</t>
        <figure anchor="fig-private-sid-example">
          <name>Resource discovery of fig-resource-discovery, translated with atmos offset=0 and coreconf-m2m offset=-100</name>
          <artwork align="left"><![CDATA[
  Request payload, original (3 bytes):
    19 F2 32                       # unsigned(62002)

  Request payload, translated (2 bytes):
    38 66                          # negative(-103)

  Response payload, original (118 bytes):
    {62002:
      {7: 1788334280, 8: 30172, 6: 120,
       1: [{3: 10000010}, {3: 10000008}, {3: 10000011}, {3: 10000002},
           {3: 10000014}, {3: 10000016}, {3: 10000015}, {3: 10000012},
           {3: 10000001}, {3: 10000013}, {3: 10000003}, {3: 10000009},
           {3: 10000006}, {3: 10000004}]}}

  Response payload, translated (61 bytes):
    {-103:
      {-7: 1788334280, -8: 30172, -6: 120,
       -1: [{-3: -11}, {-3: -9}, {-3: -12}, {-3: -3},
            {-3: -15}, {-3: -17}, {-3: -16}, {-3: -13},
            {-3: -2}, {-3: -14}, {-3: -4}, {-3: -10},
            {-3: -7}, {-3: -5}]}}
]]></artwork>
        </figure>
        <t>reference-epoch (1788334280), uptime (30172), and minimal-step (120)
are plain integers, not SIDs, and are therefore left untranslated.
Overall, this exchange shrinks from 121 bytes (3 + 118) to 63 bytes
(2 + 61), a reduction of 48%, entirely attributable to the fourteen
atmos identityref values collapsing from 5 bytes to 1 byte each.</t>
      </section>
      <section anchor="second-example-time-series-subscription-and-notification">
        <name>Second Example: Time-Series Subscription and Notification</name>
        <t><xref target="fig-notification-observe"/> exercises the opposite balance: it
references coreconf-m2m absolute SID 62048
("/history/time-series/values") twice (once in the FETCH+Observe
request, once as the notification's outer key) against a single atmos
identityref value (10000001, air-temperature) in the request. The
maximum delta any coreconf-m2m SID currently reaches from its
<tt>entry_point</tt> is 88 (<xref target="annex-sid"/>), so shifting coreconf-m2m from
<tt>offset</tt> = 0 to <tt>offset</tt> = -100 changes its encoded deltas from
0-88 to 100-188 — both comfortably inside CBOR's single 2-byte bracket
(24-255). Putting coreconf-m2m second therefore costs nothing here,
while atmos still gains its full 5-to-1-byte improvement:</t>
        <figure anchor="fig-private-sid-example-2">
          <name>Time-series subscription and notification, translated with atmos offset=0 and coreconf-m2m offset=-100</name>
          <artwork align="left"><![CDATA[
  Request payload, original (9 bytes):
    82 19 F2 60 1A 00 98 96 81
    # [62048, 10000001]

  Request payload, translated (4 bytes, atmos offset=0,
                                coreconf-m2m offset=-100):
    82 38 94 21
    # [-149, -2]

  Subscription ack, original and translated (1 byte, unchanged):
    A0                              # {}

  Notification payload, original (16 bytes):
    {62048: [189, 14, -3, 1, 5, 7, 3, 2, 1, 2]}

  Notification payload, translated (15 bytes):
    {-149: [189, 14, -3, 1, 5, 7, 3, 2, 1, 2]}
]]></artwork>
        </figure>
        <t>The history values themselves (189, 14, -3, 1, 5, 7, ...) are a
delta-encoded time series, not SIDs, and are left untranslated. This
exchange shrinks from 26 bytes (9 + 1 + 16) to 20 bytes (4 + 1 + 15),
a 23% reduction — smaller than the first example's 48%, since only one
atmos SID is involved here, but still a clear net gain, and with
coreconf-m2m paying no penalty for going second. Across both examples,
putting atmos first is never worse and sometimes substantially better,
confirming it as the right default ordering for this document's
traffic mix.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This work has been supported by the SCHC Chair from IMT Atlantique and Afnic.</t>
      <t>Claude (Anthropic) assisted with editing this document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963IjSXYm+D+eIhYlbRHdAEiQeWEiu5RiMbOqOZu3TrJU
0va0ikEgSIYSQKARgWSys3JtzNZMv9fG5kH0DHqBfQc9yZ7vXPwSCICs6mqN
ZmZp1Z0k4OHhfvz4uV/6/X5SF/U0H6Wd4zfvXhy/ef1Nelku01fZ+LqY5/26
7Ouv6XE5m63mxTiri3LeSbKLi2X+gZ4bl8t8XM4v+7P9WSehr/Orcnk7Sov5
ZZkUi+UorZerqt7f23uyt58kk3I8z2b0wskyu6zpBas6K+b9er9eXvXDufp7
w6RaXcyKqqIX1rcLeubk3dk3yXw1u8iXo2RCrxolNLzK59WqGqWX2bTKE1rT
QZJkyzzT8Tfl8v3VslwtRukZ7eQKm+Jf0nd5lWfL8XX6Lb5Od872z959202S
9/ktPTQZJWnaTw0u8kf56oR/+Yej19/KJ1+/eadfHb3lX17tv+J/T8oz/hcr
rJe0yXySTvIPxTiv+PPTk+dJ8iGfr3K8yFaIJdCfst94gfTxLCumBFAA62+L
ZX05KJdXeLior1cXdBjTer6/vxsfSZKt6utyybuh/6Xp5Wo6lTN4ma2W+bxO
z+QU+FuaMZsXf+JjJgi+OkuP6mk2r4s/rnIekMsipvLsQE/wb4tZ3c/cyMHl
Mknm5XJG83zgDb775vjx/sP9Ec3whQELnz15uCefAaTpcDCUzw8fDfXz4+fP
X8pnT4aPHvrP0mwyKbDKbAoY18tympaLfJnV5bLSSR7vP5AHTo9/e6yfHdJn
Ot/+wwf+3X09Snxx8Ogg+IJOKt3BDLLGWTlZTfMuDT3pPx8UeX3JiEv/NytG
SQLEj/d9ePD4kUz38u33R6/T8kO+/FDkN7arx08CCPBRAztxD7/Ny6tltrgu
xunLUq5eZUt8PJSn3i6LD3QV0hfzOl8ulkWVp6/5ihgQnjzQ+f0GHx880RX9
p9M3r9NX+fIqT99m9fhan3mwf6iAy+evDPz7B3p8r/Matyo9y6f5LK+Xt3Zm
B+FOTlcX1XhZXBDevy7r4rLwG4gBVxV81/Dh1WpSKDGgaz2b9rPKUQUbc1Es
31+X0z/1b7O50Ix+bQuxMUZXbP5+Ph+XEwJr64CFgJAH0lWdV1NBfxqLY++f
vfn+6N3zPtDi65PTEV8Do5tn5U22nGD7Kb6/KIgSHV/TyvIqrcu0vs5TjzrP
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
6gc+qy4/m2icWfCFK3tJZJM0Pu1hKQBBf4IphwE7Y5u0S4CEnIrnw9xoFzli
fnGS6uqSlWnIH9p/L8qqWG//XV0Xl0p9+AJ+ibbKArYllETXpxudfzVFPEHk
7zRbWOqxIJ2hAq3VZuIZBun33LnJFvRVuiepG5wLTTPH4LC+g/2hEJA5/Dpa
962/byVNUkTXuymnMPZBVydOwCk3hPdEmOvxQKnKRR4uT3PboU+Tzs6kgANe
AQoQDcHKeb4Gi8vVUgNe6tJhXVKjFiKsuD1Hi1nBdpyLkGg1zaweKteiBCpK
wjhdcmkB5bA4Ps5B+jXsOv7Sv/ru9MxXLJNdxCCMzh+RNQIE7UASEju5+KgQ
W6EM57wm5GdCzgZfuWpZo/Wou79c2Hf6gStYIn0e5isiT+8LVPshwttA1So8
AosdGpl/xb+AF+sszy7ISHBtdRWk1WrfRy3cI6hBx5ZY+1nN0A/4hVbz6aXW
kVPqGxTzuJbBl5W16aoG6UmjA2rBdHfu69LOJ9lyUvzJ0sDSkxdn31j+Ncyi
zEFuCvhaC1dYgaUkwpUKtZEsSmp9wYktWHqbwBmeL5lYYrO0jEm5dCUIpKdL
/hHGd+uIkhCbJ/knn6TargIp4Fx0dZnBuXRB9OW95Lm9VVx/wTn/SyTuv7Yg
NWC/tMg7eDwkSi/2TjhkCu5Hji6EJMghnfTsevNG0tPfvvnu5fPIL6wd0BiX
lR4rVd0hFUudDkoyJnm+AJXkBXV9EcZ1BBIgC4cF9UB8MzsuHA52EaCVkZj2
MeRonz8nkBqr1BW4wMwEdTplyXoQr6yzTDpE4ehtyBKglpe0ap6D24CLD8c5
uCbpTnRhe+62dhMO7uYC2DOUmqzU3V2wX0T5pDoOjdhckEbzXnq43PoVcEmL
yxpr0GiD498eO9aGqSwYTg9AC01ki/6Mq8FUfZUm6bgdDKqE++0wlVQzIlNr
dTfCHskOPc4Qq6Q5j9aJZlRCGMlyBXecBiqz408ksoZlVRcpqTW0du0U+Xj/
AXqn2NFV4+txn2d0rSU5v09iCTU5FPVvV+YD1OobiXTgwdIuChH7JRPfXgxy
2dxWuvOO59njz4YoAa3cD/NLWKNLo4/KafYkXFOOqVnWmGdN97uiLiBUfoYa
wJnEJ7DoLKvNEYxIwhVJiFe59gu2vZrwBQpobUrFVb1i2V2nAJKc/cPbF7yD
4zfPX3hEktWQ6Br7uyFb8nsbXX940QddR3flRQDbyfGrt4nCsSdNzaWNqyu/
7HUgLTQmyblgejkHfIKxyhsedFVuRxSUiO1R4AUH2XAIuxNUEH5TEt0TpYVe
mc1Q6wBxRaBthGNzZLJma9qHKiW+sbVgCwkHkxJtqfnKiMRAp0LrGg5SMZ9X
cMyAwDgNEuqKsJm57yq9zLVFsbM8QBUgVse9wF1taMiEZUn0fXmBYgKSgyFx
KlJs1xSa/QE7a1myxzG8fsG/W4EASZRfpn//6qUwB8alYGpOZ5ZVECmeEwpx
TI7pkWvq8ExDcYJ+3daBa5AcDAI1owrXa5Q6/rQBDcnmzmqsRyU6dcXYypxS
7l5vCzUUXmS32hcLs8gm4XUdlxWRwQdyY8LFWy0esfZIMHSk2Upex9LsEJi2
uiVZaUbH/zDY8Moiev3swST0Br4BoIYWSDRIHg3S19LImVbCPMJdfIEYOqSy
5ID4Ni7y4wgDx7kVjELZqi7xHmGVBpJM9ClRlKDhD5LH/L6QDjIft8WxL7LZ
O1tOrmRN5Aal7dJU7CelVSW8DUK/kkMSmLwaKZGE4XUUFI8ofYn4Ji1qQ0ow
30e8pYEdqsoHUNW0WCkVkumxAA54mqaHHYjxah7fa+SofM25TL7pW0N86Hnk
m2XzFSq3EONeihIOgkMMZLG6mBbVtUvAsiddba7A8hL4gnsqiBOi6xtM+0aU
J6snjeXyNi9yM22UJVOk6xWtDEUrkgtGDToUJpSnOWmhAPsxpPqJxdP5gMIw
yI5ZAnMJViuQU4zHUUCSCYh0Hkyfn708Jf77jBjwo4MHj4nV0mvfnGJG/fjw
0fAACaUn8xSVLKpxPiedvbT6DES9IPEQe6VFZ6Dx0EsvqlyDuIhbrEiuEyos
cXqEikHDc4S0ztnShD2eHL0+au4vhZDDBP2VKFYm5tYtPMP3HRANDTiE/Vo3
QubmghydcE6+Pp1EHqf7yjLJ4ycP9zhG5Uf+PjSZ8vhFFrtXt/78SHI4F1f8
kTbAgX8tD/+Y/DiKjLijxt/3+XHPbHt4BPN1dD9oYavlfARjmDQYqkYfZ9PR
vBrdkjg4isf6XY3l7x/T+CDiXZk97h0rHEdTy4FePz6NxTTzh9oqTCEhMYAF
7L4U1jj7+rlFFFSkqEEIHe7t9aQEuiv31mrkgzXIl6jVW0yo6e+LtHFwHa7D
ZXI7FPeCJJv/kwiLAZbR/ARljgvgyF9BszNkI336QkRczvNWX708NIpOhKjd
r/v9ZekLlSRsrZcPl4ZE/XxRjq+fEZxXBJNHD8JBqwVXrA9/1gcRo0Kx4z7M
3s/8oIP9cJBrvf6r9PfwkP0hMc+BfM9es7Wf0EYdj4dzw7WbeGbjwSk4uC4c
6ryv0Xgs8bAxcq2PBU+ck4qi1ERBepM28u79Tm+iSg/yufvKw/xyKZ3df4wH
ZIhGmLPKyUzrmd9U+qn5ZfX5WcsMNLqclzMw/f5FObl91gDLj/FSJ7Cd6oTh
gHRtDLGyVbig1tFckKGP8FICD7871VrYhjONB665LW30xPoDMnTHoNpt7nu0
k0+nxaIqi0k3/Mo9CqtWvdLzbF2QH0qqhhu7faisXZGvdSivbYxeOFWRzbut
EPjosPdOYN3ef+iftg+VQR9yAqmE6jW29qE/hzttIwxsFKx7m4Fqo1aLjUCS
Ia75hl81Mw3E3fWJWvYxoLn4bFpM+iuiD9NndzwjD0CMDaGyRjEMKCwdPrtj
mCu9vXy2bVhg6nq2ZVgoTLZSMx0GOai5h/Vh11wguX8R4UvLFhD7MRWLL0Mr
YgJ6Mr5WahKgl/84oOdpOKCVnvNPTNT9Q6WLWHAfO/bBpq3Gxm2hjaEtuOQ3
tWmsdpbBIzG5D5cXRco3ZiImGC1vwwtn2cd7DcuzaLqNwxCf/+yuYRy/fw9o
hBH+z9bH6S1q7zLXnO3Gpf0GX7g3iSHHLYkElGmezVuG3qSBVGFrZ8lifaTj
88/cyMPWgXQIfY3+f7Z9Sm7vRoJcUU7uGGlprrpU+7OPe7BxEYvsdlpmG6bW
7WsfLLTXvgcot0Gy7odIumXT/RBLN4+7htBA6ljhoNgO7gmBOp8bbDZtlLNA
+pYFYjMOH4Xo1/+YBp0XE4SCL8aV1Jlp/TqyTPpx8wg5HSinxszWYRlRDG34
F1G+TbJsk9iF46RB0a8MzHrVwhEMjnk2Db5Iw9X2JTTdI3w0RxoQrmXtKPzW
oWZDRkRNkwgI6NowUvfNuVRrDGENLG0MYI3Qy2vjtqys1rDe43qyNiw0bNKm
79fCfGBmyJfcjYRDPRDAH1kFTKuCDGFa1W9gB0+/fvHtyevTv+Hw9Tid7W9d
qvJwgOc6qofFijESn/Ft3+xOw8EQ5eTnzgbQua/i3MFzYQOHp8ByMf6lrKGG
2odmcut4+kZ79TrzQefdN8fpk+HjJzzv54TTRK6yefEneb4DlyV/hwK1RGn4
+Q4b8uZ5nb6AMzuXSC4k4aJ3GU27g8e6crSWzY/yT1gg11fq8LJDLyDP27S6
i3nbfBYwHx2Xr07Sm1xyN60QlbyIDQEWKyQeD7aVmU0LkTY13Jj8AkytkVQI
g0XY2EBWtcw/SOcGf7YKx+Z6acWvSinww63uloGAwG7C8jL4zmQbpL+9F1s0
J7PwD2ygGpZk47SpIadrRFV5/Tt8Fp/NI56c9KaYT9goO2GLLtwPvla7TzSM
GvuJvR8/87yq1ao901W4RQER1ZEVpaBOi8uchSkuo6gTwbguCUFcVlM6V9Ia
6IzoCFxTa4K1JrNFW+NEGp3pTByuNMq8hrrGAknlgAxbahpnd9DffzLwqN34
9rC/f7j5ZN/lLhv9S8ab6svgMOsy/dJZVb4MHDRI+HayUIh7jHUTiEozNvtw
Z+GsDorIAnxuw6eLaVH7qAyxMgEXRrHlo9di3YiOoGnRYISYlehnpCi6oR2C
egg8Utyku26xu86cIwi6w/6j9/mtpqmiBJhz9VaOTfjiZFLi5KP0RJUuxGbM
l9zfcB2SmNfzszgoRgCU6LY6CnQQV3SaXdIjN9lyUrlZgiQl5z7yb0WQElTL
mdKLHXd93fMOWXtxr2MvE3c1oIeG3lbqk8HPBoi7w/9tCZjGApEs8o4Wz+HJ
bxoasu+mNzoY5yrNFtw9ypsrmXeLR4luHPuJ3L2orCCpdICwKY7fvN59/eY1
IeMkl7ZQN1osQCIMMUecsStZHlvv7oNtdxcILvIGg41xFCW/n9L602wqbRlv
wvZZYccxt3XDvLCvqsS1TGsUinflbyojrVI0il4s2G8zLXMpRo8htA62Nrvj
PpoAZA17rPYd0fgXZlwOzE81nJMHhojlovX4lkuapORIs/2Ztu1eypwLbk0X
sOL3z0pLlKVYldNs2V8SoxQHm83CxGdR1OZ2azZtsSX0r1ezYhJen4uMDoar
+/Y5yIOHf8hIkAn+Bh+Tki76u4vHcPPwx1eriiscLuvrfvgMrFPRB7CBvFcN
102RoUTuVd7HIctx1wUqg3zsl8vC3Iy99Db60x62jWkEerx9LvxQVf1rETG6
XioIxMPgzjoPH6ht2GLnafwIcJc9jqGkw0UKDBHaz/LWioFLd4TaRYjpayop
kT5xWGJc0DfJAfcR16//zHe7qhuG+XBzLYxqR6/+jYaYoLYZl2LnJm7dkWTc
804RFuR2V4pDsnYN625VFPGk3BrBcRFP+8PnYelMviK8dpBzrt+IFUQwjO5t
+Bpz68Sv8u9QDy+nBd96qGw4iR3OH5BWRymHkGQmlTWP16GPv7ECE8aOaL3S
wgP1ZUQxQlU5IjQu7L7h1/A0xybZCehtLzJb9szP7ayPvXULY/epTcQkWv1L
nP3KyC+iVk/6dBtjb8pRrSfguoc7eAu4NwK4hjVu+d6hQix2xPcG6/lSC2/0
0i+N7H8Jd7c+/2WjY/mXxgtnaHksNbybshjTeEG49ZsrXIu3QMtx5Qns4Sq4
pALLvrNmag9j1/pbtYAbjYTuczrdSsMWp7fuTFA9Wob426ppH+p7T003E8OD
W8OxyFkqh+zCaMeUQFLQ01kxpd3wzJVEXvGvFvLgdq9tlrPKqXVyyKGL0XFG
wRWD8opLwmoMUR3U9DFCHS7tb77Sp3fDmWPmGGnSvAt9ISNq46JoByav+YRC
LUuQXNVIhX4fKy19w0zU5Bf4VWTvc1umXhRUvAJy3QaH/4EFOU7o0Uq8JGGM
ov7zgbzZ5+oTgRXLcUFpiOpkw12tjMPRYZxKI+I90BVXg6UoH2lbOOpsDdOW
uagZ0jHW9dTG+4m6MVHn8H2P8AtPZuT2VdxZndg6onI3CoOod7FZGAT6bGHS
miwW8ektotDmVTzs7z/avoqGQM9wIkwKZPfoADZpFZuXAH3359gqCo6XabFV
bH3Vw+27dVZft9E/e3MHWzaHuyKmcHmf3EDEWxO73SHhWrLptGFcVDdH7lg3
JjgNcsK28/Q3YhvnyvLBZqInmy4l9ieBXDkbCse9SosIP5o4SXHlJfkdffgr
P6JZAapnCQ7LxiiuN0rfLOotl4bAuX+n9eOC7gESUoJuyJAT1hSlHYc6Pb7f
vUDgDA9663r2tlhj1Ea7zKUaHActB/KwNNhomAlJztr6ui3bf5X9EwQ1ZnE8
OU8IKjEtwISdctzHkSOxCQqhVX5XmpXuFEyKPWL106Cst2fKjlkgDnIHFUHw
W/iYvMRSSjgAUS7ODrv21ocquzCBKvj+nVJlqDhCmrVFH6uYO6yaxwfOtpz1
Cab5VTa+Td+9PYZ+aFUAURJK/S9daW33QcpXAoJa5ztczjE8LLzg6KXCJNSg
4z04m89zv7+/hQecoDVANvUPsdghJsRgzt1fpT85WG7tJ/3Vrkz1wsn96c//
scl+mXUlscYTqC4COuL4EqCGptmzKX/VebqZSGjyR+6kcM2K1t4AoQoVq4Ug
0U6Fzj+yxm/lH0/z+auX6Q5cE4cP9g+7/KhGLwzSIy0yeQ8NSlWaLXYNaEne
qsjKEkcp85ZoMVerYsJCNzakFdTSRbmAzT0QLTc1lI32/FRsk4hSHgeknBtz
Bzi4fj5eEm8ekkbT9LnUaPULHVSLmo7TcqTe5etYMI80yiNZnhtAcUlTmfwr
1M38QX7/VTrc+0e/la4z30j5JJ/W7XEyPOtthxwav+446zsP2cnva2e98ZDX
4cUn7ZD7px+402Sb521f/EIn3a6POuLs6JdbgeuLWMz1PmqtBclwucijJA5/
MlzkzgXVGCTY2zcltXGVXeWaBPs0KK2gKYEXXHrepjIP1trS8QLSwkxJl/qg
2+0kQdYNJ4dZM2HXN6Mbqfo7hTvU8DnfZSNjp8NqwS1NCdxrFgGxdwWC5l+W
lkVlhyUtJFqvwrLJ7Hsh+kZ1EoQ+31xjqh2XB4HCc9JyIOPKc6ieLBsPrX8G
hL60Mgguk4fHN9zhnQNzemb6tp6zPunBHXHcNcuZEDa0mg1akTDSBifbeNjq
cqNWqNRiFuLh32fHgdfQLfhmZe0V/H61x3Tw5XhKKmZexb0A/lLCRyBoNixZ
1wXdw+X4+ja98+cXFz7cIpp4vFFyQzqOf4yJ2HS6hrLVgNMAG24M+coh4NLV
0t7GUP6/9r40uY0kS/N/nMINaTkETNgBgktWpjVFSZ2y1mYSVVll1dWjIBAk
owUCKAQgSq2kWR2izeYG83vOMHOTOsm8xZ8vER4gQIIpVZpoVUoSCPfw5fnz
t3+6bgvZXe9tdxALAcZyF8HwHnZnwaPyY9f01tCvLhMXvAHSbtktYz5TmoO3
jWHR3VpV+SMD2Ge66MbIphNyorwuRNGsSPtr72UUPZB/V2fdd2mIRuzDOAtm
qBgg1Ab1lX/vdZ44VeWxxC5QspwUUHDJkmO77o2C3jDCIwHRmXEgSLmXivtb
U5AZTt7gqLeLg1ms7dHsIvpEGaVClr7IC4AbPMP2mIbqqtFOfhxfde4a6KAe
ejmZoSxJG7J20/HsV4ocanlOZansOkxvlEePvfrDZHdOwUNac2nNGScvGtNQ
YbgYGGfHQXV9yd1ClaqCx8CZlFlDOQ9lROvT/32QsI3Guv3P1knYGkGt/4k3
wLUolgrgLzcP+REKJfrMRwHI3tPOL72tZ/dKRbtSVh+cx9SZNTYutbbNxWgl
HJCT4oSbsXi3YyO7TTQqlmwavm+qlzYKoWX71lQrp9HEI9h+CoEJdgjUmRDg
tbMw2qK1+XoYlwkc5WUSWCU4s9gzjGmGq2JwrSjAljYrNB7PI1UYVa97m116
jn2SsVi7COKFA2BPkXhjSmPndC1cNhAmLxJnixzph/dBq+W2ikpGcX9omD9b
jq1yaLtwHWVYxcDQr9bb4OYZXcF+ts7S+eVVrF0ojs6gchZNFqgmLFPNLshK
q2M3qU4PVZOLbWtvaYFTdbptcRjW8luBzMzGot3yOnFuK/V+QgUjpl6VOUF+
SZ1l8pyyuSA246J1l08ff9vDhpFrX8tVVnJl5Sx8uYGxueDGywnBNUtuzp3j
ZIy+98tWhv/5fgeVbH6bU4LB9u8YN28T5eF2Vk3PsDxKral+oeKQOj1djES6
jCNjtGChEd2Fyzr9EYFmeebVYJSBZU74S4PRQvnopwu3L6xPMRFgoJLtCNjx
cntCGRs3bsmLEntfudTrLd2a9sB19jIQUnPzhnrLJqttN/TIhiGWREYH5jSb
jjFau8W1f2rswxcLjSPdmgjn1F3RnEtjGzRlMWDWIizzuFd9WytCeonXIbGi
FS5HYSGFEX9Ij9PeMvfzEAOyF9oN1jo7Sh5p7nUGqfB2LwyZ+W54Y878V/5i
73NVGAYFyenpGoMrQQ+bkeR6kDsXg05YqCMioiBtmNRUougNrDfXYy6bT/B+
cHnEa42tRsJcKHR7jdNdjN+68+Fe52SFutjJCqNaebBWTYcZuFhfg0dK/r0H
HUtDOBznovo2+7lHHSsfblhqB6Ssl6H95oNfi8mCYegCWCIrUfWl82R6GMiL
KpEKn5A/HJ4/B9HsAsvhUYFUW2konH+EP6/YXeToejbS64cSCc+2Hi0pkWqC
sxrboEdLKnOiHVVx59LK1ZRo5Wo6tPz6DRWHC4mDqHJ1njX2+wWKtMoOBYN4
So4vz3lM9GesP9TArCoS/6mtX245oE5Jaty6L3kiugfGW0zPFvS7dHLj22zu
/tovfKvLONuWvmtES6l488PmiZN0rh6/fVpQWnAIbufrjcGh0HmSNAjX0O3F
G0+dCk3NlnPEslIa79NSmq3VOmSExGbB+WIcL7o6W8jXAiQ5OssO2ee4EDZd
8MC80jB9FPb0IR0tBcPalYu0owWz0IGkEaHzkZ1cUAN3629tuoQvClTp9RdY
Du0HSp1l9BfFDvy521No5GQS2XTIx7bGK3eAJ6tl3fEOyedHX1jl4pY6o8fO
Q8M2cd0bD/1p4dQIciN1ylIBFkgSfZsubkayPR0nDod9hqVL2UswncV4InV1
HKwm9oNyApu5HiEDx5rXuTYoHWFHr5XjYNxB4fOwev8N7afZz7RUDz8ZqDLb
qKrJrfGT8g5HkEsU4ue3ZRA8OqWFShTwtY9sdXPMg9W3J8c13/qkR30Ve/ZA
Gl0yaiEHSKn8JYg20Oc4fZ9Y+0YrZ9Ws8267SxmToMZD4tHoYrZ4acbWYlhi
rHRZG1st88ZKs7j37W5FKFLXGPQ/uNT1Gj/3KGe5Fi6moFZLDNpoFkWq5Jyb
Usv2cZlqLMm6VMYRIeS0eoy3jmcXs5ZuP6f5tma7+EOcjknGcP1BX7GZrBhg
7by96F4ovOllIZedyd9Tupz5i2xFFhd3niE/UrlGSjMUywii9whQAHesObo/
Artm/lgsjymMZ1kYUAlDK6xL3rtRFWuxjI0s+Q7B6eSVdcYpUdyF4ZbZNkT5
LzbDn4JjfPXSm+W3k8NkXK7Cv8hHhAuQYsXv/ro4OhM5Hh5f547ji23gHnuY
9NvQVCEVRhhINx6vGu31OtT5VMfS63oPFEZviNIMy0G10dZ89E2Fjqt9beDg
OlkTGx3d16AONSjnJQy9bE9ybkw+WWISwkYH2TqV9GEVqxm7uehgUM2cVYcB
Ux42fWv88c5vTeLNJ4tt7vROLKh1F175GLbzksFOuK+bRuOfJ65iwi1TRo5f
MjTJkGmCEu9N4IpwZYZe97tyq2noJK1JQlgymZZqpTj2+yShqI2z5Xgs7r9V
q0RJB+sw8NJVelNMZZieiTix7lq9MbDolDZobddxIZAnMAen1tmGU3F9IgIi
buKAnFWH4Q2X45wNZyV3KanF4NlsggZYX+R0WmLfcy2PXRC0iCcsuAtKfnhO
tkN9h1JeyqoyuKxPj13S2D6XLdorOypxHUkb12nCb/FeordMp3f5VxZtl67U
5V8kYa5cvoi0kIZPN9UJysWsieYw573kMYyp5YHBH60s12FIQjPT1lNVTyhJ
jV41mQr5z3lDuBy1azD2aMcsjheH4CyNH43APyvkKsWZb5Umpsg69V58nzxR
arXk61qlIFUQTERDX/xFAYI6pfci6gvhMGr4M9TB/4YK/MKpYuzn7K4UdlY5
WVCbNpEWAown51lHHwfov5kf/3M9cAN2FB4oOwLYKAvq6SVfy/nOdEiHGdhN
255PDpGfkIOXF4Rtvp21T8RK/6/m2BJLhqvmHGXf0Zmf6uu1PMM3LYBTy3Fd
8g8KKpMCS3+fzAwqkzur0yVWmrhpXE7lyK0cS2/Qj5xySTI8KfpFaC5OtI7m
NeuN2nisA0P2woLDVFWhuNpVIw8Hzmoy0tE8oZy/1QSg62huuNCnnxbJimXO
HwShFKoUj6WPsLnsgJwAl1BkVGlBZ5ICSWZ3vJBVxY5Lt1vePS7FkO8s+ThM
Eg2iQpAr9SLrwkx6lBOTeA7iY/WUMLbyHblHCTfGoWC6iuLhBaFjqTbJ5hRS
QItBby3dp+uQtODlgq8vMiBvnI6lzkFpQnmWEx/4TsM7i/O4SR7GTO4aTdTN
7c5fXt7VpSr8rNxVBp1zTMileGNRJzfR7O9GkvF2YJviDK9zYIFW8/PCmdXK
r6EcrRioI3/oOLY4RZqSikL52ecDKzWSG+Ixaqm6oHKUzCunTN9uXpoX3cO8
mJ1kG8zJ1gEuFUIKEiHjclTazWan3b5BhOO7ZTfIw4E/YWXX9bn4z3awYqUi
142s43COiESTc0wE8vKS8wun34xcQW7h3GbcsGy2QMbacguvRDu4Em6JnQ0u
NTkgVC4Ag4SIt3EwtIWLZmBDhAAi/hAsSq1//AwUueEzv4wYXCJHXORMyBSL
JvBq5zukCv/sgzIrpq8lBFyCXUrnxbhtBkj0qnPIT9t6O+xFZvouD4LyDQi5
ai5BE0Jn4JsQAvtXaiI5Zs09I7V9erYg7n388gUV28DQayoSEbzm/Qmjlw7u
AqRSLMJYRcxftwsuwsSAX47A6OQy8k+A12eBoK/ccrdBuB+lGb4J0d4Qldkj
EIzbgGHlWnWgFdeEzc/vuPDsC3gWCwnh2nCbF3mIRXwtlUy071tlkIk5YdOp
JX6zBeY1PkwLWGLgrcKFhgXTPtaJ6Orayldna1rNnVPQFqyO0VSFU5gnVM/b
WgEJCpklN7G1/1YBZlT+464/W3d8zmfDwO4F8+Vv2LVAxqlblRgj/zfZFQ7n
1yns4/G9pQe+2CQN8DfbFu8s+/bCUBEex9FMwMrM0xdWpDTa1yozzclUVp/O
FAL4HU+fHbW4pA+DjNKdJzIxF1zFPkyQiJ+jRfeLF4eRk9qNOkwSe8iZrSok
k6dnEglhLy5vLnJ9Gjs/aZa5SBFGmAxnXCqBxgbVxaqmrpJjdTITMVGqjz2V
J4pV1a124AXAL+a5uGyzghq6oEz48a3vmxhH8t5g1wesjyNIflwjQxLQnEGX
B3VrO6tAKfxmI4eb2gz9B6/sqSrT44ZkRC1oWbm5eFgP606nxBHika10zCc2
SBpWXAvOAb3IN0zCXtvy73WByQTMDKFydcWKdFpb9lWi2Ir4uVgWLpW4VhyL
z9gkQj5j4XsxT8/PyXxHC8by670HtPhZHflwkZADtBAAU4gKWj2f4s5da7CN
xy8evfnJh/0g7AzB9mDYD4Pg4ZWBc+ATC/gfiHnO6B8IC/kEoTyqx2/+WDO4
H4jqyDDoFvWTCrHpYmQLjSgZg3p4PuFIL8OeiygkUdU+yNruoRp02+12Y9Dt
HRzUQzgTNYYhzletcYq8OAUsvPBXKRPDuNKZrh1NuZk0CtCqnHr3Li7Ep2RR
zKBfcNQlbwNMum7gSus2lDOi6dT51XUPeBK/6dRNDcD8hPDrbh3To+stt92h
BarER3orH7EQBPRwf82HW4WkJWq+u27zYlodtR+s294swN66Lby8Smq6v7qp
63Wi5w9WP5+LzsQmnfbqJpyNTU92Qk/m4THxweCO5x5sudwZGwVpIN/IQ9zE
VkFiWNWqxVCO1DhICisbC7okNQ9SwurmgjhJ7YN0sbJ9HlUUewmSyCa9tPJo
o9RtkJI26zaPT4r9doPktlG/eShT7HUd0tyo15YPb0ovWYus75CxQy/Z+Bjc
+JIc7iq9ZfNjY2RVar/5yXEwPKmHzQ+PgTDF5pufHWneYihT6mXzs+P0QiAU
1M3mZ8XpZkkr2tv8XHykdptTPi1gb3Ni/i9qtxZ9mvwRarIWsaWetNFbi8AK
ORPUdC3KcmUqarUWQVE2Dj2+FuVMNI/urUUgOqcNG/SD1CBIhvhAcNulnsdY
03c/uMnylFsZHh8O7mzg4ZaBKsRWwc1d1arlmASoh+BWr+zB02apj+Cer+zD
avfUQXD7Qx2IVNcPUkCoBYc8UJsgHbhAlvDQbnDvnYdgDrMlTXs3SAXuo9Pl
Qp4N0oLn3sGngkQQAAugh4N7H3jYLNpucK9DLbgUAzYJbq2LVYwPBbcvXMaV
ng9uXknZ1zIYXOwnuKGb9dPy3UvY7SBIAht263CLQZBObtdfiwMHqNsgSd2y
W4k5oo6DVHjLjp2oIeo7SLR36FvH0VDfQfK+Zd8WwQh7vukUbNKzaIuDDU7N
jZ06MUTU9xZOWCvPnQbbOG4et7HEvLeNM+f1bfzM1P02jqDXvY3FoP63cRZ9
RozxK9T1Nk5jvuuUyHpvk8NoIOOx4SYnTRr6OszeJkeq2IXOFqOeNjlHpidz
w+1tclRywsLeJiciKEPsb0L3YdFifxPath5XaroJ2dqmLU2a+5uQptscwb6x
/Sb057VHhz71sAkhuj3wAdjfhAid5m5OC/WzCQm6/WBEAnWwCRGSOOcZ7jPQ
7YfZBzHah6znnuUcDfKKi7rUVhjw2bgdwu6mb25E8Kan/sUCifrQ3dw7uj/u
gNlNnZCfQ4Nv0wcuWHcBITyP6x3E437++OTxa/WvWGa3rp5OhuxLGbrg3CfJ
8GKC1jX1hnFo2Nni4nAT96Vavc3h9LIMjfvIlmtsScmbFfXnBdpQaiXya71p
FiB6LNZ3GHx7NcxrHtWliZAFcy6KtSayqTi0KGjDI3K3WqWZ/u8EB7WGKE3n
F4uJg2FS9aBRC5iohGhg0E9VNYSQKl35QKkFEFQu/bICks2EbqyHeVoK2mjc
lXykdZBFSeF3jXzKwOwFhAZy8uG5PCwAfvoflyOMZhR1yBjKE29qNQxDIPhJ
i5qF1UtGiOyXOqCunEptAD7CQDkMQqozdUx2EMUxmY5szC+FGMRcRf/+kJAm
H9L5dMLpq+qWP/cHRpA71JrhEGnx5gYd6P6+m+p1FabnSugh2p/KL63LbvBr
u1sVCYn2/OxvcJzKjtMrkoq9uvBqZnYea7rvuV1e3jSzTmhmr7wxevO6vAzO
Ksdh73tex8n4pol1QxM7ShFnzA7Tm9r//T/HwbkVLov7nt33r3++1ba9lqo8
ZqDe/L4Pzi5w4d33/F7FtzpvD81IlRmpN8H3r+LgFP3r+yud3R9xkOtNbLu3
wS8gh9z2EvgNbgMrJt07s2xltzp2P4N49V9TuktxsIoH63PNVhakTF94vO8J
jpLzW5EmUYgdpTcz6HOeJCtmhzLw17pzNDEa4Fq7lRfkv9ZpvcBxurSIIv90
snJuOZXka53aY4waXmtm22WSz0Q/+zqZpKss3vfW0UtuxUfsIvJ4OVkjKE7m
1N37ntP728nJRzxMq70rM+Dq+8v7o8aXjur/FVIjYRl/+bssuGVcB5eHuPZF
5tlVtjkzb2h/asQf08y362B5PyznOE5I9k3mZKMLDvLTbzLIP99tkDnj01dA
JUFOdczDVDJMqll6lcIoyTJJgoBT+zREPNs98SbT5y4/93fiV1gPv1ZTgFlR
d6w6w8foz7qOo2caWJEZYf0d4mNh3Er6RCdCOC6TkswH7qU8/yEdj5cY9i0l
FsuyIPglOh8ggidgVtBJrMs+zON5Y3qF9k9O/idHAZa5k+7RkkAZY7q27/Qs
6rT5R1WxTh3WfFWdtqJUd1hTHMhlch43uEN6o6kqg5CPXL651sRpZTRwTooY
mlLarQ/JZIS2UTsfrjn89PHJEywO8ubRS8wuzshqHRH+8Xz6IUX7K5acppfZ
GWBJHiy5cVPqhMxLsido6eRTJ3MiZ+aSJ7rOEznJRR7p2UcCFhd5qm+fynFK
eWLXPpET2eWJgX1ixbGUp/fs03n1Rh7Zt494xkv5/sB+XzCV6Wc6bftMzrwr
Tzir7Eqz8rWzxHh3y8fOsvpWHnnAWVFf2ZYHdnMPoDoo3w1y37nL0nFWzpMP
5Htn2byrOcQy1vDM8ml2XLJ176SuctASY1QvBbBZ+Ax93BAcZ/HQ/ovr9jxU
6g/iqaQPmvoMtybZdz+ppnl6ejU+RBZLT2u35lWvOZ2ftzC5qNXea8EjXpP5
6KysSefg4KAFrbrdBjzVyD7B0n1s5F5JUAelr2y32p0WNSaAd6/lx2y0YrCd
1p+eP3tTbEXV4cOtJhkBK7Tcx/+2HC3cx/FvepgHRH97DUYYZYyY6dJitpyP
qcVo2KKv6HHYz3/899/hf3ZDkUWA0MUf/xP9L4pKiesnurBjoiszT77Fad/H
8WmCwlDl+Bi91//4+3+r45evHx+/fPGkgR98mA7j0yUwGgapFvCMituHwGRU
Kjp/kRxi0MJpvJha4I0zQiBA9Blgx/K21vH06BXICZcYMIRlJeD+ousSbyhG
TKCLVBf+hE8tzCDef/VIakVrZtFKRzX2ARIOI5ZCYTTn5G9LrM/MWao0qiaM
XE9IiEfn6MLCsMd+0OjuVf7jP5DiKbubn8ZV1YEUTydnU4WFf7oVj7iwSD55
b784lWyJ1JifwZJryiISMLMMkRY8W0YvR4baFHMK5UBqVKFhjUgyVljcZQIi
kUZIojrtEe3ukgBsxp8shA0mNFMUzWQ6QowL43wG6jhLWEBFIQ0LpiHtRBQ+
Q/7mg+5uv9ZUbzML3SEzc8rNIBXAgF7o8TzVw7mM32tJcuJJwZw3jBXMG6Pp
cIlzp3o8FZ9SjsdwVUEHX3yPt00ruuKPw4loqmE2xM+W0svEYwamXAPzE04g
jpXB5cHsUp/DHOoKhQ3eFERzqkvJjoauRuhn2jvZ+/XIK9ZXrM/nPd2MkDAm
XE0C6BMk/QyxBA0ffINMGvEW0ZZC1jzhfkIb+qwli+XMrXyyaiVhBPTZyzPl
rX74ZOZ7XnFOdTd05gT+IlcL1S3QjOWqIxfsj0ozygKd4nSrjDOpWkM4csdY
Nl8fH112AKU3PkJRWQFpW+RDSoGPNYiGDJE0PSePwULeOqhNdIP4i+6uCpVr
XIt8C63KF1RXygyP0/CnqLBFGgNxB+PaETBWUgl2cotIHNCgnEUES7UgXbnA
eV6e/idejBoJMv3n4kGyYRdxVmQ0PLNXAnEZ2jLbLrxXz9LJ+8xjKnMlxs8p
Fd3hg0F4vMiEgJDcjliHV7nT2HSGnSev9Qa9grxkyEXawSJDE7qYkBZKzog/
/tH0Ek6YjL/YZelUC2fBTpqjqd8K+u/a07btys4Vgxzycxw3RsYV3rC6i7w5
TExJq2iHatnscMkfhnw7kwIYGgkLGZY5Uk31AiuyYV15FhNhyBHXe9Fl8SvB
NXQQ5ELrRqoOQUUHJUj3fIJQZAjyix9B5xQOp/HssZbcnb2VOazcXbdteH9J
R2BUJhWPRmiikJ0yuGfMHrEvUIf+cnjY+WstTNA+hF9gO1DMiyef3r5+aimX
Xw7TWEyHHqdZa4Z+6/AcH+kiW66cM9MtGIkQpFIzbH0ZSNjlzl3mqhHnzFyN
gvUmHW06U7dt2VnF+53KZcdObXlkUaM0o2rf9h5jYEAt5EW6BLjMp6mew4Kl
LNKNECUJbYfjnIJIBtLZlPG86tFyMp2PsIIPXJuP9PsQMDiN1aMXb9TJn04o
JnU+WnmWVy2pUZTWOs3ZBfGlqukRL2x9W9S2c8TdM/o8WVxMN95V27LcAAAn
9JIewZ3EwPkqlWau+xWa6+pfH5+AbkYS4D/+/r9rzegtFdMkwdGhb1PRFFgm
fSU3aFVKx0DTR7wnqSdvLydY2hX2n3GJK8FbOUT3OMtX8eLiNquD7VauDXKT
WYzA1zm+xUKvFLhPM5lopI94a7hDlhNUSAkWB2S/VrajwVmwrJ+XjlbbbMa0
ck/IHrr5tJ3GK+d+zE82+FE++zS7yDA7rNiA6Sk4ywfD0+mctPF1CCMKEIba
FmHceHzl5V/8IvaPOgl16KnZdFNNw/CG+sqFqZYbVgZXaCwrJM2i+LgmMdN7
b3FlSbvwjI0yWjrNncwREO86Me/ysIcUSOxE8OE3PKK6aangDKdCF74U0Edk
T5quQbXUlTp1VwhQxaUeDqG7HS73t2hczdNFsoP986Xm2lroO0fpr3PxbPbR
kCWmwc/XMONmx/mAOwx0KYicfMWgIcFpCusiDXVTW/620LDuAVyJVUG6kzzQ
Hbc7+jhfUxe1K3F2v3r55oS6ho3RnkO3Q+BFtlPbIWZ48cOZV2bZ9qZZYGMM
cs6YexSzStLQtizT6bq2LVWVepWtLN+nMXntcJ9rm8C8TssEqVIz1apDzrfl
LU65aXjDMXcMKC1rZSq7pFed9xUz20xE1IrjF79cCrfM4hYsabGCF+U3wYTH
cODJKRvnzUGj1/MdQy7jDvt5/RADEAbwOhupHXx8B4VTkEE0CLR/nTWjZ9Pp
e3h0ObNVrw3+cjNLR5Rwe0slP8DZN6ficqXqqS68at0hBptcLxdW0l1YFRKk
55SgypdpdgGUdom6FBYTFiYkrQnpAMlSRC/VLj3TN6xB2IHiXOFetuEmd7g0
LFuelahfJI/ncYCbUQmg1//7X4joVbUBUqiIePalKRcz5nX4gcJvXIuRurvF
CBcyNavnBUT4UQkSEXFiEj5tBqfjpyVE+JPlHJ5tvfzlmS4se/zzsXqNuaRv
sBiw1JUdXgwbc6zOCg/l4quoxefPr58c7+91+9fXtjVG4xAcBhupn776MGi9
ffSKfDPoLjjDzNXk4/ACJ2ggbRN1dPL85Zt+R0nGcqZjJkmHgPtoujxHyM+I
fXbay0ZlZ0EDpVGS/v+fBALyUYNBsS8jnhDK3SieLahydjTlNwyTSTxPp1lT
PSUkD9w+LluNQpLkz4tMiO+gGtZkaM+i5OMsGXKHimeDUg6217aMD9PxhyRr
8tLJsugecVmoI1gaFAvgsBnoPsqy16hupwm7jSaLiEQoYE0IlnOi15H9FNjP
E0TzeUanBJchGWOgV12cJq76pfNskdnpYbCdTS8gwpmQow2BCxP1fjK9mkTV
GH4OD7utQZ+bw8/h4QD+xAxxTEjGUz7+BAckepIm4xGXGwDpCx282C1OLFwO
GL+pYDkCIrgKsWopaUAUdtAb9IDCPn9GomucvPzl6PWjBn748Omb62sLBss+
H2QFwFYqZ+moUZHKBHx3VNLZh4HURagQQ6DHvI9rMCOiwIhRsXBDxnBS4ar5
uFAwHz012ESX/jWAtSI1eEqyEWGrRtjB2wmCSGdAVC91oXO578ik0ODnK6VT
jHhSlG1NOCHcoG5PD5b+o+r21L0mnnN4K6rGEWgw8D48KZnMTpnZLa7gu08k
wurmT9CYNkqQ7Vmo7ngh5Zw/NdVzvFiRMtk/i5dI9fnLGqeVW0pvjRLnr4jR
STA069FRTdd4NpSAoFl2PX9QT55J3jsT1LNkcr64qEePntKHj0ySlUbRRuM/
vv7kj/T9CXsY/0iMvGq6iV5Ns5TX7smrOr5hepkucJJGDqDQUcHH4koflzMY
+gRm8QPsc6Qvxwy3o6OWE4JQi4Fr4DAZi5ZuANieixTkj9GUvajqgqr344YQ
QxGWiYfmIb2NUumJz9Ag6mI/wgsbFlsffx3Vhq/iHdY3W/QIjqqqThIKbiMz
K51y3pa3M7zW6dTDN/qhmk1Wyw6pD20zNV5WmpVmpCBEYHGKeI4gO2Y0DAzi
8jcQZaO0CWwKziXhqeG/sOfCYxHPjmodVup4AAgoGnQd3N8KxnBE5kOqJZct
LyuslUxhSy+075TDMMxlf4oSj1O0H8iVN6Ra+RDPKxZ4gEEQeSBn6EsiGCG8
1yw7WkwX8TiSCVIL6dUuGAr03/Emtg/VW80yzxIUOQ1MIgsS1dOUm9V06GAr
GCv+IPfrg+B37qeNf49+JZ6U//kVz4/8CkfmVzwX5oPnL+U33BX5OHrwY+jn
Qe7XB8HvvLYPYFQuU7Vv7ttfT1P4Z+CMmPFy8TehDxqV7kqLDkO68fCh/VxX
baer9HyCsQglXZ3BZotASY9327ftSlfi09QLD3UGflcq2JWmb+V2hag7Oj5R
BSfY2Vt3rS6mM0K2NI/nu+ru7q45QWAZ+g7Vjw/6flcsCqBgcNOokPukNoG6
2BVLFOtMEBjp6lGxvLLOqKCrm0bVvXlUy9EM59cg2c20zxPD7mC/d+MOYlcw
qBu6CtMVsRvuTLrSlKnKuwpTe45EsSvhxnfsikSeAmfoKr+rjtNV6VpRV6Sy
uhO8Q1fvvbyhIr8KTzC37NQVwt96XeXP4G59cCAfkKGiwb8BPU7OG3pUoZ9f
c7/6xKA7gN/05JQ7wcvUq2Cw7g6GJriYvk8mbldMaY3NSDQ8QUQornYGtdAE
A8vgTJBF2GqnU9MPwe0vz4+u4J8KqBjywWpikK66ga6YrvrtDbvaKxvVGl39
+7ZkhlYUvdaiTRVFxtqhx3Ng3U9ryh6Iat/+iURd7eDfUX7ThLz85kgjVZgs
ogSeoFR1qHp7pw/gEzuGt7Mahv9/iTH4Rf/E3tFom/QSYxhpqyr+9+kj1kN+
3K1p7csXyktzS06MCSHNLIQ4OScOORCJAd1gu0cZh3AhOM6c3SfsiKlHsym5
OcnJSW9/n3ziBC+BissIa1NHXGeL+ZJqwqN2NU/gN5BaHyMuNOv6oAKOxiz2
0iR7oChfzqgaDlUkZ82Bvuqr6tPj568+DED9QWOiNs5MCFxbo3GiSC1mc5wq
gwLlfMJpFsXjq/hThjQfVd+VO4Z/SEc/wtq+01aA7i7ohTXQPQWiC2YQvZhO
GscWElRVX7x8UTNmD9hu5FGIRwmfxITahyF9WTYdphjkjxoPh39J/T9UI/62
BB0bxPvPn3Nk0dCGJdD3GYI3E+JAOLarqcFU1+Yt0Egu0HyC4OVpMueNtkEr
EgXziY0J+DIJFmiY7/BdYsTJlY6icdq29Cf7za6vm+oxKpMC/03gwGgQu5pG
RNQGvusQCEaUt+nc0dgpk0rHyBlnuhiOMKUQl2qWJOYxUTyT0TmorgQiSSh1
iXL2uKleYik8vfB8cljFNPNwFhwmTxRCTOFdXb0ThvCuHr0z3MB8AUffPoRb
/470xt0eqYfoWFuySWG3AR8oPtC1iBanMNNxOnlvcYTJUDJV/tr9wObC5Xgc
eXZOWfY67z/nWxryciJo6ur500d1JtN65J8UpmKtYKgqKbDZJToPkwkaQ3Uc
1Wwcf6rV2SApRtXlRH7TBupHtGsNGj32Smamo9kM2M05I4PiUfWshCR+Ootf
I5T1CZw6WLo5Zvwks4vkkuKw8IG6GqKeP4losnGmdru9fr+QZSoJpjwil3nT
4HI/oc9g2FH0MHCIGg3gcXAIsoXcawH5IiRxBD9bt+0fKMv71fsFKA4POWG8
pC2zitau+9m679Vn5RBo+XTTtpqE4NZ7uOF7/9BQnc5DVZ0BAeKNinMLt/1D
fhHWX2dFVuhqv/2w9gAOUHUf/otHBC7xhzX1I+pjD+Eh7ce33BOPzo+9g4PO
AZ+fH7txfAYPvpLpwhdPuqrXVdWeelhbQTOa/5MgcjeSkVXo7O3SMvx0R3L7
4iTT6ew/3KgtLECnO3BpJrwG665zI7+k0N8KkunuEc3Aw0Q03WZ7VwSQNQim
s68eIsz4gvk20MxR8Mr90pxmr/2Vc5qD23Cavc04jSzCFjhNt0tUs9d2Oc2Q
CabT7XYNwYzixCWYv3C1fCXlD/6qqgfEalaQzVaZjea5vd8HsxlsSjXIbPoe
1dyd2XhLuprZ7PL91CthNaso5zNRDt5RAxBxB0g0ZbqoKB2ik2qNI5YCz5ii
FNIpCCt1Uqg3S6QIsqUVeoty7Qot1vdkk0yHguEp8sKpCKhC5ZmqBkYWad55
iFd74ydgu2TvAfl8v/d9Tbunz+fxCHU8XfpaS8Hn8+kVPEcQzKzHUGHtXMwB
uXX8yAPJ/Gddoy6u/oi+MzK2HazM4JCuEhxkdyCj7O5/X1ej6SUqwaQ8k48X
Lo8GPiC91cIKJCrfjhqJ9wwPWsckYP4oaELiVooj5kYclsZFadAgYAOWXPfi
B61y95vtvnoBHz2ZLkFRM0xnqLMHJ1MzZ1xt+DOnpIt/OZti1hu+ARM0dTwV
j20HFBks7iP2RpTzsQAHrf3bmVOrU3vDyXd6BuSRSTgH0q62O+jca3SZovpw
8udXj0Et+rdndX4JjvI5hpGiagHaFtIjRXnrfR9tSa3gxaY4dMxHTz6mGZ1n
XPIvfel/Uy9+A/XCXvq9tmXdAbXioEfVCxAZGzGxWcPwzx1yGRMKkrv765rw
tyYD7Pa3JwP07khEg+7tiai9uQzQQHGTiGh3qzKAXtKVMgDT0C7TkL/9N1MS
aBqTZNXF714Wcv0faVKlLw/F/miCG5lDCXmZz2loQoDlBZB0PEPHxjOkr5Dn
o7zwni1Ye61eUz0mKzFdnvgGLzw8nai3r77FOZhfv8U5fItz8Lv6FufwLc7B
UrvT1e8tzoFc23vOd6tHtaqr5WxdYvgW57DFOId/puAE6/gPBwYEAwEGWwhG
2L9bMEK/vzIYoVMMRujcORjBSIrG4mBzHIxBQWc1UGS0GCQ4ZfToVUR6eSoK
P0iKe5L56fjf5SVDp2wRaE3VrMaZDRHjpo+Kob0pSJXJlQQ+qGVmUsIwS8k3
V0RAoGz4EAm3ri6mVxgqTyHeWYoCtA55j7X8bC08KQUlkCEpVtmSKni0zuJ0
jOYyV7TVi4zmkmCEBRqUtKBEphNZooK1QlXfWfbwruaG5EdoT8GKGZQOoqV7
dGKndhW7KMwfWw+vHjOVv4t5d0g7UMRQOfcBFIB2ndSAmo2F1pm6nLugcMrZ
DypJeSNitmtJBAEHf19ogxztgp18NUZ0pIRmXHfMSzVch8iSFhkAM3U6hWUc
xlhJSSsqEisPD3KWAcJAwgLgk5GNUQee8FS9O03fORlBmNE0HC+pfg++n5zh
HGIjFf1wwt5kDIlz5DcTv51OzEm6VJhwoigkpqUhICOzHkuM8yaX+NHxvxnK
oCXHfYDNe3NC2VZ6QW3guDqaRE7kjBjyiFLPJ/GY6xs1pmeNUzxIWPFuojj6
RjnRN14fJuIgH9PTD9ghO2WBLB2J2PCgqk0VqYXOXuL+6MsGf3l9fejrnyAA
krk0cum+buNQQsEWuJqq12Uzqm1llrzqhm2oB2q3S38L03tAvXb73F7TtpxH
OJijkTGX4wOnqKTH8081n3XQrrsnzJx6Odv0xBAIJ57RVKbqgOdaGOCg7Q5Q
xoD88TxG2kTDAbe8B1vmEWVu+3v3pW2Y+701bJidu9ow72B+6vYfbtb2Dw2g
WG1+2lvPhimLsAUbZo9dUPvsgjKFF9j01O/2Ol0xPfUP2p7/6S8Mat9s/hX+
aDabGGnV7bPzsoxw7sF1uU2z5V3pZtD+QmbLvS9rtvTEiRspZ7XRshP0VnZc
b2X+eslRmm5/o42yq22UYn+0Yhrw4SkXpVgz3WprRsitmSC3ZoDcmvlxa8bH
rZket2Z43JrZcWtGx62ZHLdmcNyauXFrxsatmRq3Zmjcmplxa0bGrZkYZUT1
jvnmdilLATvX6oSlMkvl1uyU2sblig63s1JqG6Ukdd3cUZmNclsWyo0oO/Tz
qyJVqhrateJvatX2o41TBbe/tCPXNsmtedhzZ43WmtpKe6lYS7O7Wku3lhO2
NaPrvZhcgUFw8lXOHLqp+bOshdnwO2eNfemRlkjI3aI5t7vN3DJjnYslOamO
+UjJbMH1C6geyTxtYB1THVaWqUorq0QO/kWlNazUJYJQKrzp6iBV/d8BZYSg
zUIDreRtdVgXh2pF0JCconFeGVOGNk3mTTGXRmxRnrkmMw7YY9PooTbgVndr
iipeSIyD+4rIGKK8uMzq4KCGlTAM8NsQ69uMkxFlwdCEqcBK5Jt9OQyOCiOm
p8sFR9CZ+hdkLGxSzBqX/8BSdlgZKCJjE2yZLmaobzqMaXuhqm0qbPoCf+0A
KWs7Inz0+s0JmZjIIho5MXsmFA5+z20KPm+MmlL2TFPFjiypTrTCHm6IwwvY
DLtlNkOgXpMlaANOYC41mr+lH69uIAILAtGJvX+e+KZ2rkYCI55niwgDVNG6
nEv24/IoMM05lV1x0wC5RJOzvVxTWoy5OLpCdRYnuLG7I34NXPKWnkDkGIjZ
vzFnyIuSxdySHa/TVG+kUCPaYXSkWqYeyMoetr9QGkJnDWte9/eehtDZXhpC
j9MQOk5EorHHdIw9Zv9M2Z3PpyP09wPpCF1DQnz4MJgLhm86qTMb2qZd72B7
dr0vSUGdu9j1tpuSoJd0dUpChw17ByUpCYPdTn//ZkL6fA13ElFOr6k8LJDv
Oi7hdLZPONtMnLsr4Qw6dyCcwYaOBJh/d/deCGedxDmdN1eaNoeEcxAknI4X
Gz2A9lE/TzRdl2i634gm1/Z3TDS77SDRdItEs5snmp5LND0tNH8jGnnu90w0
YVmnlycahRQCZIHFJpKRhGJE0aBJqhSqIt/1KE8JHmHBn+TkbSVfrPeclZd3
u2vIy3dNvugPfkMvJsxN7XnJFzfKy7IIW5CX+yzsdImSHoti55IRppD9uIH7
sht0X3a9ZMsShZYVWdBU8XJD/RBr+CDPmnjoiysi8vwi+wT4oqgakInX0jWC
ko9YpgMGiPXSGaLeAB9KeBtZXryYObYSh206WNYYq5nWo/y7uB5RzMFM9GXs
adreoKUGUTSZ0k5wadDYKdM5Twgx8jLl/NF4gampCw5d494l0qmszpCJ4SJT
C71vZKwOetAUuDUewwsjVvJtumSExbTnszlavSjeaDzFIEhRsOdOVc/eoSaq
S6k4RKF0dRvvxTxlSCC0bLj5VuDT/vot8eVb4ovf1bfEl2+JL5bana7umPiy
1lqtl/iyflc3Fvhcv6sbs1U2mODXla3yZfJC0PXXXdv1Z3M4bp9H0t84j+TL
jbFE9u0VHZO9OzomHyafpuhSE9GcfU8gJmV1J98EHTXjjAMD0ZVyiuZpAviZ
6DwGE3pKDjXt/mPnZk0H24tAK0Xw9PfdWqTLz+tcDPT0uErnIRcT2bziBBX1
Qx+pzoMOZVz0KeNit652m+12LSIPU5KJYxWk9zSGE4jwX6YeB/loL+NPNjMh
kdolaaadgU6BP/TtxkPUBGJGuMHCFXNEvfGzXByxtn8YyCXwJOwqjg1n8i1+
8lv85Nrxk7vO/fctfjLc0W8bP5kOL4kkXfGpEPXqfHNTR57Ek+8oTEc5uUI6
cuXM28VPTijBy/v5FWs93jii0GJ/O/13Pv3foqe/ttP/LXr65o5E6nJ/1osx
/Y0CMR3Oq8X/gkZhBfxu/7SggGzcQYl20C9qB/07agdaCkXMYi+RvAOzdyTT
t16N+dPlAuTtUSJ51V5+qSItgoIccxnHDJtW0m0Ev2UY2dg+pMC+KVBIHYsg
xaPLdJJy6WqEt0O81ov0NCVwr96hIOe5ibh1lK/ppBRr4xM2oSD8NVyJG3Oh
Ix75PD0/xxEbQ7zJNUeowGQymk1TjLfknG3CQrwiLCr1ap5+wKL2WJbsBK3s
Y56p4DnO+PsGbM41xvc9bTxqLmCuCG43BLJ2H2gsbAfX1xqkDc3llwlqHml2
ibsbmaewACDefCmwEMJafYMYcjDQqS4JOdFIoAK9malqRb8vwmcRd4/gz6Zn
OjDvzc8v3z57hDPGwHqBFMdAU4Oudfzw5WuySkRVxstsUAJzo9vHpN6rqWIY
QQY7SAlLkvP0HQjJQ4Vzxxy0xmX3Mqq+g8/mn/4nrfI7rA/XbWPmvJkdvwhG
2W+3aZZcsTJeXE6zYmsdihXsoCMdSK1+xjxEgIQME8GxCoBy9kG9gz6yZPHO
iY2URkvMRJbv4b3teiQ1GDKc3Cj3BDN7nY1n9kbDF3DUJfe8k+VHjnBodeek
cQFRvZf8DKjZeOAiPHvjeAbU+QttqR7sOYZc6uGjB2ieBWZEccnst0lmGMkb
aWBw3O+GIQd6n0ToZhfT5XiEsJVUUXMi2HNEjBg8HM9hWgRsB7q/FMe/SudJ
E2Mtx8ZhBhQ7tY44mNf5J4Tt2+jM6MUVRAen/qmxUayGfTAxwNDHWTJPJoxi
u5wvkmQSjQjTd7hgyjOIkvCoLpqhqrgAHEbNnSJ7xSGOlsNkXoskCd0cJ/cg
qPg0m46Xmp1U8RR0OeC2YmuwV6IJ+b54aWnxrjDUFUdO+Lga0dQEY9OHuoSE
mCZ2sggZ7hyxTGoafTwRKjBIfxfp+QXBDC4nhEs4nTRw38wwGzDMaDocEoj9
kIwsuC51i5LonQ6NVOnMF6svXKRnC44Udh5uwDnFEgFYmgI54EzgifVpEUzb
GZGyDlWfnkV2FjTfS+DXHxhuI9PVc90asv5gJNI4HkcWS4TNSgZfmAw8LZ3z
jaCfjicWxP55fJng0apFV3QozuIP2kk6RYBXuMMUYT3CriFoK3xHNzta2AhL
dEyQoHiFM790yv5y/ESGy9jhlexG1c+fC6jB1zVm6RidQaWIRyPC3owRwgLY
JF/Ocuaobokpn2ILvrzLHa13ZAmysKGbnspcoZmocjaG84dgzPDGioc2qs5A
uuA7NIzM6sbpAy0vERj2Ctgicj9d2QGvHjIeCrpvPHyfLHQNY6+48UVMjnOW
g1hObqo35rEnMpaj+TndXJl6fvRnZHYWcJRSMAh+mF8sx/70kz3ltPSCTELL
R5Kev1INegqrepTdaKpKB6xGCxn5h8vF0wzep6rqknuxDzpzIeOjJy97knWJ
TB02PTrec/7T2B1LLI7yoG94zFkhHatjib3RMTs6qsevyiVBV+9wNY7cDlVV
3lOTc9s4ThrXPWMlEvifEkVo4260WIQbJbl5vhp0251q5TSQEF2KLqKjejQ3
MQVeLHdi5kSG8ZkjHbtCFWLHYjkiPjWryg78Ah/DCx7rCCGmfxZaapIv4zKe
fJXvFVe9DAguH47ioa7dQ1W8sApX1KNkvIgJESwiwGN7iUjmz15d7dfVwLDt
HrCOMYt+LK2ksE6EFV2DfpJZxB9dxueTdLEEpQu1r7NxOqNCRXW8IKJ3s+rw
Ih2PaqqhZlVpDWPij/FT/uzdD7rqT0DIiHQp5XYX+BncNLB9MKfeDzYjq0zM
Mc+DQhS5e6zZLebbgUbQ2WNJUZiKUq91HRxz40xB8yLg96ouXVQ7JN+agZEJ
/3wHih5L6ywkASkEOrcbrKpdr/vevhoMSvqm7kU6r+KK6N61OywwdsQwcbv/
TIM61F7Czwg5sLe/3+v1u/twQPYPVa/d2QPJbgBfdEFr0K8F5fcvn0HDZW7R
aV/Xlf2zve/92en433av665T0nmw77cb+H/u+n+WdtP239fp+a/P/XlQ2o3/
+nb/+q/X1+HldXdv0PHXF3fFLG8jt74Nu8CN3Ao3aIkb8P4GLyD9emB+w/nr
X3v+FOSBXfvsnv11YH8Nt7P98n7Qr/Y33OtAK/uGXVonj0kHuJ4JoCyoP4wq
HmKE3kI7fJAZ3Y8BHqi/Qf5XyrmN8tRIZlOQRqt2g2ogZ84W6SUwc9olXbkQ
jT6X8biRLZIZPN5tg64Ed/BsDBe0sV+wnI+apfbnzhMnJVC7i+18mtHLD4iV
Ntaeb6MDZhcgAb/PuMpip9uRUmI99QAxJWrIvgZSTA14xwM16OA4gXWDHidX
WB8xKZA1ztFMBZoIJaqSbUnroUZxLNUXdUkzFEFoMLt6KGSSo5JpKM2zJ/kN
GxX0XXioTmARG28SylT1U83gKTeuXy5KT1vR5XrgIkw+JvNhKhXijKZyGo8R
mARrNUaOMlyusFImXFSttGCtEfaxhbvcyGiALZ5vpaa11aqrqpJW9UAyPoOK
qzt0NI9Y5bWgUbNVqHhpVYWT1fP4LLWczszAfJfxx/RyeQlaD17x7J53po4z
Zs0XIwHIrJhoisJr0RfBgfj295XV19IRKGpkQSH9F7ff6xy78eR7JIic8KFE
R0UIELLNEFQkDJaHEbUb8E4kpHa70YFfUW/iKpDTSzgwSKloYaFipGjV28lk
CXU5wNM56U1wAvqN7u5uraleLRfFwWpjlz2Iw2m2oKiPC3yWYjYwJlj2Rpe1
pH1j/JIl/LnbWEwbHV1HENRe4E5kKlxHeDjwrof9rpYfBm3VOVKwUgf76mCg
9jsR3+6FnM0bxYe+4ND4zLFeCATK/5RxTjtUkEUO+qprxgY3xAHcXF0aVD6D
1Jk0mRqdITK7qNswFf2Ko/aq8eErP9MN7CUChYScQUHG6cNN+5fOPgy304ch
90jG3a2jyAu/d+nP7l9X9O6Nfzd/x/cP1uv+pmvRln84sQzJTyTgBH+3/MB9
3IonZFMj3ij83xqpYAWCU202mzWOiIrocDfkqNMdypMJ3YvF25DsaVH4EhSk
JTxLcAfi/wd0DXbb8kVfvtit1aNYdXvfO9ch8hZyOkjJX2tb1rsA3IUuTLbB
UOXf6STRNyMpD+i7+DAdfzBxXqj5MK+I1XCcxFieeEF8g6dJFgxvF4CykOVg
MdwEqHbxidTQ8yl+yGyqqY4YhYs4oR4bojxrzuYomBS6RlYl2MyMCxBkoPfg
wjP9LGIBhj5N0BBZ57Kt80tymiyM1TU9v1ig9SxejhfGAqgTKBy3yE4WiWHz
Mv0Il77z8x2M262bkQHFc4pHMvqxchaPswRIjCymBAiMRYNPEUU3W87Q9cWG
IaoFjSbH4wu4A3nrnz4/UUeLMU7lb0ue5dHZJB3C+4/HMWqg1aMJFlqYpcMa
4jhj6os+FQkaF8lm6EyDBv7/AQ2xwx3AjwIA

-->

</rfc>
