<?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.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-englishm-moq-content-stitching-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="MoQ Content Stitching">Content Stitching for Media over QUIC</title>
    <seriesInfo name="Internet-Draft" value="draft-englishm-moq-content-stitching-00"/>
    <author fullname="Mike English">
      <organization>Cloudflare</organization>
      <address>
        <email>ietf@englishm.net</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>MoQ</keyword>
    <keyword>composition</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 40?>

<t>Media over QUIC Transport (MOQT) requires that an Object is always the
same bytes, no matter who asks for it or where it is retrieved from.
That property is what makes MOQT content cacheable by relays. It also
means that when different subscribers need to receive different
content, the straightforward approach is to publish a separate track for
each of them, even when most of what those tracks carry is the same.
This document describes content stitching: building the tracks that
subscribers receive out of Objects taken from other tracks, so shared
Objects can be cached once while each audience still receives a track
of its own. It names the pieces involved, describes how they fit
together, works through some examples, and draws a line between a
stitcher and a relay. It does not define a format or mechanism for
stitching.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://englishm.github.io/draft-englishm-moq-content-stitching/draft-englishm-moq-content-stitching.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-englishm-moq-content-stitching/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/englishm/draft-englishm-moq-content-stitching"/>.</t>
    </note>
  </front>
  <middle>
    <?line 57?>

<section anchor="intro">
      <name>Introduction</name>
      <t>MOQT <xref target="MoQT"/> identifies every Object by its Track Namespace, Track
Name, Group ID, and Object ID, and requires that an Object "must be an
identical sequence of bytes regardless of how or where it is retrieved"
(<xref section="2.1" sectionFormat="of" target="MoQT"/>). It also requires that two tracks in the
same scope containing different data have different names
(<xref section="2.5" sectionFormat="of" target="MoQT"/>). This is what lets a relay answer any
subscriber from its cache without knowing anything about who that
subscriber is.</t>
      <t>There are a number of applications where subscribers receiving what is
nominally the same content need to receive different bytes, for some or
all of the time. Within MOQT's rules, each distinct version has to be
its own track. If each version is published as a complete track in its
own right, caches end up holding every version in full. With N versions,
the cache footprint is roughly N times larger, even when only a small
fraction of the content actually differs between them. Ideally, cache
cost would scale with how much content is actually unique, not with the
number of versions.</t>
      <t>HTTP-based adaptive streaming deployments often handle this in the
manifest, pointing different clients at different lists of the same
cacheable resources. MOQT has no manifest in the delivery path, and
unlike HTTP request headers, MOQT request parameters do not change what
a track contains. So the same problem has to be addressed at the level
of tracks and Objects.</t>
      <t>This document describes one way to do that, which we call content
stitching. The goal is to describe building blocks: the entities
involved, what each is responsible for, and the properties that follow
from putting them together. It intentionally does not define how a
stitcher is configured, how signals are carried, or a format for
describing compositions. Some of that might be worth standardizing
later, if there turns out to be a real need for different
implementations to interoperate on it.</t>
    </section>
    <section anchor="terms">
      <name>Terminology</name>
      <t>This document uses the terms Application, Track, Group, Object, Full
Track Name, Original Publisher, End Subscriber, and Relay as defined in
<xref target="MoQT"/>.</t>
      <dl>
        <dt>Composed track:</dt>
        <dd>
          <t>A track produced by a stitcher from Objects taken from one or more
ingredient tracks. A composed track is an ordinary MOQT track with its
own Full Track Name. Subscribers do not need to know that a track they
receive is composed.</t>
        </dd>
        <dt>Ingredient track:</dt>
        <dd>
          <t>A track that a stitcher reads from in order to produce composed
tracks. An ingredient track might feed many composed tracks or only
one. Ingredient tracks can also be generated dynamically. In most
deployments, ingredient tracks are not made available to End
Subscribers directly.</t>
        </dd>
        <dt>Recipe:</dt>
        <dd>
          <t>The rule a stitcher follows to build a composed track from its
ingredient tracks. Recipes are defined by the Application. A recipe
might be a fixed pattern known in advance, or it might respond to
signals.</t>
        </dd>
        <dt>Signal:</dt>
        <dd>
          <t>Information that tells a stitcher to change how a composed track
relates to its ingredient tracks. Signals might be carried in
ingredient tracks (for example, as Object Properties), in a separate
track, or outside of MOQT entirely. This document does not specify
how.</t>
        </dd>
        <dt>Stitcher:</dt>
        <dd>
          <t>An Application that applies recipes to ingredient tracks to produce
composed tracks.</t>
        </dd>
        <dt>Audience:</dt>
        <dd>
          <t>The set of End Subscribers that receive a given composed track. An
audience can be large, or it can be a single End Subscriber.</t>
        </dd>
      </dl>
    </section>
    <section anchor="not-relays">
      <name>Stitchers and Relays</name>
      <t>A stitcher is the Original Publisher of the composed tracks it produces.
From the point of view of each ingredient track, it is an End
Subscriber: it does not forward that track to anyone. <xref target="MoQT"/> defines a
Relay as an entity that is neither the Original Publisher nor the End
Subscriber of the tracks it handles, so a stitcher is not a Relay. It is
an Application.</t>
      <t>In practice, stitchers will often be deployed alongside relays,
possibly in the same process, because that is where the shared
ingredient Objects are already cached. That is a reasonable operational
choice, but it is only that. Nothing in this document is an expectation
of MOQT relays, and a relay that does no stitching at all is a
perfectly good relay.</t>
      <t>Downstream of the stitcher, a composed track is just a track, and
relays handle it like any other.</t>
    </section>
    <section anchor="mechanics">
      <name>Composition Mechanics</name>
      <section anchor="numbering">
        <name>Identity and Numbering</name>
        <t>Each composed track has its own Full Track Name, so MOQT's immutability
rule applies to it exactly as it does to any other track. As the
Original Publisher, the stitcher assigns the composed track's Group IDs,
Subgroup IDs, Object IDs, Publisher Priority, and Object Properties.
None of these need to match the ingredient Objects the composed Objects
were taken from. A stitcher might keep an ingredient's Group IDs when
its ingredients are aligned by Group ID, or it might number the composed
track's Groups independently. Either way, the composed track's Group
IDs are expected to increase with time, the same as any other track's
(<xref section="2.3.1" sectionFormat="of" target="MoQT"/>).</t>
        <t>Immutability has a consequence for how recipes run. Once a stitcher has
published an Object in a composed track, that Object is fixed. A recipe
can change which ingredient future Objects come from, but it can never
revise what has already been published, so every decision about a given
composed Object has to be made before that Object is published.</t>
      </section>
      <section anchor="uniqueness">
        <name>Where the Uniqueness Lives</name>
        <t>It can help to ask where the uniqueness of a composed track actually
lives. In some cases it lives in the Objects: some ingredient tracks are
used by only one audience, and their Objects appear in no other composed
track. In other cases every ingredient track is shared, and the
uniqueness lives entirely in the recipe, in which shared Objects each
audience gets and in what order.</t>
        <t>The cache cost of stitching follows from that answer. Unique Objects
cost storage. Unique recipes mostly do not.</t>
      </section>
      <section anchor="transitions">
        <name>Transitions Between Ingredients</name>
        <t>Taking an Object out of one track and putting it in another does not
make it decodable. Some media has dependencies between Objects. A frame
that depends on a reference frame the composed track never carried is
useless, and so is a frame without the initialization data its decoder
needs. Codec configuration and frame rate also have to line up across
the ingredients that a composed track moves between.</t>
        <t>The simplest approach is for a composed track to move between
ingredient tracks only at Group boundaries, since MOQT Groups are
already meant to be independently useful join points
(<xref section="2.3" sectionFormat="of" target="MoQT"/>). This works best when ingredients are prepared
so that their Group boundaries line up with each other. Where Objects
within a Group do not depend on each other, a recipe can work at a finer
granularity and select individual Objects.</t>
        <t>Timing is a separate problem. An ingredient carries its own timeline,
which does not necessarily match the composed track's. If timing
information lives outside the payload (in Object Properties, for
example), the stitcher can set it for the composed track as part of
being its Original Publisher. If timing lives inside the payload, then
either the stitcher has to rewrite payloads, which costs processing and
breaks any end-to-end authentication of those payloads, or the
ingredients have to be prepared so that their timelines already agree.</t>
      </section>
      <section anchor="properties">
        <name>Object Properties</name>
        <t>Because a composed Object belongs to a different track than the
ingredient Object it came from, the stitcher decides which Object
Properties it carries. Carrying everything over is rarely what is
wanted. Properties that only make sense in the context of an ingredient
generally should not appear in composed tracks, and that includes
signals. In some applications it matters that End Subscribers cannot
tell from the composed track where transitions happen.</t>
      </section>
      <section anchor="lead-time">
        <name>Signals and Lead Time</name>
        <t>When a recipe responds to signals, how much warning a signal gives
matters. A signal that arrives well before the affected Objects need to
be published leaves time for the stitcher to choose ingredients,
subscribe to them, and receive their Objects. A signal that arrives too
late cannot change anything, since the affected composed Objects may
already be published. Recipes that respond to signals generally need a
fallback for that case, such as continuing with the current ingredient.</t>
      </section>
      <section anchor="placement">
        <name>Placement and Cost</name>
        <t>Ingredient Objects shared across many composed tracks only need to be
cached once where the stitcher runs. Downstream of the stitcher, though,
each composed track is a separate track, and a relay that caches a
composed track caches all of it. Most of the benefit of stitching
therefore comes from placing stitchers as close to End Subscribers as is
practical. The larger an audience, the more a downstream cache of its
composed track is worth. For an audience of one, it is worth very
little.</t>
      </section>
      <section anchor="creation">
        <name>Creating Composed Tracks</name>
        <t>A stitcher does not have to create every composed track in advance.
When the set of possible audiences is large, it can be more practical to
create a composed track when it is first subscribed to. How a subscriber
learns which composed track to subscribe to, and how that is authorized,
is up to the Application.</t>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>These examples are illustrative only. In them, a Full Track Name is
written as its Track Namespace Fields separated by slashes, then a
colon, then the Track Name; for example, <tt>example/in:main</tt> is the track
named <tt>main</tt> in the namespace with fields <tt>example</tt> and <tt>in</tt>. A
Location is written as {Group ID, Object ID}. This notation is specific
to this document.</t>
      <section anchor="ex-span">
        <name>Substituting a Span of Groups</name>
        <t>There are two audiences, A and B. The ingredient track <tt>example/in:main</tt>
is shared by both. The ingredient track <tt>example/in:alt-1</tt> is used only
by audience A, and has three Groups prepared to fit in place of Groups
104 through 106 of <tt>main</tt>. Every Group in both ingredients has four
Objects.</t>
        <t>Audience A receives <tt>example/out/7f3a:v</tt> and audience B receives
<tt>example/out/c21e:v</tt>. The stitcher numbers composed Groups starting
from 0.</t>
        <table>
          <name>Composed Groups and the ingredient Groups they carry</name>
          <thead>
            <tr>
              <th align="center">Composed Group</th>
              <th align="left">example/out/7f3a:v (A)</th>
              <th align="left">example/out/c21e:v (B)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">0</td>
              <td align="left">
                <tt>main</tt> Group 100</td>
              <td align="left">
                <tt>main</tt> Group 100</td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td align="left">
                <tt>main</tt> Group 101</td>
              <td align="left">
                <tt>main</tt> Group 101</td>
            </tr>
            <tr>
              <td align="center">2</td>
              <td align="left">
                <tt>main</tt> Group 102</td>
              <td align="left">
                <tt>main</tt> Group 102</td>
            </tr>
            <tr>
              <td align="center">3</td>
              <td align="left">
                <tt>main</tt> Group 103</td>
              <td align="left">
                <tt>main</tt> Group 103</td>
            </tr>
            <tr>
              <td align="center">4</td>
              <td align="left">
                <tt>alt-1</tt> Group 0</td>
              <td align="left">
                <tt>main</tt> Group 104</td>
            </tr>
            <tr>
              <td align="center">5</td>
              <td align="left">
                <tt>alt-1</tt> Group 1</td>
              <td align="left">
                <tt>main</tt> Group 105</td>
            </tr>
            <tr>
              <td align="center">6</td>
              <td align="left">
                <tt>alt-1</tt> Group 2</td>
              <td align="left">
                <tt>main</tt> Group 106</td>
            </tr>
            <tr>
              <td align="center">7</td>
              <td align="left">
                <tt>main</tt> Group 107</td>
              <td align="left">
                <tt>main</tt> Group 107</td>
            </tr>
          </tbody>
        </table>
        <t>Within each Group, composed Objects 0 through 3 carry the payloads of
Objects 0 through 3 of the corresponding ingredient Group. So {4, 2} in A's composed track
has the same payload as {0, 2} in <tt>alt-1</tt>, and {4, 2} in B's composed
track has the same payload as {104, 2} in <tt>main</tt>.</t>
        <t>The stitcher's cache holds 8 Groups of <tt>main</tt> and 3 Groups of <tt>alt-1</tt>,
no matter how many End Subscribers are in each audience. A relay
downstream that caches both composed tracks holds 16 Groups.</t>
        <t>B's composed track carries exactly what <tt>main</tt> carries, under a
different name and numbering. Giving B <tt>main</tt> directly would avoid that,
but it would expose an ingredient track to End Subscribers, and it would
make visible which End Subscribers are getting something different.</t>
      </section>
      <section anchor="ex-signal">
        <name>Responding to a Signal</name>
        <t>Object {204, 0} of <tt>example/in:main</tt> carries an Application-defined
Object Property indicating that Groups 206 and 207 are to be replaced.
The composed track <tt>example/out/9b04:v</tt> numbers its Groups as the
<tt>main</tt> Group ID minus 100. When the signal arrives, the stitcher has
published composed Groups up through 104. Its recipe selects
<tt>example/in:alt-9</tt> for this audience, and the stitcher subscribes to it
and receives its Groups 0 and 1.</t>
        <table>
          <name>Composition in response to a signal</name>
          <thead>
            <tr>
              <th align="center">Composed Group</th>
              <th align="left">Taken from</th>
              <th align="left">Notes</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">104</td>
              <td align="left">
                <tt>main</tt> Group 204</td>
              <td align="left">signal Property on {204, 0} not carried</td>
            </tr>
            <tr>
              <td align="center">105</td>
              <td align="left">
                <tt>main</tt> Group 205</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="center">106</td>
              <td align="left">
                <tt>alt-9</tt> Group 0</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="center">107</td>
              <td align="left">
                <tt>alt-9</tt> Group 1</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="center">108</td>
              <td align="left">
                <tt>main</tt> Group 208</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
        <t>Composed Object {104, 0} does not carry the signal Property, so End
Subscribers cannot see the transition coming.</t>
        <t>Suppose instead that Group 0 of <tt>alt-9</tt> is not available by the time
composed Group 106 has to be published. A recipe with a fallback might
publish <tt>main</tt> Group 206 as composed Group 106. Once it has, composed
Group 106 is fixed. If Group 0 of <tt>alt-9</tt> arrives a moment later, it
cannot replace what has already been published. Whether it makes sense
to use Group 1 of <tt>alt-9</tt> on its own for composed Group 107 is up to the
recipe.</t>
      </section>
      <section anchor="ex-objects">
        <name>Composing Individual Objects</name>
        <t>Where Objects within a Group do not depend on each other, a recipe can
select individual Objects rather than whole Groups. Group 12 of
<tt>example/in:shared</tt> has Objects 0 through 3. The ingredient track
<tt>example/in:u-91f0</tt> is used for a single End Subscriber, and its Object
{3, 0} is to appear after Object 1 of shared Group 12.</t>
        <table>
          <name>Object-level composition</name>
          <thead>
            <tr>
              <th align="center">Composed Location</th>
              <th align="left">Taken from</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">{12, 0}</td>
              <td align="left">
                <tt>shared</tt> {12, 0}</td>
            </tr>
            <tr>
              <td align="center">{12, 1}</td>
              <td align="left">
                <tt>shared</tt> {12, 1}</td>
            </tr>
            <tr>
              <td align="center">{12, 2}</td>
              <td align="left">
                <tt>u-91f0</tt> {3, 0}</td>
            </tr>
            <tr>
              <td align="center">{12, 3}</td>
              <td align="left">
                <tt>shared</tt> {12, 2}</td>
            </tr>
            <tr>
              <td align="center">{12, 4}</td>
              <td align="left">
                <tt>shared</tt> {12, 3}</td>
            </tr>
          </tbody>
        </table>
        <t>The stitcher assigns the composed Object IDs, so Object {12, 2} of
<tt>shared</tt> appears in the composed track as {12, 3}. The audience is a
single End Subscriber, so the composed track as a whole is unique to
them, but only one of its Objects is.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>If End Subscribers can subscribe to ingredient tracks directly, they can
receive content their recipe would not have given them, or bypass the
composition entirely. Where that matters, deployments need access
control on ingredient tracks, not just on composed tracks.</t>
      <t>Signals change what End Subscribers receive. A forged or replayed signal
could cause a stitcher to publish content that was never intended.
Stitchers need some way to trust the signals they act on.</t>
      <t><xref section="2.1" sectionFormat="of" target="MoQT"/> makes the Original Publisher solely responsible
for an Object's payload, including any end-to-end encryption or
authentication. A stitcher is the Original Publisher of its composed
tracks, but the payloads it publishes were produced by the publishers of
its ingredients. Where payloads are encrypted or authenticated end to
end, keys and authentication need to cover every ingredient a composed
track may draw from, and End Subscribers need to accept payloads from
all of them. A stitcher that cannot read payloads can still compose
tracks, as long as its recipes only depend on information it can see.</t>
      <t>Composed tracks are state on the stitcher. A stitcher that creates
composed tracks in response to subscriptions lets subscribers cause it
to create state, so it needs to authorize a subscription before creating
anything for it.</t>
    </section>
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>A composed track exists because some set of End Subscribers was treated
differently from others, so its Full Track Name can reveal something
about its audience. If a name encodes audience membership in a readable
way, anything that can see the name, including relays and logs, learns
it too. Opaque composed track names avoid this.</t>
      <t>A composed track for a single End Subscriber is linkable to that End
Subscriber. In some applications that linkability is the point. In
others it is a side effect worth minimizing, for example by using such
tracks only when the recipe actually calls for them.</t>
    </section>
    <section anchor="iana">
      <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="MoQT">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="1" month="October" year="2026"/>
            <abstract>
              <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-22"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9775">
          <front>
            <title>IRTF Code of Conduct</title>
            <author fullname="C. S. Perkins" initials="C. S." surname="Perkins"/>
            <date month="March" year="2025"/>
            <abstract>
              <t>This document describes the code of conduct for participants in the
Internet Research Task Force (IRTF).</t>
              <t>The IRTF believes that research is most effective when done in an
open and inclusive forum that encourages diversity of ideas and
participation. Through this code of conduct, the IRTF continues to
strive to create and maintain an environment that encourages broad
participation, and one in which people are treated with dignity,
decency, and respect.</t>
              <t>This document is a product of the Internet Research Steering Group
(IRSG).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9775"/>
          <seriesInfo name="DOI" value="10.17487/RFC9775"/>
        </reference>
      </references>
    </references>
    <?line 403?>

<section numbered="false" anchor="use-of-generative-ai">
      <name>Use of Generative AI</name>
      <t>Anthropic's Claude
was used to assist with organizing source materials,
structuring the document, and drafting text.
All AI-generated content was reviewed and approved by the author.
This disclosure follows the guidance in <xref target="RFC9775"/>,
applied voluntarily to this IETF document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA51cW3Mbx9F9n18xRT3YrgIoUpLtmF+lKhQtJayyZcViyq9a
AANgwsUusrNLiKH133NO98zsBZCT+h5skbtz6e7pPn2b5Xw+N61vS3dlz27q
qnVVaz/gwXLrq41d14392a18YesH19i//+P25swUi0XjHjD+5/rv9mjOmVkW
rdvUzeOV9dW6NmZVL6tihw1WTbFu567alD5sd/Nd/a/5UqfPQ5o+v7gwoVvs
fAge7x73mHf75u6ttc9sUYYa2/pq5fYO/6vas5k9A3lt3fii5C+316/xD6g+
u/317u2ZqbrdwjVXZgWargx2C64KXbiybdM5AyZemqJxBVb9zS1sUa3sLQhq
Ktfau6aowr5u2jNzqJv7TVN3ezIt4vilF8e9e8T71ZWxcwuJ8J9lvdvXwbfg
QH4thDXz4KoOVFj7xbWsVY7PfsOOPIC/ciSf7wpf4jlk9hfv2vV53Wz4uGiW
Wzzetu0+XD1/zlF85B/ceRr2nA+eL5r6ENxzzH/OeRvfbrsFZqbTeP6/HA5n
lpBkaAd7pinnuua5r/+ntf6nQefbdleeGVN07bZuKGJQYO26K0tVqZ/9vbNv
dA15BYaLyv+7oOyv7E1Zd6s1ROLkpVMpUjJ/yWTjrI2p6maHOQ9yPDjFO2jd
/EeRoVDWJmUwhko9GPzr25sfvv/+2ytjzs/PjZnP57ZYBIxfYuzEdnqdsl//
/Mvf776xjftX5xsXbLstWuif/WXxT7dsrQ/Q9kPxyBfOBPBqF48Q/MxWNXSh
hY7aw7a2RbgPYqW+pdYftq5x/BnzG9c23j24lV039e7c3HGHfVPvXdM+csCB
D3bFPXYnMTZKX9TVFYuSW2KVElSc29tWzM/sHDhQarFZZVd+vcaemAarDcvG
w9yCrRy2bWvMXjrIqR9l4iYz8mUpJr/ZtmDgUDQrW+xBH3YndZi97xY8IlvY
4PZFA8WzlOs9GTaO4+o119nNLPislKBdHVo+F+6gNSFOCuCraYRx2RoipUzw
K/Cp25GDlVMGQhZFVsQru+h8uaJJcnZckWIwQ74Tv3UnNOhhYhyEXMkx2BrT
mzh/ZkNtwxbauTJp6BI6sHB6BitbV0sHTjzOQvgtupV3fAbCyjJtB13RFQ32
9FikPlRyYrQRZXfvMTQAkB/qEioxG/C6rQ8c8mjXvjVtvXGkcGaJeZwLANps
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

-->

</rfc>
