<?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-no-vary-search-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="No-Vary-Search">The No-Vary-Search HTTP Caching Extension</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-no-vary-search-04"/>
    <author fullname="Domenic Denicola">
      <organization>Google LLC</organization>
      <address>
        <email>d@domenic.me</email>
      </address>
    </author>
    <author fullname="Jeremy Roman">
      <organization>Google LLC</organization>
      <address>
        <email>jbroman@chromium.org</email>
      </address>
    </author>
    <author fullname="Nidhi Jaju" role="editor">
      <organization>Google LLC</organization>
      <address>
        <email>nidhijaju@chromium.org</email>
      </address>
    </author>
    <date year="2026" month="February" day="27"/>
    <area>Web and Internet Transport</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 112?>

<t>This specification defines an extension to HTTP Caching, changing how URI query parameters impact caching.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://httpwg.org/http-extensions/draft-ietf-httpbis-no-vary-search.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-no-vary-search/"/>.
      </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/no-vary-search"/>.</t>
    </note>
  </front>
  <middle>
    <?line 116?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP caching <xref target="HTTP-CACHING"/> is based on reusing resources which match across a number of cache keys, with the most important one being the presented target URI (<xref section="7.1" sectionFormat="of" target="HTTP"/>). However, sometimes multiple URIs can represent the same resource. This leads to caches not always being as helpful as they could be: if the cache contains a response under one URI, but the response is then requested under another, the cached version will be ignored.</t>
      <t>The "No-Vary-Search" response header field defines a caching extension, as described in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>, that tackles a specific subset of this general problem, for when different URIs that only differ in
certain query parameters identify the same resource. It allows resources to declare that some or all parts of the query component do not semantically affect the served response, and thus can be ignored for cache matching purposes. For example, if the order of the query parameters do not affect which resource is identified, this is indicated using</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: key-order
]]></sourcecode>
      <t>If the specific query parameters (e.g., ones indicating something for analytics) do not semantically affect the served resource, this is indicated using</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: params=("utm_source" "utm_medium" "utm_campaign")
]]></sourcecode>
      <t>And if the resource instead wants to take an allowlist-based approach, where only certain known query parameters semantically affect the served response, they can use</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: except=("productId")
]]></sourcecode>
      <t>Note that "cache busting" by sending unique query parameters to avoid retrieving a cached response can be made ineffective by the <tt>No-Vary-Search</tt> header field.</t>
      <t><xref target="header-definition"/> defines the new response header field <tt>No-Vary-Search</tt>, using the <xref target="STRUCTURED-FIELDS"/> framework. <xref target="data-model"/> and <xref target="parsing"/> illustrate the data model for how the field value can be represented in specifications, and the process for parsing the raw output from the structured field parser into that data model. <xref target="comparing"/> gives the key algorithm for comparing if two URLs are equivalent under the influence of the header field; notably, it leans on the decomposition of the query component into keys and values given by the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format specified in <xref target="WHATWG-URL"/>. (As such, this header field is not useful for URLs whose query component does not follow that format.) Finally, <xref target="caching"/> explains how to extend <xref section="4" sectionFormat="of" target="HTTP-CACHING"/> to take this new equivalence into account.</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>In this document, the terms "URI" and "URL" are used interchangeably, depending on context. "URI" is used in the context of <xref target="URI"/>, <xref target="HTTP"/>, and <xref target="HTTP-CACHING"/>, whereas "URL" is used in the context of the algorithms specified in <xref target="WHATWG-URL"/>.</t>
      <t>This document also adopts some conventions and notation typical in WHATWG and W3C usage, especially as it relates to algorithms. See <xref target="WHATWG-INFRA"/>, and in particular:</t>
      <ul spacing="normal">
        <li>
          <t>its definition of lists, including the list literal notation « 1, 2, 3 ».</t>
        </li>
        <li>
          <t>its definition of strings, including their representation as code units.</t>
        </li>
      </ul>
      <t>(Other concepts used are called out using inline references.)</t>
    </section>
    <section anchor="header-definition">
      <name>HTTP header field definition</name>
      <t>The <tt>No-Vary-Search</tt> HTTP header field is a structured field <xref target="STRUCTURED-FIELDS"/> whose value <bcp14>MUST</bcp14> be a dictionary (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
      <t>It has the following authoring conformance requirements:</t>
      <ul spacing="normal">
        <li>
          <t>If present, the <tt>key-order</tt> entry's value <bcp14>MUST</bcp14> be a boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>params</tt> entry's value <bcp14>MUST</bcp14> be an inner list of strings (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>except</tt> entry's value <bcp14>MUST</bcp14> be an inner list of strings (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>The <tt>except</tt> entry <bcp14>MUST NOT</bcp14> be present if the <tt>params</tt> entry is also present.</t>
        </li>
      </ul>
      <t>The dictionary <bcp14>MAY</bcp14> contain entries whose keys are not one of <tt>key-order</tt>, <tt>params</tt>, and <tt>except</tt>, but their meaning is not defined by this specification. Implementations of this specification will ignore such entries (but future documents might assign meaning to such entries).</t>
      <aside>
        <t>As always, the authoring conformance requirements are not binding on implementations. Implementations instead need to implement the processing model for URL variation configurations (configs) given by the <iref item="obtain a URL variation config"/><xref target="obtain-a-url-variation-config" format="none">obtain a URL variation config</xref> algorithm (<xref target="obtain-a-url-variation-config"/>).</t>
      </aside>
    </section>
    <section anchor="data-model">
      <name>Data model</name>
      <t>A <em>URL variation config</em> consists of the following:</t>
      <dl newline="true">
        <dt>no-vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary on key order</dt>
        <dd>
          <t>a boolean</t>
        </dd>
      </dl>
      <t><iref item="default URL variation config" primary="true"/>
The <em><iref item="default URL variation config"/>default URL variation config</em> is a URL variation config whose no-vary params is an empty list, vary params is <strong>wildcard</strong>, and vary on key order is true.</t>
      <t>The <iref item="obtain a URL variation config"/><xref target="obtain-a-url-variation-config" format="none">obtain a URL variation config</xref> algorithm (<xref target="obtain-a-url-variation-config"/>) ensures that all URL variation configs obey the following constraints:</t>
      <ul spacing="normal">
        <li>
          <t>vary params is a list if and only if the no-vary params is <strong>wildcard</strong>; and</t>
        </li>
        <li>
          <t>no-vary params is a list if and only if the vary params is <strong>wildcard</strong>.</t>
        </li>
      </ul>
    </section>
    <section anchor="parsing">
      <name>Parsing</name>
      <section anchor="parse-a-url-variation-config">
        <name>Parse a URL variation config</name>
        <t><iref item="parse a URL variation config" primary="true"/>
To <em><iref item="parse a URL variation config"/><xref target="parse-a-url-variation-config" format="none">parse a URL variation config</xref></em> given <em>value</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>If <em>value</em> is null, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </li>
          <li>
            <t>Let <em>result</em> be a new URL variation config.</t>
          </li>
          <li>
            <t>Set <em>result</em>'s vary on key order to true.</t>
          </li>
          <li>
            <t>If <em>value</em>["<tt>key-order</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If <em>value</em>["<tt>key-order</tt>"] is not a boolean, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary on key order to the boolean negation of <em>value</em>["<tt>key-order</tt>"].</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If both <em>value</em>["<tt>params</tt>"] and <em>value</em>["<tt>except</tt>"] exist or neither exists, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </li>
          <li>
            <t>If <em>value</em>["<tt>params</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If <em>value</em>["<tt>params</tt>"] is not an array, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>If any item in <em>value</em>["<tt>params</tt>"] is not a string, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s no-vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>value</em>["<tt>params</tt>"].</t>
              </li>
              <li>
                <t>If any item in <em>result</em>'s no-vary params is an error, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Otherwise, if <em>value</em>["<tt>except</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If <em>value</em>["<tt>except</tt>"] is not an array, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>If any item in <em>value</em>["<tt>except</tt>"] is not a string, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>value</em>["<tt>except</tt>"].</t>
              </li>
              <li>
                <t>If any item in <em>result</em>'s vary params is an error, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s no-vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Return <em>result</em>.</t>
          </li>
        </ol>
        <aside>
          <t>In general, this algorithm is strict and tends to return the <iref item="default URL variation config"/>default URL variation config whenever it sees something it doesn't recognize. This is because the <iref item="default URL variation config"/>default URL variation config behavior will just cause fewer cache hits, which is an acceptable fallback behavior.</t>
          <t>However, unrecognized keys at the top level are ignored, to make it easier to extend this specification in the future. To avoid misbehavior with existing client software, such extensions will likely expand, rather than reduce, the set of requests that a cached response can match.</t>
        </aside>
        <aside>
          <t>The input to this algorithm is generally obtained by parsing a structured field (<xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>) using field_type "dictionary".</t>
        </aside>
      </section>
      <section anchor="obtain-a-url-variation-config">
        <name>Obtain a URL variation config</name>
        <t><iref item="obtain a URL variation config" primary="true"/>
To <em><iref item="obtain a URL variation config"/><xref target="obtain-a-url-variation-config" format="none">obtain a URL variation config</xref></em> given a <eref target="https://fetch.spec.whatwg.org/#concept-response">response</eref> <em>response</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>fieldValue</em> be the result of <eref target="https://fetch.spec.whatwg.org/#concept-header-list-get-structured-header">getting a structured field value</eref> <xref target="FETCH"/> given `<tt>No-Vary-Search</tt>` and "<tt>dictionary</tt>" from <em>response</em>'s header list.</t>
          </li>
          <li>
            <t>Return the result of parsing a URL variation config (<xref target="parse-a-url-variation-config"/>) given <em>fieldValue</em>. <iref item="parse a URL variation config"/></t>
          </li>
        </ol>
        <section anchor="examples">
          <name>Examples</name>
          <t>The following illustrates how various inputs are parsed, in terms of their impact on the resulting no-vary params and vary params:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Result</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=("a")</tt></td>
                <td align="left">no-vary params: « "<tt>a</tt>" »<br/>vary params: <strong>wildcard</strong></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=("x")</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: « "<tt>x</tt>" »</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=()</tt></td>
                <td align="left">no-vary params: (empty list)<br/>vary params: <strong>wildcard</strong></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=()</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: (empty list)</td>
              </tr>
            </tbody>
          </table>
          <t>The following inputs are all invalid and will cause the <iref item="default URL variation config"/>default URL variation config to be returned:</t>
          <ul spacing="compact">
            <li>
              <t><tt>No-Vary-Search: key-order="not a boolean"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params="not an inner list"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=(not-a-string)</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=?0</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=?1</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=?1, except=("x")</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=("a"), except=("x")</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=(), except=()</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except="not an inner list"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except=(not-a-string)</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except=?1</tt></t>
            </li>
          </ul>
          <t>The following inputs are valid, but somewhat unconventional. They are shown alongside their more conventional form.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Conventional form</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?1</tt></td>
                <td align="left">
                  <tt>No-Vary-Search: key-order</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=("x")</tt>, key-order</td>
                <td align="left">
                  <tt>No-Vary-Search: key-order, except=("x")</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=()</tt></td>
                <td align="left">(omit the header field)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?0</tt></td>
                <td align="left">(omit the header field)</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="parse-a-key">
        <name>Parse a key</name>
        <t><iref item="parse a key" primary="true"/>
To <em><iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref></em> given an ASCII string <em>keyString</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>keyBytes</em> be the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>keyString</em>.</t>
          </li>
          <li>
            <t>Replace any 0x2B (+) in <em>keyBytes</em> with 0x20 (SP).</t>
          </li>
          <li>
            <t>Let <em>keyBytesDecoded</em> be the <eref target="https://url.spec.whatwg.org/#percent-decode">percent-decoding</eref> <xref target="WHATWG-URL"/> of <em>keyBytes</em>.</t>
          </li>
          <li>
            <t>Let <em>keyStringDecoded</em> be the <eref target="https://encoding.spec.whatwg.org/#utf-8-decode-without-bom">UTF-8 decoding without BOM</eref> <xref target="WHATWG-ENCODING"/> of <em>keyBytesDecoded</em>.</t>
          </li>
          <li>
            <t>Return <em>keyStringDecoded</em>.</t>
          </li>
        </ol>
        <section anchor="examples-1">
          <name>Examples</name>
          <t>The <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> algorithm allows encoding non-ASCII key strings in the ASCII structured header field format, similar to how the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format <xref target="WHATWG-URL"/> allows encoding an entire entry list of keys and values in a URI (which is restricted to ASCII characters). For example,</t>
          <sourcecode type="http-message"><![CDATA[
No-Vary-Search: params=("%C3%A9+%E6%B0%97")
]]></sourcecode>
          <t>will result in a URL variation config whose vary params are « "<tt>é 気</tt>" ». As explained in a later example, the canonicalization process during equivalence testing means this will treat as equivalent URIs such as:</t>
          <!-- link "a later example" and "equivalence testing" -->

<ul spacing="normal">
            <li>
              <t><tt>https://example.com/?é 気=1</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?é+気=2</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9%20気=3</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9+%E6%B0%97=4</tt></t>
            </li>
          </ul>
          <t>and so on, since they all are <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">parsed</eref> <xref target="WHATWG-URL"/> to having the same key "<tt>é 気</tt>".</t>
        </section>
      </section>
    </section>
    <section anchor="comparing">
      <name>Comparing</name>
      <t><iref item="equivalent modulo variation config" primary="true"/>
Two <eref target="https://url.spec.whatwg.org/#concept-url">URLs</eref> <xref target="WHATWG-URL"/> <em>urlA</em> and <em>urlB</em> are <em>equivalent modulo variation config</em> given a URL variation config <em>variationConfig</em> if the following algorithm returns true:</t>
      <ol spacing="normal" type="1"><li>
          <t>If the scheme, username, password, host, port, or path of <em>urlA</em> and <em>urlB</em> differ, then return false.</t>
        </li>
        <li>
          <t>If <em>variationConfig</em> is equivalent to the <iref item="default URL variation config"/>default URL variation config, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>urlA</em>'s query equals <em>urlB</em>'s query, then return true.</t>
            </li>
            <li>
              <t>Return false.</t>
            </li>
          </ol>
          <t>
In this case, even URL pairs that might appear the same after running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> on their queries, such as <tt>https://example.com/a</tt> and <tt>https://example.com/a?</tt>, or <tt>https://example.com/foo?a=b&amp;&amp;&amp;c</tt> and <tt>https://example.com/foo?a=b&amp;c=</tt>, will be treated as inequivalent.</t>
        </li>
        <li>
          <t>Let <em>searchParamsA</em> and <em>searchParamsB</em> be empty lists.</t>
        </li>
        <li>
          <t>If <em>urlA</em>'s query is not null, then set <em>searchParamsA</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlA</em>'s query.</t>
        </li>
        <li>
          <t>If <em>urlB</em>'s query is not null, then set <em>searchParamsB</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlB</em>'s query.</t>
        </li>
        <li>
          <t>If <em>variationConfig</em>'s no-vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>variationConfig</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>variationConfig</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Otherwise, if <em>variationConfig</em>'s vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>variationConfig</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>variationConfig</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>variationConfig</em>'s vary on key order is false, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>keyLessThan</em> be an algorithm taking as inputs two pairs (<em>keyA</em>, <em>valueA</em>) and (<em>keyB</em>, <em>valueB</em>), which returns whether <em>keyA</em> is <eref target="https://infra.spec.whatwg.org/#code-unit-less-than">code unit less than</eref> <xref target="WHATWG-INFRA"/> <em>keyB</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsA</em> to the result of sorting <em>searchParamsA</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to the result of sorting <em>searchParamsB</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>searchParamsA</em>'s size is not equal to <em>searchParamsB</em>'s size, then return false.</t>
        </li>
        <li>
          <t>Let <em>i</em> be 0.</t>
        </li>
        <li>
          <t>While <em>i</em> &lt; <em>searchParamsA</em>'s size:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>searchParamsA</em>[<em>i</em>][0] does not equal <em>searchParamsB</em>[<em>i</em>][0], then return false.</t>
            </li>
            <li>
              <t>If <em>searchParamsA</em>[<em>i</em>][1] does not equal <em>searchParamsB</em>[<em>i</em>][1], then return false.</t>
            </li>
            <li>
              <t>Set <em>i</em> to <em>i</em> + 1.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Return true.</t>
        </li>
      </ol>
      <section anchor="examples-2">
        <name>Examples</name>
        <t>Due to how the application/x-www-form-urlencoded parser canonicalizes query strings, there are some cases where query strings which do not appear obviously equivalent, will end up being treated as equivalent after parsing.</t>
        <t>So, for example, given any non-default value for <tt>No-Vary-Search</tt>, such as <tt>No-Vary-Search: key-order</tt>, we will have the following equivalences:</t>
        <table>
          <thead>
            <tr>
              <th align="left">First Query</th>
              <th align="left">Second Query</th>
              <th align="left">Explanation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">null</td>
              <td align="left">
                <tt>?</tt></td>
              <td align="left">A null query is parsed the same as an empty string</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=x</tt></td>
              <td align="left">
                <tt>?%61=%78</tt></td>
              <td align="left">Parsing performs percent-decoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=é</tt></td>
              <td align="left">
                <tt>?a=%C3%A9</tt></td>
              <td align="left">Parsing performs percent-decoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=%f6</tt></td>
              <td align="left">
                <tt>?a=%ef%bf%bd</tt></td>
              <td align="left">Both values are parsed as U+FFFD (�)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=x&amp;&amp;&amp;&amp;</tt></td>
              <td align="left">
                <tt>?a=x</tt></td>
              <td align="left">Parsing splits on <tt>&amp;</tt> and discards empty strings</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=</tt></td>
              <td align="left">
                <tt>?a</tt></td>
              <td align="left">Both parse as having an empty string value for <tt>a</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=%20</tt></td>
              <td align="left">
                <tt>?a= &amp;</tt></td>
              <td align="left">
                <tt>%20</tt> is parsed as U+0020 SPACE</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=+</tt></td>
              <td align="left">
                <tt>?a= &amp;</tt></td>
              <td align="left">
                <tt>+</tt> is parsed as U+0020 SPACE</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="caching">
      <name>Caching</name>
      <t>If a cache <xref target="HTTP-CACHING"/> implements this specification, the presented target URI requirement in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>:</t>
      <blockquote>
        <t>the presented target URI (Section 7.1 of <xref target="HTTP"/>) and that of the stored response match, and</t>
      </blockquote>
      <t>is replaced with:</t>
      <blockquote>
        <t>the presented target URI (Section 7.1 of <xref target="HTTP"/>) and that of the stored response match or are equivalent modulo URL variation config, and</t>
      </blockquote>
      <t>Cache implementations <bcp14>MAY</bcp14> fail to reuse a stored response whose target URI matches <em>only</em> modulo URL variation config, if the cache has more recently stored a response which:</t>
      <ul spacing="normal">
        <li>
          <t>has a target URI which is equal to the presented target URI, excluding the query, and</t>
        </li>
        <li>
          <t>has a non-empty value for the <tt>No-Vary-Search</tt> field, and</t>
        </li>
        <li>
          <t>has a <tt>No-Vary-Search</tt> field value different from the stored response being considered for reuse.</t>
        </li>
      </ul>
      <aside>
        <t>Caches aren't required to reuse stored responses, generally. However, the above expressly empowers caches to, if it is advantageous for performance or other reasons, search a smaller number of stored responses.</t>
        <t>That is, because caches might store more than one response for a given pathname, they need a way to efficiently look up the No-Vary-Search value without accessing all cached responses. Such a cache might take steps like the following to identify a stored response in a performant way, before checking the other conditions in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let exactMatch be cache[presentedTargetURI]. If it is a stored response that can be reused, return it.</t>
          </li>
          <li>
            <t>Let targetPath be presentedTargetURI, with query parameters removed.</t>
          </li>
          <li>
            <t>Let lastNVS be mostRecentNVS[targetPath]. If it does not exist, return null.</t>
          </li>
          <li>
            <t>Let simplifiedURL be the result of simplifying presentedTargetURI according to lastNVS (by removing query parameters which are not significant, and stable sorting parameters by key, if key order is to be be ignored).</t>
          </li>
          <li>
            <t>Let nvsMatch be cache[simplifiedURL]. If it does not exist, return null. (It is assumed that this was written when storing in the cache, in addition to the exact URL.)</t>
          </li>
          <li>
            <t>Let variationConfig be obtained (<xref target="obtain-a-url-variation-config"/>) from nvsMatch.</t>
          </li>
          <li>
            <t>If nvsMatch's target URI and presentedTargetURI are not equivalent modulo URL variation config (<xref target="comparing"/>) given variationConfig, then return null.</t>
          </li>
          <li>
            <t>If nvsMatch is a stored response that can be reused, return it. Otherwise, return null.</t>
          </li>
        </ol>
      </aside>
      <t>To aid cache implementation efficiency, servers <bcp14>SHOULD NOT</bcp14> send different non-empty values for the <tt>No-Vary-Search</tt> field in response to requests for a given pathname over time, unless there is a need to update how they handle the query component. Doing so would cause cache implementations that use a strategy like the above to miss some stored responses that could otherwise have been reused.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The main risk to be aware of is the impact of mismatched URLs. In particular, this could cause the user to see a response that was originally fetched from a URL different from the one displayed when they hovered a link, or the URL displayed in the URL bar.</t>
      <t>However, since the impact is limited to query parameters, this does not cross the relevant security boundary, which is the <eref target="https://html.spec.whatwg.org/multipage/browsers.html#concept-origin">origin</eref> <xref target="HTML"/>. (Or perhaps just the <eref target="https://url.spec.whatwg.org/#concept-url-host">host</eref>, from <eref target="https://url.spec.whatwg.org/#url-rendering-simplification">the perspective of web browser security UI</eref>. <xref target="WHATWG-URL"/>) Indeed, we have already given origins complete control over how they present the (URL, response body) pair, including on the client side via technology such as <eref target="https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-history-replacestate">history.replaceState()</eref> or service workers.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This proposal is adjacent to the highly-privacy-relevant space of <eref target="https://privacycg.github.io/nav-tracking-mitigations/#terminology">navigational tracking</eref>, which often uses query parameters to pass along user identifiers. However, we believe this proposal itself does not have privacy impacts. It does not interfere with <eref target="https://privacycg.github.io/nav-tracking-mitigations/#deployed-mitigations">existing navigational tracking mitigations</eref>, or any known future ones being contemplated. Indeed, if a page were to encode user identifiers in its URI, the only ability this proposal gives is to <em>reduce</em> such user tracking by preventing server processing of such user IDs (since the server is bypassed in favor of the cache). <xref target="NAV-TRACKING-MITIGATIONS"/></t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-field-names">
        <name>HTTP Field Names</name>
        <t>IANA is requested to enter the following into the Hypertext Transfer Protocol (HTTP) Field Name Registry (<eref target="https://www.iana.org/assignments/http-fields/http-fields.xhtml">https://www.iana.org/assignments/http-fields/http-fields.xhtml</eref>):</t>
        <dl>
          <dt>Field Name:</dt>
          <dd>
            <t><tt>No-Vary-Search</tt></t>
          </dd>
          <dt>Status:</dt>
          <dd>
            <t>permanent</t>
          </dd>
          <dt>Structured Type:</dt>
          <dd>
            <t>Dictionary</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>this document</t>
          </dd>
          <dt>Comments:</dt>
          <dd>
            <t>(none)</t>
          </dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <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="HTTP-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="FETCH" target="https://fetch.spec.whatwg.org/">
          <front>
            <title>Fetch Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </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="WHATWG-ENCODING" target="https://encoding.spec.whatwg.org/">
          <front>
            <title>Encoding Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-INFRA" target="https://infra.spec.whatwg.org/">
          <front>
            <title>Infra Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <author initials="D." surname="Denicola" fullname="Domenic Denicola">
              <organization>Google LLC</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-URL" target="https://url.spec.whatwg.org/">
          <front>
            <title>URL Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </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="HTML" target="https://html.spec.whatwg.org/">
          <front>
            <title>HTML Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="NAV-TRACKING-MITIGATIONS" target="https://privacycg.github.io/nav-tracking-mitigations/">
          <front>
            <title>Navigational-Tracking Mitigations</title>
            <author initials="P." surname="Snyder" fullname="Pete Snyder">
              <organization>Brave Software, Inc.</organization>
            </author>
            <author initials="J." surname="Yasskin" fullname="Jeffrey Yasskin">
              <organization>Google LLC</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>W3C Privacy CG</annotation>
        </reference>
      </references>
    </references>
    <?line 475?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document benefited from valuable reviews and suggestions by:</t>
      <ul spacing="normal">
        <li>
          <t>Adam Rice</t>
        </li>
        <li>
          <t>Julian Reschke</t>
        </li>
        <li>
          <t>Kevin McNee</t>
        </li>
        <li>
          <t>Liviu Tinta</t>
        </li>
        <li>
          <t>Mark Nottingham</t>
        </li>
        <li>
          <t>Martin Thomson</t>
        </li>
        <li>
          <t>Valentin Gosu</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+U9y3LbSJJ3fEUNFXaTbYKWbE8/NG17qFdbPbbskeTumJAd
VBEokmiDAAcFiOKovb+x171O7GXvc+v5l/2OzUcVXgQp2mPHdMQqOloCUJWV
mZWZlZmVVXZd10mDNFS74nyixEns/iiThXumZOJNxLPz81diX3qTIBqLw+tU
RTqII0cOh4m62q21djyZqnGcLHaFTn3H8WMvklMA7CdylLqBSkfuJE1nw0C7
UexeYU9NPd3tR47OhtNAI/h0MYNOx4fnR06UTYcq2XV8gLzreHGkAYNM74o0
yZQDGDx0ZKLkrmj9pIZCRr44jlKVRCoV54mM9CxO0pYzj5N34yTOZtDuGQBP
ztW1aTBSiXiVxGnsxWHLeacW0NbfdYQrEFP87TH1zpWKMsBBCAMJWQNPjOxP
MAKy6Hv8Bm8nMdKNIPTu/fv4ez7uxcn4PnybyiDcFTk33Pn4j/OH+BG+ITOK
fmGgU93jj/f78Cm4Uvr+q2wYBt79MgAEm6hZXHQdB+kkG/a8eGpGp1+uslOo
74dyqEJ9vzoRACcEVusUONWAfR3GrRPbm6RT4Ctj48L0ZsqlgXdFbWBHZukk
TpD1gIQQoywMWXoOgJdR4IkD/H8cSvoM2Mgo+JtMAY9d8X0cj0Mlnj/fp4+K
Wez/0eeuvalaBvuDStR0IU7jqYw2BvnzMMH2f/Qm8DvIpjxtddAngT8JxA/y
54w+JDFql/KDNE42HilCGD8DiOpYThQnU+h4RaL4+vR4V5we7T/89puv4BFF
kp6/3dnZNs/ufn//2fHJ9/b9Drw/Ojzff4b9RSqTsUoLsRmpFCZNz5TXm09k
WgitMDbiCBuI58EVSvtZChonEx+/59NHP675DT9BBOra74krGYk/gWQB26Pi
KzOsH0VqRQMYH77PZsCh48jr0VARcO2nZ/3zn76Hx7Pz09f7569PDw/co+PD
5wdnTOlXv0dKuZV7eLL/8gCZ0ESzirzYB3LWkX1o2vymKDfEHZ8cnfYbKQui
USLXkXWMDf7NNDXAP+hVlb0Eu9EYFKCrutTIrtenzxuZlSXhOlZBt9/Q5Dsw
tWVD8Oz8RTNVaH/XkYUdf0N0CXHS/9E9P+3v/wnU1X1xfH78ff/8+OXJWSN1
syS4kt7CG/fMehfE9yN55aaJ9HA9dqdBGozJzuoy1SfyyryWoXtuGosXRePb
WfCqJ86iha+SOvGvVKqWPhHZe4m8gk/xKJ2D09JdpwE/9MRfpNaAVh38D2o0
StRi+fNK+X+4Dx4O8Unsg+S4rivkUCOLUsc5nwRaoHwEo8Aj2oWvRkGkNPQW
+VIv0rjiC3aFN5HRGLk2iee4Dom/ZipZiJlMAE2YdC2C6QyGsP5Tj0eeBr4f
KsfZQkctif3MwzEdh4CbpuLmprxyvX8vAMeh1MoXgEmiMo2NEqXjLPEA0fkk
gDUJlAH+L70k1oC7YM9RxCOCqgS4dror5iAmIoXHaaxTxBD8QxmlAFeJoUKw
+HEGsBX4kb4ROKKvfXNzpghb8XVvBwEjku/fd3riWTxXVyrpCg3WKQ2mgNM0
C9MApRy6akAB8TZgaQgNXMpJ6AmahlBJXyOnCWMNHlIqZDiXC21wk1pMVDgD
RwP/BDAL4cVZ6MNncChHBJipBU85lSBJwAgYZIZ+s8giHxkSEU5dMcwYk/x7
QCARUZhKjdRzDwl4TJC6HLwvgFoSi3kQhjC6CMbglyi/hwKlRKsaF7SKMSZA
IoAcBQqwzgUtn/hc3rpIoK+0lwRDGC6IRMH9R5b3hYAgbhLIAUUOCaCVaAFR
hYYJjJE5QOBYRSqRIcxwPAzVtCvAioL8ANV+MBqhqUp5xgheHIUL8wFQcDyV
IFMbJN2HfsFo0TSzxziHYTzXJYGFKfaVF4IR4HFQbEB/sSGCTTXjq8xI4MQD
9xA1Pyah0OAjwoAetF8ICeh5RqhUcgXcstzuUkAEdpEFsJgmopoFhbQGWT/L
klmsle6JI/ioruUUpLdrpQqCIlamAqsS/QYtgwmro6UWxcrwJ1B+l6cB/4t8
NDgoZajOjvMf8EPxBaiPlmPlVIVoFzXYJTyoqeMcMzb5VC+h1Va9ca+LEp8P
h5SSkhLNyAYJS8ACeKk7m3OXCPtXSCEk9eN2K0unAwbXEvQwhTAhm5oHDyZB
wpy1OobkPsynmZGCvxHoqvTFHJAm0UrlO4XGm8QOQ0iXbaecgdTDpHdR4EH0
SLqtTL+L4nmDZG8saWyMYNRMqw0YoK49NUuBATNeA479nMaTODVq0WIRHWYa
560lhgsYNyI3PIsCwHUZXyBfXsUBYpYmgSK3RlqjlVshow1TsEXAPkVkgSOF
AyBxl1VsLytWC0zczQ2/cMmABWiUYI2y1gwhRGq+wubVYXdZZqgXmLh6LANw
R0gcZjB60MCXqXSnsa9C+ILafXMD1CMEXCXDMMN1nfinBLYV1JYEHddpfM14
XMkwyxmRL01saivugLZWBJfFGKyXJmhmVBZFORdxls5gQRlBqMoCkiYwrRkZ
GxoQO5AZRQnF2S3QQ8LQxsmE6RhjmoOggMqDGI/jBJbtKVst2470YB6jXw4G
H8QZVi1wckI0k7xuIQBwk4HOCNTE2K7yZPwB1V0OwwWYuRRXX1gv0dVB3iky
upomd5U1JlrQryAOEUc1IR9ZSboAnQsNI+9fu/P53EW33YVYg6JO5b9tr4s/
tmAdR0UpdegIdvztLNnVsYhu3r/viXYfdDdDXScjVRHBgD0LUFR0JJCpxMP5
BMx/w4pjHJFRjOaEp44x6HXEURChZejiBPISDtOnrmch+R4kcTEv6v76BTy3
W4Quqk8+nWTiUK898HWitIe+434cXeGSEkfM+4NcETV7ICg4mMnTovXi9dl5
q8u/xclL+vv08M+vj0HL8O+zZ/3nz/M/HNPi7NnL188Pir+KnvsvX7w4PDng
zvBWVF45rRf9v7RYZ1ovX2Ho0n/ewikiyvzYy6bIV1r7Y1qTMWEJ+ofKJ7VT
cXr29l/9+l87j4B3vzs92n+ws/MtsIofvtn5+hE8oO/Co5E550c0xg6IHpgY
hIJuhSdnQSpDTY6VnqCxx0UAuPnlBXLm7a74bujNdh49MS+Q4MpLy7PKS+LZ
8pulzszEhlcNw+TcrLyvcbqKb/8vlWfL99LL756GYJ2Fu/PN0ycO+A61+WDn
FiZiChIDDmCLJxAUo0VTlWmaEGhAcY9iq+GrmVmPQKrR5QZR75n+ANx0Yr+Z
v6Lk39xAA/RZOczBv9iS131aWqalNmisBoiPuZXUaw2DYyK+Qg5DDarlxzPw
HcgN9WqqhSaStDZdzNAPQKAMkj5jdJnhEt8VigZmT0GjRU0U5ZJpUc7Rg7BZ
qQItSl5ZFgBodH8DLwPfeBdEE6BoUayySCzlxMFgR16Y+XYFwpfwv5R8+xzj
X/9b7HTFg654KH79R68RGixTAKMOL0iKJZFBAUFofdHvSDVwsf0SQyJhzLOZ
GRQU9JQwTs1Ss7AHEQleoii6gPWz10ELRvHucjTEiN1sLTsYbNeWXJNlOAHF
P/Xlt9m3YJvPvgApPdgjCREP2WkYphz0Puw9QI41gOkAQyDMmXBMalYK8rwo
g4J/AaNo0UBrjvFlkCgUP02TDI68YTar4WXu6V8KeJksvtBLOA7jGBfsKoIP
e1+tRrFhHHbDVw4SweRBuMjSVQhLdcwdzgVsPCZ7vp91zPOlcYS16DiGTUOY
QKLKBRIftAmmlYnoSyIBxtamF6hLoKzvwK4QKAH6C5hnABxLc9nNh2Jttyjm
qQhQuynMKWkNOx3sU/vsTtUTVRBbY4w6tUqq8yi/ms+iHAVHvuQT5Vi3cdxR
hmqSG0QtpsF4AnZRa+iS4wMmrNwVJf5mV2oIbN87T0RfmzwNz/HtYp9zaRjk
60dQJWaZOhvoRQoTU3HRoeycI7DC58ek9RW4y8wIxCYYZ4mB1+ZnCHwrPms8
pKmVjZ1L3jhIJDd1Jbqnbt7U5aZsF7bEQRGG3GyV4heIZsWgaYwB/tZo5u3i
lluUXWS7uNIz6anHre3We8fsIpqI2oHIMiDLnGcGYEFgFRsMQBB8Tyb+YEDJ
lrqOOc4nhgQUoR/KOYvdwmjB8tFu/w5kW2Zh2sjmTqdDajdY12jApr5xmlgh
q8yh5qCz01m6IIy7ova1TFjXBDU1OihLmGTsOK7D7u0uW45PKE4C9/4TZZJz
6NU2wQSpGapFbSVCiYLIOLBLTp0tPINgEXNP2ljHZRaWmfQHbA/gGhi9EuIa
cKQvr0xkfbNlI3t4y6/VKjZyW7WKdThXszX9wU9eC4AFdh0EEthYDNa1GRg7
MyAtGsA87PRwfTTPZPOzMOzaLDTYZRuMrxazHgJ5rlIxAMGARgN2DzCCXNn8
rNScVuC6jGMwSjJeQfDNRau0mrXeQmCLRoo3iNa3NMtZbgE+lEYzwkaIY8bM
OEeR4u0sNE0rULM0DuN0Um5jVmrAHeW39MEs2pZ8tH+RsZTMj4+YvyrniqHX
MrhoZrkLViZJ5OIjmXuMqgpamqopBiJrRzKG/tNMY814mDnk7zhzmENaUIre
KBfOd5sTf6ix8IjGETMtElyUdQSsJHYlNmbNSJI4+YRCW5BaNX/QnAKreaB5
72G14K0Si6LZ5xaL5ZE+qVh8ZpnIsd9AJj6rQCyL/5JMnPIItlPV+T6O7K6e
SXYWPgWGAjAjXsopbBXx9uqGCFMyDfd1MZehldKlnaOAM6PRF5jl8OJxFPzN
7uLiXrXyZKbV7SMM1UReBbgFiTHKz5nG7XLsOVJzZbfoJgEaVd5VY+5LD+dO
DkNoCG7QUHrvclA95wkwJd+RzqIcP98EaBwvpPFMhNAmpFjEbAx2kT1TzMMC
gQpYzGuKyeA2xFYmGcVBFDDAbr9MA12iDZYW0lnyxMIAQxadV0FwXJXXFDIr
wuCdApdJXc9g5roCQhZ2xWkf3c949w23oUgbzI61dQwb93too7MqOee0QYDb
FqRfddExUgVosGPKcajd+GjIsZRi9EerkyUmL0RdBlg9KlpFdN3qkbP3cq3T
fLO13lNGd2+t243+3loQ7PCthWE9vrWNrMsnxYWdjGLDo7nWMN/ysB06pPf0
p/EZyd0j/v3InuNQ1czjxVil6YpZIhO4MRYmEUfbqADULcCZTx1xc0P1lGbj
KhJvLutZujeXnE6+LCb6ssV7ZQVtX+TbNDhY2e5VaSsEsFE4SovAqjDKuOEl
DvYEzPdt/j0I5pY45MIAs81SBFjF3iPv+yCAONOsX5zvIPh+l2wGJdo5ug8S
WykUl0lFoLWlIQ9I+RmE4Rew/qi/t/78ArwkBn7Ezy/OL+6GP/c2bdjwA8PU
07ulQgHZ6lyWqKlyZhdT3a1LCUL16z++GyZPKt8q6QqmZ3mgfEP+ev1AZWBL
IxEW14TFyoEsRaVRGgdqF3mKznqS1tJz2zBr6SnjAMPURb4QbcxFBBFYFlj6
UEppDdvQB+BdQPZJlE8ZLtrk9tL34DF9uUxaHr49blWCytZlc3vD8ZZxhov8
8i0d2tABrAj7tJ31bZ9u3/J957bv3aoIrscM1eGDOpRar2pqvm/OJgtwEzaZ
tsgGaLBSjkiCOB+OviYuSODBFVtyMkQnE4siMJdNu7gyjKMxejQ2g45p7nIP
2q3vfYCtrOjLfh3SpzSX/6LlbFT8QjuA2c00re7T2EFsYjK7BZCNRuqusrib
28wKTe14GqRLFS6d9fO0lnvbK7j3MSOVE5gYqRb5SgxUy+lJeC5nI+GxmnyE
F/VcI7zK/cxI9M/2j49NIC4G8O2M/kTXkaJPch7h9d4CXJXcdbwIQN/iZAZB
lrDnQQofsfkcxVbRx+XinM7SvjZl3gokegaJUzULpaco3t6+frAn2vc6FHMX
iFHUBN+2RfvsVafXhP2BooqggoiZSjxQVherl6oUNBYXVZqXkadaAYs641NH
gAlawuD1+ZH7jbDjExG4Fb738kWBy8rzNltZOnK/Mei4pq87jKcl1OxJnhp+
FpGCwZwxWMK01+TGlpMoRQhoynYtuuA6RC5LF7azG7MmAs7FzgYblT15LpiC
WDeYBqGkmNqW433OErHahNYJkrSBG2DtHG392l2sekmbCe+ORTtPQoCPTokV
3olk4r2JxDMFKtGdahHxhxTE3tl/eKf/7b07h1/d2du+8+3XeVkouVQmClod
GtuChlLQAOSRX/rPv4v//Z//JOe0hzu2pkyNy2QkHXss1T1zrTtMOda8mKN6
eQGkn5F1KZeo4ZlJ2nulKkJKJhDGaaIwJaHL5YlUYE5pD4lBzHe/c13gffRO
tGpomCqkhnFawnWf4EbWZa5V3IVOfD5lWh+Dt7G6xT1s8WB1C56JOw+2sd3D
29oVM/b4Efg4iLeOBRbyQ7DqKa4PRjcZ54Ot/YcLtstFpEuWCtVJXtliICrA
RxUt5twUDdrS0ZutotyUl5fS7ExjPwvj5nzHPAYTd/pcb475Eq4DeNkf8K4K
/Lk3II4MbkegyKU0Sv4gf7Nvd4drm+cl08bRBu/k5vtwxDtvoqYKi5JVgueN
uqBGWmMlZRcsFm4Z44mZrqAKYFig0AYvEcQnJqrZ4ZEMNW4a5/n6OrIVDTH5
7nVxE4OnVT3fBSBMvtCmiBXgwaAGKfu2lrPmnWwD4rSKKr61dYKexA0JhfxH
ZGYySEy20ZSLcLFlLn5yhGqcZFFkpfJ2O29KpD+ZVnA6BUICJDxQumttTrMi
S05SNX97eklz3vhxFMdP5ePh3bt3vTUgbCvv8WU3PzZE1pHqXrEOP5//XpHm
49Phr8iWWykrv9sj36OI03UhY1VpMHs0pR1m3QB/aaPl3zuFrPGf3UGtcKrC
wL0PYuDe/2MG7jUwsG7lmrdXTS1O1ZydNQunKSsx9XfMV/R4cNNOY0gUJAMK
JGpd+cTPBgjl9f62xI9hvrnYfttbjdzexyO398mQa9o8XoL422J+GZv8yOa/
leO3Y7RathuLxWg1rTPYRpHPwZs+n8hoYGpfCw8lle/MiVeTHsOzPrzstrFn
f9A1u9n9QYeWBXq9l7/eG3S6+VFE9naAatpG5P6I3EVe1C1CdOxxg/FWo0DR
KfZxsY+LfRrMAmOzZgabVhsNzhXlLWoNMULRnj1rQKyl/ECFh7dKywZj7W0+
lpGDKqYgBTr4m7KLBblgtKVfHcQ0W+kiknwEJBXb/OanSRAqevfdijGrrmC1
yZsL6PkWBbiwIYxbDbGiYTNut46ws+kIO+tHODMcQN7Br3vwzilvCbLjWslk
HGSqnFjYdK0th7nKLvb5uYiULAWlm+l0CPjB2piPSkujavYkMLvD8fAKNwHD
Rcm3N84f1hNkM3vmvnADS0EA+9BmuxOIPYv5uHYeo9uc34JSMzZY4BpdbLh8
1jJ3gFdngAE/xShO8LaGagRVisR5+/EIDFIq/kyc+AUmDUymbx4pWXqISYaI
45ZNf+oJ9OXU+MdtM2LCF723IpV7+bSa4/1F9LlF7vFxoF6Ka0olxCbHyolk
8O2vLwu4d77aeXzn62/yN7aodaYSlEIt6qnKZj4Q3H/+vQRYPuZ8w+UnAHxn
9NVlCa4a3RnCf/4lvtnDekiT/yo2r5H+1/eOjo4ORPvu1vVoNPL/0FmCew2h
0N1LC9eypYqvBuVM6bjp5V2OmvxA4zakrnBXl+Fe5lDgqTJzBl+Tx9Q2G1Kf
qpJqYP+cDw+2S3wQdy9LcC/pYyEJxIDt7Qfb4uxVf/+wgbsF3HuVeavBvfeh
UHkfIb+M7mbLnjilmwBM0U/D1SH2lIRuqF/qmqMTDdd9lI5r3Hr9BJiCJ6sh
tWvXhlxg57cdc6xa5kf4dEp3M+RVS1SxRGX4zs3uX7M4VUAq5V5p88CnZfkz
Dk1HG6oHq01qqjkfU0V0n6ajdqiFDg+NZBByGV5GWff64JzDLVFB2IAeDrCM
frAeicotKHgijfZDE4U2IVzYsWR5NFi36EwAtpblcfNsd+7GrGI07eaVziOa
VBMfDmC4uESxMhZamDad6KMdg2rf5jYGUHFxSenwfZWjvMrSqRpY4sz9H8T+
akHcPt87A5POhY2kAX4xVzW44B7kNXKlS3DI+RjGsHiqa2QWrf/TGXxOtL3a
Jo1pqsDvxiDMv5IgIWOFBUN0uQAbczo2BY90/YzAo7B0HQH7Uyg4UzxsmZSu
+qkjyMWQ5yjpAfS0dZkGCU7dUR8WE6ovjKPSnTh0Q4hxNDDhyTlRSmbTMSwp
5nJBJZIjsCkBC1kYx+/QuUmX79PkKbPbYljHyUe2+Ih2pWoRT8qSu2JvaiFs
6ZC8TtVMU41kzT/BU2H2LpplxaJ9jpy3KaKOPBlRxcBE8SVYdATMHm71A3v0
7DYDiHw2jjv4Z176gizI0PD6zUWuNeekNKAzb96SH21EYAlZMk/5/RQZVY4Z
VzlIe8VorISvMBk9LClnPoy582npphAw7SCifglSKHV68uMZ3QwS6/SUbAa8
eHNRjFEgXXj515RBMLih+1SCqdEA0mFsNFdLdYrmM1dyL6FOVx4kvplYi157
uGDk8f0SWWyz7PFCPMNIix363bQnw1XDNvYrdQSo4ASTVlYPe1F5UnF3UKdE
XXSl6/NcIXgzbon2McuA1tlUmYWJd9DA+s2TIE1B++iSJhQSLpkprDwVFEqf
RdUaaZJBXCJ6nQLdWsoCsc4rezc5fkb21dJs2ADk2TcQh5YWD+R205Samdls
UUW0Sjej2NLNGiHVQLIkgSXkPkbJyum0CnAsv5CBbwxTdY3PLaG36PI1QSBc
xV0PdINPac2qLYv6lnUR57rAPi4qv5sMtYixeB/vY8M6eJPgwciVeGGP0WYz
vFzYhs0LWHIjP1TFMl5chtITBzFfICXmdO1aaTVZ8nSItdbBwbrY8aKw2Lw8
Yq19oM29C/Wly8wNjRPbeeCYdKhUZKaLNjbBMGegJQss1qIVXpZuQplinjQJ
9DujyRKr7tH28HVvee3tCHFhT8unC2F6uPlVXMdgDld4JcKxO24U0ulopcpe
FSGP6gv6OuZLYgRVWqPzgWrEu5gNvgsuvxAKgYu7QBd3wul7mBacTFpxcauc
dqOwOUOxzY1dIFsrE2BOcTOf3YW2BON9e8E0MBUMdTtqqC0SznSrIBvvUKG7
AhQbrg/jDK/NXJTOaNCGA5NepBMbr+LkewLB97k/TOI5MFPTlcn5FgcD6VBc
84Kv9nlJDtJEggtAJ0ZoMNyc3XzXxMXmnS5z/YK8Whh5Zq7BAlmYq6EwCBWE
vj6+ZQSEDLMJEoh3b9qlgEOtTq+2N9MB+fIVWpy5kWsZgo/nL4wWM+Wa1C/E
OzUxHZ3EIWt1rq7lSxXbALhbcntjf9GhpHH5fg9TZW7PoWDl5FUAfr/yJlEc
xqCmNkt0ASIAWrnomYjrDHRbtTsbzyjeRGpAuHIWmJn142n+1gDWCLiDIo0G
MwBBxfu+UBboQLC9vHNJuzGATuJZrPFaFvSjf5Zeaft8Ah5juHDNJaluIbl4
fJ7Cwah0D6qwl6YW9H3Q9apbWNQfMAvz1Hs8wrU703liseRxpDEVF3AFKxuS
/KJAIL0IKOZo8mC6rsz1UAXNqVbhqNBSkiKDtNFzTTcw5i3oCh80OewVXuTH
kho5IUr0fSxXfJjiGGxT+W2HzBcmLvnaPXMHBV1UmMdqKSyLWA3k93JFwdPk
AkULWML3R3Eqd4l5aAgxvUT+L1tVvJVnGISox1Um8m1r7Ol9yYervmQVYNtu
eTEkXaNiYFwDaWUv3zqB7mze6/hAi3Zhc01rPBq3wDlnUz2SV3F+qSStomQk
Vt0A/P49XRvbP+kvqQImwukmnCNyEk5AxOAtNaWEib3QlDiWmksdyhXYRmPo
HwdIG/9xANHGATqlEcSpGoP04C0531nZmM/nvUBGkiwB3yFCuSe+OZ9cmMrf
vWu0CU86u45TAN51dpfcH8dB65Np/AY4QvwGYPFlXnB4jv8QAXw9yM8YOc6p
vXUIP1QuvHKc/XhqruDZFW1ww1TH4St68TghcrrvoXSGyh9TO+dmlwNt5T9u
0W5F6339NqmhitSI1lRaWdClo3gD5CZQcy4q1Nl4jEVs6CQNF5R56ftyKk7B
7sHfP2QhMBCP63iTd/jiT3iLo3jhnSh8wquqM3EOMybh6YVM3kGITWe9JnLK
b+ABQv54quMIXvxITja8+j7WmfN/2lyr7e5iAAA=

-->

</rfc>
