<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-dispatch-mime-protobuf-06" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title>Media Type Registration for Protocol Buffers</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-dispatch-mime-protobuf-06"/>
    <author initials="M." surname="Kucherawy" fullname="Murray S. Kucherawy" role="editor">
      <organization/>
      <address>
        <email>superuser@gmail.com</email>
      </address>
    </author>
    <author initials="W." surname="Kumari" fullname="Warren Kumari">
      <organization>Google</organization>
      <address>
        <email>warren@kumari.net</email>
      </address>
    </author>
    <author initials="R." surname="Sloan" fullname="Rob Sloan">
      <organization>Google</organization>
      <address>
        <email>rmsj@google.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="20"/>
    <area>ART</area>
    <workgroup>DISPATCH</workgroup>
    <keyword>MIME</keyword>
    <keyword>protobuf</keyword>
    <keyword>media type</keyword>
    <keyword>application</keyword>
    <abstract>
      <?line 120?>

<t>This document registers media types for Protocol Buffers, a common extensible mechanism for serializing structured data.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://github.com/wkumari/draft-murray-dispatch-mime-protobuf"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-dispatch-mime-protobuf/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        DISPATCH Working Group mailing list (<eref target="mailto:dispatch@ietf.org"/>),
        which is archived at <eref target="https://www.ietf.org/mailman/listinfo/dispatch"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/dispatch/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com//wkumari/draft-murray-dispatch-mime-protobuf"/>.</t>
    </note>
  </front>
  <middle>
    <?line 124?>

<section anchor="intro">
      <name>Introduction</name>
      <t>Protocol Buffers ("protobufs") were introduced in 2008 as a free, open source, platform-independent mechanism for transport and storage of structured data: their use has become
increasingly common and Protobuf implementations exist in many languages (C++, C#, Dart, Go, Java, Kotlin, Objective-C, Python, JavaScript, Ruby, Swift, and perhaps others). See <xref target="Protobuf"/> for more information.</t>
      <t>Protobuf consists of an interface definition language ("IDL"), wire encoding formats, and language-specific implementations (typically involving a generated API) so that clients and servers can be easily deployed using a common schema. Protobuf supports two wire formats for interchange: <xref target="Binary"/>, which is optimized for wire efficiency, and <xref target="ProtoJSON"/>, which maps the Protobuf schema onto a JSON structure.</t>
      <t>Serialized objects are occasionally transported within media that make use of media types (see <xref target="RFC2045"/> et seq) to identify payloads. Accordingly,
current and historical media types used for this purpose would benefit from registration. This document requests those registrations of IANA.</t>
    </section>
    <section anchor="key-words">
      <name>Key Words</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document
are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
    </section>
    <section anchor="description">
      <name>Payload Description</name>
      <t>These media types are used in the transport of serialized objects only.  The IDL and object definitions, if transported, would be used with any appropriate text media type.
In the three figures below, only the third of these would ever be used with these media types (a JSON example is depicted).</t>
      <t>An example use of the IDL to specify a "Person" object:</t>
      <artwork><![CDATA[
edition = "2023";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}
]]></artwork>
      <t>An example of python code that uses code generated from the IDL definition above to create an instance of a "Person" object:</t>
      <sourcecode type="python"><![CDATA[
person = Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
]]></sourcecode>
      <t>An example of the above instance expressed in JSON:</t>
      <artwork><![CDATA[
{
  "name": "John Doe",
  "id": 1234,
  "email": "jdoe@example.com"
}
]]></artwork>
    </section>
    <section anchor="encoding">
      <name>Encoding Considerations</name>
      <t>Protobuf supports the <xref target="Binary"/> and <xref target="ProtoJSON"/> formats for interchange, both of which are platform-independent.
For binary forms that need to transit non-binary transports, a base64 encoding (e.g., <xref target="RFC4648"/>) is recommended.</t>
      <t>The media type includes an optional "encoding" parameter indicating which encoding format is to be used with that particular payload.  This is included for future extensibility. Valid values for this parameter are "binary" and "json", and other values MUST be treated as an error.  See <xref target="iana"/> for the defaults for each of the two registered media types. Using "binary" for the JSON type or "json" for the binary type MUST be treated as an error.</t>
    </section>
    <section anchor="versions">
      <name>Versions</name>
      <t><xref target="Proto2"/> was the first public version of the Protobuf schema language, and <xref target="Proto3"/> and <xref target="Edition2023"/> came later, with the last of these being current at the time of writing. Future editions of the IDL are expected.</t>
      <t>These versions refer to evolutions of the schema of the IDL, not the wire format. Accordingly, a serialized object generated by any of these is compatible with any other. The media type registrations in <xref target="iana"/> include support for versioning of the wire format, should it ever change, but do not refer to the IDL, which can evolve independently.</t>
      <t>Note that there may be semantic changes implicit in the IDL version which can affect the interpretation of otherwise compatible bits on the wire. For example, in Proto2, unknown values of an enumeration were interpreted as invalid, whereas in Proto3 they are retained.</t>
      <t>Clients MUST reject payloads with an unsupported version number.</t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>The payload for these media types contain no directly executable code. While it is common for a protobuf definition to be used as input to a code generator which then produces something executable, that applies to the schema language, not serializations.</t>
      <t>Protobuf provides no security, privacy, integrity, or compression services: clients or servers for which this is a concern should avail themselves of solutions that provide such capabilities (e.g. <xref target="RFC8446"/>). Implementations should be careful when processing Protobuf like any binary format: a malformed request to a protobuf server could be crafted to, for example, allocate a very large amount of memory, potentially impacting other operations on that server.</t>
      <t>Protobuf supports embedded content in <tt>string</tt> or <tt>bytes</tt> fields: in both cases, applications should ensure that the format of the content is precisely as expected. Note that UTF-8 validation of <tt>string</tt> fields is optional (see <xref target="ProtoFeatures"/>) and a manual well-formedness check may be necessary. Further, handling Unicode text generally can be quite complex with problems discussed, for example, in <xref target="UniChars"/> and <xref target="RFC8264"/>; so it is best to rely on well-supported internationalization libraries whenever possible.</t>
      <t>In order to safely use Protobuf serializations on the web, it is important to ensure that they are not interpreted as another document type, such as JavaScript: we recommend base64-encoding binary Protobuf responses whenever possible to prevent parsing as active content. Servers should generally follow the advice of <xref target="RFC9205"/> to prevent content sniffing for all binary formats.</t>
      <t>Further, when using JSON serializations it is important that it is clear to browsers that the content is pure JSON, so that they can inhibit Cross-Site Script Inclusion or side-channel attacks using techniques such as Cross-Origin Read Blocking (<xref target="CORB"/>). Per <xref target="RFC6839"/>, pure JSON content is indicated by a <tt>+json</tt> subtype suffix (see also <xref target="MIMESNIFF"/>); so when serializing Protobuf content to JSON, users MUST use the <tt>application/protobuf+json</tt> media type. When using JSON, <tt>charset</tt> can prevent certain encoding confusion attacks so users should specify it for all JSON encodings.</t>
      <t>In the <xref target="Any"/> type there is technically a link, which was intended to be dereferenced to obtain schemas for a given type; however this is not supported by widely used Protobuf implementations.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>As per the process defined in <xref target="RFC6838"/>, this document requests the registration of <tt>application/protobuf</tt> and <tt>application/protobuf+json</tt> as media types for Protobuf, and the notation of <tt>application/x-protobuf</tt>, <tt>application/x-protobuffer</tt>, and <tt>application/x-protobuf+json</tt> as deprecated aliases:</t>
      <section anchor="registration-for-the-applicationprotobuf-media-type">
        <name>Registration for the "application/protobuf" Media Type</name>
        <t>Type name: application</t>
        <t>Subtype name: protobuf</t>
        <t>Required parameters: none</t>
        <t>Optional parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>encoding</tt>, which indicates the type of Protobuf encoding and is "binary" by default for <tt>application/protobuf</tt>, indicating the <xref target="Binary"/> format. At the time of writing, no other encoding can be used for <tt>application/protobuf</tt> so this parameter is for extensibility.</t>
          </li>
          <li>
            <t><tt>version</tt>, which indicates the version of the wire encoding specification (not the schema language), with default <tt>1</tt>. At the time of writing, no protobuf wire encodings are versioned so this parameter is for extensibility. Unversioned wire encodings should be treated as having version <tt>1</tt>.</t>
          </li>
        </ul>
        <t>Encoding considerations: binary</t>
        <t>Security considerations: see <xref target="security"/></t>
        <t>Interoperability considerations: The Protobuf specification includes versioning provisions to ensure backward compatibility when encountering payloads with unknown properties.</t>
        <t>Published specification: <xref target="Protobuf"/></t>
        <t>Applications that use this media type: Any application with a need to exchange or store structured objects across platforms or implementations.</t>
        <t>Fragment identifier considerations: None.</t>
        <t>Additional information:</t>
        <ul spacing="normal">
          <li>
            <t>Deprecated alias names for this type: <tt>application/x-protobuf</tt>, <tt>application/x-protobuffer</tt></t>
          </li>
          <li>
            <t>Magic number(s):</t>
          </li>
          <li>
            <t>File extension(s):</t>
          </li>
          <li>
            <t>Macintosh file type code(s):</t>
          </li>
        </ul>
        <t>Person &amp; email address to contact for further information: Protobuf &lt;protobuf-team@google.com&gt;</t>
        <t>Intended usage: COMMON</t>
        <t>Restrictions on usage: None</t>
        <t>Author: Rob Sloan &lt;rmsj@google.com&gt;, Protobuf Team &lt;protobuf-team@google.com&gt;</t>
        <t>Change controller: IETF</t>
        <t>Provisional registration? (standards tree only): No</t>
      </section>
      <section anchor="registration-for-applicationprotobufjson-media-type">
        <name>Registration for "application/protobuf+json" Media Type</name>
        <t>Type name: application</t>
        <t>Subtype name: protobuf+json</t>
        <t>Required parameters: <tt>charset</tt>, which must be set to <tt>utf-8</tt> (case-insensitive)</t>
        <t>Optional parameters:</t>
        <ul spacing="normal">
          <li>
            <t><tt>encoding</tt>, which indicates the type of Protobuf encoding and is <tt>json</tt> by default for <tt>application/protobuf+json</tt>, indicating the <xref target="ProtoJSON"/> format. At the time of writing, no other encoding can be used for <tt>application/protobuf+json</tt> so this parameter is for extensibility.</t>
          </li>
          <li>
            <t><tt>version</tt>, which indicates the version of the wire encoding specification (not the schema language), with default <tt>1</tt>. At the time of writing, no protobuf wire encodings are versioned so this parameter is for extensibility. Unversioned wire encodings should be treated as having version <tt>1</tt>.</t>
          </li>
        </ul>
        <t>Encoding considerations: Same as encoding considerations of <tt>application/json</tt> as specified in <xref target="RFC8259"/>, Section 11.</t>
        <t>Security considerations: see <xref target="security"/></t>
        <t>Interoperability considerations: The Protobuf specification includes versioning provisions to ensure backward compatibility when encountering payloads with unknown properties.</t>
        <t>Published specification: <xref target="Protobuf"/></t>
        <t>Applications that use this media type: Any application with a need to exchange or store structured objects across platforms or implementations.</t>
        <t>Fragment identifier considerations: None.</t>
        <t>Additional information:</t>
        <artwork><![CDATA[
 Deprecated alias names for this type: x-protobuf+json
 Magic number(s):
 File extension(s):
 Macintosh file type code(s):
]]></artwork>
        <t>Person &amp; email address to contact for further information: Protobuf &lt;protobuf-team@google.com&gt;</t>
        <t>Intended usage: COMMON</t>
        <t>Restrictions on usage: None</t>
        <t>Author: Rob Sloan &lt;rmsj@google.com&gt;. Protobuf Team &lt;protobuf-team@google.com&gt;</t>
        <t>Change controller: IETF</t>
        <t>Provisional registration? (standards tree only): No</t>
      </section>
    </section>
    <section anchor="contact">
      <name>Contact</name>
      <t>Please contact protobuf-team@google.com for requests to adjust this specification. Issues may be raised at https://github.com/protocolbuffers/protobuf.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2045">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
            <date month="November" year="1996"/>
            <abstract>
              <t>This initial document specifies the various headers used to describe the structure of MIME messages. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2045"/>
          <seriesInfo name="DOI" value="10.17487/RFC2045"/>
        </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="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC6839">
          <front>
            <title>Additional Media Type Structured Syntax Suffixes</title>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>A content media type name sometimes includes partitioned meta- information distinguished by a structured syntax to permit noting an attribute of the media as a suffix to the name. This document defines several structured syntax suffixes for use with media type registrations. In particular, it defines and registers the "+json", "+ber", "+der", "+fastinfoset", "+wbxml" and "+zip" structured syntax suffixes, and provides a media type structured syntax suffix registration form for the "+xml" structured syntax suffix. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6839"/>
          <seriesInfo name="DOI" value="10.17487/RFC6839"/>
        </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>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="Protobuf" target="https://protobuf.dev/">
          <front>
            <title>Protocol Buffers</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9205">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
              <t>This document obsoletes RFC 3205.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="56"/>
          <seriesInfo name="RFC" value="9205"/>
          <seriesInfo name="DOI" value="10.17487/RFC9205"/>
        </reference>
        <reference anchor="RFC8264">
          <front>
            <title>PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="M. Blanchet" initials="M." surname="Blanchet"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>Application protocols using Unicode code points in protocol strings need to properly handle such strings in order to enforce internationalization rules for strings placed in various protocol slots (such as addresses and identifiers) and to perform valid comparison operations (e.g., for purposes of authentication or authorization). This document defines a framework enabling application protocols to perform the preparation, enforcement, and comparison of internationalized strings ("PRECIS") in a way that depends on the properties of Unicode code points and thus is more agile with respect to versions of Unicode. As a result, this framework provides a more sustainable approach to the handling of internationalized strings than the previous framework, known as Stringprep (RFC 3454). This document obsoletes RFC 7564.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8264"/>
          <seriesInfo name="DOI" value="10.17487/RFC8264"/>
        </reference>
        <reference anchor="CORB" target="https://www.chromium.org/Home/chromium-security/corb-for-developers">
          <front>
            <title>Cross-Origin Read Blocking for Web Developers</title>
            <author>
              <organization>Chromium</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="MIMESNIFF" target="https://mimesniff.spec.whatwg.org/#mime-type-groups">
          <front>
            <title>MIME Sniffing: Living Standard</title>
            <author>
              <organization>WHATWG</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Any" target="https://github.com/protocolbuffers/protobuf/blob/main/src/google/protobuf/any.proto">
          <front>
            <title>any.proto Schema Definition</title>
            <author>
              <organization>Protobuf</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Binary" target="https://protobuf.dev/programming-guides/encoding">
          <front>
            <title>Protobuf Binary Wire Encoding Spec</title>
            <author>
              <organization>Protobuf</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ProtoJSON" target="https://protobuf.dev/programming-guides/json">
          <front>
            <title>Protobuf JSON Wire Encoding Spec</title>
            <author>
              <organization>Protobuf</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Proto2" target="https://protobuf.dev/reference/protobuf/proto2-spec">
          <front>
            <title>Proto2 Schema Language Specification</title>
            <author>
              <organization>Protobuf</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Proto3" target="https://protobuf.dev/reference/protobuf/proto3-spec">
          <front>
            <title>Proto3 Schema Language Specification</title>
            <author>
              <organization>Protobuf</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Edition2023" target="https://protobuf.dev/reference/protobuf/edition-2023-spec">
          <front>
            <title>Proto Edition 2023 Schema Language Specification</title>
            <author>
              <organization>Protobuf</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ProtoFeatures" target="https://protobuf.dev/editions/features/">
          <front>
            <title>Protobuf Feature Settings for Editions</title>
            <author>
              <organization>Protobuf</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="UniChars" target="https://datatracker.ietf.org/doc/draft-bray-unichars/">
          <front>
            <title>Unicode Character Repertoire Subsets</title>
            <author>
              <organization>IETF</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 304?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Orie Steele provided valuable feedback to this work.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
E5QpsomW8wcXEJr+26Zh9r8SBqPVCjYAAA==

-->

</rfc>
