<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-resumable-upload-11" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="Resumable Uploads">Resumable Uploads for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-11"/>
    <author initials="M." surname="Kleidl" fullname="Marius Kleidl" role="editor">
      <organization>Transloadit</organization>
      <address>
        <email>marius@transloadit.com</email>
      </address>
    </author>
    <author initials="G." surname="Zhang" fullname="Guoye Zhang" role="editor">
      <organization>Apple Inc.</organization>
      <address>
        <email>guoye_zhang@apple.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTP</workgroup>
    <keyword>HTTP, upload, resumable</keyword>
    <abstract>
      <?line 70?>

<t>HTTP data transfers can encounter interruption due to reasons such as canceled requests or dropped connections. If the intended recipient can indicate how much of the data was received prior to interruption, a sender can resume data transfer at that point instead of attempting to transfer all of the data again. HTTP range requests support this concept of resumable downloads from server to client. This document describes a mechanism that supports resumable uploads from client to server using HTTP.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-resumable-upload/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/resumable-upload"/>.</t>
    </note>
  </front>
  <middle>
    <?line 74?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP data transfers can encounter interruption due to reasons such as canceled requests or dropped connections. If the intended recipient can indicate how much of the data was received prior to interruption, a sender can resume data transfer at that point instead of attempting to transfer all of the data again. HTTP range requests (see <xref section="14" sectionFormat="of" target="HTTP"/>) support this concept of resumable data transfers for downloads from server to client. While partial PUT is one method for uploading a partial representation (via Content-Range in the request), there are caveats that affect its deployability; see <xref section="14.5" sectionFormat="of" target="HTTP"/>.</t>
      <t>Canceled upload request can be triggered for various reasons, including but not limited to:</t>
      <dl>
        <dt>explicit client cancellation:</dt>
        <dd>
          <t>e.g., terminating a user-agent process</t>
        </dd>
        <dt>implicit client cancellation:</dt>
        <dd>
          <t>e.g., terminating a tab, garbage collecting a process or internal error</t>
        </dd>
        <dt>explicit server cancellation:</dt>
        <dd>
          <t>e.g., scheduled maintenance</t>
        </dd>
        <dt>implicit server cancellation:</dt>
        <dd>
          <t>e.g., DoS mitigation or internal error</t>
        </dd>
      </dl>
      <t>Connections can be dropped due to a variety of network or transport layer reasons triggered by endpoints or on-path elements.</t>
      <t>This specification defines a new mechanism for resumable uploads from client to server that can seamlessly fall back to conventional uploads. When an upload is interrupted, clients can send subsequent requests to query the server state and use this information to send the remaining representation data. Alternatively, they can cancel the upload entirely. Unlike ranged downloads, this protocol does not support transferring an upload as multiple requests in parallel.</t>
      <t>Utilizing resumable uploads, applications can recover from unintended interruptions, but also interrupt an upload on purpose to later resume it, for example, when a user wants to pause an upload, the device's network connectivity changes, or bandwidth should be saved for higher priority tasks.</t>
      <t>The document introduces the concept of an upload resource to facilitate resumable uploads (<xref target="upload-resource"/>) and defines new header fields to communicate the state of the upload (<xref target="state"/>), the status code <tt>104 (Upload Resumption Supported)</tt> to indicate the server's support for resumable uploads (<xref target="status-code-104"/>), and the <tt>application/partial-upload</tt> media type to label partial representation data when resuming an upload (<xref target="media-type-partial-upload"/>).</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>Some examples in this document contain long lines that may be folded, as described in <xref target="RFC8792"/>.</t>
      <t>The terms Structured Header, Item, Dictionary, String, Integer, and Boolean are imported from <xref target="STRUCTURED-FIELDS"/>.</t>
      <t>The terms "representation", "representation data", "representation metadata", "content", "client" and "server" are from <xref section="3" sectionFormat="of" target="HTTP"/>.</t>
      <t>The term "URI" is used as defined in <xref section="4" sectionFormat="of" target="HTTP"/>.</t>
      <t>The term "patch document" is taken from <xref target="PATCH"/>.</t>
      <t>An <em>upload resource</em> is a temporary resource on the server that facilitates the resumable upload of one representation (<xref target="upload-resource"/>).</t>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>Resumable uploads are supported in HTTP through use of a temporary resource, an <em>upload resource</em> (<xref target="upload-resource"/>), that is separate from the resource being uploaded to and specific to that upload. By interacting with the upload resource, a client can retrieve the current offset of the upload (<xref target="offset-retrieving"/>), append to the upload (<xref target="upload-appending"/>), and cancel the upload (<xref target="upload-cancellation"/>).</t>
      <t>The remainder of this section uses examples to illustrate different interactions with the upload resource. HTTP message exchanges, and thereby resumable uploads, use representation data (see <xref section="8.1" sectionFormat="of" target="HTTP"/>). This means that resumable uploads can be used with many forms of content, such as static files, in-memory buffers, data from streaming sources, or on-demand generated data. Examples are purely illustrative and non-normative. Implementations of this protocol are expected to follow normative requirements defined in other sections, together with applying security considerations presented in <xref target="security-considerations"/>.</t>
      <section anchor="example-1">
        <name>Example 1: Complete upload of representation data with known size</name>
        <t>In this example, the client first attempts to upload representation data with a known size in a single HTTP request to the resource at <tt>/project/123/files</tt>. An interruption occurs and the client then attempts to resume the upload using subsequent HTTP requests to the upload resource at <tt>/uploads/abc</tt>.</t>
        <t>1) The client notifies the server that it wants to begin an upload (<xref target="upload-creation"/>). The server reserves the required resources to accept the upload from the client and then sends an interim response to the client, which signals the server's support of resumable upload as well as the upload resource's URI via the Location header field (<xref section="10.2.2" sectionFormat="of" target="HTTP"/>). The client can start sending the representation data in the request content immediately after the request header. Alternatively, it could also await the acknowledgement in form of the interim response.</t>
        <figure anchor="fig-upload-creation">
          <name>Upload Creation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="520" viewBox="0 0 520 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,304" fill="none" stroke="black"/>
                <path d="M 368,48 L 368,304" fill="none" stroke="black"/>
                <path d="M 512,192 L 512,224" fill="none" stroke="black"/>
                <path d="M 16,128 L 360,128" fill="none" stroke="black"/>
                <path d="M 376,192 L 512,192" fill="none" stroke="black"/>
                <path d="M 376,224 L 512,224" fill="none" stroke="black"/>
                <path d="M 16,288 L 360,288" fill="none" stroke="black"/>
                <path d="M 16,320 L 120,320" fill="none" stroke="black"/>
                <path d="M 256,320 L 360,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,224 372,218.4 372,229.6" fill="black" transform="rotate(180,376,224)"/>
                <polygon class="arrowhead" points="368,128 356,122.4 356,133.6" fill="black" transform="rotate(0,360,128)"/>
                <polygon class="arrowhead" points="24,288 12,282.4 12,293.6" fill="black" transform="rotate(180,16,288)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="348" y="36">Server</text>
                  <text x="36" y="68">POST</text>
                  <text x="132" y="68">/project/123/files</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="84" y="116">[representation]</text>
                  <text x="408" y="164">Reserve</text>
                  <text x="480" y="164">resources</text>
                  <text x="392" y="180">for</text>
                  <text x="436" y="180">upload</text>
                  <text x="120" y="260">104</text>
                  <text x="164" y="260">Upload</text>
                  <text x="236" y="260">Resumption</text>
                  <text x="320" y="260">Supported</text>
                  <text x="144" y="276">Location:</text>
                  <text x="236" y="276">/uploads/abc</text>
                  <text x="8" y="324">X</text>
                  <text x="140" y="324">Flow</text>
                  <text x="208" y="324">Interrupted</text>
                  <text x="368" y="324">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                  Server
|                                            |
| POST /project/123/files                    |
| Upload-Complete: ?1                        |
|                                            |
| [representation]                           |
|------------------------------------------->|
|                                            |
|                                            | Reserve resources
|                                            | for upload
|                                            |-----------------.
|                                            |                 |
|                                            |<----------------'
|                                            |
|            104 Upload Resumption Supported |
|            Location: /uploads/abc          |
|<-------------------------------------------|
|                                            |
X--------------Flow Interrupted--------------X
]]></artwork>
          </artset>
        </figure>
        <t>2) If the connection to the server is interrupted, the client might want to resume the upload. However, before this is possible the client needs to know the amount of representation data that the server received before the interruption. It does so by retrieving the offset (<xref target="offset-retrieving"/>) from the upload resource.</t>
        <figure anchor="fig-offset-retrieving">
          <name>Offset Retrieval</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="176" width="416" viewBox="0 0 416 176" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,160" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,160" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,144 12,138.4 12,149.6" fill="black" transform="rotate(180,16,144)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">HEAD</text>
                  <text x="108" y="68">/uploads/abc</text>
                  <text x="280" y="116">204</text>
                  <text x="308" y="116">No</text>
                  <text x="352" y="116">Content</text>
                  <text x="324" y="132">Upload-Offset:</text>
                  <text x="392" y="132">X</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD /uploads/abc                               |
|------------------------------------------------>|
|                                                 |
|                                204 No Content   |
|                                Upload-Offset: X |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) The client can resume the upload by sending the remaining representation data to the upload resource (<xref target="upload-appending"/>), appending to the already stored representation data in the upload using the <tt>application/partial-upload</tt> media type. The <tt>Upload-Offset</tt> value is included to ensure that the client and server agree on the offset that the upload resumes from. Once the remaining representation data is transferred, the server processes the entire representation and responds with whatever the initial request to <tt>/project/123/files</tt> would have produced if it had not been interrupted, e.g. a <tt>200 (OK)</tt> response.</t>
        <figure anchor="fig-upload-appending">
          <name>Upload Append</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="416" viewBox="0 0 416 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,224" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,224" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,208 L 400,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,208 12,202.4 12,213.6" fill="black" transform="rotate(180,16,208)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">X</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="80" y="148">[representation</text>
                  <text x="164" y="148">from</text>
                  <text x="212" y="148">offset</text>
                  <text x="252" y="148">X]</text>
                  <text x="360" y="196">200</text>
                  <text x="388" y="196">OK</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?1                             |
| Upload-Offset: X                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [representation from offset X]                  |
|------------------------------------------------>|
|                                                 |
|                                          200 OK |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) If the client is not interested in completing the upload, it can instruct the upload resource to delete the upload and free all related resources (<xref target="upload-cancellation"/>).</t>
        <figure anchor="fig-upload-cancellation">
          <name>Upload Cancellation</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="416" viewBox="0 0 416 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,144" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,144" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,128 12,122.4 12,133.6" fill="black" transform="rotate(180,16,128)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="44" y="68">DELETE</text>
                  <text x="124" y="68">/uploads/abc</text>
                  <text x="296" y="116">204</text>
                  <text x="324" y="116">No</text>
                  <text x="368" y="116">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| DELETE /uploads/abc                             |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="example-2">
        <name>Example 2: Upload as a series of parts</name>
        <t>In some cases, clients might prefer to upload a representation as a series of parts sent serially across multiple HTTP messages. One use case is to overcome server limits on HTTP message content size. Another use case is where the client does not know the final size of the representation data, such as when the data originates from a streaming source.</t>
        <t>This example shows how the client, communicating to a server known to support resumable upload, can upload parts of a representation incrementally.</t>
        <t>1) If the client is aware that the server supports resumable upload, it can start an upload with the <tt>Upload-Complete</tt> field value set to false and the first part of the representation.</t>
        <figure anchor="fig-upload-creation-incomplete">
          <name>Upload creation with partial representation data</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="224" width="416" viewBox="0 0 416 224" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,208" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,208" fill="none" stroke="black"/>
                <path d="M 16,128 L 400,128" fill="none" stroke="black"/>
                <path d="M 16,192 L 400,192" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
                <polygon class="arrowhead" points="24,192 12,186.4 12,197.6" fill="black" transform="rotate(180,16,192)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">POST</text>
                  <text x="132" y="68">/project/123/files</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?0</text>
                  <text x="52" y="116">[partial</text>
                  <text x="152" y="116">representation]</text>
                  <text x="320" y="164">201</text>
                  <text x="368" y="164">Created</text>
                  <text x="256" y="180">Location:</text>
                  <text x="348" y="180">/uploads/abc</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| POST /project/123/files                         |
| Upload-Complete: ?0                             |
|                                                 |
| [partial representation]                        |
|------------------------------------------------>|
|                                                 |
|                                     201 Created |
|                          Location: /uploads/abc |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>2) Next, intermediate parts are appended (<xref target="upload-appending"/>) with the <tt>Upload-Complete</tt> field value set to false, indicating that they are not the last part of the representation data. The offset value in the <tt>Upload-Offset</tt> header field is taken from the previous response when creating the upload or appending to it.</t>
        <figure anchor="fig-upload-appending-incomplete">
          <name>Appending partial representation data to upload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="416" viewBox="0 0 416 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,224" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,224" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,208 L 400,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,208 12,202.4 12,213.6" fill="black" transform="rotate(180,16,208)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?0</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">X</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="52" y="148">[partial</text>
                  <text x="148" y="148">representation</text>
                  <text x="228" y="148">from</text>
                  <text x="276" y="148">offset</text>
                  <text x="316" y="148">X]</text>
                  <text x="296" y="196">204</text>
                  <text x="324" y="196">No</text>
                  <text x="368" y="196">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?0                             |
| Upload-Offset: X                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [partial representation from offset X]          |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>3) If the connection was interrupted, the client might want to resume the upload, similar to the previous example (<xref target="example-1"/>). The client retrieves the offset (<xref target="offset-retrieving"/>) to learn the amount of representation data received by the server and then continues appending the remaining parts to the upload as in the previous step.</t>
        <figure anchor="fig-upload-resume-incomplete">
          <name>Resuming an interrupted upload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="416" viewBox="0 0 416 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,336" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,336" fill="none" stroke="black"/>
                <path d="M 16,80 L 400,80" fill="none" stroke="black"/>
                <path d="M 16,144 L 400,144" fill="none" stroke="black"/>
                <path d="M 16,272 L 400,272" fill="none" stroke="black"/>
                <path d="M 16,320 L 400,320" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,272 396,266.4 396,277.6" fill="black" transform="rotate(0,400,272)"/>
                <polygon class="arrowhead" points="408,80 396,74.4 396,85.6" fill="black" transform="rotate(0,400,80)"/>
                <polygon class="arrowhead" points="24,320 12,314.4 12,325.6" fill="black" transform="rotate(180,16,320)"/>
                <polygon class="arrowhead" points="24,144 12,138.4 12,149.6" fill="black" transform="rotate(180,16,144)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="36" y="68">HEAD</text>
                  <text x="108" y="68">/uploads/abc</text>
                  <text x="296" y="116">204</text>
                  <text x="324" y="116">No</text>
                  <text x="368" y="116">Content</text>
                  <text x="324" y="132">Upload-Offset:</text>
                  <text x="392" y="132">Y</text>
                  <text x="40" y="180">PATCH</text>
                  <text x="116" y="180">/uploads/abc</text>
                  <text x="84" y="196">Upload-Complete:</text>
                  <text x="164" y="196">?0</text>
                  <text x="76" y="212">Upload-Offset:</text>
                  <text x="144" y="212">Y</text>
                  <text x="72" y="228">Content-Type:</text>
                  <text x="236" y="228">application/partial-upload</text>
                  <text x="52" y="260">[partial</text>
                  <text x="148" y="260">representation</text>
                  <text x="228" y="260">from</text>
                  <text x="276" y="260">offset</text>
                  <text x="316" y="260">Y]</text>
                  <text x="296" y="308">204</text>
                  <text x="324" y="308">No</text>
                  <text x="368" y="308">Content</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| HEAD /uploads/abc                               |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|                                Upload-Offset: Y |
|<------------------------------------------------|
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?0                             |
| Upload-Offset: Y                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [partial representation from offset Y]          |
|------------------------------------------------>|
|                                                 |
|                                  204 No Content |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
        <t>4) The request to append the last part of the representation data has a <tt>Upload-Complete</tt> field value set to true to indicate the complete transfer. Once the remaining representation data is transferred, the server processes the entire representation and responds with whatever the initial request to <tt>/project/123/files</tt> would have produced if it had received the entire representation, e.g. a <tt>200 (OK)</tt> response.</t>
        <figure anchor="fig-upload-appending-last-chunk">
          <name>Appending remaining representation data</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="416" viewBox="0 0 416 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,224" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,224" fill="none" stroke="black"/>
                <path d="M 16,160 L 400,160" fill="none" stroke="black"/>
                <path d="M 16,208 L 400,208" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="408,160 396,154.4 396,165.6" fill="black" transform="rotate(0,400,160)"/>
                <polygon class="arrowhead" points="24,208 12,202.4 12,213.6" fill="black" transform="rotate(180,16,208)"/>
                <g class="text">
                  <text x="28" y="36">Client</text>
                  <text x="388" y="36">Server</text>
                  <text x="40" y="68">PATCH</text>
                  <text x="116" y="68">/uploads/abc</text>
                  <text x="84" y="84">Upload-Complete:</text>
                  <text x="164" y="84">?1</text>
                  <text x="76" y="100">Upload-Offset:</text>
                  <text x="144" y="100">Z</text>
                  <text x="72" y="116">Content-Type:</text>
                  <text x="236" y="116">application/partial-upload</text>
                  <text x="60" y="148">[remaining</text>
                  <text x="164" y="148">representation</text>
                  <text x="244" y="148">from</text>
                  <text x="292" y="148">offset</text>
                  <text x="332" y="148">Z]</text>
                  <text x="360" y="196">200</text>
                  <text x="388" y="196">OK</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
Client                                       Server
|                                                 |
| PATCH /uploads/abc                              |
| Upload-Complete: ?1                             |
| Upload-Offset: Z                                |
| Content-Type: application/partial-upload        |
|                                                 |
| [remaining representation from offset Z]        |
|------------------------------------------------>|
|                                                 |
|                                          200 OK |
|<------------------------------------------------|
|                                                 |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="upload-resource">
      <name>Upload Resource</name>
      <t>A resumable upload is enabled through interaction with an upload resource. When a resumable upload begins, the server is asked to create an upload resource through a request to another resource (<xref target="upload-creation"/>). This upload resource is responsible for handling the upload of a representation. Using the upload resource, the client can query the upload progress (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancel the upload (<xref target="upload-cancellation"/>).</t>
      <t>An upload resource is specific to the upload of one representation. For uploading multiple representations, multiple upload resources have to be used.</t>
      <t>The server can clean up an upload resource and make it inaccessible immediately after the upload is complete. However, if a client didn't receive the last response acknowledging the upload's completion and the upload resource is not available anymore, the client cannot verify the upload's state with the server. Therefore, the server <bcp14>SHOULD</bcp14> keep the upload resource available for a reasonable amount of time after the upload is complete, or provide an alternate, application-specific way for the client to verify the completion of the upload.</t>
      <t>An upload resource <bcp14>SHOULD</bcp14> be unique. Reuse of a URI for a different upload resource <bcp14>SHOULD</bcp14> be avoided in order to reduce the chance of misdirected or corrupted upload resources, as well as the potential security issues described in <xref target="security-considerations"/>.</t>
      <section anchor="state">
        <name>State</name>
        <t>The state of an upload consists of the following properties that are tracked by the upload resource.</t>
        <section anchor="upload-offset">
          <name>Offset</name>
          <t>The offset is the number of bytes from the representation data that have been received, either during the creation of the upload resource (<xref target="upload-creation"/>) and by appending to it (<xref target="upload-appending"/>). The offset can be retrieved from the upload resource (<xref target="offset-retrieving"/>) and is required when appending representation data (<xref target="upload-appending"/>) to synchronize the client and resource regarding the amount of transferred representation data.</t>
          <t>Representation data received by the upload resource cannot be removed again and, therefore, the offset <bcp14>MUST NOT</bcp14> decrease. If the server loses any part of the state, it <bcp14>MUST</bcp14> deactivate the upload resource and reject further interaction with it.</t>
          <t>The <tt>Upload-Offset</tt> request and response header field conveys the offset. <tt>Upload-Offset</tt> is an Item Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a non-negative Integer (<xref section="3.3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>) and indicates the current offset as viewed by the message sender. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>The <tt>Upload-Offset</tt> header field in responses serves as an acknowledgement of the received representation data and as a guarantee that no retransmission of it will be necessary. Clients can use this guarantee to free resources associated to transferred representation data.</t>
        </section>
        <section anchor="upload-complete">
          <name>Completeness</name>
          <t>An upload is incomplete until it is explicitly marked as completed by the client. After this point, no representation data can be appended anymore.</t>
          <t>The <tt>Upload-Complete</tt> request and response header field conveys the completeness state. <tt>Upload-Complete</tt> is an Item Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a Boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>) and indicates whether the upload is complete or not. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>An upload is marked as completed if a request for creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>) included the <tt>Upload-Complete</tt> header field with a true value and the request content was fully received.</t>
        </section>
        <section anchor="upload-length">
          <name>Length</name>
          <t>The length of an upload is the number of bytes of representation data that the client intends to upload.</t>
          <t>Even the client might not know the total length of the representation data when starting the transfer, for example, because the representation is taken from a streaming source. However, a client <bcp14>SHOULD</bcp14> communicate the length to the upload resource as soon as it becomes known. There are two different ways for the client to indicate and the upload resource to discover the length from requests for creating the upload resource (<xref target="upload-creation"/>) or appending to it (<xref target="upload-appending"/>):</t>
          <ol spacing="normal" type="1"><li>
              <t>If the request includes the <tt>Upload-Complete</tt> field value set to true and a valid <tt>Content-Length</tt> header field, the request content is the remaining representation data. The length is then the sum of the current offset (<xref target="upload-offset"/>) and the <tt>Content-Length</tt> header field value.</t>
            </li>
            <li>
              <t>The request can include the <tt>Upload-Length</tt> header field defined below.</t>
            </li>
          </ol>
          <t>The <tt>Upload-Length</tt> request and response header field is an Item Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a non-negative Integer (<xref section="3.3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>) and indicates the number of bytes of the entire representation data. Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>If indicators (1) and (2) are both present in the same request, their indicated lengths <bcp14>MUST</bcp14> match. If multiple requests include indicators, their indicated values <bcp14>MUST</bcp14> match. A server can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#inconsistent-upload-length" (<xref target="inconsistent-length"/>) in responses to indicate inconsistent length values.</t>
          <t>The <tt>Upload-Length</tt> field can be used in response to an offset retrieval; see <xref target="offset-retrieving-server"/>.</t>
          <t>The upload resource might not know the length until the upload is complete.</t>
          <t>Note that the length and offset values do not determine whether an upload is complete. Instead, the client uses the <tt>Upload-Complete</tt> (<xref target="upload-complete"/>) header field to indicate that a request completes the upload. The offset could match the length, but the upload can still be incomplete.</t>
        </section>
        <section anchor="upload-limit">
          <name>Limits</name>
          <t>An upload resource <bcp14>MAY</bcp14> enforce one or multiple limits, which are communicated to the client via the <tt>Upload-Limit</tt> response header field. <tt>Upload-Limit</tt> is a Dictionary Structured Header Field (<xref target="STRUCTURED-FIELDS"/>). Its value is a Dictionary (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>). Other values <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
          <t>The following key-value pairs are defined:</t>
          <dl>
            <dt><tt>max-size</tt>:</dt>
            <dd>
              <t>Specifies a maximum size for the representation data, counted in bytes. The server might not create an upload resource if the length (<xref target="upload-length"/>) deduced from the upload creation request is larger than the maximum size. The server might also deactivate the upload resource if the offset (<xref target="upload-offset"/>) exceeds the maximum size. The value is an Integer.</t>
            </dd>
            <dt><tt>min-size</tt>:</dt>
            <dd>
              <t>Specifies a minimum size for the representation data, counted in bytes. The server might not create an upload resource if the length (<xref target="upload-length"/>) deduced from the upload creation request is smaller than the minimum size or no length can be deduced at all. The value is an Integer.</t>
            </dd>
            <dt><tt>max-append-size</tt>:</dt>
            <dd>
              <t>Specifies a maximum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>). The server might reject requests exceeding this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send larger upload append requests. The value is an Integer.</t>
            </dd>
            <dt><tt>min-append-size</tt>:</dt>
            <dd>
              <t>Specifies a minimum size counted in bytes for the request content in a single upload append request (<xref target="upload-appending"/>). The server might reject requests below this limit. A client that is aware of this limit <bcp14>MUST NOT</bcp14> send smaller upload append requests. The value is an Integer. Requests completing the upload by including the <tt>Upload-Complete: ?1</tt> header field are exempt from this limit.</t>
            </dd>
            <dt><tt>max-age</tt>:</dt>
            <dd>
              <t>Specifies the remaining lifetime of the upload resource in seconds counted from the generation of the response. After the resource's lifetime is reached, the server might make the upload resource inaccessible and a client <bcp14>SHOULD NOT</bcp14> attempt to access the upload resource as these requests will likely fail. The value is an Integer.</t>
            </dd>
          </dl>
          <t>Clients usually discover limits through the <tt>Upload-Limit</tt> header field when the upload resource is created (<xref target="upload-creation"/>). Throughout the lifetime of the upload resource, these limits <bcp14>SHOULD NOT</bcp14> change in a way that causes failures for clients adhering to the initially discovered limits. In particular, whereas the values for <tt>max-size</tt>, <tt>max-append-size</tt>, and <tt>max-age</tt> can increase without harm, they <bcp14>SHOULD NOT</bcp14> decrease as they can cause ongoing uploads to fail. Similarly, the value for <tt>min-append-size</tt> <bcp14>SHOULD NOT</bcp14> increase. If the client discovers that it cannot continue the upload while adhering to the limits, it <bcp14>SHOULD</bcp14> stop the current request immediately and cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>Receivers of <tt>Upload-Limit</tt> parse the Dictionary as described in <xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>. Where the Dictionary is successfully parsed, this document places two additional requirements on Dictionary members. First, a member with an unknown key <bcp14>MUST</bcp14> be ignored. Second, a member with a known key but a value of unexpected type <bcp14>MUST</bcp14> cause the entire <tt>Upload-Limit</tt> header field to be ignored, or alternatively the complete HTTP message <bcp14>MUST</bcp14> be treated as malformed.</t>
          <t>A server that supports the creation of a resumable upload resource (<xref target="upload-creation"/>) for a target URI <bcp14>MUST</bcp14> include the <tt>Accept-Patch</tt> (<xref section="3.1" sectionFormat="of" target="PATCH"/>) header field in response to an <tt>OPTIONS</tt> request for the target URI. If a server supports the creation of upload resources for any target URI, it <bcp14>SHOULD</bcp14> include the <tt>Accept-Patch</tt> header field in response to an <tt>OPTIONS</tt> request for the target <tt>*</tt> (if this target is supported). The value of the <tt>Accept-Patch</tt> header field <bcp14>MUST</bcp14> include the full <tt>application/partial-upload</tt> media type, even if it already contains <tt>*/*</tt> or <tt>application/*</tt>. The <tt>Upload-Limit</tt> header field <bcp14>SHOULD</bcp14> be included in the response to an <tt>OPTIONS</tt> request if limits apply.</t>
          <t>A client can use an <tt>OPTIONS</tt> request to discover support for resumable uploads and potential limits before creating an upload resource. While the values <tt>*/*</tt> and <tt>application/*</tt> in the <tt>Accept-Patch</tt> response header field indicate the acceptance of the <tt>application/partial-upload</tt> in PATCH requests, it does not necessarily indicate support for all aspects of resumable uploads as defined in this document. To reduce the likelihood of failing requests, the limits announced in an <tt>OPTIONS</tt> response <bcp14>SHOULD NOT</bcp14> be less restrictive than the limits applied to an upload once the upload resource has been created, unless the request to create an upload resource included additional information that warrants different limits. For example, a server might announce a general maximum size limit of 1GB, but reduce it to 100MB when the media type indicates an image.</t>
          <t>Servers, including intermediaries, can (and often do) apply restrictions on the size of individual request message content. There is no standard mechanism to communicate such existing size restriction. A server that implements one can respond with a 413 Content Too Large status code; see <xref section="15.5.14" sectionFormat="of" target="HTTP"/>. Appending to an upload resource, as a series of appends, can be used to upload data up to the <tt>max-size</tt> limit without encountering per-message limits. The <tt>min-append-size</tt> and <tt>max-append-size</tt> limits apply to the upload resource. Servers might apply restrictions that are smaller than the append limits, which would also result in a failed request. Clients could deal with such situations by retrying an upload append using a smaller size, as long as the new size resides between <tt>min-append-size</tt> and <tt>max-append-size</tt>. Cases where an append uses <tt>min-append-size</tt> yet fails with a 413 Content Too Large response might indicate a deployment mismatch that cannot be recovered from.</t>
        </section>
      </section>
      <section anchor="upload-creation">
        <name>Upload Creation</name>
        <section anchor="client-behavior">
          <name>Client Behavior</name>
          <t>A client can start a resumable upload from any request that can carry content by including the <tt>Upload-Complete</tt> header field (<xref target="upload-complete"/>). As a consequence, all request methods that allow content are possible, such as <tt>POST</tt>, <tt>PUT</tt>, and <tt>PATCH</tt>.</t>
          <t>The <tt>Upload-Complete</tt> header field is set to true if the request content includes the entire representation data that the client intends to upload. This is also a requirement for transparently upgrading to resumable uploads from traditional uploads (<xref target="upgrading-uploads"/>).</t>
          <t>If the client knows the representation data's length, it <bcp14>SHOULD</bcp14> indicate the length in the request to help the server allocate necessary resources for the upload and provide early feedback if the representation violates a limit (<xref target="upload-limit"/>). This indication can be done through the <tt>Upload-Length</tt> header field or the combination of the <tt>Content-Length</tt> and <tt>Upload-Complete: ?1</tt> header fields (see <xref target="upload-length"/>).</t>
          <t>The client <bcp14>SHOULD</bcp14> respect any limits (<xref target="upload-limit"/>) announced in the <tt>Upload-Limit</tt> header field in interim or final responses. In particular, if the allowed maximum size is less than the amount of representation data the client intends to upload, the client <bcp14>SHOULD</bcp14> stop the current request immediately and cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>The request content can be empty. If the <tt>Upload-Complete</tt> header field is then set to true, the client intends to upload an empty representation. An <tt>Upload-Complete</tt> header field set to false is also valid. This can be used to retrieve the upload resource's URI before transferring any representation data. Since interim responses are optional, this technique provides another mechanism to learn the URI, at the cost of an additional round-trip before data upload can commence.</t>
          <t>Representation metadata included in the initial request (see <xref section="8.3" sectionFormat="of" target="HTTP"/>) can affect how servers act on the uploaded representation data. The <tt>Content-Type</tt> header field (<xref section="8.3" sectionFormat="of" target="HTTP"/>) indicates the media type of the representation. The <tt>Content-Encoding</tt> header field (<xref section="8.4" sectionFormat="of" target="HTTP"/>) names the content codings applied to the representation. The <tt>Content-Disposition</tt> header field (<xref target="CONTENT-DISPOSITION"/>) can be used to transmit a filename. For this purpose, the <tt>inline</tt> disposition type is <bcp14>RECOMMENDED</bcp14>.</t>
          <t>If the client received a final response with a</t>
          <ul spacing="normal">
            <li>
              <t><tt>2xx (Successful)</tt> status code and the entire representation data was transferred in the request content, the upload is complete and the response comes from the targeted resource processing the representation.</t>
            </li>
            <li>
              <t><tt>2xx (Successful)</tt> status code and the entire representation data was not transferred in the request content, the <tt>Location</tt> response header field points the client to the created upload resource. The client can continue appending representation data to it (<xref target="upload-appending"/>).</t>
            </li>
            <li>
              <t><tt>4xx (Client Error)</tt> status code, the client <bcp14>SHOULD NOT</bcp14> attempt to retry or resume the upload, unless the semantics of the response allow or recommend the client to retry the request.</t>
            </li>
            <li>
              <t><tt>5xx (Server Error)</tt> status code or no final response at all due to connectivity issues, the client <bcp14>MAY</bcp14> automatically attempt upload resumption by retrieving the current offset (<xref target="offset-retrieving"/>) if it received the URI of the upload resource in a <tt>104 (Upload Resumption Supported)</tt> interim response.</t>
            </li>
          </ul>
        </section>
        <section anchor="server-behavior">
          <name>Server Behavior</name>
          <t>Upon receiving a request with the <tt>Upload-Complete</tt> header field, the server can choose to offer resumption support by creating an upload resource. If so, it <bcp14>SHOULD</bcp14> announce the upload resource by sending an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code unless the server is not capable of sending interim responses. The interim response allows the client to resume the upload even if the message exchange gets later interrupted. When sent, it <bcp14>MUST</bcp14> include <tt>Location</tt> header field pointing to the upload resource and <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits (<xref target="upload-limit"/>) if existing.</t>
          <t>The resource targeted by this initial request is responsible for processing the representation data transferred in the resumable upload according to the method and header fields in the initial request, while the upload resource enables resuming the transfer.</t>
          <t>If the <tt>Upload-Complete</tt> request header field is set to true, the client intends to transfer the entire representation data in one request. If the request content was fully received, no resumable upload is needed and the resource proceeds to process the request and generate a response.</t>
          <t>If the <tt>Upload-Complete</tt> header field is set to false, the client intends to transfer the representation over multiple requests. If the request content was fully received, the server <bcp14>MUST</bcp14> include the <tt>Location</tt> response header field pointing to the upload resource and <bcp14>MUST</bcp14> include the <tt>Upload-Limit</tt> header field with the corresponding limits if existing. Servers are <bcp14>RECOMMENDED</bcp14> to use the <tt>201 (Created)</tt> status code.</t>
          <t>The server <bcp14>MUST</bcp14> record the length according to <xref target="upload-length"/> if the <tt>Upload-Length</tt> or <tt>Upload-Complete: ?1</tt> header fields are included in the request.</t>
          <t>While the request content is being received, the server <bcp14>MAY</bcp14> send multiple interim responses with a <tt>104 (Upload Resumption Supported)</tt> status code and the <tt>Upload-Offset</tt> header field set to the current offset to inform the client about the upload progress.</t>
          <t>Where a response requires a <tt>Location</tt> header field to be included, all interim and final response messages for the same request <bcp14>MUST</bcp14> contain an identical <tt>Location</tt> value. However, final responses including the <tt>Upload-Complete: ?1</tt> header field are exempt from this requirement because they are the result of processing the transferred representation and the <tt>Location</tt> value does not necessarily represent the upload location. Where the <tt>Location</tt> value is expected to be identical across multiple messages, clients <bcp14>SHOULD</bcp14> verify this. If verification fails, clients <bcp14>SHOULD</bcp14> abort the current request and cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>The server might not receive the entire request content when the upload is interrupted, for example because of dropped connection or canceled request. In this case, the server <bcp14>SHOULD</bcp14> append as much of the request content as possible to the upload resource, allowing the client to resume the upload from where it was interrupted. In addition, the upload resource <bcp14>MUST NOT</bcp14> be considered complete then.</t>
        </section>
        <section anchor="upload-creation-example">
          <name>Examples</name>
          <t>A) The following example shows an upload creation, where the entire 123456789 bytes are transferred in the initial request. The server sends multiple interim responses and one final response from processing the uploaded representation.</t>
          <sourcecode type="http-message"><![CDATA[
POST /project/123/files HTTP/1.1
Host: example.com
Content-Disposition: inline; filename="file name.jpg"; filename*=UTF-8''file%20name.jpg
Content-Length: 123456789
Upload-Length: 123456789
Upload-Complete: ?1

[content (123456789 bytes)]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/b530ce8ff
Upload-Limit: max-size=1234567890

HTTP/1.1 104 Upload Resumption Supported
Upload-Offset: 23456789

HTTP/1.1 200 OK
Location: https://example.com/upload/b530ce8ff
Upload-Limit: max-size=1234567890
Content-Type: application/json

{"attachmentId": "b530ce8ff"}
]]></sourcecode>
          <t>B) The following example shows an upload creation, where only the first 23456789 bytes of a 123456789 bytes upload are transferred. The server acknowledges the received representation data and that the upload is not complete yet. The client can continue appending data.</t>
          <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Complete: ?0
Content-Length: 23456789
Upload-Length: 123456789

[partial content (23456789 bytes)]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/3fd4994ad

HTTP/1.1 201 Created
Location: https://example.com/upload/3fd4994ad
Upload-Limit: max-size=1234567890
]]></sourcecode>
          <t>C) The following example shows an upload creation, where the server responds with a 5xx status code. Thanks to the interim response containing the upload resource URI, the client can resume the upload.</t>
          <sourcecode type="http-message"><![CDATA[
POST /upload HTTP/1.1
Host: example.com
Upload-Complete: ?1
Content-Length: 123456789
Upload-Length: 123456789

[content (123456789 bytes)]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Location: https://example.com/upload/0587fa44b

HTTP/1.1 500 Internal Server Error
]]></sourcecode>
          <t>D) The following example shows an upload creation being rejected by the server because uploads to the target resource are not allowed. The client cannot continue the upload.</t>
          <sourcecode type="http-message"><![CDATA[
POST /upload-not-allowed HTTP/1.1
Host: example.com
Upload-Complete: ?1
Content-Length: 123456789
Upload-Length: 123456789

[content (123456789 bytes)]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 405 Method Not Allowed
]]></sourcecode>
        </section>
      </section>
      <section anchor="offset-retrieving">
        <name>Offset Retrieval</name>
        <section anchor="client-behavior-1">
          <name>Client Behavior</name>
          <t>If the client wants to resume the upload after an interruption, it has to know the amount of representation data received by the upload resource so far. It can fetch the offset by sending a <tt>HEAD</tt> request to the upload resource. Upon a successful response, the client can continue the upload by appending representation data (<xref target="upload-appending"/>) starting at the offset indicated by the <tt>Upload-Offset</tt> response header field.</t>
          <t>The offset can be less than or equal to the number of bytes of representation data that the client has already sent. The client <bcp14>MAY</bcp14> reject an offset which is greater than the number of bytes it has already sent during this upload by not continuing the upload and canceling the upload resource (<xref target="upload-cancellation"/>). The client is expected to handle backtracking of a reasonable length. If the offset is invalid for this upload, or if the client cannot backtrack to the offset and reproduce the same representation data it has already sent, the upload <bcp14>MUST</bcp14> be considered a failure. The client then <bcp14>MUST NOT</bcp14> continue the upload and <bcp14>SHOULD</bcp14> cancel the upload (<xref target="upload-cancellation"/>).</t>
          <t>The client <bcp14>MUST NOT</bcp14> perform offset retrieval while creation (<xref target="upload-creation"/>) or appending (<xref target="upload-appending"/>) is in progress as this can cause the previous request to be terminated by the server as described in <xref target="concurrency"/>.</t>
          <t>If the client received a response with a</t>
          <ul spacing="normal">
            <li>
              <t><tt>2xx (Successful)</tt> status code, the client can continue appending representation data to it (<xref target="upload-appending"/>) if the upload is not complete yet.</t>
            </li>
            <li>
              <t><tt>307 (Temporary Redirect)</tt> or <tt>308 (Permanent Redirect)</tt> status code, the client <bcp14>MAY</bcp14> retry retrieving the offset from the new URI.</t>
            </li>
            <li>
              <t><tt>4xx (Client Error)</tt> status code, the client <bcp14>SHOULD NOT</bcp14> attempt to retry or resume the upload, unless the semantics of the response allow or recommend the client to retry the request.</t>
            </li>
            <li>
              <t><tt>5xx (Server Error)</tt> status code or no final response at all due to connectivity issues, the client <bcp14>MAY</bcp14> retry retrieving the offset.</t>
            </li>
          </ul>
        </section>
        <section anchor="offset-retrieving-server">
          <name>Server Behavior</name>
          <t>A successful response to a <tt>HEAD</tt> request against an upload resource</t>
          <ul spacing="normal">
            <li>
              <t><bcp14>MUST</bcp14> include the offset in the <tt>Upload-Offset</tt> header field (<xref target="upload-offset"/>),</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> include the completeness state in the <tt>Upload-Complete</tt> header field (<xref target="upload-complete"/>),</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> include the length in the <tt>Upload-Length</tt> header field, unless the client has not supplied one, by providing the corresponding headers as described in (<xref target="upload-length"/>),</t>
            </li>
            <li>
              <t><bcp14>MUST</bcp14> indicate the limits in the <tt>Upload-Limit</tt> header field (<xref target="upload-limit"/>), and</t>
            </li>
            <li>
              <t><bcp14>SHOULD</bcp14> include the <tt>Cache-Control</tt> header field with the value <tt>no-store</tt> to prevent HTTP caching (<xref target="CACHING"/>).</t>
            </li>
          </ul>
          <t>The resource <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt> and <tt>302 (Found)</tt> status codes because clients might follow the redirect without preserving the <tt>HEAD</tt> method.</t>
        </section>
        <section anchor="offset-retrieving-example">
          <name>Examples</name>
          <t>A) The following example shows an offset retrieval request. The server indicates the current offset and that the upload is not complete yet. The client can continue to append representation data.</t>
          <sourcecode type="http-message"><![CDATA[
HEAD /upload/c35e2cd29 HTTP/1.1
Host: example.com
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Complete: ?0
Upload-Offset: 25000000
Upload-Length: 100000000
Upload-Limit: max-age=3600
Cache-Control: no-store
]]></sourcecode>
          <t>B) The following example shows an offset retrieval request for a completed upload. The client does not need to continue the upload.</t>
          <sourcecode type="http-message"><![CDATA[
HEAD /upload/a9edb781b HTTP/1.1
Host: example.com
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
Upload-Complete: ?1
Upload-Offset: 100000000
Upload-Length: 100000000
Cache-Control: no-store
]]></sourcecode>
        </section>
      </section>
      <section anchor="upload-appending">
        <name>Upload Append</name>
        <section anchor="client-behavior-2">
          <name>Client Behavior</name>
          <t>A client can continue the upload and append representation data by sending a <tt>PATCH</tt> request with the <tt>application/partial-upload</tt> media type (<xref target="media-type-partial-upload"/>) to the upload resource. The request content is the representation data to append.</t>
          <t>The client <bcp14>MUST</bcp14> indicate the offset of the request content inside the representation data by including the <tt>Upload-Offset</tt> request header field. To ensure that the upload resource will accept the request, the offset <bcp14>SHOULD</bcp14> be taken from an immediate previous response for retrieving the offset (<xref target="offset-retrieving"/>) or appending representation data (<xref target="upload-appending"/>).</t>
          <t>The request <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field. Its value is true in two cases:</t>
          <ul spacing="normal">
            <li>
              <t>the request has content that is the end of the representation data. Once the content is fully received by the server, the upload is complete.</t>
            </li>
            <li>
              <t>the request has no content. Once the request is processed by the server, the upload is complete. This usage requires the full representation data to have been received via prior requests.</t>
            </li>
          </ul>
          <t>If the client received a final response with the <tt>Upload-Complete: ?1</tt> header field, the upload is complete and the corresponding response comes from the resource processing the representation according to the initial request (see <xref target="upload-creation"/>). Note that the status code does not necessary indicate success. <tt>4xx (Client Error)</tt> or <tt>5xx (Server Error)</tt> status codes indicate in this case that the representation was fully transmitted, but an error occurred while processing it. Resuming the upload would not resolve this error.</t>
          <t>If the client received a final response with the <tt>Upload-Complete: ?0</tt> header field or the header field missing, the next step depends on the status code:</t>
          <ul spacing="normal">
            <li>
              <t>A <tt>2xx (Successful)</tt> status code indicates that representation data was appended but the upload is not complete. The client can continue appending representation data.</t>
            </li>
            <li>
              <t>For a <tt>307 (Temporary Redirect)</tt> or <tt>308 (Permanent Redirect)</tt> status code, the client <bcp14>MAY</bcp14> retry appending to the new URI.</t>
            </li>
            <li>
              <t>For a <tt>4xx (Client Error)</tt> status code, the client <bcp14>SHOULD NOT</bcp14> attempt to retry or resume the upload, unless the semantics of the response allow or recommend the client to retry the request.</t>
            </li>
            <li>
              <t>For a <tt>5xx (Server Error)</tt> status code, the client <bcp14>MAY</bcp14> automatically attempt upload resumption by retrieving the current offset (<xref target="offset-retrieving"/>).</t>
            </li>
          </ul>
          <t>If no final response was received at all due to connectivity issues, the client <bcp14>MAY</bcp14> automatically attempt upload resumption by retrieving the current offset (<xref target="offset-retrieving"/>).</t>
        </section>
        <section anchor="server-behavior-1">
          <name>Server Behavior</name>
          <t>An upload resource applies a <tt>PATCH</tt> request with the <tt>application/partial-upload</tt> media type (<xref target="media-type-partial-upload"/>) by appending the patch document in the request content to the upload resource.</t>
          <t>The server might not receive the entire patch document when the upload is interrupted, for example because of a dropped connection or canceled request. In this case, the server <bcp14>SHOULD</bcp14> append as much of the patch document as possible to the upload resource, starting at its beginning and without discontinuities. Appending a continuous section starting at the patch document's beginning constitutes a successful PATCH as defined in <xref section="2" sectionFormat="of" target="PATCH"/>. Saving the received data allows the client to resume the upload from where it was interrupted. In addition, the upload resource <bcp14>MUST NOT</bcp14> be considered complete then.</t>
          <t>If the <tt>Upload-Offset</tt> request header field value does not match the current offset (<xref target="upload-offset"/>), the upload resource <bcp14>MUST</bcp14> reject the request with a <tt>409 (Conflict)</tt> status code. The response <bcp14>MUST</bcp14> include the correct offset in the <tt>Upload-Offset</tt> header field. The response can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" (<xref target="mismatching-offset"/>).</t>
          <t>If the upload is already complete (<xref target="upload-complete"/>), the server <bcp14>MUST NOT</bcp14> modify the upload resource and <bcp14>MUST</bcp14> reject the request. The choice of response depends on the nature of the upload request and server state, including but not limited to:</t>
          <ul spacing="normal">
            <li>
              <t>If the client attempted to append a non-zero length document, the server <bcp14>MUST</bcp14> treat this as an inconsistent length failure. The server can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#inconsistent-upload-length" (<xref target="inconsistent-length"/>) in the response.</t>
            </li>
            <li>
              <t>If the client attempted to append a zero-length document:
              </t>
              <ul spacing="normal">
                <li>
                  <t>If the server retains knowledge of the upload resource but it is not available, the <tt>410 (Gone)</tt> status code can be used; the response could also contain a <tt>Location</tt> header field to indicate the location of the completed upload. The server can use the problem type <xref target="PROBLEM"/> of "https://iana.org/assignments/http-problem-types#completed-upload" (<xref target="completed-upload"/>) in the response.</t>
                </li>
                <li>
                  <t>If the server has not retained knowledge of the upload resource, a <tt>404 (Not Found)</tt> status code can be used.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>If the <tt>Upload-Complete</tt> request header field is set to true, the client intends to transfer the remaining representation data in one request. If the request content was fully received, the upload is marked as complete and the upload resource <bcp14>SHOULD</bcp14> generate the response that matches what the resource, that was targeted by the initial upload creation (<xref target="upload-creation"/>), would have generated if it had received the entire representation in the initial request. However, the response <bcp14>MUST</bcp14> include the <tt>Upload-Complete</tt> header field with a true value, allowing clients to identify whether a response, in particular error responses, is related to the resumable upload itself or the processing of the upload representation.</t>
          <t>If the <tt>Upload-Complete</tt> request header field is set to false, the client intends to transfer the remaining representation over multiple requests. If the request content was fully received, the upload resource acknowledges the appended data by sending a <tt>2xx (Successful)</tt> response with the <tt>Upload-Complete</tt> header field set to false.</t>
          <t>The server <bcp14>MUST</bcp14> record the length according to <xref target="upload-length"/> if the <tt>Upload-Length</tt> or <tt>Upload-Complete</tt> header fields are included in the request. If the length is known, the server <bcp14>MUST</bcp14> prevent the offset from exceeding the upload length by rejecting the request once the offset exceeds the length, marking the upload resource invalid and rejecting any further interaction with it. It is not sufficient to rely on the <tt>Content-Length</tt> header field for enforcement because the header field might not be present.</t>
          <t>While the request content is being received, the server <bcp14>SHOULD</bcp14> send interim responses with a <tt>104 (Upload Resumption Supported)</tt> status code and the <tt>Upload-Offset</tt> header field set to the current offset to inform the client about the upload progress. These interim responses <bcp14>MUST NOT</bcp14> include the <tt>Location</tt> header field.</t>
        </section>
        <section anchor="upload-appending-example">
          <name>Examples</name>
          <t>A) The following example shows an upload append request. The client transfers the next 23456789 bytes at an offset of 23456789 and does not indicate that the upload is then completed. The server generates one interim response and finally acknowledges the new offset:</t>
          <sourcecode type="http-message"><![CDATA[
PATCH /upload/37a504d87 HTTP/1.1
Host: example.com
Upload-Complete: ?0
Upload-Offset: 23456789
Content-Length: 23456789
Content-Type: application/partial-upload

[content (23456789 bytes)]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 104 Upload Resumption Supported
Upload-Offset: 35185184

HTTP/1.1 204 No Content
Upload-Complete: ?0
]]></sourcecode>
          <t>B) The next example shows an upload append, where the client transfers the remaining 4567890 bytes and completes the upload with a length of 1234567890 bytes. The server processes the uploaded representation and generates the responding response, in this example containing extracted meta data:</t>
          <sourcecode type="http-message"><![CDATA[
PATCH /upload/d38d6ffe8 HTTP/1.1
Host: example.com
Upload-Complete: ?1
Upload-Offset: 1230000000
Content-Length: 4567890
Content-Type: application/partial-upload

[content (4567890 bytes)]
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Upload-Complete: ?1
Content-Type: application/json

{
  "metadata": {
    [...]
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="upload-cancellation">
        <name>Upload Cancellation</name>
        <section anchor="client-behavior-3">
          <name>Client Behavior</name>
          <t>If the client wants to terminate the transfer without the ability to resume, it can send a <tt>DELETE</tt> request to the upload resource. Doing so is an indication that the client is no longer interested in continuing the upload, and that the server can release any resources associated with it.</t>
        </section>
        <section anchor="server-behavior-2">
          <name>Server Behavior</name>
          <t>Upon receiving a <tt>DELETE</tt> request, the server <bcp14>SHOULD</bcp14> deactivate the upload resource.</t>
          <t>The server <bcp14>SHOULD</bcp14> terminate any in-flight requests to the upload resource before sending the response by abruptly terminating their HTTP connection(s) or stream(s) as described in <xref target="concurrency"/>.</t>
          <t>The resource <bcp14>SHOULD NOT</bcp14> generate a response with the <tt>301 (Moved Permanently)</tt> and <tt>302 (Found)</tt> status codes because clients might follow the redirect without preserving the <tt>DELETE</tt> method.</t>
        </section>
        <section anchor="upload-cancellation-example">
          <name>Example</name>
          <t>The following example shows an upload cancellation:</t>
          <sourcecode type="http-message"><![CDATA[
DELETE /upload/5688a431c HTTP/1.1
Host: example.com
]]></sourcecode>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 204 No Content
]]></sourcecode>
        </section>
      </section>
      <section anchor="concurrency">
        <name>Concurrency</name>
        <t>Resumable uploads, as defined in this document, do not permit uploading representation data in parallel to the same upload resource. The client <bcp14>MUST NOT</bcp14> perform multiple representation data transfers for the same upload resource in parallel.</t>
        <t>Even if the client is well-behaved and doesn't send concurrent requests, network interruptions can occur in such a way that the client considers a request as failed while the server is unaware of the problem and considers the request still ongoing. The client might then try to resume the upload with the best intentions, resulting in concurrent requests from the server's perspective. Therefore, the server <bcp14>MUST</bcp14> take measures to prevent race conditions, data loss and corruption from concurrent requests to append representation data (<xref target="upload-appending"/>) and/or cancellation (<xref target="upload-cancellation"/>) to the same upload resource. In addition, the server <bcp14>MUST NOT</bcp14> send outdated information in responses when retrieving the offset (<xref target="offset-retrieving"/>). This means that the offset sent by the server <bcp14>MUST</bcp14> be accepted in a subsequent request to append representation data if no other request to append representation data or cancel was received in the meantime. In other words, clients have to be able to use received offsets.</t>
        <t>The <bcp14>RECOMMENDED</bcp14> approach is as follows: If an upload resource receives a new request to retrieve the offset (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancel the upload (<xref target="upload-cancellation"/>) while a previous request for creating the upload (<xref target="upload-creation"/>) or appending representation data (<xref target="upload-appending"/>) is still ongoing, the resource <bcp14>SHOULD</bcp14> prevent race conditions, data loss, and corruption by terminating the previous request before processing the new request. Due to network delay and reordering, the resource might still be receiving representation data from an ongoing transfer for the same upload resource, which in the client's perspective has failed. Since the client is not allowed to perform multiple transfers in parallel, the upload resource can assume that the previous attempt has already failed. Therefore, the server <bcp14>MAY</bcp14> abruptly terminate the previous HTTP connection or stream.</t>
        <t>Since implementing this approach is not always technically possible or feasible, other measures can be considered as well. A simpler approach is that the server only processes a new request to retrieve the offset (<xref target="offset-retrieving"/>), append representation data (<xref target="upload-appending"/>), or cancellation (<xref target="upload-cancellation"/>) once all previous requests have been processed. This effectively implements exclusive access to the upload resource through an access lock. However, since network interruptions can occur in ways that cause the request to hang from the server's perspective, it might take the server significant time to realize the interruption and time out the request. During this period, the client will be unable to access the resource and resume the upload, causing friction for the end users. Therefore, the recommended approach is to terminate previous requests to enable quick resumption of uploads.</t>
      </section>
    </section>
    <section anchor="status-code-104">
      <name>Status Code <tt>104 (Upload Resumption Supported)</tt></name>
      <t>The <tt>104 (Upload Resumption Supported)</tt> status code is can be used for two purposes:</t>
      <ul spacing="normal">
        <li>
          <t>When responding to requests to create uploads, an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code can be sent to indicate the server's support for resumable uploads, as well as the URI and limits of the corresponding upload resource in the <tt>Location</tt> and <tt>Upload-Limit</tt> header fields, respectively (see <xref target="upload-creation"/>). This notifies the client early about the ability to resume the upload in case of network interruptions.</t>
        </li>
        <li>
          <t>While processing the content of a request to append representation data or create an upload, the server can regularly send interim responses with the <tt>104 (Upload Resumption Supported)</tt> status code to indicate the current upload progress in the <tt>Upload-Offset</tt> header field (see <xref target="upload-creation"/> and <xref target="upload-appending"/>). This allows the client to show more accurate progress information about the amount of data received by the server. In addition, clients can use this information to release representation data that was buffered, knowing that it doesn't have to be re-transmitted.</t>
        </li>
      </ul>
      <t>When creating or appending resumable uploads, the client can generate a 100-continue expectation because it wants an indication that the server is willing to accept the upload. The client <bcp14>MAY</bcp14> treat an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code as fulfilling the 100-continue expectation and start sending the request content. However, the server <bcp14>MUST NOT</bcp14> omit the <tt>100 (Continue)</tt> response because it has sent an interim response with the <tt>104 (Upload Resumption Supported)</tt> status code.</t>
    </section>
    <section anchor="media-type-partial-upload">
      <name>Media Type <tt>application/partial-upload</tt></name>
      <t>The <tt>application/partial-upload</tt> media type describes a contiguous block from the representation data that should be uploaded to a resource. There is no minimum block size and the block might be empty. The block can be a subset of the representation data, where the start and/or end of the block don't line up with the start and/or end of the representation data respectively.</t>
    </section>
    <section anchor="problem-types">
      <name>Problem Types</name>
      <section anchor="mismatching-offset">
        <name>Mismatching Offset</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#mismatching-upload-offset" problem type <xref target="PROBLEM"/>. A server can use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the <tt>Upload-Offset</tt> header field in the request does not match the upload resource's offset.</t>
        <t>Two problem type extension members are defined: the <tt>expected-offset</tt> and <tt>provided-offset</tt> members. A response using this problem type <bcp14>SHOULD</bcp14> populate both members, with the value of <tt>expected-offset</tt> taken from the upload resource and the value of <tt>provided-offset</tt> taken from the upload append request.</t>
        <t>The following example shows an example response, where the resource's offset was 12500000, but the client attempted to append at offset 25000000:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 409 Conflict
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#\
    mismatching-upload-offset",
  "title": "offset from request does not match offset of resource",
  "expected-offset": 12500000,
  "provided-offset": 25000000
}
]]></sourcecode>
      </section>
      <section anchor="completed-upload">
        <name>Completed Upload</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#completed-upload" problem type <xref target="PROBLEM"/>. A server can use this problem type when responding to an upload append request (<xref target="upload-appending"/>) to indicate that the upload has already been completed and cannot be modified.</t>
        <t>The following example shows an example response:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#\
    completed-upload",
  "title": "upload is already completed"
}
]]></sourcecode>
      </section>
      <section anchor="inconsistent-length">
        <name>Inconsistent Length</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#inconsistent-upload-length" problem type <xref target="PROBLEM"/>. A server can use this problem type when responding to an upload creation (<xref target="upload-creation"/>) or upload append request (<xref target="upload-appending"/>) to indicate that the request includes inconsistent upload length values, as described in <xref target="upload-length"/>.</t>
        <t>The following example shows an example response:</t>
        <sourcecode type="http-message"><![CDATA[
# NOTE: '\' line wrapping per RFC 8792

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type":"https://iana.org/assignments/http-problem-types#\
    inconsistent-upload-length",
  "title": "inconsistent length values for upload"
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="content-codings">
      <name>Content Codings</name>
      <t>Since the codings listed in <tt>Content-Encoding</tt> are a characteristic of the representation (see <xref section="8.4" sectionFormat="of" target="HTTP"/>), both the client and the server always compute the values for <tt>Upload-Offset</tt> and optionally <tt>Upload-Length</tt> on the content coded data (that is, the representation data). Moreover, the content codings are retained throughout the entire upload, meaning that the server is not required to decode the representation data to support resumable uploads. See <xref section="A" sectionFormat="of" target="DIGEST-FIELDS"/> for more information.</t>
    </section>
    <section anchor="transfer-codings">
      <name>Transfer Codings</name>
      <t>Unlike <tt>Content-Encoding</tt> (see <xref section="8.4.1" sectionFormat="of" target="HTTP"/>), <tt>Transfer-Encoding</tt> (see <xref section="6.1" sectionFormat="of" target="RFC9112"/>) is a property of the message, not of the representation. Moreover, transfer codings can be applied in transit (e.g., by proxies). This means that a client does not have to consider the transfer codings to compute the upload offset, while a server is responsible for transfer decoding the message before computing the upload offset. The same applies to the value of <tt>Upload-Length</tt>. Please note that the <tt>Content-Length</tt> header field cannot be used in conjunction with the <tt>Transfer-Encoding</tt> header field.</t>
    </section>
    <section anchor="integrity-digests">
      <name>Integrity Digests</name>
      <t>The integrity of an entire upload or individual upload requests can be verifying using digests from <xref target="DIGEST-FIELDS"/>.</t>
      <section anchor="representation-digests">
        <name>Representation Digests</name>
        <t>Representation digests help verify the integrity of the entire representation data that has been uploaded so far, which might stretch across multiple requests.</t>
        <t>If the client knows the integrity digest of the entire representation data before creating an upload resource, it can include the <tt>Repr-Digest</tt> header field when creating an upload (<xref target="upload-creation"/>). Once the upload is completed, the server can compute the integrity digest of the received representation data and compare it to the provided digest. If the digests don't match, the server <bcp14>SHOULD</bcp14> consider the upload failed, not process the representation further, and signal the failure to the client. This way, the integrity of the entire representation data can be protected.</t>
        <t>Alternatively, when creating an upload (<xref target="upload-creation"/>), the client can ask the server to compute and return the integrity digests using a <tt>Want-Repr-Digest</tt> field conveying the preferred algorithms.
The response <bcp14>SHOULD</bcp14> include at least one of the requested digests, but might not include it.
The server <bcp14>SHOULD</bcp14> compute the representation digests using the preferred algorithms once the upload is complete and include the corresponding <tt>Repr-Digest</tt> header field in the response.
Alternatively, the server can compute the digest continuously during the upload and include the <tt>Repr-Digest</tt> header field in responses to upload creation (<xref target="upload-creation"/>) and upload appending requests (<xref target="upload-appending"/>) even when the upload is not completed yet.
This allows the client to simultaneously compute the digest of the transmitted representation data, compare its digest to the server's digest, and spot data integrity issues.
If an upload is spread across multiple requests, data integrity issues can be found even before the upload is fully completed.</t>
      </section>
      <section anchor="content-digests">
        <name>Content Digests</name>
        <t>Content digests help verify the integrity of the content in an individual request.</t>
        <t>If the client knows the integrity digest of the content from an upload creation (<xref target="upload-creation"/>) or upload appending (<xref target="upload-appending"/>) request, it can include the <tt>Content-Digest</tt> header field in the request. Once the content has been received, the server can compute the integrity digest of the received content and compare it to the provided digest. If the digests don't match the server <bcp14>SHOULD</bcp14> consider the transfer failed, not append the content to the upload resource, and signal the failure to the client. This way, the integrity of an individual request can be protected.</t>
      </section>
    </section>
    <section anchor="responses-to-uploads">
      <name>Responses to Uploads</name>
      <t>HTTP uploads often not only transfer a representation to the server but also send back information to the client. For resumable uploads, this works similarly to conventional HTTP uploads. The server can include information in the response to the request that transferred the remaining representation data and included the <tt>Upload-Complete: ?1</tt> header field. Clients can regard this response as the final response for the entire upload, as detailed in <xref target="upload-creation"/> and <xref target="upload-appending"/>.</t>
      <t>However, due to network interruptions, the upload resource might receive the remaining representation data, complete the upload, and send a response to the client, which then does not receive the response. The client can learn that the upload is complete by retrieving its state (<xref target="offset-retrieving"/>), but resumable uploads as defined in this document do not offer functionality to recover the missed response.</t>
      <t>To address this issue, the server can send the desired information in header fields, which are included in both the final response and responses when the client fetches the upload state via a HEAD request (<xref target="offset-retrieving"/>). This way, the client can retrieve the information from the header even if it failed to receive the final response. If the piece of information is too large for header fields, the server could make it available as a separate resource for retrieval and point the client to its URI in an appropriate header field.</t>
    </section>
    <section anchor="upload-strategies">
      <name>Upload Strategies</name>
      <t>The definition of the upload creation request (<xref target="upload-creation"/>) provides the client with flexibility to choose whether the representation data is fully or partially transferred in the first request, or if no representation data is included at all. Which behavior is best largely depends on the client's capabilities, its intention to avoid data re-transmission, and its knowledge about the server's support for resumable uploads.</t>
      <t>The following subsections describe two typical upload strategies that are suited for common environments. Note that these modes are never explicitly communicated to the server and clients are not required to stick to one strategy, but can mix and adapt them to their needs.</t>
      <section anchor="optimistic-upload-creation">
        <name>Optimistic Upload Creation</name>
        <t>An "optimistic upload creation" can be used independent of the client's knowledge about the server's support for resumable uploads. However, the client must be capable of handling and processing interim responses. An upload creation request then includes the full representation data because the client anticipates that it will be transferred without interruptions or resumed if an interruption occurs.</t>
        <t>The benefit of this method is that if the upload creation request succeeded, the representation data was transferred in a single request without additional round trips.</t>
        <t>A possible drawback is that the client might be unable to resume an upload. If an upload is interrupted before the client receives a <tt>104 (Upload Resumption Supported)</tt> interim response with the upload resource's URI, the client cannot resume that upload due to the missing URI. The interim response might not be received if the interruption happens too early in the message exchange, the server does not support resumable uploads at all, the server does not support sending the <tt>104 (Upload Resumption Supported)</tt> interim response, or an intermediary dropped the interim response. Without a 104 response, the client needs to either treat the upload as failed or retry the entire upload creation request if this is allowed by the application.</t>
        <t>A client might wait for a limited duration to receive a 104 (Upload Resumption Supported) interim response before starting to transmit the request content. This way, the client can learn about the resource's support for resumable uploads and/or the upload resource's URI. This is conceptually similar to how a client might wait for a 100 (Continue) interim response (see <xref section="10.1.1" sectionFormat="of" target="HTTP"/>) before committing to work.</t>
        <section anchor="upgrading-uploads">
          <name>Upgrading To Resumable Uploads</name>
          <t>Optimistic upload creation allows clients and servers to automatically upgrade non-resumable uploads to resumable ones. In a non-resumable upload, the representation is transferred in a single request, usually <tt>POST</tt> or <tt>PUT</tt>, without any ability to resume from interruptions. The client can invite the server to upgrade such a request to a resumable upload by adding the <tt>Upload-Complete: ?1</tt> header field to the original request. The <tt>Upload-Length</tt> header field <bcp14>SHOULD</bcp14> be added if the representation data's length is known upfront. The request is not changed otherwise.</t>
          <t>A server that supports resumable uploads at the target URI can create an upload resource and send its URI in a <tt>104 (Upload Resumption Supported)</tt> interim response for the client to resume the upload after interruptions. A server that does not support resumable uploads or does not want to upgrade to a resumable upload for this request ignores the <tt>Upload-Complete: ?1</tt> header. The transfer then falls back to a non-resumable upload without additional cost.</t>
          <t>This upgrade can also be performed transparently by a library or program that acts as a HTTP client by sending requests on behalf of a user. When the user instructs the client to send a non-resumable request, the client can perform the upgrade transparently and handle potential interruptions and resumptions under the hood without involving the user. The last response received by the client is considered the response for the entire upload and should be provided to the user.</t>
        </section>
      </section>
      <section anchor="careful-upload-creation">
        <name>Careful Upload Creation</name>
        <t>For a "careful upload creation" the client knows that the server supports resumable uploads and sends an empty upload creation request without including any representation data. Upon successful response reception, the client can use the included upload resource URI to transmit the representation data (<xref target="upload-appending"/>) and resume the upload at any stage if an interruption occurs. The client should inspect the response for the <tt>Upload-Limit</tt> header field, which would indicate limits applying to the remaining upload procedure.</t>
        <t>The retransmission of representation data or the ultimate upload failure that can happen with an "optimistic upload creation" is therefore avoided at the expense of an additional request that does not carry representation data.</t>
        <t>This approach is best suited if the client cannot receive interim responses, e.g. due to a limitation in the provided HTTP interface, or if large representations are transferred where the cost of the additional request is minuscule compared to the effort of transferring the representation itself.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The upload resource URI is the identifier used for modifying the upload. Without further protection of this URI, an attacker may obtain information about an upload, append data to it, or cancel it. To prevent this, the server <bcp14>SHOULD</bcp14> ensure that only authorized clients can access the upload resource. To reduce the risk of unauthorized access, it is <bcp14>RECOMMENDED</bcp14> to generate upload resource URIs in such a way that makes it hard to be guessed by unauthorized clients. In addition, servers may embed information about the storage or processing location of the uploaded representation in the upload resource URI to make routing requests more efficient. If so, they <bcp14>MUST</bcp14> ensure that no internal information is leaked in the URI that is not intended to be exposed.</t>
      <t>Uploaded representation data and its metadata are untrusted input. Server operators have to be careful of where uploaded data is written and subsequently accessed, especially if the operations cause the representation to be processed or executed by the server. In addition, metadata <bcp14>MUST</bcp14> be validated and/or sanitized if the server takes its values into consideration for processing or storing the representation.</t>
      <t>Some servers or intermediaries provide scanning of content uploaded by clients. Any scanning mechanism that relies on receiving a complete representation in a single request message can be defeated by resumable uploads because content can be split across multiple messages. Servers or intermediaries wishing to perform content scanning <bcp14>SHOULD</bcp14> consider how resumable uploads can circumvent scanning and take appropriate measures. Possible strategies include waiting for the upload to complete before scanning the entire representation, or disabling resumable uploads.</t>
      <t>There can be a significant delay between the creation of an upload resource and its completion. Policy decisions or authorization checks performed on the initial request might become outdated or invalid by the time the upload completes. To mitigate vulnerabilities arising from time-of-check to time-of-use (TOCTOU) conditions, the server <bcp14>SHOULD</bcp14> validate that the user is still allowed to perform the requested action before finalizing the upload. This includes, for example, validating access privileges and quota policies associated with the upload resource.</t>
      <t>Resumable uploads are vulnerable to Slowloris-style attacks <xref target="SLOWLORIS"/>. A malicious client may create upload resources and keep them alive by regularly sending <tt>PATCH</tt> requests with no or small content to the upload resources. This could be abused to exhaust server resources by creating and holding open uploads indefinitely with minimal work. Servers <bcp14>SHOULD</bcp14> provide mitigations for Slowloris attacks, such as increasing the maximum number of clients the server will allow, limiting the number of uploads a single client is allowed to make, imposing restrictions on the minimum transfer speed an upload is allowed to have, and restricting the length of time an upload resource can exist.</t>
      <t>Uploads performed as a series of appends can be used to upload data up to the <tt>max-size</tt> limit, which could be a larger size than a server or intermediary might normally permit in conventional single upload request message content. Servers or intermediaries need to consider that relying solely on message content limits to constrain resources allocated to uploads might not be an effective strategy when using resumable uploads.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-fields">
        <name>HTTP Fields</name>
        <t>IANA is asked to register the following entries in the "Hypertext Transfer Protocol (HTTP) Field Name Registry":</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Status</th>
              <th align="left">Structured Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Upload-Offset</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-offset"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Complete</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-complete"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Length</td>
              <td align="left">permanent</td>
              <td align="left">Item</td>
              <td align="left">
                <xref target="upload-length"/> of this document</td>
            </tr>
            <tr>
              <td align="left">Upload-Limit</td>
              <td align="left">permanent</td>
              <td align="left">Dictionary</td>
              <td align="left">
                <xref target="upload-limit"/> of this document</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="http-status-code">
        <name>HTTP Status Code</name>
        <t>IANA is asked to register the following entry in the "HTTP Status Codes" registry:</t>
        <dl>
          <dt>Value:</dt>
          <dd>
            <t>104 (suggested value)</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Upload Resumption Supported</t>
          </dd>
          <dt>Specification:</dt>
          <dd>
            <t><xref target="status-code-104"/> of this document</t>
          </dd>
        </dl>
      </section>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>IANA is asked to register the following entry in the "Media Types" registry:</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>partial-upload</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>see <xref target="security-considerations"/> of this document</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="media-type-partial-upload"/> of this document</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Applications that transfer files over unreliable networks or want pause- and resumable uploads.</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
        </dl>
        <t>Additional information:</t>
        <ul spacing="normal">
          <li>
            <t>Deprecated alias names for this type: N/A</t>
          </li>
          <li>
            <t>Magic number(s): N/A</t>
          </li>
          <li>
            <t>File extension(s): N/A</t>
          </li>
          <li>
            <t>Macintosh file type code(s): N/A</t>
          </li>
          <li>
            <t>Windows Clipboard Name: N/A</t>
          </li>
        </ul>
        <dl>
          <dt>Person and email address to contact for further information:</dt>
          <dd>
            <t>See the Authors' Addresses section of this document.</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>See the Authors' Addresses section of this document.</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
        </dl>
      </section>
      <section anchor="http-problem-types">
        <name>HTTP Problem Types</name>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#mismatching-upload-offset</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Mismatching Upload Offset</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>409</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="mismatching-offset"/> of this document</t>
          </dd>
        </dl>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#completed-upload</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Upload Is Completed</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>400</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="completed-upload"/> of this document</t>
          </dd>
        </dl>
        <t>IANA is asked to register the following entry in the "HTTP Problem Types" registry:</t>
        <dl>
          <dt>Type URI:</dt>
          <dd>
            <t>https://iana.org/assignments/http-problem-types#inconsistent-upload-length</t>
          </dd>
          <dt>Title:</dt>
          <dd>
            <t>Inconsistent Upload Length Values</t>
          </dd>
          <dt>Recommended HTTP status code:</dt>
          <dd>
            <t>400</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t><xref target="inconsistent-length"/> of this document</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="CACHING">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="PATCH">
          <front>
            <title>PATCH Method for HTTP</title>
            <author fullname="L. Dusseault" initials="L." surname="Dusseault"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>Several applications extending the Hypertext Transfer Protocol (HTTP) require a feature to do partial resource modification. The existing HTTP PUT method only allows a complete replacement of a document. This proposal adds a new HTTP method, PATCH, to modify an existing HTTP resource. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5789"/>
          <seriesInfo name="DOI" value="10.17487/RFC5789"/>
        </reference>
        <reference anchor="PROBLEM">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="DIGEST-FIELDS">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </reference>
        <reference anchor="CONTENT-DISPOSITION">
          <front>
            <title>Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)</title>
            <author fullname="J. Reschke" initials="J." surname="Reschke"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>RFC 2616 defines the Content-Disposition response header field, but points out that it is not part of the HTTP/1.1 Standard. This specification takes over the definition and registration of Content-Disposition, as used in HTTP, and clarifies internationalization aspects. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6266"/>
          <seriesInfo name="DOI" value="10.17487/RFC6266"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="SLOWLORIS" target="https://web.archive.org/web/20150315054838/http://ha.ckers.org/slowloris/">
          <front>
            <title>Welcome to Slowloris - the low bandwidth, yet greedy and poisonous HTTP client!</title>
            <author initials="R." surname="&quot;RSnake&quot; Hansen">
              <organization/>
            </author>
            <date year="2009" month="June"/>
          </front>
        </reference>
        <reference anchor="RFC8792">
          <front>
            <title>Handling Long Lines in Content of Internet-Drafts and RFCs</title>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <author fullname="E. Auerswald" initials="E." surname="Auerswald"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <author fullname="Q. Wu" initials="Q." surname="Wu"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>This document defines two strategies for handling long lines in width-bounded text content. One strategy, called the "single backslash" strategy, is based on the historical use of a single backslash ('\') character to indicate where line-folding has occurred, with the continuation occurring with the first character that is not a space character (' ') on the next line. The second strategy, called the "double backslash" strategy, extends the first strategy by adding a second backslash character to identify where the continuation begins and is thereby able to handle cases not supported by the first strategy. Both strategies use a self-describing header enabling automated reconstitution of the original content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8792"/>
          <seriesInfo name="DOI" value="10.17487/RFC8792"/>
        </reference>
      </references>
    </references>
    <?line 1006?>

<section removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-10">
        <name>Since draft-ietf-httpbis-resumable-upload-10</name>
        <ul spacing="normal">
          <li>
            <t>Add recommended disposition type for file name indication.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-09">
        <name>Since draft-ietf-httpbis-resumable-upload-09</name>
        <ul spacing="normal">
          <li>
            <t>Requires Accept-Patch in OPTIONS.</t>
          </li>
          <li>
            <t>Add security consideration regarding time-of-check to time-of-use.</t>
          </li>
          <li>
            <t>Lift requirement on Upload-Complete for all final responses.</t>
          </li>
          <li>
            <t>Relax requirements on limit changes.</t>
          </li>
          <li>
            <t>Describe the interaction between 100 and 104 responses.</t>
          </li>
          <li>
            <t>Numerous editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-08">
        <name>Since draft-ietf-httpbis-resumable-upload-08</name>
        <ul spacing="normal">
          <li>
            <t>Clarify definitions of new header fields.</t>
          </li>
          <li>
            <t>Make handling of OPTIONS * optional.</t>
          </li>
          <li>
            <t>Require server to announce limits using Upload-Limit.</t>
          </li>
          <li>
            <t>Require clients to adhere to known limits.</t>
          </li>
          <li>
            <t>Rephrase requirements for concurrency handling, focusing on the outcome.</t>
          </li>
          <li>
            <t>Remove requirement for 204 status code for DELETE responses.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Add section about 104 status code.</t>
          </li>
          <li>
            <t>Rephrase recommendation for sending information back to client.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-07">
        <name>Since draft-ietf-httpbis-resumable-upload-07</name>
        <ul spacing="normal">
          <li>
            <t>Clarify server handling when upload length is exceeded.</t>
          </li>
          <li>
            <t>Extend security considerations about upload resource URIs, representation metadata, and untrusted inputs.</t>
          </li>
          <li>
            <t>Allow clients to retry for appropriate 4xx responses.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-06">
        <name>Since draft-ietf-httpbis-resumable-upload-06</name>
        <ul spacing="normal">
          <li>
            <t>Minor editorial improvements to introduction and examples.</t>
          </li>
          <li>
            <t>Define structured types for new header fields.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-05">
        <name>Since draft-ietf-httpbis-resumable-upload-05</name>
        <ul spacing="normal">
          <li>
            <t>Increase the draft interop version.</t>
          </li>
          <li>
            <t>Numerous editorial changes.</t>
          </li>
          <li>
            <t>Rename <tt>expires</tt> limit to <tt>max-age</tt>.</t>
          </li>
          <li>
            <t>Require <tt>Upload-Complete</tt>, but not <tt>Upload-Offset</tt> or <tt>Upload-Limit</tt>, for append responses.</t>
          </li>
          <li>
            <t>Add problem type for inconsistent length values.</t>
          </li>
          <li>
            <t>Reduce use of "file" in favor of "representation".</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-04">
        <name>Since draft-ietf-httpbis-resumable-upload-04</name>
        <ul spacing="normal">
          <li>
            <t>Clarify implications of <tt>Upload-Limit</tt> header.</t>
          </li>
          <li>
            <t>Allow client to fetch upload limits upfront via <tt>OPTIONS</tt>.</t>
          </li>
          <li>
            <t>Add guidance on upload creation strategy.</t>
          </li>
          <li>
            <t>Add <tt>Upload-Length</tt> header to indicate length during creation.</t>
          </li>
          <li>
            <t>Describe possible usage of <tt>Want-Repr-Digest</tt>.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-03">
        <name>Since draft-ietf-httpbis-resumable-upload-03</name>
        <ul spacing="normal">
          <li>
            <t>Add note about <tt>Content-Location</tt> for referring to subsequent resources.</t>
          </li>
          <li>
            <t>Require <tt>application/partial-upload</tt> for appending to uploads.</t>
          </li>
          <li>
            <t>Explain handling of content and transfer codings.</t>
          </li>
          <li>
            <t>Add problem types for mismatching offsets and completed uploads.</t>
          </li>
          <li>
            <t>Clarify that completed uploads must not be appended to.</t>
          </li>
          <li>
            <t>Describe interaction with Digest Fields from RFC9530.</t>
          </li>
          <li>
            <t>Require that upload offset does not decrease over time.</t>
          </li>
          <li>
            <t>Add Upload-Limit header field.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-02">
        <name>Since draft-ietf-httpbis-resumable-upload-02</name>
        <ul spacing="normal">
          <li>
            <t>Add upload progress notifications via informational responses.</t>
          </li>
          <li>
            <t>Add security consideration regarding request filtering.</t>
          </li>
          <li>
            <t>Explain the use of empty requests for creation uploads and appending.</t>
          </li>
          <li>
            <t>Extend security consideration to include resource exhaustion attacks.</t>
          </li>
          <li>
            <t>Allow 200 status codes for offset retrieval.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-01">
        <name>Since draft-ietf-httpbis-resumable-upload-01</name>
        <ul spacing="normal">
          <li>
            <t>Replace Upload-Incomplete header with Upload-Complete.</t>
          </li>
          <li>
            <t>Replace terminology about procedures with HTTP resources.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-httpbis-resumable-upload-00">
        <name>Since draft-ietf-httpbis-resumable-upload-00</name>
        <ul spacing="normal">
          <li>
            <t>Remove Upload-Token and instead use Server-generated upload URL for upload identification.</t>
          </li>
          <li>
            <t>Require the Upload-Incomplete header field in Upload Creation Procedure.</t>
          </li>
          <li>
            <t>Increase the draft interop version.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-02">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-02</name>
        <t>None</t>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-01">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-01</name>
        <ul spacing="normal">
          <li>
            <t>Clarifying backtracking and preventing skipping ahead during the Offset Receiving Procedure.</t>
          </li>
          <li>
            <t>Clients auto-retry 404 is no longer allowed.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-tus-httpbis-resumable-uploads-protocol-00">
        <name>Since draft-tus-httpbis-resumable-uploads-protocol-00</name>
        <ul spacing="normal">
          <li>
            <t>Split the Upload Transfer Procedure into the Upload Creation Procedure and the Upload Appending Procedure.</t>
          </li>
        </ul>
      </section>
    </section>
    <section removeInRFC="true" anchor="draft-version-identification">
      <name>Draft Version Identification</name>
      <t>To assist the development of implementations and interoperability testing while this document is still a draft, an interop version is defined. Implementations of this draft use the interop version to identify the iteration of the draft that they implement. The interop version is bumped for breaking changes.</t>
      <t>The current interop version is 8.</t>
      <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to its requests. The <tt>Upload-Draft-Interop-Version</tt> field value is an Integer.</t>
      <t>Server implementations of draft versions of the protocol <bcp14>MUST NOT</bcp14> send a <tt>104 (Upload Resumption Supported)</tt> informational response when the interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field in the request is missing or mismatching.</t>
      <t>Server implementations of draft versions of the protocol <bcp14>MUST</bcp14> also send a header field <tt>Upload-Draft-Interop-Version</tt> with the interop version as its value to the <tt>104 (Upload Resumption Supported)</tt> informational response.</t>
      <t>Client implementations of draft versions of the protocol <bcp14>MUST</bcp14> ignore a <tt>104 (Upload Resumption Supported)</tt> informational response with missing or mismatching interop version indicated by the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
      <t>The reason both the client and the server are sending and checking the draft version is to ensure that implementations of the final RFC will not accidentally interop with draft implementations, as they will not check the existence of the <tt>Upload-Draft-Interop-Version</tt> header field.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document is based on an Internet-Draft specification written by Jiten Mehta, Stefan Matsson, and the authors of this document.</t>
      <t>The <eref target="https://tus.io/">tus v1 protocol</eref> is a specification for a resumable file upload protocol over HTTP. It inspired the early design of this protocol. Members of the tus community helped significantly in the process of bringing this work to the IETF.</t>
      <t>The authors would like to thank Mark Nottingham for substantive contributions to the text, along with the following in alphabetical order for their thorough reviews of the document:</t>
      <ul spacing="normal">
        <li>
          <t>Mike Bishop</t>
        </li>
        <li>
          <t>Roy T. Fielding</t>
        </li>
        <li>
          <t>Julian Reschke</t>
        </li>
        <li>
          <t>Glenn Strauss</t>
        </li>
        <li>
          <t>Willy Tarreau</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19+Xob15Xn/3iKauqbT1IGgEgttszudIemJJvd2kak2kkn
+cICUAArBKqQqgIpWlY/yzzLPNmc9W51C4sk28pM9HXHEoC6dZdzz35+ZzAY
9Jq8mWeHyZusXi3S0TxL3i7nZTqpk2lZJd+fnb3upaNRlV1FftKblOMiXcDT
kyqdNoM8a6aDi6ZZjvJ6UOmvByv69eDgoDdOm2xWVjeHSd1Mer18WR0mTbWq
m/v7+9/s3++lVZYeJj9koyQtJslJ0WRVkTXJWZUW9bKsmt51WV3OqnK1POSp
XWY38NGE/9VP+E39xLy7V69Gi7yu87I4u1nCRE+enj3r9eoGxv9LOi8L+Ogm
q3v1Iq2av/xtVTZZfZgUZW+ZHyZ/bMpxP6nhvVU2reFvNwv8y597vausWGWH
vSRx55IkDb3iB5hjXsyS7/A7+PSixB3CbakP793D/17PhmU1uwffLdJ8fpiY
fRtcz353/QC/hO/Sanxhn5vndVMP+ct7R/BVfpXV916vRvN8fM8dAIetsmVp
H53lzcVqNByXC3k7/WeQvWuyAnemvjdPR9m8vhceWY+fHMAGrrIB/egwaf2o
l66ai7LC7RjA/ydJXsAevhgm/zHP8smcPmIqeZFW+ap2P69KpL1skjdlRR/A
6tIi/zFtYF6HfPD4kryhbzPerwWN87vGfouL89//3TD5r4u0mDmv/25V3mTO
pxtefrRcAqmfFOOh++4ZDvKXH3GQ36X4i/arnw+T12k1WWXOu5+vxmntfrzh
5cfzcjWZzuFCuC+f4yi/o/9d0lD08l6vKKsFPHhFNInECJf12fE3Bwf78O/j
o+PvT15+px8dwEf8t/uHNPYkr5fz9Iap+N7BEH9wevbm7fHZ2zdPnwyenTx9
/uSUn/7qEX75+ujs+Hv64NHXj7/BD968+vb50xf8m4ePvoaPnpx89/T0zHv4
0QOazauXZ09fng2enJy+fnV6cnby6iV9/dX9r74CjlBM3aWcPn/1w/NXb05O
eabCqvZ+yOaw7ixpyuR0Xl7Pyyqvk0HSXGQJ/DMZweW+zifNRR/udgN3NMsm
N8RRlmVel0UJNIhrTcbzPCuaf9qjwS0V45+B/BePNG/ydA7n+mZoPqxXFZ/r
3p/23pwW6WX2p73keyDHrODRJsDpDhNka4P9r3jyaTXLGhl/T+/mdTYapnyb
6WbDv+/d3z94tP8A/v/Rw8cPHtNlRcaRDseXWVXTz2pd9r09Ps7HX38Dx9kb
DAZJOqrhZoybXo8WCTNJE7oqU3g6GadFkhXjcoXMFRYH/1utlkh0CdATbinw
YNikGtY4vkhSemKczbMJfPG3VQZcCEgVGH65XMJn47IosjE+Xg+TkymdAQ5a
TOiBcb7ELaa35sUkRwEADPE6WeDgJf+eZngNb4LfZ7ARcE5VDu+Aubjz6ydp
UuPAFQ1HfCjzl5ekDYwI/wMHDW+F29hk6QTfkzZNtoBhgC/DsPb387k3i3SW
5sWQqQN+M8vsouvVEkUQ/BaIDZY9zpYNPmv4YTIprwsRnVW5gLlWVxmtguls
mJzhoyAzYd4wu0lWj6t8lNWwrkU2Bo6S1wuevryrdgZfLZ2heUAcWl6yqnFl
OO0hE8Ein0xA/PVuoRStysmKzugfJPFZSeJOnWXJ+/envNrk4CE+iD/88OHu
NvTiHwPqWxtJ6IeLHJ4E5o88KXn99iyB0UGNAQoC9jWhQZhUcF2p+SVoBPBi
GILkS3LnKk+T4xJPpRm8oVXlBa1ZFne3j/+qMtBCMtjbqyyF9dI+ptMprDfJ
4d+TDN50k47yed7c/HMS7sbwkd0PIMtjJRqen76JTm4EZFblsxm8kddwBSIe
+bRQXh+mN56vaFGjVQMaWpPM80XewM+bEhhf9m4JilDe6NVgCp2zNO2BoB3O
hrCkrFrkRdrw3qxgewfpDH++rMpxVtcggBa7j9Oko34yS6sRjAUnPZ/jDvDu
87B4O4hsCzgJIF6Q+HbCcsbxF9Xji2yywk0DBQBPC3/lzHLtw0/KU+ADTT7j
M49M4theVT0GvcVy81M6iay5waMEXRwVcBypUZU8AdUBZqAcwp7i6AaYyoRu
HW1AWQyWaXORAAkg+6uBIogf1ktgCVNkA8RwsmleEEsssmuHLSJNbMsMiUxx
OXWWLuaw//ObZIrXepSOL+kylQVo8Pg+2AoZC69WVoCWoOQJUzOsJgObgl9T
y8CgTIBpUSMJw7sNR4DB4W/VDV0lmQ4YG8DhUP0AgmN2YNQcWDHNG77ky4fH
jLQT3FdkFcPkaE7Hh9rR/IYu6A1Nh4+fRpDJ4+oq+NEweVvM88uMOdfE8pc+
TwQIFIyccg5fwKbjrTJsS/hSRZRsdgVY8mI1b3JUjc2qgXUAn4EdzuZwqm8b
4Ac/8iKCAwN+vUTKTS3JAYMvcZfoKFeFERQum4fn8NKDEuawf2dSsEHLVbUs
ayJZuAZZpbIgb/pEO9m7FO5M1k+u6ZTp7oOAKfjMlikejRmwz9w/u8rH2e3a
kL0KtivgdgkS5iyDmcHgRuFM6otyNZ/gParTK2FlF/kMOCkLMHyySetLpv7M
KgO5SOmspnc78sIuE5ZUrqoxLXKajpHrImW1r8Wd9+/F5tZHUCAhBer1wst1
AXIQNz7P5pOar8ViASdAApnol4YXWShzgKHpYxiwb360QgE3yZLzg/2HyR12
DrC3gLWIU6apbHL3nCX4xHkJXZLbVr+K33R576oe4JsG8CKaQSoX59yhq3si
88Q+PQcuMgFph8Y5kweYsV1ykfUOJBGagk/7MAcaaoBDDfy3wGyGqG0dG9ZS
0+Se4Ibn9G8+8Uu4s+iyqJO9F29Pz/b6/N/k5Sv6+5un/+vtCZhd+PfT74+e
Pzd/6ckvTr9/9fb5E/s3++Txqxcvnr58wg/Dp4n3UW/vxdEf9njL9l69RsPr
6Pkei31XLUWBD9s0YqWtgu1BIZvWPdVX8W4m3x6//j//GxSe9+//CayP+wcH
33z4IP94fPA1HA7tIr+tLIAB8z+RZfXgrLIUhRHpWuN0CXQ8R95Q4/25LhJU
PGA3f/NH3Jk/Hyb/MhovDx7+q3yAC/Y+1D3zPqQ9a3/Sepg3MfJR5DVmN73P
g53253v0B+/fuu/Oh//yb3O4ksng4PG//SuY8qdo2Aq3qtunA4yhAREBdi6Q
5pzuMom7RXqDRzYt5xMUVmmdeMf1/r3YiKSJIR2iClMnp00FlsEK5fX3xA76
yQloxaA75KQWpBXIGfgRXIQ++eNm+BM81G/Lcp7B3UByAXWErjczcVABQ+9B
8NY9/9YhuUbuYeRjUHJT/WrM2iv9lUTzHpM2M5Q9mpjOR1TSB54+qvNJ9t6+
OdlDeQ9CYMJbh1xSNk4fftjxMCg1YLfoAdE4TXoJHEReTt4SeuaoSP4SsPK/
4M+BN2W4g7DZlseXhatD0Blbnl+LtuBzSZwgmgKhrh+TBsSsXsHQV3l23eu9
aTFc3L5a+TbuBBlAzUVVrmYXpMmgbIrMHMkjss7oLPq8MNQCM9QgGjkyWR3v
xChDNswPk7pP56xqI9luOAj/YJh8e8OMK2Ul/DoHsewIMGeajo4PHwORZ1cs
k8arqsIvyum0zpq2BOTPB/IMvIVlEbC1YsLzcX8ty+avzY/hl221zf7a1ej5
uM6MfohSm+ZE+8bUCQdSW7aBQnY+X6EfCLZ0koPJVomWwRuD4qlrZ8TWXYDi
jAZN9s6oOiJtq2x0E9PtkChi8jQwkx8PDxw7WbwiC+Alwsrawl9ME7qeNOtF
WtygogC8BEYSTtA37gnUFIAypmAqk+U4WGSLEkh0tMKNgI9oWmxhN2C5kJzn
xbNCB7bKBLYalgvWYYabOBEV/KluMd4PUDpBx7ZbDXo57VEBzxuX7DA5wScW
uie1OTujfONYYA/C/jB9AxdHP6YZgjRt0OfJbnK5U4mnoTSAOn05y+gj2iXU
iW5oaRlQNCmt8Kt8gguiichRKafTnw38nxHvunVLl54cHIKWg39rXMYTVaRw
FpcFivQ6/xFo4JZQ6ODgQ693IrLNqOZ09fhKTvOqbtRDQ/RsiLTjNan7IlQt
EnSJwXTZcSO+BrmchrcAuZ3fg3P4K2zhvYP7D+4RzZyDqVX4jrByDHtTG31T
bU4yJpxZitXh3Cr2zDm2ojufOuAW/ryE/O+lo/E5HMHB3eTMvhpsNWB/Iglc
KZE31q4ZZbO88DVY5S9A9spbaFgZAjcX/qIChsjOzosGTcdkmjjTNjxb5ia7
xHYybhrvZb7AgZZAUpmumx9AqyyHq1vnM7DI3SU5doHnOrPW6DVwSfxvZBfh
YZDsCbq68NvnpfgYXMMHt8R4rPaH94f3A96UuVICGEvV0KrIa3gR53e+J03Z
E2hJZD00yDLSaUPnZX/Fk2rZ+OiJIpOSjN/0Os1559Mxkvs8m8wysR+JH6qs
CvcbyOe///u/kzStr2a9Y17Qxj+ndAS9nzb/0v75CX7++hUo6e1b1fVzthcH
ylMOk387WDf6jpP5o39Cf17/88H2f/71Iyazy8/RgMYDsJdv1wGsL3jHJ1tr
He766tYnOw7wL+EMbn/SZqNfYo1bIvy5corDxOXB3uitCa75szOh/N5//hkq
AyfWF+l/+3u82b33h8mtaT4bBOydQ6a/3ZPFH8vHeyB+79/V4IwN2ChbFmEQ
ukAdFr/IZxcsaKJiD3TI8hrUaTAWRxnQofo9Qeco6zpHFu4MVmQZe6CQpzF7
W2A0qkuvIDnXuEJLgkTmXZknvUEFa9jDCTyUdFdV3OmnouZ3KPZWuoV68sfw
VPrzMYxVCS/5/unRkw667HpmB1qlP7uyNjO3DX/uwzV8WWrcabtnRDq8opM5
TH6/6+X7mBso63HvVYsy9GbxxICt0BfpHK/Wg7uh4tDWC4EMfT1ijee/S0vs
NC71X/pgOoeLP4E3NiWrc51Ki6e17uBZZVXp3Dut8wT2Y5UxG8HoHVs3WVGv
6JLKJXaURrnPKaZsqAdEbqf5ud0E2FEOAQ2TV8U422If0TejcQ1laPJOCdWJ
5svxk3AMnCJrVBMxn69hVtmVqHKSKeIaGzHjIrkmhe4iBdm+ZKc/GGBTVPUu
0gkFYUZZVvisFyN6YNOc39/fT+68+o+755+m2tGfT2JD5NbagQ/tqOmFz9j7
v8XcNLDNKX/dBOw+s+ufiG7JkkLo9fcRTfMLYsX2D1LUq//4ldhqyL4CfeWI
PkeW+tBqK0ziOYcr6ZLAZWMfxpgpS3mXRvNyzTapyd0d5aVwWScZ+TScb/HC
T5EXYaCiyubkCLLG8Dp33a9xJ588ff707On2l/KLosdAOfhV6dE9zlCFdr5C
wnQcY/cP1chIa0pMqtA/Azoscp3a8X7dZ+9XjaGecVqj01GzC1ivBq4y5bwf
JcSWKIq9Ab+mD4Fcb5J0XIGubcP1rle3RpFJHlWaAAnGMsFAPCVWikykDBtM
L/I9wurQQFcbesrYC+mOdU2pQ85tNekFRsOf5ph8Qd468VlEBLZ16VJM1uRk
lVU+w/wbkf+4FYEfV7NLZMspsFhTmpnrdrIRb1GWUl06OxMxN0PcT6HvqU8s
RY6Ht58CIsEqQPFhvy0eCTvxWnwsvU5dfUjTRrpyAA0/Y2+UnYVx6J8HgvZc
fF2sjpE2hRkE8zozDk12uOI64sfxa2kZ27uSzDNtLWN/43s+Zm5/jOcQdHqY
vihumyDDPWCHQNsB4v/pcIf8uhxaPBkDuGAajPAZtXGB0LVYk+8hzpCX2bum
z/qE+GnlWuPlZAUl64rnfczV62seDGsrfPlv6G3IKCmZPV17JyUkdWaNJLG3
Cm8qaox5bm8/So0/h5GvJOVSfPTEc3kbPYUKI2SeiZk3f9dGyGb28EUbIR2k
3WWMfFFs6EtS+gxJR3jKkSH3dYljRl8TJ1Dbv4op7R/pUgVdCNSxeVqpU8dc
WNVxgDfZ+GoQvdL8hnobjydmyWVpVWzhirWuVy/n1UQAUVfMixUGzC3H8Pw0
zGR9D1daKxMziwQTb/kPj2trbhv/tG/YpicCZveHX/BW/moc/Q/bzO1L4uh/
+AdHD+YW4ejMQyPs/I2T3OuwY4d7P2QXvuPK1fSuLfWy5IJM9K30wabiYgsv
MdrOWTzW/095uY3c6JzHBp/337G+ubPT+7+2mdsv6PTuID6XP/3Xn51nvhzu
pH++KKf3APnJYHyxKi7b+ubaq04OSCezgV3Z72+Fmba93lE7eQq9YwV+MDFp
vU5+qGTVtYpPtE6qPR4lm9Ueu0HnVn3JYT8yJLNoOYu8PfXYrbgVI8HOIHcN
E7eDEXNjxVKqAVXhAFubh3Zs22E3TN7Wwa9sxrCjrKP/zVZ6qRuwKmcV1vtt
yhGOZsl2BHPLasdE4aP2DjtldoGmHU0ZHybPvDJSp+LL/RmctfkmeGPNjJ/r
SDBvVxKYbb0ibGRGtBCjCBRBi/QSy7eAJjHhUJJG4jl0lqBVaDr5J/nUZnpP
8klxu1HhY2W5cXnYtDqfCG6boVVCxmJIEpNKr1Kw03C6aXGzKKsW5eCPYG75
9MZ/BRdcGV8SbxaZcRUltnh3S6pULrNsGU8hNbNA8k+lQpOnZUy6Jgcbc91G
Ev0BXV/lE7q7qaQnZl4p38BQ13VKidlekmzpLtbZRi+vPk64skgkoiKH+zYE
LmdqDzC5k9dmM9y7B0ivynwiadPVhKMroB6tRKXCJPcxDbzI6wmoI5SMjZev
9LVDS+P9MP90WaIERuXIZFwTdEqrGGdDpvUp0oFcGK3Bs7eEnqmbWvePs8XJ
lK7KZQayXouCKKwA/PzS2uftHKZb8EJJYjGCg5nXB56CSPSc11isFiOuPxjd
mPhLlw5MsyBOQBkNqvSBapcTc5+sKr1nxl3rV1usZ/90E2FlgTeyg5d6rlKp
KVC/yKQzzavTS4LvJkEjSdJcWeoI7m15PIWZbooxiMEC42FBUoyZSJXN0sp4
UJxLbJX9qIcYy3s2e27CZQufoj1alPhDQkLAKQk2gGVJsqdanQfkjodUZwb/
QQOKJZoeWLzhWk9E4xTVogEmGWogV6kfivdkQ5WhtZFMVxWRUUttIYd0LCFJ
FQxr4wAz8RzjVBt+47rJhq1Rcsppx0K5dgFd8syklber4O5iJmJt06JSLhXJ
ZlzmIQV2bk76g+EDLpeJjcYkKEajFA77pUvAmLDAy56yxnAZNQNMStpAmlDN
2z9OuUzdmGXe9khl6KzARLKOTfYDDYXZ6DqR2oKU9i9MYTe2tNBl7ALhgsmu
nq1SoPomk7hpUdJNhnsgaF84GlZC5Fj2D1wrQxUirW6GybFTx28K8p3hSs74
sJpMWtflOE+lNmfzZUOGqtZegdqgYasqVD+4so6z40xBDez5nNQe9OsyygPo
Oou0uuTaRP2lOVFFBjkSKU45tjlGt2lT2nsonM+EtERJCQ7TOix2uzNjd+V0
s4eRMT/jDdJC1ODSfLXlpQGuTVcgrv6gAgBc8NPviXfesdPMp479g1pNLPC2
QRq243JdEsfmY0aP3FuKlFeRk4r3XfXfsMIFoxvTFeae6CWW6/A8K2YwiLkI
c/q36Bf8D1/H6VA2NuWDa04FgUg4ZWMwjadXkkDiRVu8lJSmbEB1s9Pp0mpI
0FPyhR6PMoUAa2KUWSIJ80K8+Gskf8UaMMZ6EV02hGmQCXdVkmHSOycM5SjN
Mb+n5vQWsSxYTbwuHS0atPg6osYb/2SXAYRJdHnNgB7O1GiNpuTt5ybuw17v
wCgeSqJC8PX2QXqid5I3+Hk+Sc7Vw8bU7N+SfvRC5FpHtxbWxbkE/ICUfq9M
OVcg1e26RVEXrkZrWzdLXuGwd3/oebc5OZI2yNuf6BBafjrKwOoIhIY+sFlk
fMEqVITpdDvL+QQ/VToAscocyqpO7hzwtO7cv0t3c1RiAgu/VeOidbow50e0
l1dmGROhJpnKAgEK6ELEkHv41O3b24O5y5KxjlxHji4UrM/RHM6TgFbevxdQ
yA8fcAMN3mGeFikhGIJWBeunimaGI5XHCVylvoUqEZm5SMqe1NjDs/W+FmlC
Ys1RNl2G5f5e7xqvq4OCRbFxCs+dsdk/qbex0tIPRUBrWYsD3i0DHBEyvIgs
kjmyOtjh4+r1XpaNkzgozxDkipMPhOghNPgkY9yyzCg9nsC1vrMTBsnz3Far
upN5OvxaFVw4i5DgneAWuiYcXsnPuCW8vqVOgSSiPGeZDAnl7AxnRIq+bzVq
1UA4ldVqIPjvD1Gf04ujP8ClBSlFKBykApqLwxmxWq9M2HhWGhvsB9kyLTw2
tIUPn8cZ4jD8FbE2i8LyyVzSGcrjjfe7OOPnsQ2tc+oyuxnwfJZpXnFancgS
kNjni/TdALOBzxG/7pTdiQyNmb7LFyAKKVVYdZJorjAjWNJNJc7tFbbbO9Yd
iMin7j2yZG0ZzCTjQGboLDLeK6Nv1MkcAV+pKJ9ZtruQyNSowHuD70MmuEYN
yN6NuZgy+kJLD4VKyiHufV507D1oLX+Xe18vEI3O3Xx3JWTU6asU91BGR940
n6/fLiBVVji3oNhwY5xtDHRFB7NC06A0WsS/XOfV9HZa3GNGyjNRsLqNhIkc
BoW4QbFInTx0RSehX1mXHmEUCklHp1dvJLG1e+aez5ewZ6Tefup+KRnuumHJ
G51GtKIJXT8WDzUmlDHLINDbGWQGkUr0BpmlKU3PwnPxjZd5Ps0oYNThos8R
8GNMaSN6guauCo6O4+A3uRzGc2Wdbrdr+zJysaeIg+qFv/jUKEgYn4sTNWQr
zrei8YwEuUVBTeooiogEd2pHayavIsJqErBovpZbqLtxVa+oKsfYx1Jco8Hv
iKLge2HULIwEHceSxd8ZIqdXlKIvbTjGvqxW5udsF+NA8aXDOJ/grJJmiNsA
yolY97LmdAIKhFOGLKlDzi6grULvQaWTc2vHK+AyfS4hkriaqCA4tNUT+kmL
ETNClaFltWspFEFuLNyCi7RaCHaqszaNWMhpK64qxRqLWWkRyGpO4MdDP+V8
XIFilfPnSQbczn2TTmgYFALplkjsLjeRYk2hdQ/rmmCgw/1V7TQ3VF435dLz
IBgZ6QbSd8Yie8PuvYqM44Bq4RBFR3RUzjYeoYHV69RAKdOkag2VEww53lZ2
NdL7JoJna3ASl/OU4Iqu4WpPJrlg/Xo4WvByZ9hFhlY/0OEzrITqEyY7+QFM
HkzBNWEI4Elc3tF1k1Pie62nEvsIAdgKjcB6V4UF/EJ7Oa5er2MInrZNYfrU
hQ7ynPF+/Z7OvhG2gZi+6Rzhg9hV7cFJmTK0JgjSRjKANnjwOFbPfRAoeE8T
8RxPR4QtNXiNxt65b6iQC0fAFO92xpjEND9noM1T64pSFcK+ni5g2iq3C9fZ
ymyhZRQ3zkjujVuznE+d8/lvYEtyUTfks7y2KI13XTkkzH3dFFrbjxdqW8CH
fpKhR50zOhVfQtBJa5jqPZgsskJ3tN+c+zARMbK2CRsmRmHwtDZsF8xFhBYh
3xEpO+laAvHcfs71Wq9HIeYeIprkIS8T0Bnj0o7nzOUCeSOyjDeIxJW/Q6Z6
yz+4Di+qmzDMuGyaxUJjrDtKeA+ns6paQ1RsCnU1YpojwKG+xt2dlPJekIfV
MWy2OgBS9dgzkIGXfEO6VH5RlpSQhtKVneU6MSvcEpSJq2LMgwbHKVvkCNsR
WpQ1ZQM2FTJ7yvoSm9AhllyBRS2k+DiuWGJaNyWziNLVB1Y+V9XRoag1lq7S
tSOYPEB4ZLtgWlSE4meDMqooPXNDTGngRJDdwQg5adxz3xplIwX2+OC7b9mD
JqeQ06QP9vdffGtVTQc427rIUadagBiB68W51F5zBls/iaXpXCR9hz2ScG2A
AO7y5bQnQoiY4tSWanB82VU+WTlZ5kHtuYauKOMuoXZeaTVx26j4cOZURp69
y2u6ofQeZwKOQ5t1LwXs5NYaAuCDCfEq1x8ePDAlDmdlmTxHbuxiobe6YTwa
Phq6DUKGyZEbzWrTST+s8WeFUvZUvdIWIoBCk6ul6oJWUZZDV/3XdHqhjLGs
GujWKn0Rh25psFazdj91+W1HBHIoKfeKbRA5fpOs1nLbiMXsu12vLSAicp25
+AGQbdiWNE6iB/18kgE10ekRLdR5sxIUVAEEuwkaHfCbGQgpNTPDZdPJEAC3
2CeIpq80lWOQcZQ118gjttxGmCuiQAhsQlrYl6OkaI2BTa1wsfV6ajT8kPfd
Bm+lb8uCw+C1etbTxsv5UvuMAJYoLVHyzBVEzslrUSVPkl9Y5n6bXaRXObYZ
OWpjaEa0R46EFzeWi2ofjzEwwxvj9Nno/DhvIXy2wxNw/fB2YVSIcFnpvs1d
foPtdJQ0CY5X30/Iv4JiZwEqzhGqAI3S12/P1BAl+XremVgTBkTdwHPuh6+t
w8sJY3dHJJPNGRGcOI/eCgIWdU0j1jupwUuKkgeu62o5q1LlVW1Rz24e/IXI
M/2C9l4eFc2jZhPSN37RTlIR2loNeoMk5uPq2ZNWCkQAvApTvcjmS9drhCdJ
T5mEsECxdxgYKXuS+ZyhmZ9Ms2xCPWTyaHIIEPucRaSwXMeLTeEmU6+glf9l
YdzPKGiivqBYDF4zM8rFiNoQWa9aK/xPhLjRO2h6WYVedyFe33eGnAWdpXhZ
RQK0l+prapvcW7nFCC4rAYcxodyWc0j2n+4l9UZyVBz0arI+lm5TwLzukngB
0J/Xo3IWuexCGuiivDHeos1spGHkZcNL+mvXiOKG3pCENSBHxaaXeUgyykoo
WUboPNBUPJD9QE0QsGZF8PS7D4WTk7SL07wYt7GOObRYLpkViWOoAc2QKgj0
StemwshTGm3dO9n1ykXLWnvxuN4koKvJAJa01GmLDmbi0aiComxpp2BrJ4uW
lRuWV7bA850mFnfpJdKQDbGNatG0Uvh36bqLO5JVWddzKwfbsrPjzX7OjGMp
xOGD/Dc9BR0URcK6t3nN9LDZpumMxJeDBvCst42vfZIDhdR0fO03RxqT6g47
JCw5xqjAYJ0rzostMk685S5UfOPO8wIbtJxTg1V5rRhTtdswpiUMTQZ0GjBC
0fd6vUFyfv/du+TOqXGE3j33OjFpNtgaFQGTNd1k5jhqed+9q25irM0Blblx
YqEJ+LB/yoHL09rjOHL68LOticBztlzXuUIbdTlYpH2dczia4iG+05ax40hL
5gDivF9fGLK2bAW35iFujSjWT7F5n785MUkVRLjIxklK0xnNnqvnwqix7wUI
2jqM04kWTAMwX5sE+8JvcDabZv6IDpXVr8jMJRgfEDor3dqE0Gu8xhVV3oIx
YyddNSU6UMaMfSfrtsejoN9t+Od2cmW03Ic9nV7dOgqs7lhoulU/tAhSP9pQ
smHWhnq7LLWAii1SJeg10FPtBFW3/vKilIZ5JXqY3D1SNx/s1VqvJrCtunSV
cuN+im2Jg3gc6whh17HFrrkE5BGvlh1T4CxdkpUCR6QvbukKfGFbkyFaD+99
6+IYFziLQL9fTgLsr5ZmhA7GhNRP18SDNGFAnfAOP2qzISfQF6uJagdT1kWT
dbOxupFdWxzh71LmYZHqPjPaqiZ9K6enghSybnwVJlKNvVYW+I1xPR4e9v8Y
w/xdoGvpgov74Zs3ce2qL4HU2J5ybbzAL4aJ/lZmd9fLrDHvu1Ry04R4g5zD
GtbCstkw2b27HkOKgtpIAAjBn01cqe4IbUHn12627qvcHkns1FEutrW94oPi
bbExwY5Q3KaV2rzTpji8o32NttIRfrnL6d5E41pFi8dRKcm8k1DyOeI83hGg
R591+kX5NEeU7dXEdap4d6zlIFDuF7orMPS3hdeBuge24nyiPPRs1CxSWMFt
4eJnCPoA5V8ZqmjbiOI63VXYmDILWVy05lFvelu5oDxoatTj0Hk6Kv1UZsWR
oC0gl7AlPfHTEbZQh7TQ7p28rezX1A0gRGtf11JIYOP/cmsLJDFBuk6i3J4g
XwIty309l5XYkqXAf/OZktVcF6VTWsWYmSof5mSoB/JlTdGmOdBgNfFIqHnY
Pa65POkmrLSG43pO0+IND8jsZIjUrCdiYaFFvzI4CjnzN/q3ehIpJNB6BIir
aqIOq49zUrVSel0wDSOyApYb5K6FfWWcojlzsHCI2orcwU80YChuoEcbySH6
dAwiQ6Ip1Lp67FT2+ZNM3d40UU7eZ7XQ2A1rFEMiWg7n5E2I+kgzVj9SP/Ym
m0Y6ykzTPtoJxQSDHRVLwXQkbIVjBrKnWObAcGY2G9/HxXbAJeTZvoPhLad6
cP/Bw0dfff34G0nKTasspqQFKpaXasv94NZwZW4XnIUsirYzuNMdji3BiKSS
IrlHvS4UafQu3TsYHvS+L+vmUPdkCLvci7iMDhN26Pyz8fz8dg//Rs6p4V+X
sz37zW9++/bs2eDx7dv4wf+4v68/6fnu+UO7qT1PgEa+cLllr/dHJds7wbHc
/TNhTbU3QRe7qRlWz8I9a9GWszGCfXZv9OjB/jh7PJ32XEXmMNGo82/NtPZ7
27/aE6qHidkCOwIDd33+OXajp/21Lote7/1e2jTp+AKFz8lk7zDZM6PvfeAd
//Zj7xj1x0aSZhD24JpRql1499T+8a+gd9cceAVV2TcAK4QtdtSMVqZzkzXb
+LcEBqHjFsrYa65em973W9dm863pGRRNc1N+lYvyYDp5+M03D9OJR8QGeX3X
QTZTMi3q+FP4vW0F6mBApgk68lzjAd6QFpcGurflQxGlsavKm+IrjU9NLUH6
eeno4GPY76/OavcfPf56mj58OHIo6BGwQeoIiGLSda7yjJ7sevzGmvora6g+
mrPqZE4GvHXxO4auQNdLWDbkFR257JuOeADPDTTS+2Uf98P9R8kL9kC9hMUe
8aT5KYuyZVrFgcbW9jR3pND4ESLT4LeteTKYW+q3L+4z7OouPRY3wUPV6LGp
qLMi3txppuW5Yum63t7kHCG0vYTbyJDDhHzcqZPeb5hJi1PEiiI8ILAd4LcM
lIeIPwU8MxXwsgVtMKlYIa8HmibRQ5uQgJbO3zCxUfbgIxFOCFxYm/ppPqQb
DpFyNlulzqlzCHVEgsfJsQunkLeHt0BtFmwTNsW50QGXt7blFiAfgZ3pLiWw
mgnEE2xE0G0I1w4Hl1IEA27Ininj/rPodXnBOB5TjdZq9Av+nU8DAqM0OH2N
HpaCagmCZ2nyl8VjEnHUtvfSM/i0FMOx8VKtpfI2Ag0+axXGqB9npQgxO1v1
Sjn6gmVWSTtpH+JA/OVGbGwB1dKFQEQ+eYOYSpmUkjFiy2CcniSGc2DhCsEY
pG1B1S4zgp1iv8f4huAXOiPtO8fYu1nSx4d6lQ7XKOA4rwf7Xyd3zrIFaBGY
wfYmY7zKu+x2fbD/OLnzGrYoLXBqzrdds2eG0VRdnXFNUB8TXbFy5h8R6S0i
0mt2NB7kjekDCh1CZVltucg9ywLxSjiNdRMJ2SJVt0IRRtxtdmxHEAf6sSHb
IHDh8Lvk6kZf4ad8rsuW9IjJkZ94tTDSTelDZYF4XTeSHWZcfF4AhgetW1wm
AlbgTNlNU5UIzuZ0yHYEllKKYdRYmdkxlkcPUNmtynlXMInd0OdFOaAuwOcc
0cMIdsPlgWMYRRj28dHx9ycvv3NTE308XbzJkbCfE8R/gFGnF4QbanjR/Oau
JKQ+2L+f3HmG+XP+3auNreE3RGRLRm4y8zNT0EAstjI3TC4DR4LbPtL2DdvF
S9qShzEv53pEzk91tNhWFHH4ybZ54rSvuTd+8Ci7P57c/2adKbXBzPFbfET9
NaEjD+xV/NMyu/b3gy+sXwNe+dsHX8FXHnUfJkrA2zrduo5MylEtAqNNjG+3
rcTwuPD9bexXb8vTb7LJ6OvHB6Ofc8sPwi1vb21rz9durK334DolG16wCss2
5R5dquoaJHzfdOQiiki603Z1qsjO6F8ELDbwfyjgy1Fj9CwedmYWFFXreEkR
jdoTAkKPHVGonOyAzrd01r6EAMc+ttRZu+t6aI8RpgWXkLoT8/CdbW2ui11Z
2NT3SBNBLqSNaZVdiXae9bC9GR8k0XdmXMQ1jwAvi2twCsIPoA69h6g6uQd2
QeitfGgKCMPBssnabo2mh49DU346im/TdCXgDiPzKUpbH+n0CjJZWNr9Z9tX
SHMNSmszeQcUqFjNOzvgteHeCQhtWeVECZKds2POc+wA22kDG5OVfX2uK3V5
u4zldvJZR+p+20AeJj5wn2t8tNIOvPJrMgCGceMLbb8Npk2dOIiINmhuZxIs
0eZKad47xesJy6JIMnxBUo5Jw1FMEmfPEDTpjZs9JyfD9ZucO1CX8yvB4Kbh
PhNh7McLprzPCCm8mPXFsn3XUI9BLI6kKLXWJNvdIx5wtClN3dX+0iZ6S3Bb
Dfx2AGMY6IIfmVCO3OEZ6Tc/o7PAg+MN3APy8r9bJ4HMf8N9+sWz0Pl6tL0T
SFH2pnxxyfNdSe0R9E2u56l/Cc3PbxyC7kaqhDYYQvHKkS6Fcfv0qOA1H5kd
lf7M+VHBLLdJj3IDKYyMMsuLghP+J8ZeJ6wVDhpgqxoXCCFV9kYdX2VNYXjG
n9ht9zXoRm/yZsVFuI6/jJFOfEQSW2x234EWGian6ZWV+HKlOEdiu6KAXyj3
K8ivXmcAhBmNFkt3M7D4mjlKjMm9I5pV+3D/G+D7ZTGFexoIE7WshHNFfIcV
uXe2d0sGI/5smNSKlWBr2WWbCJLa/dbsnj0ne7ktWJIcaNzp6V5UQxKLcuJ3
DXMYp6aZt49FlIiLMmdsILNVga5TpAgw3CppsumimsYnDXuMJYo6DBIWOSvJ
U0K6kq/JiVgRpB3hOYTe/mNWGThWvdft9RNcGXMybiATA/X2YmdfLEi5q6AM
t9wo3KRBsEmHvSQZBD2WQPASBJfJ/uoqUcND40YzXtM6qYx8eLCf3PmuLLJA
vXXqYf/ZV7TGFpbF5Iuvy1H3XePyM9PxIOqW+7kP1LxVTpOOMfwweobtc9AQ
A58HLGTTgfSZcT5M7mDySMQ57u79L1GAtKHL8MfXIPn8sN0Np7O/iCgsJvLg
0R+ZW8SCCUrHWLQW1jTl6fgFa9ZuD3OiosHtvtvYWCeyW2fjzkxpUz/hrWtH
T1a7X4+Tt65RFbx+VH4AwsQ0A3CybXIXb0MMfZOl3eeKvrkLed+uKWvqbD5V
w9vxCoTEHyRvfyxV71I+1kHWn6mQrCWYw0RcY/pHvN1t38Jmf8caVI5ftsJr
l+ou3VXb+IawUttiX2OUjueYNGwX1NyW4vBoZKeiFmQVeT47A+snI7lw+Yox
hPyoK2tJc4hsE0IFKFnXixCT5HINOE+n+dgaD0A9onytb9xDRiA3pQjrn0Kv
llqeo0ybxnxCKZ2i3mTUJufvsogONYc6VmxitOqOcs8grS9ebGO7eH9EtY0P
CO8nfAnLUoS5d63CgNRN7wOuar7G7TW2nt92xZe8aElaTctTsVSyMQJiuz5e
ywjRXRTyN3QD8rQOY7m9ZIqbzPav00f7DyePv961IiCMMGv+bmelQHeFh+8Z
cjOAP3e+dzDpB48OHsP/PeztFFt3495EF+upy83sj9KWlYdSQqD0VVing4eM
L7feNsqz1QeR5h8adHKHiJdhWpqz+o8XqOmbqIUu2akxgJ1AvotwYKBxk2zd
TH6TB48nX02n2eNdM8vDaPv9ByaqHhDg5gqjbvrzdnUz+Ulx1LpM+M76JrBg
9hSUau8wwX8nyR+Hw+Gf4W8feh/CrIBjJ4/UKT10s0t3S2U3SZ30rdHY1GtI
itMon6MX27jd+gKTz/IJBNGTp8+fnj3dnGn+hBD9wVLNxZNg8PhayIkUVkW0
TxXuMC6rM9HU576f4eNYrCDsucNA4YIOOt1lbevi7RBgwtXGBPf6hkK+eiiP
2IPAmebFYDqXDinS/qID50Aw0GrHoW7kBbraR+gBxVCijC8/yitJPzNe7Ds1
JQFwS0z8x+a03jPH0vt7yFHTk4tlqcVvk6NebKdbuA/HGCFPwXDCR189fpw+
fHAw/nxZSsoxju1hIQ5eAB7aXwcU3tfedUskGg1JrXFJAC9FoF5TX0GZ+dHc
nq6Ud8cA7AalCcAS2maCmYi2nvUrDGCJ13A4gxHebsFdQZWtuN0wLzMEbu9d
H6R9c11Wl15pD6fMUxAeX8twtLY9i/NOjSXUDnhUWitssgXCsSBKq8JpcWRd
bawY6GCuTcH996RhirfNfEVI4aRoayxwYi7miDu2Es4+vKefMLADAzjFtsbm
bvDkb9d4nARSChaNgIXbdvWeVxk7CC2AMVP3GicnFpQJ0i84VAOTIAKYI1AD
b4CeAL88Nqu1qZpdJQAw+D0Txpu3PFF++cZ6Mm+FmsJwApEa8KcJ+7AcEHqv
kyZFKHdK4pLUIdhXhfd2nqGKIr9wQ+tgOAFNwP2BmEeMzty4An3NluYUG2dY
z+2eMDvth9BzBcDHpIIFbyUPCxdw4qBskBuQq1JSCY2uaidwyEvWLqMuRA9M
qipTrsnCa0gMvT6kpiTtsLgMSP1uwbxyFueBqq4/lf7u5Nh3dsi5qt0EKZ2J
2qU7XW2ftygh2uH2oEPQZULGl+qpBpvveD+85KOW4tJeomhAQdqYc16geHJS
hnLySTZPb8SbBIRFoPzBlJlzms6mVgGM7YpmZGrPKqNGrxNXiqufuw3SfRZK
0QyWFAq7G+rIpu6XmGgoTK3gdGRj3F9KmLa1CAeN+etWa26KW1Wn8+rg8pjf
EuqeQXlZoIBa7RObXDDIsLaEMGWQ7v3l1VPXdAYa5kQakzCBkNYgYhgxXlGH
ReRIUMetAGTlgLpS0Hsr72WhbUHwEdbK/vUYxEZhRd5XTE0Kb07tZI2aJFWR
IRnBG3NPK6cxR/ZuPF/VSJraui9ulSimelroD+fl+NKJtdR0vluoVny8pued
p/hwbepsvR5C1qooQtq3UCPq+awgJCf0zmBvPjq3dI6A5hwqstNiA5Ma+K2C
MP8Tp0wXXpyXPoT5tfCQVaGyyml76CUSRJLtcNE5LZHbdhiWIp0qqrp1A03G
XTbxKdi19tu00JQCvpj8bZWPLxMnAc3040KJCjYyW2XH6FTexgn9/hbbcQO0
4wbwgFhTuzqwA2hz2onrUuGfOVn8B1aajBOLTtSuUPoDWSPoc0KiyuRqCTN4
kXZDmWtbXfWVC2mPE8S6TU0rFhumdxOqI2ZQ4FJ3uxFE6t5Y1V+a+74mg5p4
A/Bd26hUiJxbNdhwQMtp5DnBC06AhuVEOcCQDjLIa+aFs4tOqs+3VTWDplAt
UN4qm62opeTaiMvHkERIBmqsBNGS7cpAO46Fjrez4S6lPkUy6NBxkSxQcUqR
1TJPMLOxJolzpAa5IgpVwfsZmD+qsNvckdwfnsNx5KHrRGBAG2G0ooZccHYY
9mB64H6dasA7NkGVDZzMecZzLKwaHGi5rTvoWu8wb8ebdbC/PzCp4AyRoEAu
LJ1yda12uDetlY9SQRiUU//jpt04mcKchPVZmRWH0ac6Cxihc3GUg0b9g3wv
oxfRDPIoQpu3RD+SzHOfkhTpPW6k3dlD1DOJjX7OJZPsekGJyuiPX5/Q/P5W
dxKzSK8t86HVh1prnu2M8mxHqBC51S8dxA/3FBNfRk4Qp+HOQY5bzfRk04be
PDp1ZtGwL3/EipDtb3JmvhHpJfa/UyoX6TvvoFZxXyn2njhVWDzmpMSbifB9
MHt7cF0PxRFxrGSiE3wt/jA8w5o8nS9sDqig/eAJ5TaXmf2czAE/Z/5pVxac
09nOY3ze76/bmkpXiLrL7Pali7CYtTIkSK6P5CYH2sTt2oInnF2X/hKyd3Dz
65waq1AfX8o9Ea/yIc9GgWRk00QZkXYw9lPTCPjIXvRVbdVq97XqTiiXK8yG
SkZg2+kA/bD0Hlslt+bgFFLGrBe9MnaE1nzjIwSZBRuDBvqBDbXam9U6AZKD
B1LU3TcVTOvSV03yhpaCx0ISt5BBPz1Mbv/pNl/V6wqez7lPYfLm2XHy+Otv
7vdcwK1vEs0yXxdg5TP7n06oE49v73DnK/gnCot2X8Q+jZ038wwhIt10pQ5C
t+kbuss8RkAoe4d2v/HrgAr2nBL7D07cRXNo30pk+fPxonam7BfJgmQE11vE
zVvN1ghSlSRMUX59nk12vzCfiZ73k29JhaCl/oIk3TpPn5K7qxcmew7FnbgZ
+ZwA8TmJbl2+/c9HfpvBrj6dTk2RtvZ39Gob/ORG7iDdj0TFg8zN/++IeA19
+OQcqxyRxtxTc56WsE1z1WNuOqZOYXYEcB+yea5pIZEuZylh+I8vUspQqrB7
w7hD1Wz1e3P7oPVZw3CFrSgIpr8leSnxcq4ar+H41MnXfeUoQNonb37TzvAt
PFcHWi6Ss3xHEA/6XcoyGPwvwKIvjRXWattGWfFSGSE+WjXvJWleXSQYhDNm
tm+6cn0FAROQtjHJ2NfRZcaUxunVMraxlwZuvBQjvgO2Afv+5OS7p6dng2cn
T58/Of3wgXaRXBWO54BsgTMNtBgSeVtgV/MYNbSPGG6Ne8jnOlr3Q1/xI3D9
vjk4uC+RL4y6lXArmxslLrnEfdqpjs58zkHpIvSU1BITkCzU2fEniF+XDWdD
Rcx6l2d1JOSbtmB01DOiwQ6aT+ut3LvbELBwP9Z0+ibAaKmgCpoLmQGJHNRL
oP2ZJEjHbwhikWJgcPoiRsq0GlmCC1YN96/KMHnNnqPCw3VYn9JttQ5yInNm
w19XhZM7ToNEiCHMTCYs4FmFbs4n+QxdzMz6c/MxN6/0bhbhXtpO68b0EB+1
nD23nCDvLhlBEx6fldr374MLwo2ig16XZkrB5zoUNek1rS2CWTsModMzgeod
qXXGMcHotBrY1BBqRSC1YbeNTkwS25TYzojnvMXElMy6+6eZ5EUv/Rz3aMA7
Ftb1eK5DO15ULXEAYKzuZnS2djM45751LXYjfjwOknLVs9wXNVNkJFP0oSfP
XhmyhGLJix6bkGVwsJcZmt+QypuUlGNwGB9Vh5TzF6Q+1FQW0EkL6wLR2d+Z
AOWawFQaMtiAio7mBMzNnqL+bufW8vmm9aW7Mw5v5Dhds6qK6LHVpnf9+Q8p
8CCPsIQDlcVVduOkM0gnj3Q+K2GkiwXcibMLJ40zAB9MUXlKqazG6ftKt8mc
ec3+AVuWog9joutZ5MgtIYbb7S2ra8a2xKdN97RlrVpzo/WvuXutes/gjNdc
J7lEFtgANC0Dp+xBom3JB7zULNvHeYOZgi/w7BQOOQiz77BVqL9hBJ/CRaiZ
MCztmvhOjqw2LTJee2RvhHScSEnc2WsZTK2Pav6bBjX5Y7n2S5imJIbq3WAA
lGHPy7JC+3SJZm2nbOjHx9HbP8UsYd4tbWDt7ReXCdpKG02LJZXYiEf9YGu5
aEHjNMojsty6/XaVaDqkJhJ9nA2cd+M+m1z1mPCzXXfW3UFJdmghqRk1IFrJ
trOYM42hPlW0bZJsNknLkW3iTHDX19mV6lNFXJR4YpINVTuH87ASXLPtb7pD
lFOYLRschSKHTaW+2LvU3t1lUDEED6DIN2Kvh+FZdzXP4kkL5NrBMH6NbCfn
UDobHFecTQwLdGfbwhUw4slPhnW5v615lrA/6ftOJyz+cl3xvMPu/VLIbnC7
oVTS1JookFIVb+5gLUqqRtg8q/T6iZoyFXQfNZz87XqPtgjnAyWYEOvET2j0
sifi+X0LqSaxuEhr96rvId94VTZS9ROeC9OIKv8Nii9jgfqvFWkeYqyBUlM5
ofKIIuEDYaE8YpTrzrw6pO4Wva6rfNDCB27OPBWzMLWpLGMqVyfLNidMR6uc
9M5KzHyoWDfGPAeUVi1uWCuDmWR1XrUTwIPMHN7OsKbbOKRCvPRi4qgpRoeQ
XaZ2IX5VIW8gQkWmCeHnOn7UNSnmhqN5bYScjEd3USZKJkvT/s3A1qUMgrfW
kIi/KMPkl3nGSDrejiFPLJM5okvQpQv2z919iqQvMAkwd6BXCNcGfoP5sY2T
kedgqGK3yEJ6zgZ6FlIhZmmxNkD5dsuKUFlb7gLJVDht8D2zPBN3AdFi7sKw
hOK/7dt21QCRiZ4CSH6M6Tx7l9s8LGk9rsATXe46ozhhw2hOa3DkidNykPum
Gc2C+3lQo+PooIZ8GSgP23YiZY8Uhp8q4mFAOknU1n2UJJMfTf3FcVE5YWI0
ta1ZoQjCVZlPNHVA04DqmrKRiP83LkiPzW7aLkGv5dynZIkx561qXICyEpub
JXUZNfdMD128dFiztyLYJkrRLxeLEj1FV3lVssM9gCutKUwmDSALlAKYozPP
x3nDSu5iVUjjHF/CkyIlMkx7RbneW/SKU68VNCdlmjfMOvFWL/J3jBw9STlH
aSHj5xXhc9esVr8C2bNgD7uWqgqJEt7gXmm/D6h7z0vqBI2Izl2y/LyT/4Rj
85OTtDpqRdUDbsd6anWj0HkuqGq7g/1RW023qklmVJoN0L0uooQJLsAu5UsL
ZprbHGL3GmqVo588bTA7CR0n6EjFadVKxaOsANYj+0xOZGqipcnu+XpmRDh/
2UT1/S7E1YBxpJj5PbM2nlmF5gwi4ye7DhjvEmd6ZBP6J1V6zSqqk4/vlbp5
adaSeGrsqWES2p8ORKBrQvoguPWWWBvdiWrtnJpIGz5B5jUFGPKQaHqqcSAx
Ithroo5m740eDIktq5oa48MQwgUpliw7OXfXFF+xwz57N8bcel9/MQpdZ0BH
uPv6p9w0wo/ZWRI2StqUalfdGFzOJrIxIGyUzAgtwg7knEHBmDSwHzkLSEG+
s94iU7YpmsFNW8Nv35N8qtqgKdWRjFknKDt08Pv5EK/TXJslKL7fBNN0TdIs
q0u8nrX71yYTrRlXiE/FatIczVZqZ6fOxzq7ZccOia9lyJr813k75J2k/ReY
HrsiNUTMS6r8KK9trKu1Z36WaXsLgsDewf7wwAsHOgEr9I3JLqGxJWXjb5ez
imuiQe1/Y9YnxjlVk8sPJCZef+j1XnVKQXXiGUltcB+5oNWDCuahM0JxbG+t
cj6WaQXKKszJjv46yrvzjVy7D8KaD+Qcm0YyLNXrt2fnfcvPi5tIEQCZAn6u
f2gG5qADeUUT7G3lFUuhtZv63yIugj2Y7NL3XhvNVflMLA8HGWhdkyOnNwO8
0bLaiDAEsg5At2C6sB3aRdBpGEB+XmK+Ey5bu87JvjQpNZwYzPerjvNg8nBx
p1C0TsgNF5RB+PmOXPngGDMfJ/PU7bEOqpebZQZU4C9uC0FTOoLlOuV3KZnE
6cK0IDR7PSvKSjS0dWTCJ+TC2RUI9Dav2WFGb4vdrphyMy4lMZRaIfJ0KeKE
Tjh0/HENJwoyfB/6PxEeg4gaJMGI4OTLios10oVYE+OG4VmlppI338G4MyEH
qlW4SBEjEGtosIJsyEVTdEA1HQxYASscMYgoWOhYu1APBMW5xVqKyscup+It
CIlOOksuSzLgYHd8XdbUxMm/QS0UwxVMWVcBvirnpkSel4QHNk/JPhXKDOtV
bBWtUwTqORyjLjy+LCYp3zik1U2Mb+dAAywUQbBb5hCD3O+N5fuWORSJHPgp
OOtuvtxkzjPDFP9OvcTunuIJM0ROpHsKYeDE+uDhni4t0IFz/mrTGKs/5DnI
Ztp6xy54DTHOwnIHFBvQYLvNH1fkyFEC0S8tfnNAAGtq59RBdy2jSIqh1Ouh
hnejGpbncrUFYONsgtDJiqbjeiy6+tKq4jQHbcKWM9oQBFfLqpIvyGEbjHAG
puM6UnaisKuGLsA7tBUyCVq4lprrizfcGCi7ilOS8D23KnXEtmTeWOkZ2kSs
6bZM8H6C2VBqIIma7IUOzOUkrkgDTNNxpr4q9hn682QfiWdmWxy30sarIpuA
FjRom/V4Nc80dGX4QjadohjDp3VsW0jla18E4cqFthmQKypQx8KheIpMKrEL
Jd2QBGQ2ByI1lbKMYe7Hv61ZpDiaEnYyvshcTFU89qYBYYc19CkIoBEhTbcL
BZ0iS4ml2farLqoF4nOeWdgXfFMsF8Xtn0VxLVCEL0BP+zGzTq2xLTKPmBP0
GjgIbRpc5fUlFTQXzlD8eF+AuV28EJi4qf+L7HgdQ/9BD7M0dK4mUpI4W5kW
UN6bZRFB2aRq/rjVWNcyiew0bVZTVsjqysp1VoWo3iY/Kw6I3MGZyU9elZyt
Z/QHSsPMFE2VPCp1SSd3w8V+7okVJV+6giS757MHw/HSupLpldLOi7NVGq5f
580D/lMy+vbbjqXY8F5DfqyUP0CpXYAyI0nCy1UzVIQ3zNhMYfs8MBmVybBx
fO3N1qkX+7rCTAmpiTRAOYTHyfgJwJVQkrDXXBgavytnbAMLYhCGZUem3pld
DNk7uP+tdssBqZjFKpgPQeWmUmSBNnadYnThR8tfVdEWMq01WRl23SaJSujG
pyxC6Cg7OBeidpSLzBBvWbkOGvR8Cz9OamTtgkqtYXaz07BYcymOUJjrjxcZ
GkV5LTpvlVGOaIDOZ2KFbVpvuR7V1SX+50k2zbS7dVuzMuhzmlItxf7LOcaS
ggQWGblWaottBhh1F6IaqLKsY5slh3kL6PNoT42Mu7warxZX3tOUpY632I1K
KQLKMHmtblUnNqFxePSkEOyE76ORPDgOxooTSd/maMr+3hPbn+Q1zDlacM2q
T2XOIfVwORirZ5Q115kGM1WTLaOYTcoFZKKUbP26nOdjDCmN81q95MqEeazx
RTa+rB3rq4yixRs3MzavsxhedLqMUS13leFEHPe5QrqSPAJFJZ9R4HU1R+Gi
8SzgWLnAfWDIFMYYlNMBzY0UCfkA6fDO2avjs1dv73pASm0BqtzAGhFs4ylg
UwQ9yPEAkmiUAnc6bYrM5j+GagT76iTg4fVO6usMiCBZSgMlXuXzbCZot39b
lcC+lnhEeQSaMybTI4CGxOx1O9n/fwpLm8MR14O6ucE4L2kwNbr9nr/64fmr
NyenXKm0SPHdWJWt7kQgOQ8qxLyap3yZZUuOhcGTV5KY4GJIUGKj30lLUCQQ
KQ246AIBedanGNWyr2O1NdMRaXPooX53kWLwyjQf0cmNbtycVzCwyznNpVya
PG3qRsghZwyz0qSobByonPybhmcZ2C7m2kK0dH/whM326sb2RRMiUqgQeUmL
ANJ3VJVerLBGl7i+dkSwBHttyLHPqrxB8jJPmaNWTm5teIeOUXHpI2hRWQu/
aQQ8xwSTtUzeuHRAZJPAdGJDzoioIfTV5OTBZG4WjZkufIQdjangKyenjzqH
LZeR1AMSCMjOlhzzdiOiNteUxPxqqeRyjv2ascT/nPdLTVFLL2zhVIwDAAyg
sAUcvjy6MZGjasEYWgz8ydURNodLtt0vWrByVMMF3ULP6eismXgsyskyqcu5
QPMHQ6o9LU/CsXE6rl7JOam87mbVfiwMD0ERrUyQm/NjVnWXVLqVnBy9PGoZ
X7dusT35jDJMej36EcEJXmoqywzL0lhyOnWARVOxjKUv9r6/waIhhBI3ZUyv
wfwqx+U8uYNvuMuvSF5iTcwbGrS62Tvs9X4aRP/81PH3rk+6//zU+8l9t/3z
k4I/yd/RT7hCM5cQNX5Kwj9vMFU8w5TR8M9Pv8wqvNo7u4ql6b35U3LSAB/3
1tjqx2aMYZMnZlehr1DH8Y6vsM3HOl7ivIJDEDuvwvQU2WIV5OJK4q94wlwU
2UXrFfjYmjf8MsdtrqaDULbb/byxtzMYp96T56obuIH/iRbTYe+Qo6/1ajZj
bYksqbu93hNKBSKnI/5qTRAFjCY0F6cSCMZfv38f4qW1N5aBTwyYzceu0o7g
r4+ucwF3H+fjxKlhtqtR434Zwui/0dQiTKcD4xTkAP7s5b0jDn+SHIl8p2V2
vgFK349ypDl4tbrD2j/haG4tPxj4P4huH9buUdmmBinbg9K8Xq/AbKkvsLqt
fU5rGp1GXnlk91Gc+qYu3uIF4cDtH9pk9Rz7oFAS6qpAE5hkluQBk8SlWNgS
bdWB9ZIHku1Zlc642ar1FHas/8g6Oh0XDmHtPUEzj+UuqMHYeC1dZLUNs9Fy
eJRB8iKd5WPR5e7Ud83nz7Cu1ADJuN+8SMfokagvaNEMGYA3wv3ND6DLYojk
eJ4vRyW621Bg6dEBfQl8Ffrd5zY7V3rljTlbwDYRctZ3SJXJeEmOyFCsbydH
/HhmcRXCMx4yXZHrihq44zjoTHz1kkwWTxE1P+B9prd8/HuPKWBM66rgsmc0
1MnTs2eWKwbISZ/AF72R2ozj7ZsTfPtnQ1qCYRFDAMd0sZ6Eqyrk0xsH95Jm
6TURP0TYGvyRKCRygSPtQ2PM4kvbqhA4xNkh2ZWT2iLRbLM3+629aXdg/HvY
mW40CmePPMQU2TBRrkiy1x+3Y9HWo5FNA2WFMgcI5ILubd17f1hlC+DreVFN
x7/dwz6Ce9TLRYCfJ1U6bQZ51kwHuOpRXtsovK7zYB+GYRabTX67R73ocJDf
IAtJXFzYSV6jecyeZ9xt4oPIZpGHO9CFwx2nAHesYwqiGNTJEcEdDl5TkRZQ
xKvXZyevXp4OZZp1VMonXHpDdvcatxgO8jyfmgxnEnLwdKijU5LYfB5UGtRD
muc8fec+T8yaFFzJyqGfPTHJ3ppvaDxl7KrEDDQUPW6+IT35EqigQmcTyHx0
pqNkXaCThd+2844/7trxYzD/sYrRFhjUDLl67RdJ4KReoJ/YZD/Dr+RUkt8Y
rJKhPUQnMwuDtCucq5jobE671oT7nNMJM51wYLWUbCh+nn+8vKgYEdQ5BE6T
Nz1NzGTR3Tjmt4p3p1w16J7lofBOedSA42DLFBcMEz+TzizeUZ2wH0vKZvEw
+KhLqhCt6X4YqnVicwf++MGi5BraCIt6DN0YmWYWSendrkTx9SaiMP1y5cjZ
F8Ks0CaqcadGDL39JnmKSlrX/axl5bEYaT8MxmjMin1qQYSONv6Imvo41MLp
ttOy8oIZD9+9cw9sxz36qmuPXuQFerCj15ORpEDHmqzkxFG9lAaFzBiwtCyp
rW+EBBPNPXL1dpzzo645b0eqEd7j8LQ3GXF/xEtETi1+RVwx+RpBXT13L3Or
EWnftCQPMY8cGCROounrWWZuxZreJg8mbEpuxC7oKJ4QhfdXnKKyh3JsDyXL
NL0qyXG85xPg3s7b/nDTdUKMfGOyuVA1bspQSNm4s1STZy6e8FBODKWyvHNh
xOe6N7NVPsEcCjIhgtwu9WzqbztyV10wNO1tztgIOpIn4Uz9BVkstLoWtsXO
O/pgnapCgD7MUCyaj4Ez54xyk0JT+h1rNHjiEuo6qF5LhzKaMZOR5S3n6Gp2
BaNboB6CKMXol2++Y2hodxqv1ePEfa0SFSdyhb/guiV1bGtX46b0zqzVEJfP
SZzWHF9EGKtHD/bdnXIrTwQk06R1TTLhMFwCm7OExeV6vkO/7HE7xrQj7dxf
Rzs2s47BzBmtXq8mXilHzIbK31YKqOmtkyMcCXzikoqEWJFSOP/SdssyrXhK
G4uj0jqlvo1Slm8uh+iNiJVgIMkiDsRZPoO9Kb0melNiiHSwprb1Zzqlg25L
ALZqrLUSAzTGRC0X2iGCDYTL0HmQ21iU83KmLQdMHqVEWcli83jBz7DATmtL
tE5ZwVl5KQlDmFmNeCdIHxwjG9he9kK3b988d9AQjYNubNiyvaprdtBgdwTZ
x2h0a8Lpx+0J+qW7tqRGW5wCWJ139GVZZB89ZidFCcPEy4l6M7akvbRVnJRi
SPHFy5wxNFPcJhcPSOJDb0wmkbdPCgGBVTgD1kQfgobvNSmVcPHHb1gnNZ1S
ipE9bi9cyJPk1C3nJ+3zNpiV8osjI/KcpfZuJU+IDP6Tjz858civy0mBwAc1
amdMSLDf83K5kBJe0z1I7QTtsOE63xvgkGyFcD9EN4Rkc1V4R23XFkun+CPB
dBgmJ8EbjQOGlmYz0/0RkLXyagX3p1GmK2mU/Ljm0ThtkZxiTH9Go9ViKem3
IzgQIkmjblMSr/YDiTz8GJ26kt/QXhBPRn5uGsMoNXEyoBRseCxBNUI65oEE
QQZy3Oc24yacUOpkCirsgYHw8+qkOkbm1/Pz3P6X0BOpWkJSMj9ymaal4rYl
SzHpb7EyWkchmrJJ7dqw0HV4+5QiblIpHZ3wkzfBYvj8TAdOK//o7f1kWuZS
rU88Yk51iu3/Zz11U8uRYvhpE3aw07yZDAL0aqpY8nZGeni5CdaRzSS3O3k1
ESSakqoI2Go8Ju7GacmyWNoQkfv+SH1BNbqxI4i7lcpByBAfG/TB3fbmVnI0
VigHcqnEBd9ZKARGac15mcI7qiJr+JV+aNbkaMPJ/XuOf3mRXaCz6bTJpvDs
i7Spa4UDoVoODrTFomp4jn9E7fnqwBDkn+9oTAK+GOblPUEB9ifBZcg2+ErO
dWubMGmTJYW6KgithmqQcq1C46J8xAia2XifPjiEJXHDDQXxIwWfMEBAmiKE
XTZx02htfb+id8KDI1R/cm2xQUBSctExbiir183hAicCV6YfpcUl7CQ88rKk
8uiLdMG+TLDFG4SwuJJgZD5aSSCbx8aMJ9h7VJss97GBIkzUni8v0lFG1c4J
9efUPOQc/7fk1oLYwC67Njugh3bIDjyY5rd5fVEuUWMub5KzIZu+8Ar45N9X
8xwoAdjH+OIygw++m2dFQcg8q7qGf/+Q4z05S0E6p6ve/wXvRUBZsUEBAA==

-->

</rfc>
