<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mls-dmls-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.1 -->
  <front>
    <title abbrev="DMLS">Decentralized Messaging Layer Security</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-dmls-02"/>
    <author fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <date year="2025" month="September" day="15"/>
    <area/>
    <workgroup>Messaging Layer Security</workgroup>
    <keyword>security</keyword>
    <keyword>authenticated key exchange</keyword>
    <keyword>end-to-end encryption</keyword>
    <abstract>
      <?line 47?>

<t>Messaging Layer Security (MLS) provides strong end-to-end security guarantees
for group messaging including Forward Secrecy (FS) and Post-Compromise Security
(PCS). MLS requires a Delivery Service (DS) component to facilitate agreement
between group members on the order of Commit messages. In decentralized settings
without an authoritative entity to enforce ordering, group members will likely
have to retain key material so they can process commits out-of-order.</t>
      <t>Retaining key material, however, significantly reduces the FS of the protocol.
This draft specifies Decentralized MLS (DMLS), based on the the Fork-Resilient
Continuous Group Key Agreement protocol FREEK proposed by Alwen et al.
<xref target="FRCGKA"/>. In essence, DMLS extends MLS such that key material can be retained
to process Commits out-of-order with recuded impact to FS, thus allowing safer
deployment in decentralized environments.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://phnx-im.github.io/dmls-spec/draft-kohbrok-mls-dmls.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-kohbrok-mls-dmls/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Messaging Layer Security  mailing list (<eref target="mailto:mls@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/mls/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/mls/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/phnx-im/dmls-spec"/>.</t>
    </note>
  </front>
  <middle>
    <?line 63?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>...</t>
      <t>DMLS allows group members to keep around old group state a little more safely,
because the init secret of old epoch states is punctured. However, keeping an
old epoch state around is still not as safe as deleting it in the first place.
See <xref target="security-considerations"/> for more details.</t>
      <t>While DMLS is thus safer to use in scenarios where members must be able to
process old commits, it is still not as safe as the use of vanilla MLS with its
strict deletion schedule.</t>
      <t>Even when using DMLS, applications should take care that group state forks are
short-lived and group members (and/or assisting servers) endeavour to resolve
forks as soon as possible.</t>
      <t>In contrast scenarios should be avoided where multiple forks are long-lived. For
example, if two or more parts of a group are not in contact with one-another and
effectively run their own fork of the same group.</t>
    </section>
    <section anchor="epoch-identifiers">
      <name>Epoch identifiers</name>
      <t>In MLS, each epoch is identified by a 64 bit unsigned integer, with the epoch
increasing by one with each commit. The integer identifies epochs uniquely as
long as there is only one chain of Commits. However, in a decentralized context
there can be multiple commits for the same epoch, which means that an integer is
not sufficient to uniquely identify an epoch. For example, if two group member
send a commit at the same time with different subsets of group members receiving
a different commit first. After processing the newly arrived Commit, all group
members would be in the same epoch, but in different group states. For
subsequently arriving messages, it is unclear from the integer designating the
epoch, which state the message belongs to. In such scenarios it is important
that epochs are uniquely identifiable.</t>
      <t>The <tt>dmls_epoch</tt> can be used for this purpose.</t>
      <t><tt>pseudocode
dmls_epoch = DeriveSecret(epoch_secret, "epoch")
</tt></t>
      <t>A dmls_epoch is represented by byte strings of length <tt>KDF.Nh</tt> (thus depending
on the group's ciphersuite). The byte string identifying an epoch is derived
from the epoch's <tt>epoch_secret</tt>.</t>
    </section>
    <section anchor="dmls-messages">
      <name>DMLS Messages</name>
      <t>As regular MLSMessages only contain integer-based epoch identifiers, this
section introduces DMLSMessages, a simple wrapper that adds a dmls_epoch header
to an MLSMessage.</t>
      <sourcecode type="tls"><![CDATA[
struct {
  MLSMessage message;
  opaque dmls_epoch<V>;
} DMLSMessage
]]></sourcecode>
    </section>
    <section anchor="dmls-key-schedule">
      <name>DMLS key schedule</name>
      <t>DMLS uses a modified version of the MLS key schedule that allows the derivation
of multiple <tt>init_secret</tt>s, where each init secret can be used to initialize a
subsequent epoch.</t>
      <t>The individual <tt>init_secret</tt>s are derived through a puncturable pseudorandom
function (PPRF, see <xref target="puncturable-pseudorandom-function"/>) keyed by the
<tt>base_init_secret</tt>.</t>
      <figure>
        <name>The DMLS Key Schedule</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="400" viewBox="0 0 400 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 152,88 L 152,176" fill="none" stroke="black"/>
              <path d="M 152,248 L 152,272" fill="none" stroke="black"/>
              <path d="M 152,304 L 152,336" fill="none" stroke="black"/>
              <path d="M 152,128 L 176,128" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="184,128 172,122.4 172,133.6" fill="black" transform="rotate(0,176,128)"/>
              <polygon class="arrowhead" points="160,336 148,330.4 148,341.6" fill="black" transform="rotate(90,152,336)"/>
              <polygon class="arrowhead" points="160,272 148,266.4 148,277.6" fill="black" transform="rotate(90,152,272)"/>
              <polygon class="arrowhead" points="160,176 148,170.4 148,181.6" fill="black" transform="rotate(90,152,176)"/>
              <g class="text">
                <text x="28" y="36">(above</text>
                <text x="72" y="36">the</text>
                <text x="108" y="36">same</text>
                <text x="140" y="36">as</text>
                <text x="168" y="36">the</text>
                <text x="200" y="36">MLS</text>
                <text x="232" y="36">key</text>
                <text x="288" y="36">schedule)</text>
                <text x="152" y="52">|</text>
                <text x="156" y="84">epoch_secret</text>
                <text x="248" y="132">DeriveSecret(.,</text>
                <text x="348" y="132">&lt;label&gt;)</text>
                <text x="192" y="148">=</text>
                <text x="236" y="148">&lt;secret&gt;</text>
                <text x="160" y="196">DeriveSecret(.,</text>
                <text x="284" y="196">"parent_init")</text>
                <text x="152" y="212">|</text>
                <text x="164" y="244">parent_init_secret</text>
                <text x="156" y="292">DeriveChildSecret(.,</text>
                <text x="296" y="292">"child_init",</text>
                <text x="316" y="308">commit_confirmation,</text>
                <text x="304" y="324">GroupContext_[n])</text>
                <text x="160" y="356">init_secret_[n]</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
        (above the same as the MLS key schedule)
                          |
                          V
                     epoch_secret
                          |
                          |
                          +--> DeriveSecret(., <label>)
                          |    = <secret>
                          |
                          V
                    DeriveSecret(., "parent_init")
                          |
                          V
                   parent_init_secret
                          |
                          V
                 DeriveChildSecret(., "child_init",
                          |          commit_confirmation,
                          |          GroupContext_[n])
                          V
                    init_secret_[n]
]]></artwork>
        </artset>
      </figure>
      <sourcecode type="pseudocode"><![CDATA[
commit_confirmation = DeriveSecret(path_secret[n], "conf")

DeriveChildSecret(prf_key, label, input_secret, context) =
  DeriveFSSecret(prf_key, ExpandWithLabel(input_secret, label, context, KDF.Nh))
]]></sourcecode>
    </section>
    <section anchor="puncturable-pseudorandom-function">
      <name>Puncturable pseudorandom function</name>
      <t>A PPRF allows the derivation of keys in a forward secure way. In particular, a
PRF that was evaluated with a given key and input can't be evaluated with those
same parameters again. Storing the original input key thus doesn't harm the
forward secrecy of (deleted) output keys.</t>
      <t>The MLS Secret Tree as defined in <xref target="RFC9420"/> already represents a PPRF an
needs to be modified only slightly for the purpose of this document.</t>
      <t>In the context of MLS, the Secret Tree has as many leaves as the group has
members. To derive child init secrets, the same tree is used but with <tt>KDF.Nh</tt>
leaves.</t>
      <t>The function <tt>DeriveFSSecret(secret, input)</tt> thus follows these steps:</t>
      <ul spacing="normal">
        <li>
          <t>Check if <tt>secret</tt> and <tt>input</tt> are of length <tt>KDF.Nh</tt></t>
        </li>
        <li>
          <t>With <tt>secret</tt> as the root node secret and <tt>input</tt> as the leaf index, derive
the direct path nodes and the copath nodes as defined in Section 9 of
<xref target="RFC9420"/></t>
        </li>
        <li>
          <t>With <tt>leaf_node_secret</tt> as the resulting secret compute the final output using
<tt>DeriveSecret(leaf_node_secret, "pprf")</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="state-management">
      <name>State management</name>
      <t>As outlined in <xref target="security-considerations"/> DMLS makes it safer to retain old MLS
group states. As such, it enables an <em>eventually consistent</em> delivery service as
described in Section 5.2.2. of <xref target="RFC9750"/>, i.e. one that tolerates out-of-order
delivery of messages. This in turn allows the use of DMLS in applications with
highly decentralized architectures.</t>
      <t>The lack of a strong agreement on message order, however, leads to the various
state-agreement problems inherent to distributed systems and independent of
(D)MLS.</t>
      <t>More concretely, applications need to specify the following.</t>
      <ul spacing="normal">
        <li>
          <t>What fork should a client choose when sending a message?</t>
        </li>
        <li>
          <t>When can an old epoch state be safely deleted?</t>
        </li>
        <li>
          <t>When can a fork be safely consolidated and deleted?</t>
        </li>
        <li>
          <t>How should two forks be consolidated?</t>
        </li>
      </ul>
      <t>The answers to these questions depend on the application's specific architecture
and other requirements and are thus outside of the scope of this document.</t>
      <t>The remainder of this section shows an example of how these questions can be
answered in a decentralized scenario.</t>
      <section anchor="example-federated-scenario-with-server-support">
        <name>Example: Federated scenario with server support</name>
        <t>The architecture of the first application consists of a federation of servers,
where each server serves one or more clients.</t>
        <t>The servers can queue messages for their clients and determine the order of
handshake messages for the groups their clients are in.</t>
        <t>In this system, forks can only occur if a subset of servers lose connectivity
from the rest.</t>
        <section anchor="server-behaviour">
          <name>Server behaviour</name>
          <t>The exact nature of the algorithm used by the servers to agree on a commit for
the next epoch is out of scope for this example. However, the requirement of
such an algorithm are:</t>
          <ul spacing="normal">
            <li>
              <t>Agreement: If one or more commits reach one or more servers at the same time
the algorithm should facilitate agreement between the servers that can
currently reach one-another.</t>
            </li>
            <li>
              <t>Netsplit detection: Servers should be able to detect if the federation of
servers has split. If connections between individual servers fail, other
servers can act as forwarding proxies between the disconnected servers.</t>
            </li>
          </ul>
          <t>If a netsplit is detected, servers will fack back on agreement within their
subgroup of servers. Agreed-upon commits and other group messages are buffered
for later fan-out to the rest of the federation.</t>
          <t>If a netsplit ends, all messages buffered during the netsplit are delivered to
their respective destinations.</t>
          <t>If a fork has occurred during the netsplit, the fork with the lexicographically
higher confirmation tag in the first differing commit wins and the servers
restart their agreement algorithm with respect to that fork.</t>
          <t>If there was another netsplit during a netsplit, the same rules apply.</t>
          <t>When fanning out group messages to their clients, servers include a flag to
indicate whether the old commit state should be retained due to an ongoing
netsplit.</t>
        </section>
        <section anchor="client-behaviour">
          <name>Client behaviour</name>
          <t>Clients generally only have one fork of a given group. If they send a message,
that's the fork they choose.</t>
          <t>Epoch states are generally deleted immediately after processing the next commit,
except when the server indicates that the epoch state should be retained.</t>
          <t>When a client receives a commit for an old epoch (i.e. if a fork occurs), it
retains the fork where the first differing commit has the lexicographically
higher confirmation tag.</t>
          <t>To keep the scenario simple, losing forks are simply deleted.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The use of a PPRF to derive init secrets for new epochs significantly improves
forward secrecy in scenarios where clients need to be able to process multiple
commits for a given epoch.</t>
      <t>However, PPRF only improves forward secrecy for the init secret. Group members
must still delay the deletion of other secrets such as the (private) decryption
keys for the nodes in the ratchet tree. This delay in deletion compromises the
forward secrecy of the protocol. Conversely, the fact that other group members
might encrypt to those keys in turn weakens the protocol's post-compromise
security.</t>
      <t>It is thus still advisable to delete old epoch states as soon as the functional
requirements of the application allows it.</t>
      <t>A rule that will be safe for most applications, for example, is that an old
epoch state can be deleted once each group member has sent a commit on at least
one fork "upstream" of that epoch state. This signals that all group members
have agreed to continue using this particular fork of the group state.</t>
      <t>For effective forward secrecy and post-compromise security it is thus advisable
to choose a state management algorithm where members converge on a shared fork
rather than continuously using different forks of the same group.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9420">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="R. Robert" initials="R." surname="Robert"/>
            <author fullname="J. Millican" initials="J." surname="Millican"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages. Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time. In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9420"/>
          <seriesInfo name="DOI" value="10.17487/RFC9420"/>
        </reference>
        <reference anchor="RFC9750">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="S. Inguva" initials="S." surname="Inguva"/>
            <author fullname="A. Duric" initials="A." surname="Duric"/>
            <date month="April" year="2025"/>
            <abstract>
              <t>The Messaging Layer Security (MLS) protocol (RFC 9420) provides a group key agreement protocol for messaging applications. MLS is designed to protect against eavesdropping, tampering, and message forgery, and to provide forward secrecy (FS) and post-compromise security (PCS).</t>
              <t>This document describes the architecture for using MLS in a general secure group messaging infrastructure and defines the security goals for MLS. It provides guidance on building a group messaging system and discusses security and privacy trade-offs offered by multiple security mechanisms that are part of the MLS protocol (e.g., frequency of public encryption key rotation). The document also provides guidance for parts of the infrastructure that are not standardized by MLS and are instead left to the application.</t>
              <t>While the recommendations of this document are not mandatory to follow in order to interoperate at the protocol level, they affect the overall security guarantees that are achieved by a messaging application. This is especially true in the case of active adversaries that are able to compromise clients, the Delivery Service (DS), or the Authentication Service (AS).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9750"/>
          <seriesInfo name="DOI" value="10.17487/RFC9750"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="FRCGKA" target="https://eprint.iacr.org/2023/394.pdf">
          <front>
            <title>Fork-Resilient Continuous Group Key Agreement</title>
            <author initials="J." surname="Alwen" fullname="Joël Alwen">
              <organization/>
            </author>
            <author initials="M." surname="Mularczyk" fullname="Marta Mularczyk">
              <organization/>
            </author>
            <author initials="Y." surname="Tselekounis" fullname="Yiannis Tselekounis">
              <organization/>
            </author>
            <date year="2024" month="February" day="22"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 298?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61a7W4bSXb9X09R0QAZCSGpgWc2wWhnZteRrV3H41nDMnYQ
BIFV7C6SBTW7uV3dpDiO54XyGHmxnHNvVbNJy95FsjYgUeyqW/fz3I/q6XRq
utBV/sqePfOFr7vWVeEXX9pXPka3DPXS/uj2vrW3vujb0O3PjJvPW7/lhlc/
3p6ZwnV+2bT7KxvqRWNM2RS1W4Ng2bpFN71vVvO2uZ+uqzgt+eOrJyb283WI
MTR1t99g5Yvnb2+s/cK6KjagG+rSbzx+1N3ZxJ75MnRNG1zFP148/Vf8alp8
evP25szU/Xru2ytTgosrUzR19HXs45Xt2t4bcPm1ca13oHpmdk17v2ybfoO/
Pi3evd9jYXll7NTG9C0/u75bgaNAeUuLVdY/FCtXLz2fgt1p10zxCx+Ldr/p
IJ3Z+roHW9b+9WOtVV2c8ePahQofoa7fB98tZk275NeuLVb4etV1m3h1eclV
/Cps/Swvu+QXl9D4LvpL7L/kvmXoVv0cOzer+mEa1pdiiLjxBZ9WECh2I7pp
1Uy3zUJzWH/5uFFnq25dnRlDHTUtVQe61i76qlJfeNnUrSvxS/bJQzDr6vCL
o6Ku7OtV4+vwYN/84zN56lUF97Jvls77Pazs4qoNtZ+V3pi6adfYv4WKDZ1v
+MvamzfXf3j59Epoda5degiY5fMbUOhmwRWtqOzJV0++vvz6229mm3KhG1JE
3MBhpm98DFWA5e01/DXUfdNH+wfa076EEzxdtt6v6aqyVfzQguI3cPTpkyfy
5aAW+Te1qpN/a/7nvyv7tNr5+uTJK9d2zr7qad1f9vcnT/89uLoO0b6NvvL3
TY/PxsxmM2PMdAo/nUcEcdEZ8ylns+cI3Au7aZttKH20WN9g0ciFs9/bZe9a
V3feRwP1qhvb9UA31EXVl/wEVe1cW/KM1hc44gYnOJB63cRuet2scRpi3g9M
mPPX17cXMwtWbOv/0ocWnDj7zFewYLvHunYbCm/Pn4FQgf1NTRt0jV24Agbp
oGjrsvLN3Hc77+uBQ6JCtE1tEbRwtRLiNwtYcL0OXRLAx5l9UdvyCPai72Dj
ZTQ7OH/Td5AhmY8ngjVLDIBmwIinyxWJPDZNTk7fhaqyVbj31d6sHLZiT+s7
F2qBDzirJ6zZ2JDLvS1wFtRUgDtKDE4hQd9Nm8VUjoCF38h2KnxMYWJXzc5D
bRMbw7IOC4BU3VV7nFb2ICdKuLmlBvgJZ3RN0VQz83YFP5KQtoxubMTikzwA
+5wT6S8mdu4ivklKFZpHAWI+HyDDuQjO589f8s9NQ4LzvUaB9VA3uHr/XqP3
wwcxENQBSPUTSy4Auh08NApfsS9W4MN1x/qkHuc+qdqXBmrPar1+RK2Wpsbq
oi/BTFhvEDw01c3tBMQhi6uqZkedR7fwrUFyqpq9SBRO3cfX24Bg4sM403hc
h7KsAFZfQBYEGgwiqUEjVkQS+vHEecDAvfcbYD4iHEqvyrQgqufDsTqglF03
rRfGqv0EUVC4Pqpt4CYdAxlqoOFJwG8aKEwIRAvLb/q66Ho4ycz+MTsQD6Ws
rjYnWzIrgYhB164b2CvK4fxdAo46QQVRDHlYhDbC7pUr/Mzcem/fv8/QMmWu
Bvy0kgDihw+WACPSlDRcRf39vAoQUZQUohpDbEDtUE4cE6F+14YG4bby2Jz1
t+5xMrzAzSsGnskeQKFScE2E009IQ/Z5BFS3RZ6qKicuJ76CvQagGeAnKnRD
PlYItgpymudI++SmBgHqg/xPrNtsKhYPlNZGYAsY6dy9h7u2Xr14bGBo4x6u
13qDtW03JSyWgqjHfnKOry6hOYd6Kor6I5ATTy4I6N5tm75V4IlNtfUm0QUL
DbjGb8RgDHNhHMEGq8CZobqDXhOv1OW2CYyRpOm+6sKmGrFqK+QR5XRGbDD+
wa2xAooG8uwamy28QYKLVK1L0nAzDRCUA0agaBqgP3V4gAMpu/GLhS8IwwS3
XpwsANl3tTCRAS4iTyrhGePuufhwYD1JhGujSCpG8Q5P1MfhCMMSwSRn//kb
O4eL9DVRldiATLhkkAhvPEm2ovZAlDmxNfaBZ10gxNXXZvathKTsP5wTlUDE
EeEvPYVy0VCJyQOhlcAsVilVlJtQ0JDH4ihs8b07wSIqEmhplE4CxcFoOcEw
6gadCTcQbxXA+dq7OqpjYu/AezQ0VOwXyDIhpeSB/STZnjuEmPiBPfWDsQub
yIrDJYYsThvY6cI6qbIMMHzL09A7IEeL8xwHAgDchy1sYNxoeaIqQDSzTxdI
ETkZ0Fw8qvY7Kr5tJcJUtROCsh5ghnSewyCB21hj816TwXDuKJSjxoIwDi1J
YpbTyEAuRTIWAZEr71q7QLmUYFz1jkINTui6xLU5MpVCBpcnemCTbsQ0IjlU
MuUhpPUspDogCyoFI0ZOrshQPLVncAoQdOI7FvzvZPFd9qqeaVw9SdJKy8SO
9Xd3d5voe7SEDer1w0b7PaoM6lvKxe5cvnynyYodH/88u+B2Y57a0b5AO2+A
ZWBLo3S+h+QEY0oLp6h8vYTD3L18djP7CRyeS9bQhpLOkaoXsc+XqLPCBuER
+9D5Cw3SEcHBnTUhHoCiFOZLM1hJnoDc3ViSO0EfyV6vkpkhDiVYsrQnAuXv
NcYF+sIQa1Ott/wpfE1EzYgbqSS4WsoKlm4jknBhVIMMO7trkXyYNSWWy5KF
9kipK+8gEMskV4+YAve//vqr7SpJdihb7Ht0Iofn2dd+i2+bjYPDjIh+9+cf
fms+jBkisUEfrNdyxkxVEHyIfK2bUhGYOYziJUw/3ZWE0dKJC8Qmkl4Ntgw4
d8c6KBskTlLuEmgeV0hjR4Yi+CgIjlo3ityEaRoIAQ6FBqpHxXl8iIRQchGw
Bk9briBZqrakINGoQGtVNmuz4AOKev769Zsb1PBSKI2WT8fLp3n5hw8X1IiG
ASHhjv7ybsxKMqFzcbtMXaRFxTBvtv4AYanYOVXwxbDh43//9Zlnf3782Tgw
/o+UP/fsn6bTH44xZTax31UOOPjDZyXhj+/td8rYD39XmU/ZOUPZAycSC539
XdU7Ivz/U/Ej1FWKa1Ti5UiUgn+rJJO/pl79p5n4HTAOyXgtgfo37pRe8lqr
mXf/Uf/n51T3uCVGiiEBgaL3Vzrn+f6MwSwQxHb1Nrn/mf2gwTNKYI+IcJrJ
Nq7LXo6DqCgshrHNx2rctIt3CLiJFS9lCbfpuyEJpurtwn5vsg1ubk93Pn/Y
ABN+RoX0I2mcH5NIdBOlidWUeHGRkfj1JwDJZoRh8iUkPQ6zRGZwEbX2XKQB
kPR3SDluL4UHK/1QMN0hHxnSEtzeAXT81lW9DFOlxEMrENg4EYPY5ogsxOUv
pY87Wd2tUGEYwS8cgV8dSzS3RPqc2VvOi1N1h0/LUAOjlR6pa0XQ+EjSK9dK
CjcjAWSCBenOpbvz5QXnBWl3TOhPf1Fz2LetTw3wImibAPj+hzc3199+8+Qr
NLauQndQ7g+VC/Oc6rU2tfeldPssznPuk2ogVmG5YrGYS/RUV2lGZBXSFD0n
Ddq5cUUyNVdIe8PvxkyunLR+a1fvUSi5rY8Z/bVexfNc7qIYalISsxLs43QZ
J6MinYRZucoop0+NW66/jB6TlDZkursTj84uK0a6uFMTLZrB7SJLMr+JV8ZM
7fXKF/dsJe5SmhN/uZO9d5J8P64Dse1n4WvYonK3DZqZGsGdC4EjUroGIiyY
7f3DJGmE03rGQoCndJYxLzSi7FZDjL88co3bVLZ9Cy5BZ+wpA5M88R03vztl
10cWNtLla93SrMGqT9MW+nlyVRk9gP7dETydEmZSApqcXdwREG6ljYB3oFyT
qSqrVdCrDm796fGNIOja3XtpL4YxTRp4cuyCBea4LwJ5dibS/KA3ARBRhfYd
etq6Q2GlNTEHG0xvHLbocDim4TDcFQou2jA/1u1vZk/wn26Q1Psvv4F6cczM
z6STFhDqmor8++NxoBlOYRk5TIplVMrOr2/rMR6mGZHOqOrjKQ8jwawQxZDj
uDeXa5vOy/QtB0flinudiaSB/DDd5sg1N3bC42jgC4sqfpCZLdu7nvU6xJq6
8eQVul1TgJX2p9hQBnY5iFiOvfdQ8Tom4B2u3+ii588uIBt4fMXJDcxBv+G0
8VhW4hip6hx5rw7ZpMkpR6H2Z+pcxjRpooSeXy9WilVDXJORWdQ+jZ2ASvw7
2YonLNFdfTrIJG7q+NMmtD7eoCceFtGfmiqUkkoo7mjXH5vdMJnbNWmuNfdH
e36nxnJ13KUxrcIT+oOomlDt5TH5SEnoD9OUvThyAEM2dMaVbkLWmiQ4F5HZ
YC8uyngbRlxAmEczwVtBibWjFdthQe4VId1OQixNZLgAX30kg7ZDRqXU2Dod
L+VpApvcL1CJCL0re+MFFEYLNCHoVBLhvuHQISlxpIQsmI6MR1rLCJDmhQuf
QYd/p1nnxIzaunwSf0WJ9jx2VHfL8Zb2iqyQvB8a2mEoFtq8JXkKiox1qP3R
pZJZ4VlccZJ7ul+zajwlxalenZM2jSPBN0n+RnZ04lcAapnmXBp6jQS2FQMG
mqllHMr7tGEWAUTpxChfyCUamJz7ldsCGFoVHLZH1qrdWO2uWvKKa7VOeVwD
OJ/G0QDBhE49TOrArtH52UN3GI3wzox8in8OI6HkbqOBpXI6eDsVKUMqxuzA
C1QlGX+4Q7qyLxbHJk1jzFZMP36SeT8dKKbcfTgkRfxj14o2XyseKYM4BiuB
EAzU+nTTls7P4+oZ2P4JlRL8uBPPKfSi+zZRGU3V9YYiLZIRKeNg7Oc4Kp/O
Ek6IzqiK7AGM2czraC6RNy1cQCMgfI1ICT4WcuuRil8CL3LFAyfTY9GRKtJJ
ckUq2+nA9M06CylzsU7WTIYz5A50wcw2l/RWj5RLXAhphs8hi9YGByefqd3L
ab8RGFBLH8ByfBvtNa7mvQxgS7mt5osNLQ6vp3TKlCIZHQPWDDr+SBjeMeoQ
eKCfaduybw+z47ReRz5SOEgeNBrzOG2jFxYc4KJw02yZj5PcRItKrH+C9iTl
Uiwd7h0q/xCKZtm6zQowWfGCGWUGpD3qTTu3PL6J0/k0D0gxjOR8KFqT2g1V
hLYtwdbBXoeQSTemIpsqNqV2FUxvHNjj5bubQU9JPncinURn20v9B+jfy90f
nG/BVx2wngY8Mbfa84CrB5/TtxJ4R7qooAEYgyHB93ZYYgg/AuDDTWCqJA4h
ma+Owa6EpkDysmFFnflOCHutFcwIYa8TzC99Deeq5OoGP+QFAOJTvqjK/a7e
U1lV296m25Ak5kRG81/GgwvomwJSMPGqcXyjSx88nJrqGhvWa18G18nt0uP3
Hw/5nmRi/EPhN52WYgefsFmBCf2GkfcnNZcNONR4ej0jI95D/jiu586lPA9D
YEhQxAt2B0bpjvSgCf8zrr0aure/MVRYFqRLd62wUvmiQ/QJUy7JH2475cGg
aBn2D6/YXB+1R5p3U6uQev9uaK/HjbVopfa7fBtz/D5H4Gs0W30Z52hY8chF
eC43cmE+yjT5LjwPyc34MjD7ZR51DxlbuBZfzmzYUzZy3TOSaJZeBUljBSP3
8nrjDsW5fRoqpVt0vqggAZrVoTWBWvJ8I6Mnf8FKNL9iJxOofK722wnyoPsC
4S4DitS/6Yny1kY6sBjeTIqfmgIdvTJDwxJkpAES75O3RRgUx0kpScsRTn4j
UCGLhVsem0kzufOoHZNr53O+lHv5bnpgz+TOmxDbHV6HEE26chvioY6gP378
wsfozr8bzWJcZY66jlwQjirw1O4K6D0VmE5TPJ6dWqv0+sZx7R6lqB1d/x7u
k8GeGUNIuoDJqIU2M5XzY4Vq9SO5KIc52evYBcfODPB6hqobZnfrMxUn327q
WckZ5D61yhzl697BdALYkvwkfAp9t8mndzr0onMYbh69fjCacUBhcv+dX1v4
KGKYe08sfXj7LhzsPFiY13SpX3ZJdYeBzThFH70NU4jXLlMBj26l1Qvbe4Mo
0YTo6ixj00cEucp5uNFW3Hv8DYsXT396+gjkjTpTsVzd6EpX5CpI3pBiZUgq
T4v7utlVvlyKJ5r3V/p2ry+/P1vAUv7sA6j+6dmfQCCvhIb/F4xLUpHELAAA

-->

</rfc>
