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

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-lcurley-warp-02" category="info">

  <front>
    <title abbrev="WARP">Warp - Segmented Live Media Transport</title>

    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization>Twitch</organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Pugin" fullname="Kirill Pugin">
      <organization>Meta</organization>
      <address>
        <email>ikir@meta.com</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>

    <date />

    <area>General</area>
    <workgroup>Independent Submission</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document defines the core behavior for Warp, a segmented live media transport protocol over QUIC.
Media is split into segments based on the underlying media encoding and transmitted independently over QUIC streams.
QUIC streams are prioritized based on the delivery order, allowing less important segments to be starved or dropped during congestion.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">
<t>Warp is a live media transport protocol that utilizes the QUIC network protocol <xref target="QUIC"/>.</t>

<t><list style="symbols">
  <t><xref target="motivation"/> covers the background and rationale behind Warp.</t>
  <t><xref target="segments"/> covers how media is encoded and split into segments.</t>
  <t><xref target="quic"/> covers how QUIC is used to transfer media.</t>
  <t><xref target="messages"/> covers how messages are encoded on the wire.</t>
</list></t>

<section anchor="terms-and-definitions" title="Terms and Definitions">

<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>

<t>Commonly used terms in this document are described below.</t>

<t><list style="hanging">
  <t hangText="Bitstream:">
  A continunous series of bytes.</t>
  <t hangText="Codec:">
  A compression algorithm for audio or video.</t>
  <t hangText="Congestion:">
  Packet loss and queuing caused by degraded or overloaded networks.</t>
  <t hangText="Consumer:">
  A QUIC endpoint receiving media over the network. This could be the media player or middleware.</t>
  <t hangText="Container:">
  A file format containing timestamps and the codec bitstream</t>
  <t hangText="Decoder:">
  A endpoint responsible for a deflating a compressed media stream into raw frames.</t>
  <t hangText="Decode Timestamp (DTS):">
  A timestamp indicating the order that frames/samples should be fed to the decoder.</t>
  <t hangText="Encoder:">
  A component responsible for creating a compressed media stream out of raw frames.</t>
  <t hangText="Frame:">
  An video image or group of audio samples to be rendered at a specific point in time.</t>
  <t hangText="I-frame:">
  A frame that does not depend on the contents of other frames; effectively an image.</t>
  <t hangText="Group of pictures (GoP):">
  A I-frame followed by a sequential series of dependent frames.</t>
  <t hangText="Group of samples:">
  A sequential series of audio samples starting at a given timestamp.</t>
  <t hangText="Player:">
  A component responsible for presenting frames to a viewer based on the presentation timestamp.</t>
  <t hangText="Presentation Timestamp (PTS):">
  A timestamp indicating when a frames/samples should be presented to the viewer.</t>
  <t hangText="Producer:">
  A QUIC endpoint sending media over the network. This could be the media encoder or middleware.</t>
  <t hangText="Rendition:">
  One or more tracks with the same content but different encodings.</t>
  <t hangText="Slice:">
  A section of a video frame. There may be multiple slices per frame.</t>
  <t hangText="Track:">
  An encoded bitstream, representing a single video/audio component that makes up the larger broadcast.</t>
</list></t>

</section>
</section>
<section anchor="motivation" title="Motivation">

<section anchor="latency" title="Latency">
<t>In a perfect world, we could deliver live media at the same rate it is produced.
The end-to-end latency of a broadcast would be fixed and only subject to encoding and transmission delays.
Unfortunately, networks have variable throughput, primarily due to congestion.</t>

<t>Attempting to deliver media encoded at a higher bitrate than the network can support causes queuing.
This queuing can occur anywhere in the path between the encoder and decoder.
For example: the application, the OS socket, a wifi router, within an ISP, or generally anywhere in transit.</t>

<t>If nothing is done, new frames will be appended to the end of a growing queue and will take longer to arrive than their predecessors, increasing latency.
Our job is to minimize the growth of this queue, and if necessary, bypass the queue entirely by dropping content.</t>

<t>The speed at which a media protocol can detect and respond to queuing determines the latency.
We can generally classify existing media protocols into two categories based on the underlying network protocol:</t>

<t><list style="symbols">
  <t>TCP-based media protocols (ex. RTMP, HLS, DASH) are popular due to their simplicity.
Media is served/consumed in decode order while any networking is handled by the TCP layer.
However, these protocols primarily see usage at higher latency targets due to their relatively slow detection and response to queuing.</t>
  <t>UDP-based media protocols (ex. RTP, WebRTC, SRT) can side-step the issues with TCP and provide lower latency with better queue management.
However the media protocol is now responsible for fragmentation, congestion control, retransmissions, receiver feedback, reassembly, and more.
This added complexity significantly raises the implementation difficulty and hurts interoperability.</t>
</list></t>

<t>A goal of this draft is to get the best of both worlds: a simple protocol that can still rapidly detect and respond to congestion.
This is possible emergence of QUIC, designed to fix the shortcomings of TCP.</t>

</section>
<section anchor="universal" title="Universal">
<t>The media protocol ecosystem is fragmented; each protocol has it's own niche.
Specialization is often a good thing, but we believe there's enough overlap to warrant consolidation.</t>

<t>For example, a service might simultaneously ingest via WebRTC, SRT, RTMP, and/or a custom UDP protocol depending on the broadcaster.
The same service might then simultaneously distribute via WebRTC, LL-HLS, HLS, (or the DASH variants) and/or a custom UDP protocol depending on the viewer.</t>

<t>These media protocols are often radically different and not interoperable; requiring transcoding or transmuxing.
This cost is further increased by the need to maintain separate stacks with different expertise requirements.</t>

<t>A goal of this draft is to cover a large spectrum of use-cases. Specifically:</t>

<t><list style="symbols">
  <t>Consolidated contribution and distribution.
The primary difference between the two is the ability to fanout.
How does a CDN know how to forward media to N consumers and how does it reduce the encoded bitrate during congestion?
A single protocol can cover both use-cases provided relays are informed on how to forward and drop media.</t>
  <t>A configurable latency versus quality trade-off.
The producer (broadcaster) chooses how to encode and transmit media based on the desired user experience.
Each consumer (viewer) chooses how long to wait for media based on their desired user experience and network.
We want an experience that can vary from real-time and lossy for one viewer, to delayed and loss-less for another viewer, without separate encodings or protocols.</t>
</list></t>

<t>A related goal is to not reinvent how media is encoded.
The same codec bitstream and container should be usable between different protocols.</t>

</section>
<section anchor="relays" title="Relays">
<t>The prevailing belief is that UDP-based protocols are more expensive and don't "scale".
While it's true that UDP is more difficult to optimize than TCP, QUIC itself is proof that it is possible to reach performance parity.
In fact even some TCP-based protocols (ex. RTMP) don't "scale" either and are exclusively used for contribution as a result.</t>

<t>The ability to scale a media protocol actually depends on relay support: proxies, caches, CDNs, SFUs, etc.
The success of HTTP-based media protocols is due to the ability to leverage traditional HTTP CDNs.</t>

<t>It's difficult to build a CDN for media protocols that were not designed with relays in mind.
For example, an relay has to parse the underlying codec to determine which RTP packets should be dropped first, and the decision is not deterministic or consistent for each hop.
This is the fatal flaw of many UDP-based protocols.</t>

<t>A goal of this draft is to treat relays as first class citizens.
Any identification, reliability, ordering, prioritization, caching, etc is written to the wire in a header that is easy to parse.
This ensures that relays can easily route/fanout media to the final destination.
This also ensures that congestion response is consistent at every hop based on the preferences of the media producer.</t>

</section>
</section>
<section anchor="segments" title="Segments">
<t>Warp works by splitting media into segments that can be transferred over QUIC streams.</t>

<t><list style="symbols">
  <t>The encoder determines how to fragment the encoded bitstream into segments (<xref target="media"/>).</t>
  <t>Segments are assigned an intended delivery order that should be obeyed during congestion (<xref target="delivery-order"/>)</t>
  <t>Segments can be dependent on other segments, in which case reordering is required (<xref target="dependencies"/>).</t>
  <t>The decoder receives each segment and skips any segments that do not arrive in time (<xref target="decoder"/>).</t>
</list></t>

<section anchor="media" title="Media">
<t>An encoder produces one or more codec bitstreams for each track.
The decoder processes the codec bitstreams in the same order they were produced, with some possible exceptions based on the encoding.
See the appendix for an overview of media encoding (<xref target="appendix.encoding"/>).</t>

<t>Warp works by fragmenting the bitstream into segments that can be transmitted somewhat independently.
Depending on how the segments are fragmented, the decoder has the ability to safely drop media during congestion.
See the appendix for fragmentation examples (<xref target="appendix.examples"/>)</t>

<t>A segment:</t>

<t><list style="symbols">
  <t>MUST contain a single track.</t>
  <t>MUST be in decode order. This means an increasing DTS.</t>
  <t>MAY contain any number of frames/samples.</t>
  <t>MAY have gaps between frames/samples.</t>
  <t>MAY overlap with other segments. This means timestamps may be interleaved between segments.</t>
  <t>MAY reference frames in other segments, but only if listed as a dependency.</t>
</list></t>

<t>Segments are encoded using fragmented MP4 <xref target="ISOBMFF"/>.
This is necessary to store timestamps and various metadata depending on the codec.
A future draft of Warp may specify other container formats.</t>

</section>
<section anchor="delivery-order" title="Delivery Order">
<t>Media is produced with an intended order, both in terms of when media should be presented (PTS) and when media should be decoded (DTS).
As stated in motivation (<xref target="latency"/>), the network is unable to maintain this ordering during congestion without increasing latency.</t>

<t>The encoder determines how to behave during congestion by assigning each segment a numeric delivery order.
The delivery order SHOULD be followed when possible to ensure that the most important media is delivered when throughput is limited.
Note that the contents within each segment are still delivered in order; this delivery order only applies to the ordering between segments.</t>

<t>A segment MUST NOT have a smaller delivery order than a segment it depends on.
Delivering segments out of dependency order will increase latency and can cause artifacting when memory limits are tight.
This is especially problematic and can cause a deadlock if the receiver does not release flow control until dependencies are received.</t>

<t>A sender MUST send each segment over a dedicated QUIC stream.
The QUIC library should support prioritization (<xref target="prioritization"/>) such that streams are transmitted in delivery order.</t>

<t>A receiver MUST NOT assume that segments will be received in delivery order for a number of reasons:</t>

<t><list style="symbols">
  <t>Newly encoded segments MAY have a smaller delivery order than outstanding segments.</t>
  <t>Packet loss or flow control MAY delay the delivery of individual streams.</t>
  <t>The sender might not support QUIC stream prioritization.</t>
</list></t>

</section>
<section anchor="dependencies" title="Dependencies">
<t>Media encoding uses references to improve the compression.
This creates hard and soft dependencies that need to be respected by the transport.
See the appendex for an overview of media encoding (<xref target="appendix.encoding"/>).</t>

<t>A segment MAY depend on any number of other segments.
The encoder MUST indicate these dependecies on the wire via the <spanx style="verb">HEADERS</spanx> message (<xref target="headers"/>).</t>

<t>The sender SHOULD NOT use this list of dependencies to determine which segment to transmit next.
The sender SHOULD use the delivery order instead, which MUST respect dependencies.</t>

<t>The decoder SHOULD process segments according to their dependencies.
This means buffering a segment until the relevent timestamps have been processed in all dependencies.
A decoder MAY drop dependencies at the risk of producing decoding errors and artifacts.</t>

</section>
<section anchor="decoder" title="Decoder">
<t>The decoder will receive multiple segments in parallel and out of order.</t>

<t>Segments arrive in delivery order, but media usually needs to be processed in decode order.
The decoder SHOULD use a buffer to reassmble segments into decode order and it SHOULD skip segments after a configurable duration.
The amount of time the decoder is willing to wait for a segment (buffer duration) is what ultimately determines the end-to-end latency.</t>

<t>Segments MUST synchronize frames within and between tracks using presentation timestamps within the container.
Segments are NOT REQUIRED to be aligned and the decoder MUST be prepared to skip over any gaps.</t>

</section>
</section>
<section anchor="quic" title="QUIC">

<section anchor="establishment" title="Establishment">
<t>A connection is established using WebTransport <xref target="WebTransport"/>.</t>

<t>To summarize:
The client issues a HTTP CONNECT request with the intention of establishing a new WebTransport session.
The server returns an 200 OK response if the WebTransport session has been established, or an error status otherwise.</t>

<t>A WebTransport session exposes the basic QUIC service abstractions.
Specifically, either endpoint may create independent streams which are reliably delivered in order until canceled.</t>

<t>WebTransport can currently operate via HTTP/3 and HTTP/2, using QUIC or TCP under the hood respectively.
As mentioned in the motivation (<xref target="motivation"/>) section, TCP introduces head-of-line blocking and will result in a worse experience.
It is RECOMMENDED to use WebTransport over HTTP/3.</t>

<t>The application SHOULD use the CONNECT request for authentication.
For example, including a authentication token and some identifier in the path.</t>

</section>
<section anchor="streams" title="Streams">
<t>Warp endpoints communicate over unidirectional QUIC streams.
The application MAY use bidirectional QUIC streams for other purposes.</t>

<t>A stream consists of sequential messages.
See messages (<xref target="messages"/>) for the list of messages and their encoding.
These are similar to QUIC and HTTP/3 frames, but called messages to avoid the media terminology.</t>

<t>Each stream MUST start with a <spanx style="verb">HEADERS</spanx> message (<xref target="headers"/>) to indicates how the stream should be transmitted.</t>

<t>Messages SHOULD be sent over the same stream if ordering is desired.
For example, <spanx style="verb">PAUSE</spanx> and <spanx style="verb">PLAY</spanx> messages SHOULD be sent on the same stream to avoid a race.</t>

</section>
<section anchor="prioritization" title="Prioritization">
<t>Warp utilizes stream prioritization to deliver the most important content during congestion.</t>

<t>The encoder may assign a numeric delivery order to each stream (<xref target="delivery-order"/>)
This is a strict prioritization scheme, such that any available bandwidth is allocated to streams in ascending priority order.
The sender SHOULD prioritize streams based on the delivery order.
If two streams have the same delivery order, they SHOULD receive equal bandwidth (round-robin).</t>

<t>QUIC supports stream prioritization but does not standardize any mechanisms; see Section 2.3 in <xref target="QUIC"/>.
In order to support prioritization, a QUIC library MUST expose a API to set the priority of each stream.
This is relatively easy to implement; the next QUIC packet should contain a STREAM frame for the next pending stream in priority order.</t>

<t>The sender MUST respect flow control even if means delivering streams out of delivery order.
It is OPTIONAL to prioritize retransmissions.</t>

</section>
<section anchor="cancellation" title="Cancellation">
<t>A QUIC stream MAY be canceled at any point with an error code.
The producer does this via a <spanx style="verb">RESET_STREAM</spanx> frame while the consumer requests cancellation with a <spanx style="verb">STOP_SENDING</spanx> frame.</t>

<t>When using <spanx style="verb">order</spanx>, lower priority streams will be starved during congestion, perhaps indefinitely.
These streams will consume resources and flow control until they are canceled.
When nearing resource limits, an endpoint SHOULD cancel the lowest priority stream with error code 0.</t>

<t>The sender MAY cancel streams in response to congestion.
This can be useful when the sender does not support stream prioritization.</t>

</section>
<section anchor="relays-1" title="Relays">
<t>Warp encodes the delivery information for each stream via a <spanx style="verb">HEADERS</spanx> frame (<xref target="headers"/>).
This MUST be at the start of each stream so it is easy for a relay to parse.</t>

<t>A relay SHOULD prioritize streams (<xref target="prioritization"/>) based on the delivery order.
A relay MAY change the delivery order, in which case it SHOULD update the value on the wire for future hops.</t>

<t>A relay that reads from a stream and writes to stream in order will introduce head-of-line blocking.
Packet loss will cause stream data to be buffered in the QUIC library, awaiting in order delivery, which will increase latency over additional hops.
To mitigate this, a relay SHOULD read and write QUIC stream data out of order subject to flow control limits.
See section 2.2 in <xref target="QUIC"/>.</t>

</section>
<section anchor="congestion-control" title="Congestion Control">
<t>As covered in the motivation section (<xref target="motivation"/>), the ability to prioritize or cancel streams is a form of congestion response.
It's equally important to detect congestion via congestion control, which is handled in the QUIC layer <xref target="QUIC-RECOVERY"/>.</t>

<t>Bufferbloat is caused by routers queueing packets for an indefinite amount of time rather than drop them.
This latency significantly reduces the ability for the application to prioritize or drop media in response to congestion.
Senders SHOULD use a congestion control algorithm that reduces this bufferbloat (ex. <xref target="BBR"/>).
It is NOT RECOMMENDED to use a loss-based algorithm (ex. <xref target="NewReno"/>) unless the network fully supports ECN.</t>

<t>Live media is application-limited, which means that the encoder determines the max bitrate rather than the network.
Most TCP congestion control algorithms will only increase the congestion window if it is full, limiting the upwards mobility when application-limited.
Senders SHOULD use a congestion control algorithm that is designed for application-limited flows (ex. GCC).
Senders MAY periodically pad the connection with QUIC PING frames to fill the congestion window.</t>

</section>
<section anchor="termination" title="Termination">
<t>The QUIC connection can be terminated at any point with an error code.</t>

<t>The media producer MAY terminate the QUIC connection with an error code of 0 to indicate the clean termination of the broadcast.
The application SHOULD use a non-zero error code to indicate a fatal error.</t>

<texttable>
      <ttcol align='right'>Code</ttcol>
      <ttcol align='left'>Reason</ttcol>
      <c>0x0</c>
      <c>Broadcast Terminated</c>
      <c>0x1</c>
      <c>GOAWAY (<xref target="goaway"/>)</c>
</texttable>

</section>
</section>
<section anchor="messages" title="Messages">
<t>Messages consist of a type identifier followed by contents, depending on the message type.</t>

<t>TODO document the encoding</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Messages</ttcol>
      <c>0x0</c>
      <c>HEADERS (<xref target="headers"/>)</c>
      <c>0x1</c>
      <c>SEGMENT (<xref target="segment"/>)</c>
      <c>0x2</c>
      <c>APP (<xref target="app"/>)</c>
      <c>0x10</c>
      <c>GOAWAY (<xref target="goaway"/>)</c>
</texttable>

<section anchor="headers" title="HEADERS">
<t>The <spanx style="verb">HEADERS</spanx> message contains information required to deliver, cache, and forward a stream.
This message SHOULD be parsed and obeyed by any Warp relays.</t>

<t><list style="symbols">
  <t><spanx style="verb">id</spanx>.
An unique identifier for the stream.
This field is optional and MUST be unique if set.</t>
  <t><spanx style="verb">order</spanx>.
An integer indicating the delivery order (<xref target="delivery-order"/>).
This field is optional and the default value is 0.</t>
  <t><spanx style="verb">depends</spanx>.
An list of dependencies by stream identifier (<xref target="dependencies"/>).
This field is optional and the default value is an empty array.</t>
</list></t>

</section>
<section anchor="segment" title="SEGMENT">
<t>A <spanx style="verb">SEGMENT</spanx> message consists of a segment in a fragmented MP4 container.</t>

<t>Each segment MUST start with an initialization fragment, or MUST depend on a segment with an initialization fragment.
An initialization fragment consists of a File Type Box (ftyp) followed by a Movie Box (moov).
This Movie Box (moov) consists of Movie Header Boxes (mvhd), Track Header Boxes (tkhd), Track Boxes (trak), followed by a final Movie Extends Box (mvex).
These boxes MUST NOT contain any samples and MUST have a duration of zero.
Note that a Common Media Application Format Header <xref target="CMAF"></xref> meets all these requirements.</t>

<t>Each segment MAY have a Segment Type Box (styp) followed by any number of media fragments.
Each media fragment consists of a Movie Fragment Box (moof) followed by a Media Data Box (mdat).
The Media Fragment Box (moof) MUST contain a Movie Fragment Header Box (mfhd) and Track Box (trak) with a Track ID (<spanx style="verb">track_ID</spanx>) matching a Track Box in the initialization fragment.
Note that a Common Media Application Format Segment <xref target="CMAF"></xref> meets all these requirements.</t>

<t>Media fragments can be packaged at any frequency, causing a trade-off between overhead and latency.
It is RECOMMENDED that a media fragment consists of a single frame to minimize latency.</t>

</section>
<section anchor="app" title="APP">
<t>The <spanx style="verb">APP</spanx> message contains arbitrary contents.
This is useful for metadata that would otherwise have to be shoved into the media bitstream.</t>

<t>Relays MUST NOT differentiate between streams containing <spanx style="verb">SEGMENT</spanx> and <spanx style="verb">APP</spanx> frames.
The same forwarding and caching behavior applies to both as specified in the<spanx style="verb">HEADERS</spanx> frame.</t>

</section>
<section anchor="goaway" title="GOAWAY">
<t>The <spanx style="verb">GOAWAY</spanx> message is sent by the server to force the client to reconnect.
This is useful for server maintenance or reassignments without severing the QUIC connection.
The server MAY be a producer or consumer.</t>

<t>The server:</t>

<t><list style="symbols">
  <t>MAY initiate a graceful shutdown by sending a GOAWAY message.</t>
  <t>MUST close the QUIC connection after a timeout with the GOAWAY error code (<xref target="termination"/>).</t>
  <t>MAY close the QUIC connection with a different error code if there is a fatal error before shutdown.</t>
  <t>SHOULD wait until the <spanx style="verb">GOAWAY</spanx> message and any pending streams have been fully acknowledged, plus an extra delay to ensure they have been processed.</t>
</list></t>

<t>The client:</t>

<t><list style="symbols">
  <t>MUST establish a new WebTransport session to the provided URL upon receipt of a <spanx style="verb">GOAWAY</spanx> message.</t>
  <t>SHOULD establish the connection in parallel which MUST use different QUIC connection.</t>
  <t>SHOULD remain connected for two servers for a short period, processing segments from both in parallel.</t>
</list></t>

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

<section anchor="resource-exhaustion" title="Resource Exhaustion">
<t>Live media requires significant bandwidth and resources.
Failure to set limits will quickly cause resource exhaustion.</t>

<t>Warp uses QUIC flow control to impose resource limits at the network layer.
Endpoints SHOULD set flow control limits based on the anticipated media bitrate.</t>

<t>The media producer prioritizes and transmits streams out of order.
Streams might be starved indefinitely during congestion.
The producer and consumer MUST cancel a stream, preferably the lowest priority, after reaching a resource limit.</t>

</section>
</section>
<section anchor="iana-considerations" title="IANA Considerations">
<t>TODO</t>

</section>
<section anchor="appendix.encoding" title="Appendix A. Video Encoding">
<t>In order to transport media, we first need to know how media is encoded.
This section is an overview of media encoding.</t>

<section anchor="tracks" title="Tracks">
<t>A broadcast consists of one or more tracks.
Each track has a type (audio, video, caption, etc) and uses a corresponding codec.
There may be multiple tracks, including of the same type for a number of reasons.</t>

<t>For example:</t>

<t><list style="symbols">
  <t>A track for each codec.</t>
  <t>A track for each resolution and bitrate.</t>
  <t>A track for each language.</t>
  <t>A track for each camera feed.</t>
</list></t>

<t>Tracks can be muxed together into a single container or stream.
The goal of Warp is to independently deliver tracks, and even parts of a track, so this is not allowed.
Each Warp segment MUST contain a single track.</t>

</section>
<section anchor="appendix.init" title="Init">
<t>Media codecs have a wide array of configuration options.
For example, the resolution, the color space, the features enabled, etc.</t>

<t>Before playback can begin, the decoder needs to know the configuration.
This is done via a short payload at the very start of the media file.
The initialization payload MAY be cached and reused between segments with the same configuration.</t>

</section>
<section anchor="appendix.video" title="Video">
<t>Video is a sequence of pictures (frames) with a presentation timestamp (PTS).</t>

<t>An I-frame is a frame with no dependencies and is effectively an image file.
These frames are usually inserted at a frequent interval to support seeking or joining a live stream.
However they can also improve compression when used at scene boundaries.</t>

<t>A P-frame is a frame that references on one or more earlier frames.
These frames are delta-encoded, such that they only encode the changes (motion).
This result in a massive file size reduction for most content outside of few notorious cases (ex. confetti).</t>

<t>A common encoding structure is to only reference the previous frame, as it is simple and minimizes latency:</t>

<figure><artwork><![CDATA[
 I <- P <- P <- P   I <- P <- P <- P   I <- P ...
]]></artwork></figure>

<t>There is no such thing as an optimal encoding structure.
Encoders tuned for the best quality will produce a tangled spaghetti of references.
Encoders tuned for the lowest latency can avoid reference frames to allow more to be dropped.</t>

<section anchor="appendix.b-frame" title="B-Frames">
<t>The goal of video codecs is to maximize compression.
One of the improvements is to allow a frame to reference later frames.</t>

<t>A B-frame is a frame that can reference one or more frames in the future, and any number of frames in the past.
These frames are more difficult to encode/decode as they require buffering and reordering.</t>

<t>A common encoding structure is to use B-frames in a fixed pattern.
Such a fixed pattern is not optimal, but it's simpler for hardware encoding:</t>

<figure><artwork><![CDATA[
    B     B         B     B         B
   / \   / \       / \   / \       / \
  v   v v   v     v   v v   v     v   v
 I <-- P <-- P   I <-- P <-- P   I <-- P ...
]]></artwork></figure>

</section>
<section anchor="timestamps" title="Timestamps">
<t>Each frame is assigned a presentation timestamp (PTS), indicating when it should be shown relative to other frames.</t>

<t>The encoder outputs the bitstream in decode order, which means that each frame is output after its references.
This makes it easier for the decoder as all references are earlier in the bitstream and can be decoded immediately.</t>

<t>However, this causes problems with B-frames because they depend on a future frame, and some reordering has to occur.
In order to keep track of this, frames have a decode timestamp (DTS) in addition to a presentation timestamp (PTS).
A B-frame will have higher DTS value that its dependencies, while PTS and DTS will be the same for other frame types.</t>

<t>For the example above, this would look like:</t>

<figure><artwork><![CDATA[
     0 1 2 3 4 5 6 7 8 9 10
PTS: I B P B P I B P B P B
DTS: I   PB  PBI   PB  PB
]]></artwork></figure>

<t>B-frames add latency because of this reordering so they are usually not used for conversational latency.</t>

</section>
<section anchor="appendix.gop" title="Group of Pictures">
<t>A group of pictures (GoP) is an I-frame followed by any number of frames until the next I-frame.
All frames MUST reference, either directly or indirectly, only the most recent I-frame.</t>

<figure><artwork><![CDATA[
        GoP               GoP            GoP
+-----------------+-----------------+---------------
|     B     B     |     B     B     |     B
|    / \   / \    |    / \   / \    |    / \
|   v   v v   v   |   v   v v   v   |   v   v
|  I <-- P <-- P  |  I <-- P <-- P  |  I <-- P ...
+-----------------+-----------------+--------------
]]></artwork></figure>

<t>This is a useful abstraction because GoPs can always be decoded independently.</t>

</section>
<section anchor="appendix.svc" title="Scalable Video Coding">
<t>Some codecs support scalable video coding (SVC), in which the encoder produces multiple bitstreams in a hierarchy.
This layered coding means that dropping the top layer degrades the user experience in a configured way.
Examples include reducing the resolution, picture quality, and/or frame rate.</t>

<t>Here is an example SVC encoding with 3 resolutions:</t>

<figure><artwork><![CDATA[
      +-------------------------+------------------
   4k |  P <- P <- P <- P <- P  |  P <- P <- P ...
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+------------------
1080p |  P <- P <- P <- P <- P  |  P <- P <- P ...
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+------------------
 360p |  I <- P <- P <- P <- P  |  I <- P <- P ...
      +-------------------------+------------------
]]></artwork></figure>

</section>
</section>
<section anchor="appendix.audio" title="Audio">
<t>Audio is dramatically simpler than video as it is not typically delta encoded.
Audio samples are grouped together (group of samples) at a configured rate, also called a "frame".</t>

<t>The encoder spits out a continuous stream of samples (S):</t>

<figure><artwork><![CDATA[
S S S S S S S S S S S S S ...
]]></artwork></figure>

</section>
</section>
<section anchor="appendix.examples" title="Appendix B. Segment Examples">
<t>Warp offers a large degree of flexibility on how segments are fragmented and prioritized.
There is no best solution; it depends on the desired complexity and user experience.</t>

<t>This section provides a summary of some options available.</t>

<section anchor="video" title="Video">

<section anchor="group-of-pictures" title="Group of Pictures">
<t>A group of pictures (GoP) is consists of an I-frame and all frames that directly or indirectly reference it (<xref target="appendix.gop"/>).
The tail of a GoP can be dropped without causing decode errors, even if the encoding is otherwise unknown, making this the safest option.</t>

<t>It is RECOMMENDED that each segment consist of a single GoP.
For example:</t>

<figure><artwork><![CDATA[
    segment 1       segment 2    segment 3
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
]]></artwork></figure>

<t>Depending on the video encoding, this approach may introduce unnecessary ordering and dependencies.
A better option may be available below.</t>

</section>
<section anchor="scalable-video-coding" title="Scalable Video Coding">
<t>Some codecs support scalable video coding (SVC), in which the encoder produces multiple bitstreams in a hierarchy (<xref target="appendix.svc"/>).</t>

<t>When SVC is used, it is RECOMMENDED that each segment consist of a single layer and GoP.
For example:</t>

<figure><artwork><![CDATA[
               segment 3             segment 6
      +-------------------------+---------------
   4k |  P <- P <- P <- P <- P  |  P <- P <- P
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+--------------

               segment 2             segment 5
      +-------------------------+---------------
1080p |  P <- P <- P <- P <- P  |  P <- P <- P
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+--------------

               segment 1             segment 4
      +-------------------------+---------------
 360p |  I <- P <- P <- P <- P  |  I <- P <- P
      +-------------------------+---------------
]]></artwork></figure>

</section>
<section anchor="frames" title="Frames">
<t>With full knowledge of the encoding, the encoder MAY can split a GoP into multiple segments based on the frame.
However, this is highly dependent on the encoding, and the additional complexity might not improve the user experience.</t>

<t>For example, we could split our example B-frame structure (<xref target="appendix.b-frame"/>) into 13 segments:</t>

<figure><artwork><![CDATA[
      2     4           7     9           12
+--------+--------+--------+--------+-----------+
|     B  |  B     |     B  |  B     |     B     |
|-----+--+--+-----+-----+--+--+-----+-----+-----+
|  I  |  P  |  P  |  I  |  P  |  P  |  I  |  P  |
+-----+-----+-----+-----+-----+-----+-----+-----+
   1     3     5     6     8     10    11    13
]]></artwork></figure>

<t>To reduce the number of segments, segments can be merged with their dependency.
QUIC streams will deliver each segment in order so this produces the same result as reordering within the application.</t>

<t>The same GoP structure can be represented using eight segments:</t>

<figure><artwork><![CDATA[
      2     3           5     6           8
+--------+--------+-----------------+------------
|     B  |  B     |     B  |  B     |     B     |
+--------+--------+--------+--------+-----------+
|  I     P     P  |  I     P     P  |  I     P
+-----------------+-----------------+------------
         1                 4              7
]]></artwork></figure>

<t>We can further reduce the number of segments by combining frames that don't depend on each other.
The only restriction is that frames can only reference frames earlier in the segment, or within a dependency segment.
For example, non-reference frames can have their own segment so they can be prioritized or dropped separate from reference frames.</t>

<t>The same GoP structure can also be represented using six segments, although we've removed the ability to drop individual B-frames:</t>

<figure><artwork><![CDATA[
   segment 2     segment 4   segment 6
+-------------+-------------+---------
|    B   B    |    B   B    |    B
+-------------+-------------+---------
|  I   P   P  |  I   P   P  |  I   P
+-------------+-------------+---------
   segment 1     segment 3   segment 5
]]></artwork></figure>

</section>
<section anchor="init" title="Init">
<t>Initialization data (<xref target="appendix.init"/>) is required to initialize the decoder.
Each segment MAY start with initialization data although this adds overhead.</t>

<t>Instead, it is RECOMMENDED to create a init segment.
Each media segment can then depend on the init segment to avoid the redundant overhead.
For example:</t>

<figure><artwork><![CDATA[
    segment 2       segment 3    segment 5
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
|              init             |  init
+-------------------------------+---------
             segment 1           segment 4
]]></artwork></figure>

</section>
</section>
<section anchor="audio" title="Audio">
<t>Audio (<xref target="appendix.audio"/>) is much simpler than video so there's fewer options.</t>

<t>The simplest configuration is to use a single segment for each audio track.
This may seem inefficient given the ease of dropping audio samples.
However, the audio bitrate is low and gaps cause quite a poor user experience, when compared to video.</t>

<figure><artwork><![CDATA[
         segment 1
+---------------------------
| S S S S S S S S S S S S S
+---------------------------
]]></artwork></figure>

<t>An improvement is to periodically split audio samples into separate segments.
This gives the consumer the ability to skip ahead during severe congestion or temporary connectivity loss.</t>

<figure><artwork><![CDATA[
    segment 1       segment 2    segment 3
+---------------+---------------+---------
| S  S  S  S  S | S  S  S  S  S | S  S  S
+---------------+---------------+---------
]]></artwork></figure>

<t>This frequency of audio segments is configurable, at the cost of additional overhead.
It's NOT RECOMMENDED to create a segment for each audio frame because of this overhead.</t>

<t>Since video can only recover from severe congestion with an I-frame, so there's not much point recovering audio at a separate interval.
It is RECOMMENDED to create a new audio segment at each video I-frame.</t>

<figure><artwork><![CDATA[
    segment 1       segment 3    segment 5
+---------------+---------------+---------
| S  S  S  S  S | S  S  S  S  S | S  S  S
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
    segment 2       segment 4    segment 6
]]></artwork></figure>

</section>
<section anchor="appendix.delivery-order" title="Delivery Order">
<t>The delivery order (<xref target="delivery-order"/> depends on the desired user experience during congestion:</t>

<t><list style="symbols">
  <t>if media should be skipped: delivery order = PTS</t>
  <t>if media should not be skipped: delivery order = -PTS</t>
  <t>if video should be skipped before audio: audio delivery order &lt; video delivery order</t>
</list></t>

<t>The delivery order may be changed if the content changes.
For example, switching from a live stream (skippable) to an advertisement (unskippable).</t>

</section>
</section>
<section numbered="false" anchor="contributors" title="Contributors">

<t><list style="symbols">
  <t>Alan Frindell</t>
  <t>Charles Krasic</t>
  <t>Cullen Jennings</t>
  <t>James Hurley</t>
  <t>Jordi Cenzano</t>
  <t>Mike English</t>
</list></t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference anchor='QUIC' target='https://www.rfc-editor.org/info/rfc9000'>
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
<author fullname='J. Iyengar' initials='J.' role='editor' surname='Iyengar'><organization/></author>
<author fullname='M. Thomson' initials='M.' role='editor' surname='Thomson'><organization/></author>
<date month='May' year='2021'/>
<abstract><t>This document defines the core of the QUIC transport protocol.  QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances.  Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t></abstract>
</front>
<seriesInfo name='RFC' value='9000'/>
<seriesInfo name='DOI' value='10.17487/RFC9000'/>
</reference>



<reference anchor='QUIC-RECOVERY' target='https://www.rfc-editor.org/info/rfc9002'>
<front>
<title>QUIC Loss Detection and Congestion Control</title>
<author fullname='J. Iyengar' initials='J.' role='editor' surname='Iyengar'><organization/></author>
<author fullname='I. Swett' initials='I.' role='editor' surname='Swett'><organization/></author>
<date month='May' year='2021'/>
<abstract><t>This document describes loss detection and congestion control mechanisms for QUIC.</t></abstract>
</front>
<seriesInfo name='RFC' value='9002'/>
<seriesInfo name='DOI' value='10.17487/RFC9002'/>
</reference>


<reference anchor='WebTransport'>
   <front>
      <title>WebTransport over HTTP/3</title>
      <author fullname='Alan Frindell' initials='A.' surname='Frindell'>
         <organization>Facebook</organization>
      </author>
      <author fullname='Eric Kinnear' initials='E.' surname='Kinnear'>
         <organization>Apple Inc.</organization>
      </author>
      <author fullname='Victor Vasiliev' initials='V.' surname='Vasiliev'>
         <organization>Google</organization>
      </author>
      <date day='6' month='July' year='2022'/>
      <abstract>
	 <t>   WebTransport [OVERVIEW] is a protocol framework that enables clients
   constrained by the Web security model to communicate with a remote
   server using a secure multiplexed transport.  This document describes
   a WebTransport protocol that is based on HTTP/3 [HTTP3] and provides
   support for unidirectional streams, bidirectional streams and
   datagrams, all multiplexed within the same HTTP/3 connection.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-ietf-webtrans-http3-03'/>
   <format target='https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-03.txt' type='TXT'/>
</reference>


<reference anchor="ISOBMFF" >
  <front>
    <title>Information technology — Coding of audio-visual objects — Part 12: ISO Base Media File Format</title>
    <author >
      <organization></organization>
    </author>
    <date year="2015" month="December"/>
  </front>
</reference>




<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></author>
<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' target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></author>
<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 title='Informative References'>

<reference anchor="CMAF" >
  <front>
    <title>Information technology -- Multimedia application format (MPEG-A) -- Part 19: Common media application format (CMAF) for segmented media</title>
    <author >
      <organization></organization>
    </author>
    <date year="2020" month="March"/>
  </front>
</reference>




<reference anchor='NewReno' target='https://www.rfc-editor.org/info/rfc6582'>
<front>
<title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
<author fullname='T. Henderson' initials='T.' surname='Henderson'><organization/></author>
<author fullname='S. Floyd' initials='S.' surname='Floyd'><organization/></author>
<author fullname='A. Gurtov' initials='A.' surname='Gurtov'><organization/></author>
<author fullname='Y. Nishida' initials='Y.' surname='Nishida'><organization/></author>
<date month='April' year='2012'/>
<abstract><t>RFC 5681 documents the following four intertwined TCP congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery.  RFC 5681 explicitly allows certain modifications of these algorithms, including modifications that use the TCP Selective Acknowledgment (SACK) option (RFC 2883), and modifications that respond to &quot;partial acknowledgments&quot; (ACKs that cover new data, but not all the data outstanding when loss was detected) in the absence of SACK.  This document describes a specific algorithm for responding to partial acknowledgments, referred to as &quot;NewReno&quot;.  This response to partial acknowledgments was first proposed by Janey Hoe.  This document obsoletes RFC 3782.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6582'/>
<seriesInfo name='DOI' value='10.17487/RFC6582'/>
</reference>


<reference anchor='BBR'>
   <front>
      <title>BBR Congestion Control</title>
      <author fullname='Neal Cardwell' initials='N.' surname='Cardwell'>
         <organization>Google</organization>
      </author>
      <author fullname='Yuchung Cheng' initials='Y.' surname='Cheng'>
         <organization>Google</organization>
      </author>
      <author fullname='Soheil Hassas Yeganeh' initials='S. H.' surname='Yeganeh'>
         <organization>Google</organization>
      </author>
      <author fullname='Ian Swett' initials='I.' surname='Swett'>
         <organization>Google</organization>
      </author>
      <author fullname='Van Jacobson' initials='V.' surname='Jacobson'>
         <organization>Google</organization>
      </author>
      <date day='7' month='March' year='2022'/>
      <abstract>
	 <t>   This document specifies the BBR congestion control algorithm.  BBR
   (&quot;Bottleneck Bandwidth and Round-trip propagation time&quot;) uses recent
   measurements of a transport connection&#39;s delivery rate, round-trip
   time, and packet loss rate to build an explicit model of the network
   path.  BBR then uses this model to control both how fast it sends
   data and the maximum volume of data it allows in flight in the
   network at any time.  Relative to loss-based congestion control
   algorithms such as Reno [RFC5681] or CUBIC [RFC8312], BBR offers
   substantially higher throughput for bottlenecks with shallow buffers
   or random losses, and substantially lower queueing delays for
   bottlenecks with deep buffers (avoiding &quot;bufferbloat&quot;).  BBR can be
   implemented in any transport protocol that supports packet-delivery
   acknowledgment.  Thus far, open source implementations are available
   for TCP [RFC793] and QUIC [RFC9000].  This document specifies version
   2 of the BBR algorithm, also sometimes referred to as BBRv2 or bbr2.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-cardwell-iccrg-bbr-congestion-control-02'/>
   <format target='https://www.ietf.org/archive/id/draft-cardwell-iccrg-bbr-congestion-control-02.txt' type='TXT'/>
</reference>




    </references>



  </back>

<!-- ##markdown-source:
H4sIAGgUV2MAA9V96XYb15ngfzzFHflHxASAKcp2bDp9JtxksSNKbJKKT05P
H6tQdQFUWKhCaiEJW8rph5gHmGeZR5kn6W+9S6FASe6TmWkmpohC1V2+fbtf
TSaTUZu3hT00T35M6rWZmGu7WNmytZl5ld9Zc2GzPDE3dVI266pun4yS2ay2
d4fmx6Ory1FWpWWygqezOpm3kyLt6sJuJvcw1GT/YJQlLXz3y+nRzdmHUQof
FlW9OTR5Oa9Go3xdH5q27pr2YH//O7g7qW1yaH6wpa2TYnRf1beLuurWh+a8
zOzawq+yNdfdbJU3TV6Vo1u7gZsy/L61dWnbySmuYjRq2qTMfkqKqoTZN7YZ
Naukbn/6W1e1tjk0ZTVa54fmX9sqHZsGNlXbeQN/bVb8B2xqlazXebn4t9Eo
6dplVR+OjJnAfwbWDiO8mpoT2ildYgi86m5teLWqF0mZ/5y0sNRDc3Oft+mS
vrCrJC8OzW3+YAsASfbHBV6YptVqFM/yp6m57BZ5GUzyp7zOiyK4HM9yYdsk
nCO/zes/ruDiwOjXU/MawJTcdgCcYIrrbpk0/a/iaU7yJq3CeZqSb/9jit/w
ZKOyqlfwwJ1F4P3L2/OTQ3P14uS7/f19+Ty5Ojt58+ezq7/oFwfwxY925ogN
MDs5nea2nU/u7azFy5Nl266f41bOr98cX7x4cUjrUBo+B8qiWavStDZdllVR
LTbm//z7/zQnVQYYNdXcJF2WV5O7vOmSwlSzv9q0beiWS6AS8+zgEMc2x0mj
1P8iL6x5QQM/oemYrg/2n309eXYAlKyz8l5PLo4+bVmTibnoijZf0SxAckWe
8k18u3l6cXn2w+RoD+/kxX0H0K9WK7hl90M4/x5+Mo3jZbo7XvzB/mT/OVx5
be+vbFkREr75+ltEwvHxFcM+Ters3hbFJE/TejEB1p+kVbmwDU6If7Z1VSCn
j0YTWGMyawBLKbDgzTJvkJE6nN9kdp6XtjHt0pq0qq2Z2WVyl8MKcZUoeMYm
CVZboOThDbZKDGZdV8CxFaDsztZEQNMR4wemagAMLRB2W+kwjZkBBjODIIdp
OxAfdbFBEuCBbZkyRQDp8iyrvMXJcy9tio2fzMDWbLJqpqPwkwGhBSuDreRt
/jM8HU2aWdxJDaPUMDvssSiqe5yzsE1j8hXuKwH4uCXD8mcWxk7qOxylBrla
rdfwZ9bV+JwH/pQhvsqzrLAA/i++QDFYV1mX4tcjkuYAmOQjwGyXQDJdmxew
ekYQbQ+kKQpgf98vv+D1Dx9g3t/Ch1UF1E5k9+EDrAo2yQ/PkpSkNsAU4VrT
LUlBGAfAEq6nNILu2T+/rO5lnbBuQo/lUQaQy2P8rcvT+HlaPDzeIRbgftrx
HFBIA/NTKwB+AmDsz8xXCaM6u+DxPq/tlIF8Y2vEOqzqFIk6x/01SO/WgD4y
qJAa8+Ti7fXNkzH/a16/ob+vzmBxV2en+Pf1y6NXr9wfI7nj+uWbt69O/V/+
yZM3Fxdnr0/5YbhqokujJxdHf4FvcFVP3lzenL95ffTqCQAMFh+yIe6MKSxH
jbmuLdJ70owy26R1PiPiN8cnl//7fz37CgD130AiHDx79h0Aij98++z3X8GH
+6UtebaqBBbhjwCnzQjEkU1qHAVI3aTJOm+TAlQqaJQGgFyapWVIshCDhxlR
BNTB9fqlzSwwDzx7nLfMfIej0aE5Qp5o87Irqw4msXUOKAQhP9uArp/iRJlN
3Z0r2DMZD7C+BfLsckUiiFQC8ttdntmKHlNGo2cvgaxta4qqYdz/rbMd8WNC
659tYJ2LOsmYaZGoioo+CR/xSsoG9lXLYohSQcysK0CGqW1q8zsvnUjsIOnJ
AFNDEjWtugIhQV/xnesi2cC9MC3LArC9LM/WJiB0dbo56jDRECl/h7Oh8gFx
s1rzvlhAA8TMTKE8Gp1avKQDBUsGUVI2+YwHBkkDYh4sGpKpDtaqe0RgMhfX
yb2Z12BuIFx4eHOjKzFPT2+u92Q2tz4Uy6TocNGwSpKoLL14pC8buAvkKhKa
AGkuMoAkMe0Bpjsrw93gMsFMHNhOCsv9yF6qrkVSi3bzAv/gwUumJpDzIFcQ
QWTOOgvE6IKZJWtUOTXyY4u6cG3TfJ6nhmGNrAGQgPHPJ3M/A0/LUMgqGKqs
UNmi9lLRhbgm1QLTVnChlqV+b+x8DpYPKAfgwqTkVcIEP+gi13nadrBt8/SH
6lLxIdMDhFCVMemj5gaGAC4Ee8pzoLfZHXDc2LJ1GXTw8RhGqBIZGwidBay6
9LQBI18SF3wUqYhGnAkG4kUh8BPAk70HyES6W24Voy2cKvwioNrLj1AtikmY
aye1yoSeZnlVNCOq9R2SA57Jfo3cYBW3LTiucDwn+N6URLkrNNrQtLttQBm2
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

-->

</rfc>

