<?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-vasters-json-structure-core-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title>JSON Structure: Core</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-core-02"/>
    <author fullname="Clemens Vasters">
      <organization>Microsoft Corporation</organization>
      <address>
        <email>clemensv@microsoft.com</email>
      </address>
    </author>
    <date year="2025" month="December" day="04"/>
    <area>Web and Internet Transport</area>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 66?>

<t>This document specifies JSON Structure, a data structure definition language
that enforces strict typing, modularity, and determinism. JSON Structure
describes JSON-encoded data such that mapping to and from programming languages
and databases and other data formats is straightforward.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://json-structure.github.io/core/draft-vasters-json-structure-core.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vasters-json-structure-core/"/>.
      </t>
      <t>
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/json-structure/core"/>.</t>
    </note>
  </front>
  <middle>
    <?line 73?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies <em>JSON Structure</em>, a data structure definition language
that enforces strict typing, modularity, and determinism. <em>JSON Structure</em>
documents (schemas) describe JSON-encoded data such that mapping JSON encoded
data to and from programming languages and databases and other data formats
becomes straightforward.</t>
      <t><em>JSON Structure</em> is extensible, allowing additional features to be layered on
top. The core language is a data-definition language.</t>
      <t>The "Validation" and "Conditional Composition" extension specifications add
rules that allow for complex pattern matching of <em>JSON Structure</em> documents
against JSON data for document validation purposes.</t>
      <t>Complementing <em>JSON Structure</em> are a set of extension specifications that extend
the core schema language with additional, <bcp14>OPTIONAL</bcp14> features:</t>
      <ul spacing="normal">
        <li>
          <t><em>JSON Structure: Import</em> <xref target="JSTRUCT-IMPORT"/>: Defines a mechanism for importing
external schemas and definitions into a schema document.</t>
        </li>
        <li>
          <t><em>JSON Structure: Alternate Names and Descriptions</em> <xref target="JSTRUCT-ALTNAMES"/>:
Provides a mechanism for declaring multilingual descriptions, and alternate
names and symbols for types and properties.</t>
        </li>
        <li>
          <t><em>JSON Structure: Symbols, Scientific Units, and Currencies</em> <xref target="JSTRUCT-UNITS"/>:
Defines annotation keywords for specifying symbols, scientific units, and
currency codes complementing type information.</t>
        </li>
        <li>
          <t><em>JSON Structure: Validation</em> <xref target="JSTRUCT-VALIDATION"/>: Specifies extensions to
the core schema language for declaring validation rules for JSON data that
have no structural impact on the schema.</t>
        </li>
        <li>
          <t><em>JSON Structure: Composition</em> <xref target="JSTRUCT-COMPOSITION"/>: Defines a set of
conditional composition rules for evaluating schemas.</t>
        </li>
      </ul>
      <t>These extension specifications are enabled by the extensibility
(<xref target="extensions-and-add-ins"/>) features and can be applied to meta-schemas,
schemas, and JSON document instances.</t>
    </section>
    <section anchor="conventions">
      <name>Conventions</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?>

</section>
    <section anchor="json-structure-core-specification">
      <name>JSON Structure Core Specification</name>
      <section anchor="schema-elements">
        <name>Schema Elements</name>
        <section anchor="schema">
          <name>Schema</name>
          <t>A "schema" is a JSON object that describes, constrains, and interprets a JSON
node.</t>
          <t>This schema constrains a JSON node to be of type <tt>string</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "string"
}
]]></sourcecode>
          <t>In the case of a schema that references a compound type (<tt>object</tt>, <tt>set</tt>,
<tt>array</tt>, <tt>map</tt>, <tt>tuple</tt>, <tt>choice</tt>), the schema further describes the structure
of the compound type. Schemas can be placed into a namespace (<xref target="namespaces"/>)
for reuse in other schemas.</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  }
}
]]></sourcecode>
          <t>All schemas have an associated name that serves as an identifier. In the example
above where the schema is a root object, the name is the value of the <tt>name</tt>
property.</t>
          <t>When the schema is placed into a namespace (<xref target="namespaces"/>) or embedded into a
properties (<xref target="properties-keyword"/>) section of an <tt>object</tt> type, the name is the
key under which the schema is stored.</t>
          <t>Further rules for schemas are defined in <xref target="type-system-rules"/>.</t>
          <t>A "schema document" is a schema that represents the root of a schema hierarchy
and is the container format in which schemas are stored on disk or exchanged. A
schema document <bcp14>MAY</bcp14> contain multiple type declarations and namespaces. The
structure of schema documents is defined in <xref target="document-structure"/>.</t>
          <t>JSON Structure is extensible. All keywords that are not explicitly defined in
this document <bcp14>MAY</bcp14> be used for custom annotations and extensions. This also
applies to keywords that begin with the <tt>$</tt> character. A complete list of
reserved keywords is provided in <xref target="reserved-keywords"/>.</t>
          <t>The semantics of keywords defined in this document <bcp14>MAY</bcp14> be expanded by extension
specifications, but the core semantics of the keywords defined in this document
<bcp14>MUST NOT</bcp14> be altered.</t>
          <t>Be mindful that the use of custom keywords and annotations might conflict with
future versions of this specification or other extensions and that the authors
of this specification will not go out of their way to avoid such conflicts.</t>
          <t><xref target="extensions-and-add-ins"/> details the extensibility features.</t>
          <t>Formally, a schema is a constrained non-schema (<xref target="non-schema"/>) that requires a
type (<xref target="type-keyword"/>) keyword or a <tt>$ref</tt> (<xref target="ref-keyword"/>) keyword to be a
schema.</t>
        </section>
        <section anchor="non-schema">
          <name>Non-Schema</name>
          <t>Non-schemas are objects that do not declare or refer to a type. The root of a
schema document (<xref target="document-structure"/>) is a non-schema unless it contains a
<tt>type</tt> keyword.</t>
          <t>A namespace is a non-schema that contains type declarations and other
namespaces.</t>
        </section>
        <section anchor="meta-schemas">
          <name>Meta-Schemas</name>
          <t>A meta-schema is a schema document that defines the structure and constraints of
another schema document. Meta-schemas are used to validate schema documents and
to ensure that schemas are well-formed and conform to the JSON Structure
specification.</t>
          <t>The meta-schemas for JSON Structure and the extension specifications are
enumerated in the Appendix: Metaschemas (<xref target="schema"/>).</t>
          <t>Meta-schemas can extend existing meta-schemas by adding new keywords or
constraints. The <tt>$schema</tt> keyword is used to reference the meta-schema that a
schema document conforms to, the <tt>$id</tt> keyword is used to define the identifier
of the new meta-schema, and the <tt>$import</tt> keyword defined in the
<xref target="JSTRUCT-IMPORT"/> extension specification is used to import all definitions
from the foundational meta-schema.</t>
        </section>
      </section>
      <section anchor="data-types">
        <name>Data Types</name>
        <t>The data types that can be used with the <tt>type</tt> keyword are categorized into
JSON primitive types, extended types, compound types, and reusable types
<xref target="reusable-types"/>.</t>
        <t>While JSON Structure builds on the JSON data type model, it introduces a rich
set of types to represent structured data more accurately and to allow more
precise integration with common data types used in programming languages and
data formats. All these extended types have a well-defined representation in
JSON primitive types.</t>
        <section anchor="json-primitive-types">
          <name>JSON Primitive Types</name>
          <t>These types map directly to the underlying JSON representation:</t>
          <section anchor="string">
            <name><tt>string</tt></name>
            <t>A sequence of Unicode characters enclosed in double quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt> <xref section="7" sectionFormat="of" target="RFC8259"/></t>
              </li>
              <li>
                <t>Annotations: The <tt>maxLength</tt> keyword can be used on a schema with the <tt>string</tt>
type to specify the maximum length of the string. By default, the maximum
length is unlimited. The purpose of the keyword is to inform consumers of the
maximum space required to store the string.</t>
              </li>
            </ul>
          </section>
          <section anchor="number">
            <name><tt>number</tt></name>
            <t>A numeric literal without quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt> <xref section="6" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
            <t>Note that the <tt>number</tt> representation in JSON is a textual representation of a
decimal number (base-10) and therefore cannot accurately represent all possible
values of IEE754 floating-point numbers (base-2), in spite of JSON <tt>number</tt>
leaning on the IEEE754 standard as a reference for the value space.</t>
          </section>
          <section anchor="integer">
            <name><tt>integer</tt></name>
            <t>An alias for <tt>int32</tt> (<xref target="int32"/>), provided for compatibility with JSON Schema.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2³¹ to 2³¹–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="boolean">
            <name><tt>boolean</tt></name>
            <t>A literal <tt>true</tt> or <tt>false</tt> (without quotes).</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>boolean</tt> <xref section="3" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
          </section>
          <section anchor="null">
            <name><tt>null</tt></name>
            <t>A literal <tt>null</tt> (without quotes).</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>null</tt> <xref section="3" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="extended-primitive-types">
          <name>Extended Primitive Types</name>
          <t>Extended types impose additional semantic constraints on the underlying JSON
types. These types are used to represent binary data, high-precision numeric
values, date and time information, and structured data.</t>
          <t>Large integer and decimal types are used to represent high-precision numeric
values that exceed the range of IEEE 754 double-precision format, which is the
foundation for the <tt>number</tt> type in JSON. Per <xref section="6" sectionFormat="of" target="RFC8259"/>,
interoperable JSON numbers have a range of -2⁵³ to 2⁵³–1, which is less than the
range of 64-bit and 128-bit values. Therefore, the <tt>int64</tt>, <tt>uint64</tt>, <tt>int128</tt>,
<tt>uint128</tt>, and <tt>decimal</tt> types are represented as strings to preserve precision.</t>
          <t>The syntax for strings representing large integer and decimal types is based on
the <xref section="6" sectionFormat="of" target="RFC8259"/> syntax for integers and decimals:</t>
          <ul spacing="normal">
            <li>
              <t>integer = <tt>[minus] int</tt></t>
            </li>
            <li>
              <t>decimal = <tt>[minus] int frac</tt></t>
            </li>
          </ul>
          <section anchor="binary">
            <name><tt>binary</tt></name>
            <t>A binary value. The default encoding is Base64 <xref target="RFC4648"/>. The type annotation
keywords <tt>contentEncoding</tt>, <tt>contentCompression</tt>, and <tt>contentMediaType</tt> can be
used to specify the encoding, compression, and media type of the binary data.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> be an encoded binary value, with the encoding
specified in the <tt>contentEncoding</tt> keyword.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int8">
            <name><tt>int8</tt></name>
            <t>An 8-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2⁷ to 2⁷–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint8">
            <name><tt>uint8</tt></name>
            <t>An 8-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2⁸–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int16">
            <name><tt>int16</tt></name>
            <t>A 16-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2¹⁵ to 2¹⁵–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint16">
            <name><tt>uint16</tt></name>
            <t>A 16-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2¹⁶–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int32">
            <name><tt>int32</tt></name>
            <t>A 32-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2³¹ to 2³¹–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint32">
            <name><tt>uint32</tt></name>
            <t>A 32-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2³²–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int64">
            <name><tt>int64</tt></name>
            <t>A 64-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>[minus] int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 64-bit integer in the range -2⁶³ to 2⁶³–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint64">
            <name><tt>uint64</tt></name>
            <t>A 64-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 64-bit integer in the range 0 to 2⁶⁴–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int128">
            <name><tt>int128</tt></name>
            <t>A 128-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>[minus] int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 128-bit integer in the range -2¹²⁷ to
2¹²⁷–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint128">
            <name><tt>uint128</tt></name>
            <t>A 128-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 128-bit integer in the range 0 to 2¹²⁸–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="float8">
            <name><tt>float8</tt></name>
            <t>An 8-bit floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 single-precision value range limits (8 bits), which are
3 bits of significand and 4 bits of exponent, with a range of approximately
±3.4×10³.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="float">
            <name><tt>float</tt></name>
            <t>A single-precision floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 single-precision value range limits (32 bits), which
are 24 bits of significand and 8 bits of exponent, with a range of
approximately ±3.4×10³⁸.</t>
                  </li>
                </ul>
              </li>
            </ul>
            <t>IEEE754 binary32 are base-2 encoded and therefore cannot represent all decimal
numbers accurately, and vice versa. In cases where you need to encode IEEE754
values precisely, store the IEE754 binary32 value as an <tt>int32</tt> or <tt>uint32</tt>
number.</t>
          </section>
          <section anchor="double">
            <name><tt>double</tt></name>
            <t>A double-precision floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 double-precision value range limits (64 bits), which
are 53 bits of significand and 11 bits of exponent, with a range of
approximately ±1.7×10³⁰⁸.</t>
                  </li>
                </ul>
              </li>
            </ul>
            <t>IEEE754 binary64 are base-2 encoded and therefore cannot represent all decimal
numbers accurately, and vice versa. In cases where you need to encode IEEE754
values precisely, store the IEE754 binary64 value as an <tt>int64</tt> or <tt>uint64</tt>
number.</t>
          </section>
          <section anchor="decimal">
            <name><tt>decimal</tt></name>
            <t>A decimal number supporting high-precision values.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition
for the <tt>[minus] int frac</tt> syntax.</t>
                  </li>
                  <li>
                    <t>Defaults: 34 significant digits and 7 fractional digits, which is the
maximum precision supported by the IEEE 754 decimal128 format.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Annotations:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The <tt>precision</tt> keyword <bcp14>MAY</bcp14> be used to specify the total number of
significant digits.</t>
                  </li>
                  <li>
                    <t>The <tt>scale</tt> keyword <bcp14>MAY</bcp14> be used to specify the number of fractional digits.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="date">
            <name><tt>date</tt></name>
            <t>A date in YYYY-MM-DD form.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>full-date</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="datetime">
            <name><tt>datetime</tt></name>
            <t>A date and time value with time zone offset.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>date-time</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="time">
            <name><tt>time</tt></name>
            <t>A time-of-day value.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>time</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="duration">
            <name><tt>duration</tt></name>
            <t>A time duration.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>duration</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uuid">
            <name><tt>uuid</tt></name>
            <t>A universally unique identifier.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC9562"/> <tt>UUID</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uri">
            <name><tt>uri</tt></name>
            <t>A URI reference, relative or absolute.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3986"/> <tt>uri-reference</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="jsonpointer">
            <name><tt>jsonpointer</tt></name>
            <t>A JSON Pointer reference.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC6901"/> JSON Pointer format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="compound-types">
          <name>Compound Types</name>
          <t>Compound types are used to structure related data elements. JSON Structure
supports the following compound types:</t>
          <section anchor="object">
            <name><tt>object</tt></name>
            <t>The <tt>object</tt> type is used to define structured data with named properties. It's
represented as a JSON object, which is an unordered collection of key–value
pairs.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>properties</tt> attribute that defines the
properties of the object. The <tt>properties</tt> attribute <bcp14>MUST</bcp14> be a JSON object where
each key is a property name and each value is a schema definition for the
property. The object <bcp14>MUST</bcp14> contain at least one property definition.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include a <tt>required</tt> attribute that defines the required
properties of the object.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include an <tt>additionalProperties</tt> attribute that defines
whether additional properties are allowed and/or what their schema is.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "name": "Person",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"],
  "additionalProperties": false
}
]]></sourcecode>
          </section>
          <section anchor="array">
            <name><tt>array</tt></name>
            <t>An <tt>array</tt> type is used to define an ordered collection of elements. It's
represented as a JSON array, which is an ordered list of values.</t>
            <t>The <tt>items</tt> attribute of an array <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t><strong>Examples:</strong></t>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/definitions/Namespace/TypeName" } }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="set">
            <name><tt>set</tt></name>
            <t>The <tt>set</tt> type is used to define an unordered collection of unique elements.
It's represented as a JSON array where all elements are unique.</t>
            <t>The <tt>items</tt> attribute of a <tt>set</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "type": { "$ref": "#/definitions/Namespace/TypeName" } }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="map">
            <name><tt>map</tt></name>
            <t>The <tt>map</tt> type is used to define dynamic key–value pairs. It's represented as a
JSON object where the keys are strings and the values are of a specific type.</t>
            <t>Map keys <bcp14>MAY</bcp14> be any valid JSON string.</t>
            <t>The <tt>values</tt> attribute of a <tt>map</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "type": { "$ref": "#/definitions/StringType" } }
}
]]></sourcecode>
          </section>
          <section anchor="tuple">
            <name><tt>tuple</tt></name>
            <t>The <tt>tuple</tt> type is used to define an ordered collection of elements with a
specific length. It's represented as a JSON array where each element is of a
specific type.</t>
            <t>The elements are defined using a <tt>properties</tt> map as with the <tt>object</tt>
(<xref target="object"/>) type and each element is named. This permits straightforward
mapping into application constructs. All declared properties of a <tt>tuple</tt> are
implicitly <bcp14>REQUIRED</bcp14>.</t>
            <t>The order of the elements in a tuple is declared using the <tt>tuple</tt> keyword
<xref target="tuple-keyword"/>, which is <bcp14>REQUIRED</bcp14>. The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> be a JSON array
of strings, where each declared property name <bcp14>MUST</bcp14> be an element of the array.
The order of the elements in the array defines the order of the properties in
the tuple.</t>
            <t>A <tt>tuple</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "tuple",
  "name": "Person",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "tuple": ["name", "age"]
}
]]></sourcecode>
            <t>The following JSON node is an valid instance of the <tt>tuple</tt> type defined above:</t>
            <sourcecode type="json"><![CDATA[
["Alice", 42]
]]></sourcecode>
          </section>
          <section anchor="any">
            <name><tt>any</tt></name>
            <t>The <tt>any</tt> type is used to define a type that can be any JSON value, including
primitive types, compound types, and extended types.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "any"
}
]]></sourcecode>
          </section>
          <section anchor="choice">
            <name><tt>choice</tt></name>
            <t>The <tt>choice</tt> type is used to define a "discriminated union" of types. A
choice is a set of types where only one type can be selected at a time and
where the selected type is determined by the value of a selector.</t>
            <t>The <tt>choice</tt> type can declare two variants of discriminated unions that
are represented differently in JSON:</t>
            <ul spacing="normal">
              <li>
                <t><em>Tagged unions</em>: The <tt>choice</tt> type is represented as a JSON object with a
single property whose name is the selector of the type as declared in the
<tt>choices</tt> (<xref target="choices-keyword"/>) map and whose value is of the selected type.</t>
              </li>
              <li>
                <t><em>Inline unions</em>: The <tt>choice</tt> type is represented as a JSON object of the
selected type with the selector as a property of the object.</t>
              </li>
            </ul>
            <section anchor="tagged-unions">
              <name>Tagged Unions</name>
              <t>A tagged union is declared as follows:</t>
              <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
              <t>The JSON node described by the schema above is a tagged union. For the
example, the following JSON node is a valid instance of the <tt>MyChoice</tt> type:</t>
              <sourcecode type="json"><![CDATA[
{
  "string": "Hello, world!"
}
]]></sourcecode>
              <t>or:</t>
              <sourcecode type="json"><![CDATA[
{
  "int32": 42
}
]]></sourcecode>
            </section>
            <section anchor="inline-unions">
              <name>Inline Unions</name>
              <t>Inline unions require for all type choices to extend a common base type.</t>
              <t>This is expressed by using the <tt>$extends</tt> (<xref target="extends-keyword"/>) keyword in the
<tt>choice</tt> declaration. The <tt>$extends</tt> keyword <bcp14>MUST</bcp14> refer to a schema that defines
the base type and the base type <bcp14>MUST</bcp14> be abstract.</t>
              <t>If <tt>$extends</tt> is present, the <tt>selector</tt> property declares the name of the
injected property that acts as the selector for the inline union. The
type of the selector property is <tt>string</tt>. The selector property <bcp14>MAY</bcp14>
shadow a property of the base type; in this case, the base type property
<bcp14>MUST</bcp14> be of type <tt>string</tt>.</t>
              <t>The selector is defined as a property of the base type and the value of the
selector property <bcp14>MUST</bcp14> be a string that matches the name of one of the
options in the <tt>choices</tt> map.</t>
              <t>Example:</t>
              <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "type": "choice",
  "$extends": "#/definitions/Address",
  "selector": "addressType",
  "choices": {
    "StreetAddress": { "type": { "$ref": "#/definitions/StreetAddress" } },
    "PostOfficeBoxAddress": { "type": { "$ref": "#/definitions/PostOfficeBoxAddress" } }
  },
  "definitions" : {
    "Address": {
      "abstract": true,
      "type": "object",
      "properties": {
          "city": { "type": "string" },
          "state": { "type": "string" },
          "zip": { "type": "string" }
      }
    },
    "StreetAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "street": { "type": "string" }
      }
    },
    "PostOfficeBoxAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "poBox": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
              <t>The JSON node described by the schema above is an inline union. This
example shows a JSON node that is a street address:</t>
              <sourcecode type="json"><![CDATA[
{
  "addressType": "StreetAddress",
  "street": "123 Main St",
  "city": "Seattle",
  "state": "WA",
  "zip": "98101"
}
]]></sourcecode>
              <t>This example shows a JSON node that is a post office box address:</t>
              <sourcecode type="json"><![CDATA[
{
  "addressType": "PostOfficeBoxAddress",
  "poBox": "1234",
  "city": "Seattle",
  "state": "WA",
  "zip": "98101"
}
]]></sourcecode>
            </section>
          </section>
        </section>
      </section>
      <section anchor="document-structure">
        <name>Document Structure</name>
        <t>A JSON Structure document is a JSON object that contains schemas (<xref target="schema"/>)</t>
        <t>The root of a JSON Structure document <bcp14>MUST</bcp14> be a JSON object.</t>
        <t>The root object <bcp14>MUST</bcp14> contain the following <bcp14>REQUIRED</bcp14> keywords:</t>
        <ul spacing="normal">
          <li>
            <t><tt>$id</tt>: A URI that is the unique identifier for this schema document.</t>
          </li>
          <li>
            <t><tt>$schema</tt>: A URI that identifies the version and meta-schema of the JSON
Structure specification used.</t>
          </li>
          <li>
            <t><tt>name</tt>: A string that provides a name for the document. If the root object
 defines a type, the <tt>name</tt> attribute is also the name of the type.</t>
          </li>
        </ul>
        <t>The presence of both keywords identifies the document as a JSON Structure
document.</t>
        <t>The root object <bcp14>MAY</bcp14> contain the following <bcp14>OPTIONAL</bcp14> keywords:</t>
        <ul spacing="normal">
          <li>
            <t><tt>$root</tt>: A JSON Pointer that designates a reusable type as the root type for
instances.</t>
          </li>
          <li>
            <t><tt>definitions</tt>: The root of the type declaration namespace hierarchy.</t>
          </li>
          <li>
            <t><tt>type</tt>: A type declaration for the root type of the document. Mutually
exclusive with <tt>$root</tt>.</t>
          </li>
          <li>
            <t>if <tt>type</tt> is present, all annotations and constraints applicable to this
declared root type are also permitted at the root level.</t>
          </li>
        </ul>
        <section anchor="namespaces">
          <name>Namespaces</name>
          <t>A namespace is a JSON object that provides a scope for type declarations or
other namespaces. Namespaces <bcp14>MAY</bcp14> be nested within other namespaces.</t>
          <t>The <tt>definitions</tt> keyword forms the root of the namespace hierarchy for reusable
type definitions. All type declarations immediately under the <tt>definitions</tt>
keyword are in the root namespace.</t>
          <t>A <tt>type</tt> definition at the root is placed into the root namespace as if it were
a type declaration under <tt>definitions</tt>.</t>
          <t>Any object in the <tt>definitions</tt> map that is not a type declaration is a
namespace.</t>
          <t>Example with inline <tt>type</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
          <t>Example with <tt>$root</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "$root": "#/definitions/TypeName",
    "definitions": {
        "TypeName": {
            "type": "object",
            "properties": {
                "name": { "type": "string" }
            }
        }
    }
}
]]></sourcecode>
          <t>Example with the root type in a namespace:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "$root": "#/definitions/Namespace/TypeName",
    "definitions": {
        "Namespace": {
            "TypeName": {
                "name": "TypeName",
                "type": "object",
                "properties": {
                    "name": { "type": "string" }
                }
            }
        }
    }
}
]]></sourcecode>
        </section>
        <section anchor="schema-keyword">
          <name><tt>$schema</tt> Keyword</name>
          <t>The value of the <bcp14>REQUIRED</bcp14> <tt>$schema</tt> keyword <bcp14>MUST</bcp14> be an absolute URI. The keyword
has different functions in JSON Structure documents and JSON documents.</t>
          <ul spacing="normal">
            <li>
              <t>In JSON Structure schema documents, the <tt>$schema</tt> keyword references a
meta-schema that this document conforms to.</t>
            </li>
            <li>
              <t>In JSON documents, the <tt>$schema</tt> keyword references a JSON Structure schema
document that defines the structure of the JSON document.</t>
            </li>
          </ul>
          <t>The value of <tt>$schema</tt> <bcp14>MUST</bcp14> correspond to the <tt>$id</tt> of the referenced
meta-schema or schema document.</t>
          <t>The <tt>$schema</tt> keyword <bcp14>MUST</bcp14> be used at the root level of the document.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
          <t>Use of the keyword <tt>$schema</tt> does NOT import the referenced schema document such
that its types become available for use in the current document.</t>
        </section>
        <section anchor="id-keyword">
          <name><tt>$id</tt> Keyword</name>
          <t>The <bcp14>REQUIRED</bcp14> <tt>$id</tt> keyword is used to assign a unique identifier to a JSON
Structure schema document. The value of <tt>$id</tt> <bcp14>MUST</bcp14> be an absolute URI. It <bcp14>SHOULD</bcp14>
be a resolvable URI (a URL).</t>
          <t>The <tt>$id</tt> keyword is used to identify a schema document in references like
<tt>$schema</tt>.</t>
          <t>The <tt>$id</tt> keyword <bcp14>MUST</bcp14> only be used once in a document, at the root level.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
        </section>
        <section anchor="root-keyword">
          <name><tt>$root</tt> Keyword</name>
          <t>The <bcp14>OPTIONAL</bcp14> <tt>$root</tt> keyword is used to designate any reusable type defined in
the document as the root type of this schema document. The value of <tt>$root</tt> <bcp14>MUST</bcp14>
be a valid JSON Pointer that resolves to an existing type definition inside the
<tt>definitions</tt> object.</t>
          <t>The <tt>$root</tt> keyword <bcp14>MUST</bcp14> only be used once in a document, at the root level. Its
use is mutually exclusive with the <tt>type</tt> keyword.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "$root": "#/definitions/Namespace/TypeName",
  "definitions": {
      "Namespace": {
          "TypeName": {
            "name": "TypeName",
            "type": "object",
            "properties": {
                "name": { "type": "string" }
            }
          }
      }
  }
}
]]></sourcecode>
        </section>
        <section anchor="definitions-keyword">
          <name><tt>definitions</tt> Keyword</name>
          <t>The <tt>definitions</tt> keyword defines a namespace hierarchy for reusable type
declarations. The keyword <bcp14>MUST</bcp14> be used at the root level of the document.</t>
          <t>The value of the <tt>definitions</tt> keyword <bcp14>MUST</bcp14> be a map of types and namespaces.
The namespace at the root level of the <tt>definitions</tt> keyword is the root
namespace.</t>
          <t>A namespace is a JSON object that provides a scope for type declarations or
other namespaces. Any JSON object under the <tt>definitions</tt> keyword that is not a
type definition (containing the <tt>type</tt> attribute) is considered a namespace.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "definitions": {
        "Namespace": {
            "TypeName": {
                "name": "TypeName",
                "type": "object",
                "properties": {
                    "name": { "type": "string" }
                }
            }
        }
    }
}
]]></sourcecode>
        </section>
        <section anchor="ref-keyword">
          <name><tt>$ref</tt> Keyword</name>
          <t>References to type declarations within the same document <bcp14>MUST</bcp14> use a schema
containing a single property with the name <tt>$ref</tt> as the value of <tt>type</tt>. The
value of <tt>$ref</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer Fragment Identifier
(see <xref section="6" sectionFormat="of" target="RFC6901"/>) that resolves to an existing type definition.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "properties": {
      "name1": { "type": { "$ref": "#/definitions/Namespace/TypeName" }},
      "name2": { "type": { "$ref": "#/definitions/Namespace2/TypeName2" }}
  },
  "definitions": {
      "Namespace": {
          "TypeName": {
              "name": "TypeName",
              "type": "object",
              "properties": {
                  "name": { "type": "string" }
              }
          }
      },
      "Namespace2": {
          "TypeName2": {
              "name": "TypeName2",
              "type": "object",
              "properties": {
                  "name": { "type": { "$ref": "#/definitions/Namespace/TypeName" }}
              }
          }
      }
  }
}
]]></sourcecode>
          <t>The <tt>$ref</tt> keyword is only permitted inside the <tt>type</tt> attribute value of a
schema definition, including in type unions.</t>
          <t><tt>$ref</tt> is NOT permitted in other attributes and <bcp14>MUST NOT</bcp14> be used inside the
<tt>type</tt> of the root object.</t>
        </section>
        <section anchor="cross-references">
          <name>Cross-references</name>
          <t>In JSON Structure documents, the <tt>$schema</tt> keyword references the meta-schema of
this specification. In JSON documents, the <tt>$schema</tt> keyword references the
schema document that defines the structure of the JSON document. The value of
<tt>$schema</tt> is a URI. Ideally, the URI <bcp14>SHOULD</bcp14> be a resolvable URL to a schema
document, but it's primarily an identifier. As an identifier, it can be used as
a lookup key in a cache or schema-registry.</t>
          <t>The <bcp14>OPTIONAL</bcp14> <xref target="JSTRUCT-IMPORT"/> extension specification is the exception and
provides a mechanism for importing definitions from external schemas.</t>
        </section>
      </section>
      <section anchor="type-system-rules">
        <name>Type System Rules</name>
        <section anchor="schema-declarations">
          <name>Schema Declarations</name>
          <ul spacing="normal">
            <li>
              <t>Every schema element <bcp14>MUST</bcp14> declare a <tt>type</tt> referring to a primitive, compound,
or reusable type.</t>
            </li>
            <li>
              <t>To reference a reusable type, the <tt>type</tt> attribute <bcp14>MUST</bcp14> be a schema with a
single <tt>$ref</tt> property resolving to an existing type declaration.</t>
            </li>
            <li>
              <t>Compound types <bcp14>SHOULD</bcp14> be declared in the <tt>definitions</tt> section as reusable
types. Inline compound types in arrays, maps, unions, or property definitions
<bcp14>MUST NOT</bcp14> be referenced externally.</t>
            </li>
            <li>
              <t>Primitive and compound type declarations are confined to this specification.</t>
            </li>
            <li>
              <t>Defined types:
              </t>
              <ul spacing="normal">
                <li>
                  <t><strong>JSON Primitives:</strong> <tt>string</tt>, <tt>number</tt>, <tt>integer</tt>, <tt>boolean</tt>, <tt>null</tt>.</t>
                </li>
                <li>
                  <t><strong>Extended Primitives:</strong> <tt>int32</tt>, <tt>uint32</tt>, <tt>int64</tt>, <tt>uint64</tt>, <tt>int128</tt>,
<tt>uint128</tt>, <tt>float</tt>, <tt>double</tt>, <tt>decimal</tt>, <tt>date</tt>, <tt>datetime</tt>, <tt>time</tt>,
<tt>duration</tt>, <tt>uuid</tt>, <tt>uri</tt>, <tt>binary</tt>, <tt>jsonpointer</tt>.</t>
                </li>
                <li>
                  <t><strong>JSON Compounds:</strong> <tt>object</tt>, <tt>array</tt>.</t>
                </li>
                <li>
                  <t><strong>Extended Compounds:</strong> <tt>map</tt>, <tt>set</tt>, <tt>tuple</tt>, <tt>any</tt>, <tt>choice</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="reusable-types">
          <name>Reusable Types</name>
          <ul spacing="normal">
            <li>
              <t>Reusable types <bcp14>MUST</bcp14> be defined in the <tt>definitions</tt> section.</t>
            </li>
            <li>
              <t>Each declaration in <tt>definitions</tt> <bcp14>MUST</bcp14> have a unique, case-sensitive name
within its namespace. The same name <bcp14>MAY</bcp14> appear in different namespaces.</t>
            </li>
          </ul>
        </section>
        <section anchor="type-references">
          <name>Type References</name>
          <ul spacing="normal">
            <li>
              <t>Use <tt>$ref</tt> to reference types declared in the same document.</t>
            </li>
            <li>
              <t><tt>$ref</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer to an existing type declaration.</t>
            </li>
            <li>
              <t><tt>$ref</tt> <bcp14>MAY</bcp14> include a <tt>description</tt> attribute for additional context.</t>
            </li>
          </ul>
        </section>
        <section anchor="dynamic-structures">
          <name>Dynamic Structures</name>
          <ul spacing="normal">
            <li>
              <t>Use the <tt>map</tt> type for dynamic key–value pairs. The <tt>object</tt> type requires at
least one property and cannot model fully dynamic properties with
<tt>additionalProperties</tt>.</t>
            </li>
            <li>
              <t>The <tt>values</tt> attribute of a <tt>map</tt> and the <tt>items</tt> attribute of an <tt>array</tt> or
<tt>set</tt> <bcp14>MUST</bcp14> reference a reusable type, a primitive type, or a locally declared
compound type.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="composition-rules">
        <name>Composition Rules</name>
        <t>This section defines the rules for composing schemas. Further, <bcp14>OPTIONAL</bcp14>
composition rules are defined in the <xref target="JSTRUCT-COMPOSITION"/> extension
specification.</t>
        <section anchor="unions">
          <name>Unions</name>
          <ul spacing="normal">
            <li>
              <t>Non-discriminated type unions are formed as sets of primitive types and type
references. It is NOT permitted to define a compound type inline inside a
non-discriminated type union. Discriminated unions are formed as a
<tt>choice</tt> (<xref target="choice"/>) type to which the rules of this section do not apply.</t>
            </li>
            <li>
              <t>A type union is a composite type reference and not a standalone compound type
and is therefore not named.</t>
            </li>
            <li>
              <t>The JSON node described by a schema with a type union <bcp14>MUST</bcp14> conform to at least
one of the types in the union.</t>
            </li>
            <li>
              <t>If the JSON node described by a schema with a type union conforms to more than
one type in the union, the JSON node <bcp14>MUST</bcp14> be considered to be of the first
matching type in the union.</t>
            </li>
          </ul>
          <t><strong>Examples:</strong></t>
          <t>Union of a string and a compound type:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "$ref": "#/definitions/Namespace/TypeName" } ]
}
]]></sourcecode>
          <t>Union of a string and an <tt>int32</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", "int32"]
}
]]></sourcecode>
          <t>A valid union of a string and a <tt>map</tt> of strings:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "map", "values": { "type": "string" } } ]
}
]]></sourcecode>
          <t>An inline definition of a compound type in a union is NOT permitted:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "object", "properties": { "name": { "type": "string" } } } ]
}
]]></sourcecode>
        </section>
        <section anchor="prohibition-of-top-level-unions">
          <name>Prohibition of Top-Level Unions</name>
          <ul spacing="normal">
            <li>
              <t>The root of a JSON Structure document <bcp14>MUST NOT</bcp14> be an array.</t>
            </li>
            <li>
              <t>If a type union is desired as the type of the root of a document instance, the
<tt>$root</tt> keyword <bcp14>MUST</bcp14> be used to designate a type union as the root type.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="identifier-rules">
        <name>Identifier Rules</name>
        <t>All property names and type names <bcp14>MUST</bcp14> conform to the regular expression
<tt>[A-Za-z_][A-Za-z0-9_]*</tt>. They <bcp14>MUST</bcp14> begin with a letter or underscore and <bcp14>MAY</bcp14>
contain letters, digits, and underscores. Keys and type names are
case-sensitive.</t>
        <t>If names need to contain characters outside of this range, consider using the
<xref target="JSTRUCT-ALTNAMES"/> extension specification to define those.</t>
      </section>
      <section anchor="structural-keywords">
        <name>Structural Keywords</name>
        <section anchor="type-keyword">
          <name>The <tt>type</tt> Keyword</name>
          <t>Declares the type of a schema element as a primitive or compound type. The
<tt>type</tt> keyword <bcp14>MUST</bcp14> be present in every schema element. For unions, the value of
<tt>type</tt> <bcp14>MUST</bcp14> be an array of type references or primitive type names.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string"
}
]]></sourcecode>
        </section>
        <section anchor="properties-keyword">
          <name>The <tt>properties</tt> Keyword</name>
          <t><tt>properties</tt> defines the properties of an <tt>object</tt> type.</t>
          <t>The <tt>properties</tt> keyword <bcp14>MUST</bcp14> contain a map of property names mapped to schema
definitions.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="required-keyword">
          <name>The <tt>required</tt> Keyword</name>
          <t><tt>required</tt> defines the required properties of an <tt>object</tt> type. The <tt>required</tt>
keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt>.</t>
          <t>The value of the <tt>required</tt> keyword is a simple array of property names or an
array of arrays of property names.</t>
          <t>An array of arrays is used to define alternative sets of required properties.
When alternative sets are used, exactly one of the sets <bcp14>MUST</bcp14> match the
properties of the object, meaning they are mutually exclusive.</t>
          <t>Property names in the <tt>required</tt> array <bcp14>MUST</bcp14> be present in <tt>properties</tt>.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"]
}
]]></sourcecode>
          <t>Example with alternative sets:</t>
          <t>Because the <tt>name</tt> property is required in both sets, the <tt>name</tt> property is
required in all objects. The <tt>fins</tt> property is required in the first set, and
the <tt>legs</tt> property is required in the second set. That means that an object
<bcp14>MUST</bcp14> have either <tt>fins</tt> or <tt>legs</tt> but not both.</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "fins": { "type": "int32" },
    "legs": { "type": "int32" },
    "wings": { "type": "int32" }
  },
  "required": [["name", "fins"], ["name", "legs"]]
}
]]></sourcecode>
        </section>
        <section anchor="items-keyword">
          <name>The <tt>items</tt> Keyword</name>
          <t>Defines the schema for elements in an <tt>array</tt> or <tt>set</tt> type. The value is a type
reference or a primitive type name or a locally declared compound type.</t>
          <t>Examples:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/definitions/Namespace/TypeName" }}
}
]]></sourcecode>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="values-keyword">
          <name>The <tt>values</tt> Keyword</name>
          <t>Defines the schema for values in a <tt>map</tt> type.</t>
          <t>The <tt>values</tt> keyword <bcp14>MUST</bcp14> reference a reusable type or a primitive type or a
locally declared compound type.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="const-keyword">
          <name>The <tt>const</tt> Keyword</name>
          <t>Constrains the values of the JSON node described by the schema to a single,
specific value. The <tt>const</tt> keyword <bcp14>MUST</bcp14> appear only in schemas with a primitive
<tt>type</tt>, and the instance value <bcp14>MUST</bcp14> match the provided constant exactly.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "const": "example"
}
]]></sourcecode>
        </section>
        <section anchor="enum-keyword">
          <name>The <tt>enum</tt> Keyword</name>
          <t>Constrains a schema to match one of a specific set of values. The <tt>enum</tt> keyword
<bcp14>MUST</bcp14> appear only in schemas with a primitive <tt>type</tt>, and all values in the enum
array <bcp14>MUST</bcp14> match that type. Values <bcp14>MUST</bcp14> be unique.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "enum": ["value1", "value2", "value3"]
}
]]></sourcecode>
          <t>It is NOT permitted to use <tt>enum</tt> in conjunction with a type union in <tt>type</tt>.</t>
        </section>
        <section anchor="additionalproperties-keyword">
          <name>The <tt>additionalProperties</tt> Keyword</name>
          <t><tt>additionalProperties</tt> defines whether additional properties are allowed in an
<tt>object</tt> type and, optionally, what their schema is. The value <bcp14>MUST</bcp14> be a boolean
or a schema. If set to <tt>false</tt>, no additional properties are allowed. If
provided with a schema, each additional property <bcp14>MUST</bcp14> conform to it.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  },
  "additionalProperties": false
}
]]></sourcecode>
        </section>
        <section anchor="choices-keyword">
          <name>The <tt>choices</tt> Keyword</name>
          <t><tt>choices</tt> defines the choices of a <tt>choice</tt> type. The value <bcp14>MUST</bcp14> be a map of
type names to schemas. Each type name <bcp14>MUST</bcp14> be unique within the <tt>choices</tt> map.</t>
          <t>The value of each type name <bcp14>MUST</bcp14> be a schema. Inline compound types are permitted.</t>
          <t>The <tt>choices</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t><strong>*Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="selector-keyword">
          <name>The <tt>selector</tt> Keyword</name>
          <t>The <tt>selector</tt> keyword defines the name of the property that acts as the selector
for the type in a <tt>choice</tt> type. The value of <tt>selector</tt> <bcp14>MUST</bcp14> be a string.</t>
          <t>The <tt>selector</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t>See <tt>choice</tt> (<xref target="choice"/>) for an example.</t>
        </section>
        <section anchor="tuple-keyword">
          <name>The <tt>tuple</tt> Keyword</name>
          <t>The <tt>tuple</tt> keyword defines the order of properties in a <tt>tuple</tt> type. The
value of <tt>tuple</tt> <bcp14>MUST</bcp14> be an array of strings, where each string is the name of a
property defined in the <tt>properties</tt> map. The order of the strings in the array
defines the order of the properties in the tuple.</t>
          <t>The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>tuple</tt> (<xref target="tuple"/>).</t>
          <t>See <tt>tuple</tt> (<xref target="tuple"/>) for an example.</t>
        </section>
      </section>
      <section anchor="type-annotation-keywords">
        <name>Type Annotation Keywords</name>
        <t>Type annotation keywords provide additional metadata about the underlying type.
These keywords are used for documentation and validation of additional
constraints on types.</t>
        <section anchor="maxlength-keyword">
          <name>The <tt>maxLength</tt> Keyword</name>
          <t>Specifies the maximum allowed length for a string. The <tt>maxLength</tt> keyword <bcp14>MUST</bcp14>
be used only with <tt>string</tt> types, and the string’s length <bcp14>MUST</bcp14> not exceed this
value.</t>
          <t>The purpose of <tt>maxLength</tt> is to provide a known storage constraint on the
maximum length of a string. The value <bcp14>MAY</bcp14> be used for validation.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "maxLength": 255
}
]]></sourcecode>
        </section>
        <section anchor="precision-keyword">
          <name>The <tt>precision</tt> Keyword</name>
          <t>Specifies the total number of significant digits for numeric values. The
<tt>precision</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt> types.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "precision": 10
}
]]></sourcecode>
        </section>
        <section anchor="scale-keyword">
          <name>The <tt>scale</tt> Keyword</name>
          <t>Specifies the number of digits to the right of the decimal point for numeric
values. The <tt>scale</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt>
types to constrain the fractional part.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "scale": 2
}
]]></sourcecode>
        </section>
        <section anchor="contentencoding-keyword">
          <name>The <tt>contentEncoding</tt> Keyword</name>
          <t>Specifies the encoding of a binary value. The <tt>contentEncoding</tt> keyword is used
as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentEncoding</tt> are defined in <xref target="RFC4648"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>base64</tt>: The binary value is encoded as a base64 string.</t>
            </li>
            <li>
              <t><tt>base64url</tt>: The binary value is encoded as a base64url string.</t>
            </li>
            <li>
              <t><tt>base16</tt>: The binary value is encoded as a base16 string.</t>
            </li>
            <li>
              <t><tt>base32</tt>: The binary value is encoded as a base32 string.</t>
            </li>
            <li>
              <t><tt>base32hex</tt>: The binary value is encoded as a base32hex string.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64"
}
]]></sourcecode>
        </section>
        <section anchor="contentcompression-keyword">
          <name>The <tt>contentCompression</tt> Keyword</name>
          <t>Specifies the compression algorithm used for a binary value before encoding. The
<tt>contentCompression</tt> keyword is used as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentCompression</tt> are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>gzip</tt>: The binary value is compressed using the gzip algorithm. See
<xref target="RFC1952"/>.</t>
            </li>
            <li>
              <t><tt>deflate</tt>: The binary value is compressed using the deflate algorithm. See
<xref target="RFC1951"/>.</t>
            </li>
            <li>
              <t><tt>zlib</tt>: The binary value is compressed using the zlib algorithm. See
<xref target="RFC1950"/>.</t>
            </li>
            <li>
              <t><tt>brotli</tt>: The binary value is compressed using the brotli algorithm. See
<xref target="RFC7932"/>.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "compression": "gzip"
}
]]></sourcecode>
        </section>
        <section anchor="contentmediatype-keyword">
          <name>The <tt>contentMediaType</tt> Keyword</name>
          <t>Specifies the media type of a binary value. The <tt>contentMediaType</tt> keyword is
used as an annotation for <tt>binary</tt> types.</t>
          <t>The value of <tt>contentMediaType</tt> <bcp14>MUST</bcp14> be a valid media type as defined in
<xref target="RFC6838"/>.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "mediaType": "image/png"
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="documentation-keywords">
        <name>Documentation Keywords</name>
        <t>Documentation keywords provide descriptive information for schema elements. They
are <bcp14>OPTIONAL</bcp14> but <bcp14>RECOMMENDED</bcp14> for clarity.</t>
        <section anchor="description-keyword">
          <name>The <tt>description</tt> Keyword</name>
          <t>Provides a human-readable description of a schema element. The <tt>description</tt>
keyword <bcp14>SHOULD</bcp14> be used to document any schema element.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "description": "A person's name"
}
]]></sourcecode>
          <t>For multi-lingual descriptions, the <xref target="JSTRUCT-ALTNAMES"/> companion provides an
extension to define several concurrent descriptions in multiple languages.</t>
        </section>
        <section anchor="examples-keyword">
          <name>The <tt>examples</tt> Keyword</name>
          <t>Provides example instance values that conform to the schema. The <tt>examples</tt>
keyword <bcp14>SHOULD</bcp14> be used to document potential instance values.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "examples": ["example1", "example2"]
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="extensions-and-add-ins">
        <name>Extensions and Add-Ins</name>
        <t>The <tt>abstract</tt> and <tt>$extends</tt> keywords enable controlled type extension,
supporting basic object-oriented-programming-style inheritance while not
permitting subtype polymorphism where a sub-type value can be assigned a
base-typed property. This approach avoids validation complexities and mapping
issues between JSON schemas, programming types, and databases.</t>
        <t>An <em>extensible type</em> is declared as <tt>abstract</tt> and serves as a base for
extensions. For example, a base type <em>Address</em> <bcp14>MAY</bcp14> be extended by
<em>StreetAddress</em> and <em>PostOfficeBoxAddress</em> via <tt>$extends</tt>, but <em>Address</em> cannot
be used directly.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "definitions" : {
    "Address": {
      "abstract": true,
      "type": "object",
      "properties": {
          "city": { "type": "string" },
          "state": { "type": "string" },
          "zip": { "type": "string" }
      }
    },
    "StreetAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "street": { "type": "string" }
      }
    },
    "PostOfficeBoxAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "poBox": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
        <t>A <em>add-in type</em> is declared as <tt>abstract</tt> and <tt>$extends</tt> a specific type that
does not need to be abstract. For example, an add-in type <em>DeliveryInstructions</em>
might be applied to any <em>StreetAddress</em> types in a document:</t>
        <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/Addresses",
    "$root": "#/definitions/StreetAddress",
    "$offers": {
        "DeliveryInstructions": "#/definitions/DeliveryInstructions"
    },
    "definitions" : {
      "StreetAddress": {
        "type": "object",
        "properties": {
            "street": { "type": "string" },
            "city": { "type": "string" },
            "state": { "type": "string" },
            "zip": { "type": "string" }
        }
      },
      "DeliveryInstructions": {
        "abstract": true,
        "type": "object",
        "$extends": "#/definitions/StreetAddress",
        "properties": {
            "instructions": { "type": "string" }
        }
      }
    }
}
]]></sourcecode>
        <t>Add-in types are options that a document author can enable for a schema. The
definitions of add-in types are not part of the main schema by default, but are
injected into the designated schema type when the document author chooses to use
them.</t>
        <t>Add-in types are advertised in the schema document through the <tt>$offers</tt>
keyword, which is a map that defines add-in names for add-in schema definitions
that exist in the document.</t>
        <t>Add-ins are applied to a schema by referencing the add-in name in the <tt>$uses</tt>
keyword that is available only in instance documents. The <tt>$uses</tt> keyword is a
set of add-in names that are applied to the schema for the document.</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://schemas.vasters.com/Addresses",
  "$uses": ["DeliveryInstructions"],
  "street": "123 Main St",
  "city": "Anytown",
  "state": "QA",
  "zip": "00001",
  "instructions": "Leave at the back door"
}
]]></sourcecode>
        <section anchor="abstract-keyword">
          <name>The <tt>abstract</tt> Keyword</name>
          <t>The <tt>abstract</tt> keyword declares a type as abstract. This prohibits its direct
use in any type declaration or as the type of a schema element. Abstract types
are used as base types for extension via <tt>$extends</tt> or as add-in types via
<tt>$addins</tt>.</t>
          <t>Abstract types implicitly permit additional properties (<tt>additionalProperties</tt>
is always <tt>true</tt>).</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A boolean (<tt>true</tt> or <tt>false</tt>).</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>abstract</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt> and
<tt>tuple</tt>.</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MUST NOT</bcp14> be used as the type of a schema element or
referenced via <tt>$ref</tt>.</t>
                </li>
                <li>
                  <t>The <tt>additionalProperties</tt> keyword <bcp14>MUST NOT</bcp14> be used on abstract types (its
value is implicitly <tt>true</tt>).</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MAY</bcp14> extend other abstract types via <tt>$extends</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="extends-keyword">
          <name>The <tt>$extends</tt> Keyword</name>
          <t>The <tt>$extends</tt> keyword merges all properties from one or more abstract base
types into the extending type.</t>
          <t>If the type using <tt>$extends</tt> is marked as <tt>abstract</tt> and referenced via
<tt>$addins</tt>, the composite type <em>replaces</em> the base type in the type model of the
document.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A JSON Pointer to an abstract type, or an array of JSON Pointers to
abstract types.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$extends</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt> and
<tt>tuple</tt>.</t>
                </li>
                <li>
                  <t>The value of <tt>$extends</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer or an array of valid
JSON Pointers that point to abstract types within the same document.</t>
                </li>
                <li>
                  <t>The extending type <bcp14>MUST</bcp14> merge the abstract type's properties and constraints
and <bcp14>MUST NOT</bcp14> redefine any inherited property.</t>
                </li>
                <li>
                  <t>When multiple base types are specified, properties are merged in array
order. If multiple base types define a property with the same name, the
property from the first base type in the array takes precedence.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="offers-keyword">
          <name>The <tt>$offers</tt> Keyword</name>
          <t>The <tt>$offers</tt> keyword is used to advertise add-in types that are available for
use in a schema document. The <tt>$offers</tt> keyword is a map of add-in names to
add-in schema definitions.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A map of add-in names to add-in schema definitions.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$offers</tt> keyword <bcp14>MUST</bcp14> only be used in the root object of a schema
document.</t>
                </li>
                <li>
                  <t>The value of <tt>$offers</tt> <bcp14>MUST</bcp14> be a map where each key is a string and each
value is a JSON Pointer to an add-in schema definition in the same document
or a set of JSON Pointers to add-in schema definitions in the same document.
If the value is a set, the add-in name selects all add-in schema definitions
at the same time.</t>
                </li>
                <li>
                  <t>The keys in the <tt>$offers</tt> map <bcp14>MUST</bcp14> be unique.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="uses-keyword">
          <name>The <tt>$uses</tt> Keyword</name>
          <t>The <tt>$uses</tt> keyword is used to apply add-in types to a schema <em>in an instance
document</em> that references the schema. The keyword <bcp14>MAY</bcp14> be used in a meta-schema
that references a parent schema.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A set of add-in names or JSON Pointers to add-in schema definitions
in the same meta-schema document.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$uses</tt> keyword <bcp14>MUST</bcp14> only be used in instance documents.</t>
                </li>
                <li>
                  <t>The value of <tt>$uses</tt> <bcp14>MUST</bcp14> be a set of strings that are either:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>add-in names advertised in the <tt>$offers</tt> keyword of the schema document
referenced by the <tt>$schema</tt> keyword of the instance document or</t>
                    </li>
                    <li>
                      <t>JSON Pointers to add-in schema definitions in the same meta-schema
document.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="reserved-keywords">
      <name>Reserved Keywords</name>
      <t>The following keywords are reserved in JSON Structure and <bcp14>MUST NOT</bcp14> be used as
custom annotations or extension keywords:</t>
      <ul spacing="normal">
        <li>
          <t><tt>definitions</tt></t>
        </li>
        <li>
          <t><tt>$extends</tt></t>
        </li>
        <li>
          <t><tt>$id</tt></t>
        </li>
        <li>
          <t><tt>$ref</tt></t>
        </li>
        <li>
          <t><tt>$root</tt></t>
        </li>
        <li>
          <t><tt>$schema</tt></t>
        </li>
        <li>
          <t><tt>$uses</tt></t>
        </li>
        <li>
          <t><tt>$offers</tt></t>
        </li>
        <li>
          <t><tt>abstract</tt></t>
        </li>
        <li>
          <t><tt>additionalProperties</tt></t>
        </li>
        <li>
          <t><tt>choices</tt></t>
        </li>
        <li>
          <t><tt>const</tt></t>
        </li>
        <li>
          <t><tt>default</tt></t>
        </li>
        <li>
          <t><tt>description</tt></t>
        </li>
        <li>
          <t><tt>enum</tt></t>
        </li>
        <li>
          <t><tt>examples</tt></t>
        </li>
        <li>
          <t><tt>format</tt></t>
        </li>
        <li>
          <t><tt>items</tt></t>
        </li>
        <li>
          <t><tt>maxLength</tt></t>
        </li>
        <li>
          <t><tt>name</tt></t>
        </li>
        <li>
          <t><tt>precision</tt></t>
        </li>
        <li>
          <t><tt>properties</tt></t>
        </li>
        <li>
          <t><tt>required</tt></t>
        </li>
        <li>
          <t><tt>scale</tt></t>
        </li>
        <li>
          <t><tt>selector</tt></t>
        </li>
        <li>
          <t><tt>type</tt></t>
        </li>
        <li>
          <t><tt>values</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="cbor-type-system-mapping">
      <name>CBOR Type System Mapping</name>
      <t>CBOR <xref target="RFC8949"/> is a binary encoding of JSON-like data structures. The CBOR
type system is a superset of the JSON type system and adds "binary strings" as
its most substantial type system extension. Otherwise, CBOR is structurally
compatible with JSON.</t>
      <t>JSON Structure <bcp14>MAY</bcp14> be used to describe CBOR-encoded data structures. For
encoding CBOR data structures, the data structure is first mapped to a JSON type
model as described in this specification, with the exception that the <xref target="binary"/>
primitive type is preserved as a byte array. The resulting mapping is converted
into CBOR per the rules spelled out in <xref section="6.2" sectionFormat="of" target="RFC8949"/>.</t>
      <t>The decoding process is the reverse of the encoding process. The CBOR-encoded
data structure is first decoded into a JSON type model, and then the JSON type
model is validated against the JSON Structure schema, with <tt>binary</tt> types
validated as byte arrays.</t>
    </section>
    <section anchor="media-type">
      <name>Media Type</name>
      <t>The media type for JSON Structure documents is <tt>application/json-structure</tt>.</t>
      <t>It is <bcp14>RECOMMENDED</bcp14> to append the structured syntax suffix <tt>+json</tt> to indicate
unambiguously that the content is a JSON document, if the document is a JSON
document. In spite of this specification being focused on JSON, the JSON
Structure documents <bcp14>MAY</bcp14> be encoded using other serialization formats that can
represent the same data structure, such as CBOR <xref target="RFC8949"/>.</t>
      <ul spacing="normal">
        <li>
          <t>Type name: application</t>
        </li>
        <li>
          <t>Subtype name: json-structure</t>
        </li>
        <li>
          <t>Required parameters: none</t>
        </li>
        <li>
          <t>Optional parameters: none</t>
        </li>
        <li>
          <t>Encoding considerations: binary</t>
        </li>
        <li>
          <t>Security considerations: see <xref target="security-considerations"/></t>
        </li>
        <li>
          <t>Interoperability considerations: none</t>
        </li>
        <li>
          <t>Published specification: this document</t>
        </li>
        <li>
          <t>Applications that use this media type: none</t>
        </li>
        <li>
          <t>Fragment identifier considerations: none</t>
        </li>
        <li>
          <t>Additional information: none</t>
        </li>
      </ul>
    </section>
    <section anchor="media-type-parameters">
      <name>Media Type Parameters</name>
      <t>While the media type <tt>application/json-structure</tt> does not have any parameters,
this specification defines a parameter applicable to all JSON documents.</t>
      <section anchor="schema-parameter">
        <name><tt>schema</tt> Parameter</name>
        <t>The <tt>schema</tt> parameter is used to reference a JSON Structure document that
defines the structure of the JSON document. The value of the <tt>schema</tt> parameter
<bcp14>MUST</bcp14> be a URI that references and ideally resolves to a JSON Structure document.</t>
        <t>The <tt>schema</tt> parameter <bcp14>MAY</bcp14> be used in conjunction with the <tt>application/json</tt>
media type or the <tt>+json</tt> structured syntax suffix or any other media type that
is known to be encoded as JSON.</t>
        <t>Example using the HTTP <tt>Content-Type</tt> header:</t>
        <sourcecode type="http"><![CDATA[
Content-Type: application/json; schema="https://schemas.vasters.com/TypeName"
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>JSON Structure documents are self-contained and <bcp14>MUST NOT</bcp14> allow external
references except for the <tt>$schema</tt> and <tt>$addins</tt> keywords. Implementations <bcp14>MUST</bcp14>
ensure that all <tt>$ref</tt> pointers resolve within the same document to eliminate
security vulnerabilities related to external schema inclusion.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA shall be requested to register the media type <tt>application/json-structure</tt>
as defined in this specification in the "Media Types" registry.</t>
      <t>IANA shall be requested to register the parameter <tt>schema</tt> for the
<tt>application/json</tt> media type in the "Media Type Structured Syntax Suffixes"
registry.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC3986">
          <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="RFC9562">
          <front>
            <title>Universally Unique IDentifiers (UUIDs)</title>
            <author fullname="K. Davis" initials="K." surname="Davis"/>
            <author fullname="B. Peabody" initials="B." surname="Peabody"/>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <date month="May" year="2024"/>
            <abstract>
              <t>This specification defines UUIDs (Universally Unique IDentifiers) --
also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform
Resource Name namespace for UUIDs. A UUID is 128 bits long and is
intended to guarantee uniqueness across space and time. UUIDs were
originally used in the Apollo Network Computing System (NCS), later
in the Open Software Foundation's (OSF's) Distributed Computing
Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the OSF DCE specification with the
kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have
been incorporated into this document. This document obsoletes RFC
4122.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9562"/>
          <seriesInfo name="DOI" value="10.17487/RFC9562"/>
        </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="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="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </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="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </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="RFC1950">
          <front>
            <title>ZLIB Compressed Data Format Specification version 3.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <author fullname="J-L. Gailly" surname="J-L. Gailly"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1950"/>
          <seriesInfo name="DOI" value="10.17487/RFC1950"/>
        </reference>
        <reference anchor="RFC1951">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
        <reference anchor="RFC1952">
          <front>
            <title>GZIP file format specification version 4.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1952"/>
          <seriesInfo name="DOI" value="10.17487/RFC1952"/>
        </reference>
        <reference anchor="RFC7932">
          <front>
            <title>Brotli Compressed Data Format</title>
            <author fullname="J. Alakuijala" initials="J." surname="Alakuijala"/>
            <author fullname="Z. Szabadka" initials="Z." surname="Szabadka"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7932"/>
          <seriesInfo name="DOI" value="10.17487/RFC7932"/>
        </reference>
        <reference anchor="JSTRUCT-ALTNAMES" target="https://json-structure.github.io/alternate-names">
          <front>
            <title>JSON Structure Alternate Names</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-COMPOSITION" target="https://json-structure.github.io/conditional-composition">
          <front>
            <title>JSON Structure Conditional Composition</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-IMPORT" target="https://json-structure.github.io/import">
          <front>
            <title>JSON Structure Import</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-UNITS" target="https://json-structure.github.io/units">
          <front>
            <title>JSON Structure Units</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-VALIDATION" target="https://json-structure.github.io/validation">
          <front>
            <title>JSON Structure Validation</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 1857?>

<section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-01">
      <name>Changes from draft-vasters-json-structure-core-01</name>
      <ul spacing="normal">
        <li>
          <t>Fixed <tt>$ref</tt> paths in examples to correctly include <tt>#/definitions/</tt> prefix
for types defined in the definitions section.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-00">
      <name>Changes from draft-vasters-json-structure-core-00</name>
      <ul spacing="normal">
        <li>
          <t>Added <tt>integer</tt> as an alias for <tt>int32</tt> to improve compatibility with
simple JSON Schema definitions and user habits.</t>
        </li>
        <li>
          <t>Updated the <tt>$extends</tt> keyword to accept either a single JSON Pointer
or an array of JSON Pointers, enabling multiple inheritance for object
and tuple types.</t>
        </li>
        <li>
          <t>Fixed inconsistent <tt>$ref</tt> usage in examples throughout the document.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+192XIcyZHgO8zwDzmgzIbsrSoSIJpNYk7w6BVGvIYAJdO2
tRGJqgSQYlZmKQ+S1TTIRt+wD2v7tp+wu9rRzLz2/om+ZP2M8MijUCCb7Naa
+qGZyIqM8HD38HD3cPcYj8ebG3VaZ8letPVPh8+eRod12UzrpoQXD4oy2drc
mMZ1claUy72oqmebG5sbs2Kax3NoMCvj03r8Jq7qpKzGv6mKfFzp5+MpfD2+
tbO5UTUn87Sq0iKvlwv46uDR0ddRdC2Ks6qAUdN8liwS+F9eb42irWSW1kWZ
xhn+cbB/H/4pSnh6cfQ1wJI385Ok3AMYAKi9aOfWzpfj7Z3xrV0As8irJK+a
ai8CGJLNjTd70e3NjbhM4r3oV8lJFOez6CAHUPOkjo7KOK8WRVlvbrwtytdn
ZdEs9qL7TZrN0vwsup8V09dVdApD//zo6Hm0//yg2tx4nSyh8WzPdTN+iBiA
oZK8SQCqKJKOju4/xL94wr+CAbDT/4y/4et5nGauTVxOz90fZ2l93pwAVkJk
3pwyKaIog3lXNTQ4r+tFtXfzZthwwh1M0oI+uXkphSbn9TyDnuOmPi9KmsI4
Om2yjCn8IEvmgNTol9wD/hwBPc7iPP0uroGke9GTdFoWVXFaI78ARuk1N0x4
olPu5M0/zrXpZFrMkZPyopxD+zeMuxdfP7h9+/Y993zv7h19vvflnR193r2z
e1ef79y97Z/v3drW57s7X7p+7t7bxec0P22Ptn3vy1vmeds8u9G+unebn//p
8OjFywdH4/3HR0/3nzw63OM59i+eaD9DDgFiRU8BkdUWNzZYxv8uxXQdl2cJ
UPtSYsc63Bh7qyy8D549ef7s8ODo4NnT1SA/KHJYe0C8OIPn+aKo6K9PDfrU
Dwsc6Ya1UziAGbw4Wg39wRxX86cGNp2zzPCwvXx6cHQJL7zM0/qTc0CDg1jA
frn/+ODh/uVk/2WcpbP4c1D6jRsJ1/54PI7iE2gXT2v8++g8rSLYWhoYoY6q
RTJNT9OkikJwR1EcQR9x5AaIZslpmhPPgHTMz5r4DIR/fR7XUYJLfgp9QON0
WqM4Bjk8iubFrMniMq2XI9oVZgnMZg6dVPNJazzYaZJqWqYnAsk4yafFLJkJ
EM30PKKh5vEC+47qgno8LYt5tCiLszKez/G9QgY4oxHh65O4gk7xr6I+T0ru
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
YRklpBgXLrLF5szQcuoC/F9LWRdXvLFVd4lMMEtsZ4VJhG+L8j2EjrREZEz1
Erz7kXuUeiadSaRzygylUF2uO1i3YXHJq0QDzSNAaBwYzo9M9DchFZZErWKL
3V5wVQAXpXX0liI64i67MogBeDx2vlQSqgESoBOdTCqCqeJEt+uUzuDCKYnN
wswuOogspp5d96MMmQ8xZYwnqPNDvwI4qNJdVvOzpcEFiFEh+BNBCUHTVW87
7ay9E+LCNW1pvSv06ks15nXRrP+ZPy8lQCjA6fjL8fFPnCo9B/mX08d91EOg
YdqtXC9XIPJahL4asVsEX4P+dKziqrX9QgS0KwqtTkDdXILSuE5h7ZZ7M0eR
GuGKKid7vdxx6Tl6+vUoIjpt8qnz/Qxo2lW36LqmLxx0PmoX9dPacW1gbYVn
RFGnJF1YZtRUo5vYga80Tj+spLOsUf3QaONRRxN1NPIQiNVRgja1KLj8GYOI
EdXSmYMOj96t5t8tqOhUjUG60/FbR6/q6ISX+PM+Vr78SJvay25lL4+pWQHU
xKqxUhswRH2nBCYWXJWLdjBIgs8j+T6aKH4TpxmpvKizSVFv7I/vq6hDPPNK
R4L7VZ7OOivcLOqBGotxheZIFPfYn+TgZxtxcBmyDDBMisMMyosDMPup/j7e
wkPmD/z6hiaNJuz1GP55fMNw5ADQAuSyp8ooIM2szCx9jSccSq+BngleOhD2
leWmsmVqx6MBw+ITMvyfkebH7EgKn2FI/LvDks5o1va9hT/FRqaAhdBIDgtl
h5Z9j83a4z5psyyDgUwgbGmi4QLTndmVz+iowKpUVm2ZVWivp+SkQ94LLI52
aHYLBR/KiLCwKir+g0ici2XeNss5DmXZrhn8kzmBuaIuOKQJDuuBqzT4yzTA
H0XFj1pe8+6SC5jLLzzzurP++j0K3iV3mReBuJ1qOTp/QaAIfojW0FFG+4H0
jlm03F1AT6uyP3dn/AdDIPQPknox0jb8P7GTaF+Ds6THAc+LL2luXRcd5050
XZyWPr6R1r7zsFKdcfS6pRyzGrc8Nz+xne0vhl/42Lf/Ygl8s/2aSvjY6IXX
i9Bk6HCl+CLJOEGHe3gggrtL7Cwbw1txNzJMtxvy2wtcces6FmZHibSwuzE2
9iu9Zy/+uozPCK4DUxT8epX0palz2uGNK+3fP61tsZ+1iJm21zvm702L8Gfj
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
6TzVIFmOnj18BnPXxuwa/X91Hu+PL+QAAA==

-->

</rfc>
