<?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 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-holmgren-at-repository-00" category="std" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title abbrev="AT Repo and Sync">Authenticated Transfer Repository and Synchronization</title>
    <seriesInfo name="Internet-Draft" value="draft-holmgren-at-repository-00"/>
    <author fullname="Daniel Holmgren">
      <organization>Bluesky Social</organization>
      <address>
        <email>daniel@blueskyweb.xyz</email>
      </address>
    </author>
    <author fullname="Bryan Newbold">
      <organization>Bluesky Social</organization>
      <address>
        <email>bryan@blueskyweb.xyz</email>
      </address>
    </author>
    <date year="2025" month="September" day="14"/>
    <area>Applications and Real-Time Area</area>
    <abstract>
      <?line 146?>

<t>This document specifies the repository and synchronization semantics for Authenticated Transfer (AT), a protocol for cryptographically-verifiable storage and distribution of structured user-controlled data. It defines the AT repository that serves as the fundamental data storage model. It further specifies synchronization mechanisms that allow efficient distribution of repository changes to interested parties.</t>
      <t>This document specifically deals with the repository and sync protocol. Overall network architecture is described further in <xref target="AT-ARCH"/>.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-holmgren-at-repository/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bluesky-social/ietf-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 152?>

<section anchor="user-id">
      <name>Introduction</name>
      <t>The Authenticated Transfer (AT) repository and synchronization protocol addresses the challenges of building decentralized applications that require consistent data replication across distributed multi-party infrastructure. Traditional web platforms maintain user data at a single network location, creating vendor lock-in and limiting user agency over their digital identity and published content.</t>
      <t>In the AT model, user data is stored in cryptographically signed repositories that can be hosted, synchronized, and distributed by any compatible server while preserving data authenticity and user ownership. Each repository consists of a set of CBOR-encoded objects called records, organized lexicographically by type. The cryptographic structure allows repository contents to be re-distributed and cached by any network participant without requiring trust in intermediary hosts.</t>
      <t>The synchronization system provides efficient mechanisms for propagating repository state changes across the network, supporting both real-time streaming updates and bulk synchronization scenarios. The protocol can detect dropped or withheld updates and provides cryptographic proofs for all operations, including record deletions, ensuring that consumers can maintain accurate and complete views of repository state.</t>
      <t>This document specifically deals with the repository and sync protocol. Overall network architecture is described further in <xref target="AT-ARCH"/>.</t>
    </section>
    <section anchor="repo">
      <name>Repository</name>
      <t>An AT repository provides a sorted key-value interface where values are CBOR-encoded objects refered to as records. Applications interact with repositories through standard CRUD operations while the underlying Merkle tree structure enables cryptographic verification of all modifications.</t>
      <t>Repository authority is established through Decentralized Identifiers (DIDs). Each repository is associated with exactly one DID, which resolves to the cryptographic key material necessary for verifying repositories.</t>
      <t>The repository structure provides several advantages over individualy signed objects:</t>
      <ul spacing="normal">
        <li>
          <t>Simplified key rotation through a single repository-level signature rather than record-level signatures</t>
        </li>
        <li>
          <t>Cryptographic proofs of record deletion</t>
        </li>
        <li>
          <t>Completeness guarantees that enable observers to detect withheld, missing, or outdated records</t>
        </li>
      </ul>
      <t>This document describes version <tt>3</tt> of the AT repository format. Both previous versions are deprecated, and implementations do not need to support them.</t>
      <section anchor="repo-semantics">
        <name>Repository Semantics</name>
        <t>Records are discrete units of user data, each CBOR-encoded and identified by a unique key within the repository. The repository is schema-agnostic and provides the foundational layer for higher-level data models and application semantics.</t>
        <t>Repositories support individual record operations as well as batch writes that group multiple operations under a single commit, or signed mutation, to the repository. When applying batch operations, implementations should ensure that the resulting changes can be adequately represented within the synchronization system (see <xref target="commit-events"/>).</t>
        <t>By convention, records are organized using a hierarchical two-part key structure consisting of a collection identifier and a record key. Record keys may be derived from timestamps or other monotonically increasing values, ensuring that new records are typically added to the lexicographically rightmost position within their collection.</t>
        <t>Repository efficiency, especially in partial synchronization situations, benefits from grouping related records around lexicographically similar keys. This grouping allows for structural sharing within the repository data structure and reduces cryptographic proof sizes.</t>
      </section>
      <section anchor="repo-structure">
        <name>Repository Structure</name>
        <t>AT repositories are organized as a <eref target="https://inria.hal.science/hal-02303490/document">Merkle Search Tree</eref> (<xref target="MST"/>) with a cryptographically signed commit referencing the tree root.</t>
        <t>The MST provides several fundamental properties for repository operations. As a content-addressed structure, it enables efficient verification of data. The MST maintains lexicographic key ordering, enabling structural sharing of intermediate tree nodes for related records. It is probabilistically self-balancing, offering consistent performance characteristics. Additionally the MST exhibits unicity, meaning that any given set of keys and values will always produce the same tree structure and root hash regardless of insertion order.</t>
        <t>Repository contents are encoded using deterministic CBOR serialization and organized as a directed acyclic graph where data objects reference each other through content hashes. These hash-identified data objects, referred to as "blocks," include three distinct types: commit objects, MST internal nodes, and user records.</t>
        <t>Large binary data such as images and media files are not stored directly within repositories. Instead, such data is stored externally and referenced in records by a hash link.</t>
      </section>
      <section anchor="user-ids">
        <name>User Identifiers</name>
        <t>Repository authority is established through a resolvable user identifier specified in the repository commit (<xref target="commits"/>). AT employs Decentralized Identifiers (DIDs) as defined in <xref target="DID"/> for this purpose.</t>
        <t>DIDs are globally unique identifiers that resolve to DID Documents containing cryptographic key material and other metadata associated with the identifier. Resolution enables independent verification of repository commits without dependence on centralized authorities.</t>
        <t>Each repository must reference exactly one DID, and each DID may be associated with at most one AT repository.</t>
        <t>The signing key for repository commits is specified within the DID document's <tt>verificationMethod</tt> array. The key entry must have an <tt>id</tt> field ending in <tt>#atproto</tt>. When multiple possible verification methods are present, implementations must use the first valid entry and ignore subsequent ones. The public key must be encoded using the <tt>publicKeyMultibase</tt> format as specified in <xref target="CONTROLLEDID"/>. The signing key must use one of the signing algorithms described in <xref target="sig-curves"/>.</t>
        <t>DID resolution may return supplementary information beyond the signing key, including canonical repository hosting locations, alternative user identifiers, or relevant service endpoints.</t>
        <t>To ensure interoperability, AT restricts support to specific DID methods. Currently supported methods are <tt>did:web</tt> and <tt>did:plc</tt>. The resolution mechanisms and specifications for these methods are described in <xref target="DIDWEB"/> and <xref target="DIDPLC"/>.</t>
      </section>
      <section anchor="commits">
        <name>Commit Objects</name>
        <t>Commit objects serve as the authoritative root of each repository, establishing cryptographic ownership and providing a verifiable reference to the state of a repository at a particular point in time. Each commit is digitally signed by the repository owner and contains metadata necessary for verification and synchronization.</t>
        <t>A commit object contains the following data fields:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>did</tt></strong> (string, required): The resolvable user identifier associated with the repository as described in <xref target="user-ids"/></t>
          </li>
          <li>
            <t><strong><tt>version</tt></strong> (integer, required): Repository format version, fixed value of <strong><tt>3</tt></strong> for the current specification</t>
          </li>
          <li>
            <t><strong><tt>data</tt></strong> (hash link, required): Hash pointer to the root of the repository’s MST structure</t>
          </li>
          <li>
            <t><strong><tt>rev</tt></strong> (string, required): Repository revision identifier that functions as a logical clock and must increase monotonically (see <xref target="revs"/>).</t>
          </li>
          <li>
            <t><strong><tt>prev</tt></strong> (hash link, nullable): Optional pointer to the previous commit object in the repository's history chain. While included for backward compatibility with version 2 repositories, this field is typically <tt>null</tt> in version 3 implementations</t>
          </li>
          <li>
            <t><strong><tt>sig</tt></strong> (byte array, required): Cryptographic signature over the commit contents.</t>
          </li>
        </ul>
        <t>Commit signature generation and verification procedures are detailed in <xref target="sig-gen"/>.</t>
      </section>
      <section anchor="mst">
        <name>MST Construction</name>
        <t>The MST structure is deterministically reproducible from any given key-value mapping, where keys are non-empty byte strings and values are hash link references to records. This deterministic construction ensures that identical input sets always produce the same root hash regardless of insertion order.</t>
        <t>The tree's structural organization depends solely on the keys present, not on the record values they reference. When a record value changes, the new content hash propagates up through the tree nodes to the root, but the tree's shape and node organization remain unchanged.</t>
        <section anchor="mst-structure">
          <name>Tree Structure</name>
          <t>Each MST node contains a list of key-value entries and references to child subtrees. Entries and subtree links are maintained in lexicographic order, with all keys in a linked subtree falling within the range corresponding to that link's position. The ordering proceeds from left (lexicographically first) to right (lexicographically last).</t>
          <t>Keys are assigned to tree levels based on a layer value computed from the key itself. Nodes at each level contain all keys with the corresponding layer value, while subtree links point to nodes containing keys that fall within specific lexicographic ranges but have lower layer values. Adjacent keys may appear within the same node, but adjacent subtrees must be separated by at least one key entry to prevent structural ambiguity.</t>
        </section>
        <section anchor="mst-layer">
          <name>Layer Calculation</name>
          <t>The layer for a given key is calculated using SHA-256 with a 2-bit grouping scheme that provides an average fanout of 4:</t>
          <ol spacing="normal" type="1"><li>
              <t>Compute the SHA-256 hash of the key (byte string) with binary output</t>
            </li>
            <li>
              <t>Count the number of leading binary zeros in the hash</t>
            </li>
            <li>
              <t>Divide by 2, rounding down to the nearest integer</t>
            </li>
          </ol>
          <t>Examples of layer calculation:</t>
          <ul spacing="normal">
            <li>
              <t><tt>key1</tt>: SHA-256 begins <tt>100000010111...</tt> → layer 0</t>
            </li>
            <li>
              <t><tt>key7</tt>: SHA-256 begins <tt>000111100011...</tt> → layer 1</t>
            </li>
            <li>
              <t><tt>key515</tt>: SHA-256 begins <tt>000000000111...</tt> → layer 4</t>
            </li>
          </ul>
          <t>When processing the MST structure, implementations must verify the layer assignment and ordering of keys. While this verification is most essential for untrusted inputs, implementations should perform these checks consistently regardless of data source. Additional validation of node size limits and other structural parameters is required to prevent resource exhaustion attacks, as detailed in Security Considerations (<xref target="security"/>).</t>
        </section>
        <section anchor="mst-example">
          <name>MST Construction Example</name>
          <t>The following is a Merkle Search Tree containing 9 records with keys A-I. Each key would include a pointer to some record hash, though that hash is irrelevant to the construction of the tree. Each asterisk (<tt>*</tt>) represents a hash pointer to the subtree under it.</t>
          <t>For the sake of illustration assume the following layer calculations:</t>
          <ul spacing="normal">
            <li>
              <t><tt>layer(D) = 2</tt></t>
            </li>
            <li>
              <t><tt>layer(A|E|I) = 1</tt></t>
            </li>
            <li>
              <t><tt>layer(B|C|F|G|H) = 0</tt></t>
            </li>
          </ul>
          <figure anchor="f-mst-example">
            <name>Example MST Structure</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="168" viewBox="0 0 168 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 24,80 L 24,120" fill="none" stroke="black"/>
                  <path d="M 40,144 L 40,184" fill="none" stroke="black"/>
                  <path d="M 80,32 L 80,56" fill="none" stroke="black"/>
                  <path d="M 136,80 L 136,120" fill="none" stroke="black"/>
                  <path d="M 136,136 L 136,184" fill="none" stroke="black"/>
                  <path d="M 32,64 L 128,64" fill="none" stroke="black"/>
                  <path d="M 16,128 L 32,128" fill="none" stroke="black"/>
                  <path d="M 120,128 L 152,128" fill="none" stroke="black"/>
                  <path d="M 32,192 L 48,192" fill="none" stroke="black"/>
                  <path d="M 120,192 L 152,192" fill="none" stroke="black"/>
                  <circle cx="24" cy="96" r="6" class="closeddot" fill="black"/>
                  <circle cx="40" cy="160" r="6" class="closeddot" fill="black"/>
                  <circle cx="80" cy="32" r="6" class="closeddot" fill="black"/>
                  <circle cx="136" cy="96" r="6" class="closeddot" fill="black"/>
                  <circle cx="136" cy="160" r="6" class="closeddot" fill="black"/>
                  <g class="text">
                    <text x="80" y="84">|</text>
                    <text x="80" y="100">D</text>
                    <text x="8" y="148">|</text>
                    <text x="112" y="148">|</text>
                    <text x="160" y="148">|</text>
                    <text x="8" y="164">A</text>
                    <text x="112" y="164">E</text>
                    <text x="160" y="164">I</text>
                    <text x="24" y="212">|</text>
                    <text x="56" y="212">|</text>
                    <text x="112" y="212">|</text>
                    <text x="136" y="212">|</text>
                    <text x="160" y="212">|</text>
                    <text x="24" y="228">B</text>
                    <text x="56" y="228">C</text>
                    <text x="112" y="228">F</text>
                    <text x="136" y="228">G</text>
                    <text x="160" y="228">H</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
         *
         |
   -------------
  |      |      |
  *      D      *
  |             |
 ---          -----
|   |        |  |  |
A   *        E  *  I
    |           |
   ---        -----
  |   |      |  |  |
  B   C      F  G  H
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="mst-empty-nodes">
          <name>Empty Nodes</name>
          <t>An empty repository containing no records is represented as a single MST node with no entries. This is the only case where a node without entries is permitted.</t>
          <t>Nodes that contain no key entries but do contain subtree links are allowed at intermediate positions, provided those subtrees eventually contain key entries. However, such nodes are not permitted at the root position - the root must either contain key entries or be the special case of a completely empty repository. Similarly, nodes without key entries are not permitted at leaf positions except for the empty repository case.</t>
          <t>This structure ensures that nodes lacking key-value entries are pruned from the top and bottom of the tree while preserving intermediate nodes that maintain proper height relationships and prevent subtree links from skipping layers.</t>
        </section>
        <section anchor="mst-nodes">
          <name>MST Node Schema</name>
          <t>Given their prevalence through the repository structure, MST nodes require a compact binary representation for storage efficiency. Keys within each node use prefix compression, where each entry specifies the number of bytes it shares with the preceding key in the array. The first entry in each node contains the complete key with a prefix length of zero. This compression applies only within individual nodes and does not extend across node boundaries. The compression scheme is mandatory to ensure deterministic MST structure across all implementations.</t>
          <t>MST nodes contain the following fields:</t>
          <ul spacing="normal">
            <li>
              <t><tt>l</tt> (hash link, nullable): Reference to a subtree node at a lower layer containing keys that sort lexicographically before all keys in the current node</t>
            </li>
            <li>
              <t><tt>e</tt> (array, required): Ordered array of entry objects, each containing:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>p</tt> (integer, required): Number of bytes shared with the previous entry in this node</t>
                </li>
                <li>
                  <t><tt>k</tt> (byte string, required): Key suffix remaining after removing the shared prefix bytes</t>
                </li>
                <li>
                  <t><tt>v</tt> (hash link, required): Reference to the record data for this entry</t>
                </li>
                <li>
                  <t><tt>t</tt> (hash link, nullable): Reference to a subtree node at a lower layer containing keys that sort after this entry's key but before the next entry's key in the current node</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="mst-node-example">
          <name>MST Node example</name>
          <t>The following example shows an MST node at layer 1 containing two subtree pointers and two key-value entries. The node contents in order are:</t>
          <ul spacing="normal">
            <li>
              <t>Left subtree: hash link <tt>0x017112643b9326...</tt></t>
            </li>
            <li>
              <t>Entry: <tt>key7</tt> → record hash link <tt>0x0171122d9aa87e...</tt></t>
            </li>
            <li>
              <t>Right subtree: hash link <tt>0x01711247e2886f...</tt></t>
            </li>
            <li>
              <t>Entry: <tt>key10</tt> → record hash link <tt>0x01711210b6da2c...</tt></t>
            </li>
          </ul>
          <t>This node would be encoded as follows:</t>
          <sourcecode type="json"><![CDATA[
{
        l: 0x017112643b9326...
        e: [
                {
                        p: 0,
                        k: "key7",
                        v: 0x0171122d9aa87e...
                        t: 0x01711247e2886f...
                },
                {
                        p: 3,
                        k: "10",
                        v: 0x01711210b6da2c...
                        t: null
                }
        ]
{
]]></sourcecode>
        </section>
      </section>
      <section anchor="signatures">
        <name>Commit Signatures</name>
        <t>Commit objects are signed by the key declared by the repository owner’s resolvable identifier. Neither the signature nor the signed commit object contains information about the curve type or specific public key used for signing. This information must be obtained by resolving the repository's DID as specified in <xref target="user-ids"/>.</t>
        <t>The most recent commit must always be verifiable using the currently resolvable signing key. When rotating signing keys, a new repository commit must be created, even if the contents and structure of the repository remain unchanged.</t>
        <section anchor="sig-gen">
          <name>Signature Generation</name>
          <t>To generate a commit signature:</t>
          <ol spacing="normal" type="1"><li>
              <t>Populate all commit data fields except the <tt>sig</tt> field</t>
            </li>
            <li>
              <t>Serialize the unsigned commit using deterministic CBOR encoding (see <xref target="cbor"/>)</t>
            </li>
            <li>
              <t>Compute the SHA-256 hash of the serialized bytes</t>
            </li>
            <li>
              <t>Sign the hash using the current signing key associated with the repository's DID</t>
            </li>
            <li>
              <t>Format the signature as a concatenation of the 32-byte <tt>r</tt> and 32-byte <tt>s</tt> values</t>
            </li>
            <li>
              <t>Add the resulting 64-byte signature to the commit object as the <tt>sig</tt> field</t>
            </li>
          </ol>
        </section>
        <section anchor="sig-curves">
          <name>Supported Curves</name>
          <t>AT implementations must support both of the following elliptic curves and signature algorithms:</t>
          <ul spacing="normal">
            <li>
              <t>NIST P-256 (also known as secp256r1 or p256) <xref target="SEC2"/></t>
            </li>
            <li>
              <t>secp256k1 (also known as k256) <xref target="SEC2"/></t>
            </li>
          </ul>
        </section>
        <section anchor="sig-canonicalization">
          <name>Signature Canonicalization</name>
          <t>ECDSA signatures exhibit malleability, allowing transformation into distinct but equally valid signatures without access to the private key or original data. While the security impact is limited, signature malleability could enable broadcast of multiple valid versions of the same repository commit with different hashes, potentially causing synchronization confusion.</t>
          <t>To prevent such scenarios, AT requires all ECDSA signatures to be canonicalized in low-S form. Specifically, the <tt>s</tt> component of the signature must satisfy <tt>s ≤ n/2</tt>, where <tt>n</tt> is the order of the curve's base point.</t>
        </section>
      </section>
      <section anchor="cbor">
        <name>Deterministic CBOR Encoding</name>
        <t>Repository content requires consistent binary representation across all implementations to ensure identical content hashes and verifiable integrity. All records, MST nodes, and commits must be encoded using Deterministically Encoded CBOR as specified in <xref section="4.2" sectionFormat="of" target="CBOR"/>, with map key ordering following the original specification in <xref section="3.9" sectionFormat="of" target="RFC7049"/> for historical compatibility.</t>
        <t>For interoperability purposes, hash links between repository objects are encoded using a specific format within the CBOR structure. SHA-256 hash links are represented as CBOR byte strings under tag 42, with the byte string containing the 32-byte hash value prefixed by the fixed byte sequence <tt>0x017112</tt>.</t>
        <t>Hash links that point to arbitrary binary data instead of other repository objects should be encoded similarly though prefixed by the fixed byte sequence <tt>0x015512</tt>.</t>
      </section>
      <section anchor="serialization">
        <name>Repository Serialization Format</name>
        <t>Repositories are serialized for transmission and storage as a concatenated sequence of block data, where blocks represent the CBOR-encoded records, MST nodes, and commit objects that comprise the repository structure. The serialization is prefixed with a header that identifies the root block, typically the repository's commit object.</t>
        <t>Serialized repositories may contain partial repository state, such as when transmitting cryptographic proofs for specific records. In these situations, they may not include unrelated MST nodes or records outside the proof path.</t>
        <section anchor="serialization-header">
          <name>Header Format</name>
          <t>The header is constructed by CBOR-encoding an object with the following fields:</t>
          <ul spacing="normal">
            <li>
              <t><tt>version</tt> (integer, required): Fixed value of <tt>1</tt></t>
            </li>
            <li>
              <t><tt>root</tt> (array, required): Single-element array containing the hash link of the commit block</t>
            </li>
          </ul>
          <t>The CBOR-encoded header is prefixed with its byte length encoded as an unsigned LEB128 integer as described in Section 7.6 of <xref target="DWARF"/>.</t>
        </section>
        <section anchor="serialization-blocks">
          <name>Block Format</name>
          <t>Following the header, each repository block is serialized by concatenating:</t>
          <ol spacing="normal" type="1"><li>
              <t>The combined byte length of the following two components, encoded as an unsigned LEB128 integer</t>
            </li>
            <li>
              <t>The block's content hash, prefixed with <tt>0x017112</tt> as specified in <xref target="cbor"/></t>
            </li>
            <li>
              <t>The CBOR-encoded block data</t>
            </li>
          </ol>
          <figure anchor="f-serialization">
            <name>Repo Serialization Layout</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="568" viewBox="0 0 568 64" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 16,32 L 64,32" fill="none" stroke="black"/>
                  <path d="M 136,32 L 184,32" fill="none" stroke="black"/>
                  <path d="M 216,32 L 352,32" fill="none" stroke="black"/>
                  <path d="M 408,32 L 544,32" fill="none" stroke="black"/>
                  <g class="text">
                    <text x="8" y="36">|</text>
                    <text x="100" y="36">Header</text>
                    <text x="192" y="36">|</text>
                    <text x="208" y="36">|</text>
                    <text x="380" y="36">Data</text>
                    <text x="552" y="36">|</text>
                    <text x="8" y="52">[</text>
                    <text x="32" y="52">int</text>
                    <text x="56" y="52">|</text>
                    <text x="92" y="52">Header</text>
                    <text x="144" y="52">block</text>
                    <text x="176" y="52">]</text>
                    <text x="192" y="52">[</text>
                    <text x="216" y="52">int</text>
                    <text x="240" y="52">|</text>
                    <text x="268" y="52">hash</text>
                    <text x="296" y="52">|</text>
                    <text x="328" y="52">block</text>
                    <text x="360" y="52">]</text>
                    <text x="376" y="52">[</text>
                    <text x="400" y="52">int</text>
                    <text x="424" y="52">|</text>
                    <text x="452" y="52">hash</text>
                    <text x="480" y="52">|</text>
                    <text x="512" y="52">block</text>
                    <text x="544" y="52">]</text>
                    <text x="560" y="52">…</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
|------- Header -------| |------------------ Data ------------------|
[ int | Header block ] [ int | hash | block ] [ int | hash | block ] …
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="serialization-ordering">
          <name>Block Ordering</name>
          <t>Block ordering should follow preorder traversal of the included repository portion when possible, though parsers must be tolerant of other or unexpected orderings.</t>
          <t>Preorder traversal enables streaming verification of repositories, allowing parsers to walk the MST structure and output key-to-record mappings while maintaining minimal MST state in memory. This approach supports efficient processing of large repositories without requiring complete buffering of the serialized data.</t>
        </section>
      </section>
    </section>
    <section anchor="sync">
      <name>Synchronization</name>
      <t>The AT synchronization model operates on the principle that any participant can independently verify repository updates. This allows sync to occur between any client and server without requiring that the server is a canonical or trusted host.</t>
      <t>AT supports multiple synchronization patterns: full repository synchronization for complete replicas, partial synchronization for specific record subsets, and proof-only synchronization for cryptographic verification without content retrieval.</t>
      <t>The typical synchronization workflow establishes baseline state through full synchronization, then maintains currency through incremental updates. Full synchronization is performed by fetching a complete serialized repository over HTTPS.</t>
      <section anchor="revs">
        <name>Repository Revisions</name>
        <t>Each repository maintains a <tt>rev</tt> field (short for “revision”) that functions as a logical clock for the progression of the contents of the repository over time. The revision value is a short string value that must increase lexicographically with each new commit.</t>
        <t>Revisions may be used when comparing two repositories, especially when obtained from a non-canonical host, to determine which is more recent.</t>
        <section anchor="tids">
          <name>Timestamp Identifier Format</name>
          <t>The recommended mechanism for generating revision values is the Timestamp Identifier (TID) format.</t>
          <t>TIDs provide a standardized revision format with the following properties:</t>
          <ul spacing="normal">
            <li>
              <t>64-bit integer with big-endian byte ordering</t>
            </li>
            <li>
              <t>Base32-sortable encoding using characters <tt>234567abcdefghijklmnopqrstuvwxyz</tt></t>
            </li>
            <li>
              <t>Fixed 13-character length with no padding (integer zero encodes as <tt>2222222222222</tt>)</t>
            </li>
          </ul>
          <t>The layout of the 64-bit integer is:</t>
          <ul spacing="normal">
            <li>
              <t>The top bit is always 0</t>
            </li>
            <li>
              <t>The next 53 bits represent microseconds since the UNIX epoch. 53 bits is chosen as the maximum safe integer precision in a 64-bit floating point number, as used by Javascript.</t>
            </li>
            <li>
              <t>The final 10 bits are a random "clock identifier."</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="diffs">
        <name>Repository Diffs</name>
        <t>Repository diffs enable efficient synchronization by containing only the data that changed between two repository revisions. A diff includes the commit object, MST nodes, and records that differ between an older baseline revision and the current revision. Applying a diff to the baseline repository reconstructs the complete current repository state.</t>
        <t>Diffs use the same serialization format as complete repositories, with the commit block serving as the root. A diff must include:</t>
        <ul spacing="normal">
          <li>
            <t>The new commit block</t>
          </li>
          <li>
            <t>All created and updated record blocks</t>
          </li>
          <li>
            <t>All MST nodes in the current repository that did not exist in the baseline revision</t>
          </li>
        </ul>
        <t>Required blocks must be included in the diff regardless of their presence in earlier repository history. For example, if an MST node was previously present in the repository, then deleted, and subsequently reintroduced during the range that the diff represents, then the diff must include that block even though it appeared in prior revisions.</t>
        <t>Deleted records and past versions of updated records are excluded from diffs.</t>
        <t>With the exception of deleted record data, the diff may include additional blocks which receivers should ignore.</t>
      </section>
      <section anchor="diff-limits">
        <name>Diff Verification Limitations</name>
        <t>Repository diffs present verification challenges for consumers who do not maintain complete repository state. These consumers often wish to authenticate repository content and utilize records without persisting the entire repository structure, making diffs an attractive option for lightweight verification.</t>
        <t>Diffs partially support this use case by providing a signed commit and the relevant portions of the Merkle tree, creating a verifiable proof chain for record creations, updates, and deletions. When a recipient possesses both a diff and a corresponding list of operations, they can use the diff contents to cryptographically verify that the operations are authentic.</t>
        <t>However, observers without knowledge of the complete baseline repository state cannot reliably enumerate all operations by examining the diff contents alone. While comprehensive diffs  reveal created or updated records by traversing to the leaf nodes, they provide no information about deletion operations that occurred during the period that the diff represents.</t>
        <t>This means that while diffs enable verification of a known operation list, they cannot be used to exhaustively reconstruct the complete operation list from diff contents alone. However, if a recipient has a complete repository structure from some prior revision and receives a diff representing changes since that revision, they can compute the complete set of operations that occurred between the two versions.</t>
        <t>This asymmetry means diffs alone cannot substitute for complete state tracking when comprehensive operation enumeration is required. An efficient mechanism for cross-verification of a diff and enumerated operation list against the prior repository commit state is described in {#streaming-validation}.</t>
      </section>
    </section>
    <section anchor="realtime">
      <name>Real-time synchronization</name>
      <t>AT supports real-time synchronization, enabling applications to receive repository updates with minimal latency through a pull-based WebSocket connection.</t>
      <t>Real-time streams of repository updates are often referred to as the “firehose”. The firehose delivers events containing repository diffs along with supporting metadata necessary for verification and processing.</t>
      <t>Each event includes a monotonic cursor that establishes a total ordering across all repository changes from a given host. This ordering enables reliable event replay and ensures that consumers can maintain consistent state even when reconnecting after network interruptions.</t>
      <t>AT allows consumers to maintain fully-verified copies of repository records without storing the underlying Merkle tree structure, providing an efficient method for applications that need authenticated content access without the overhead of complete repository replication.</t>
      <section anchor="cursors">
        <name>Cursors</name>
        <t>Real-time synchronization streams include per-message cursors to improve transmission reliability. Cursors are positive integers that increase monotonically across the stream. Cursor semantics are flexible, and they may contain arbitrary gaps between consecutive messages.</t>
        <t>Consumers track the last cursor value they successfully processed and can specify this cursor when reconnecting to receive any missed messages within the provider's rollback window. Providers maintain no persistent consumer state across connections, relying entirely on the cursor values supplied by consumers during reconnection.</t>
        <t>Stream behavior depends on the cursor value specified during connection:</t>
        <ul spacing="normal">
          <li>
            <t><strong>No cursor specified</strong>: The provider begins transmitting from the current stream position, providing only new messages generated after the connection is established.</t>
          </li>
          <li>
            <t><strong>Future cursor</strong>: When the requested cursor exceeds the current stream cursor, the provider sends an error message and closes the connection.</t>
          </li>
          <li>
            <t><strong>Cursor within rollback window</strong>: The provider transmits all persisted messages with cursor numbers greater than or equal to the requested cursor, then continues with the real-time stream once caught up.</t>
          </li>
          <li>
            <t><strong>Cursor older than rollback window</strong>: The provider sends an informational message indicating that the requested cursor is too old, then begins transmission at the oldest available event, sends the entire rollback window, and continues with the real-time stream.</t>
          </li>
          <li>
            <t><strong>Cursor value of 0</strong>: The provider treats this as a request for the complete available history, starting at the oldest available event, transmitting the entire rollback window, then continuing with the real-time stream.</t>
          </li>
        </ul>
      </section>
      <section anchor="streaming-events">
        <name>Streaming Events</name>
        <t>The real-time stream delivers two types of events: <tt>commit</tt> and <tt>sync</tt>.</t>
        <section anchor="commit-events">
          <name>Commit Events</name>
          <t>Commit events represent an atomic set of repository modifications and consist of a repository diff combined with some supporting metadata.</t>
          <t>The diff MUST include the new commit and all blocks in the Merkle proof chain for any modified key, as well as blocks for keys directly adjacent to the modified keys. The rationale for including adjacent keys is detailed in <xref target="streaming-validation"/>.</t>
          <t>The metadata provides additional context required for processing and verification and includes:</t>
          <ul spacing="normal">
            <li>
              <t>The revision of the repository after the modifications</t>
            </li>
            <li>
              <t>The revision of the repository before the diff</t>
            </li>
            <li>
              <t>The root hash of the repository MST before the diff</t>
            </li>
            <li>
              <t>A description of the operations contained in the diff with each containing
              </t>
              <ul spacing="normal">
                <li>
                  <t>the key</t>
                </li>
                <li>
                  <t>the hash of the new record at the key (in the case of a create/update)</t>
                </li>
                <li>
                  <t>the hash of the old record at the key (in the case of an update/delete)</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>A single commit events must contain no more than 200 repository operations and the full serialized event should be no larger than 2MB. Mutations that do not fit in these limits should instead be communicated through Sync Events.</t>
        </section>
        <section anchor="sync-events">
          <name>Sync Events</name>
          <t>Sync events declare the current state of a repository, regardless of the previous state.</t>
          <t>Sync events are emitted when commit events cannot adequately describe the transition between repository revisions. This may occur in several scenarios:</t>
          <ul spacing="normal">
            <li>
              <t>Large mutations that exceed the practical size limits for commit events</t>
            </li>
            <li>
              <t>Data loss or corruption that breaks the continuity of commit history</t>
            </li>
            <li>
              <t>Account migration between different infrastructure providers</t>
            </li>
          </ul>
          <t>In these cases, a sync event provides a reset point that encourages consumers to resynchronize against the current authoritative state without requiring knowledge of the intervening changes.</t>
        </section>
      </section>
      <section anchor="streaming-validation">
        <name>Commit Validation</name>
        <t>Commit validation occurs through a two-step process that ensures both the validity of the repository transition and the consumer's resulting synchronization state.</t>
        <t>First, the consumer validates that the commit represents a valid transition from a previous repository revision (<tt>revA</tt>) to the new revision (<tt>revB</tt>). Second, the consumer confirms that they last observed the repository at <tt>revA</tt>. Together, these steps establish that the repository is now definitively at <tt>revB</tt>.</t>
        <t>The validation process inverts all operations against the partial MST provided in the diff. That is, each “create” operation will be inverted as a “delete” operation on the same key and applied to the tree. Each “delete” will become a “create” of the same record, and every “update” will be updated back to the previous value.</t>
        <t>If the operation list is complete and accurate, applying the inverse operations will reconstruct the tree state as it existed before the commit. The hash of this reconstructed tree must match the previous root hash of the MST as specified in the commit event. If the hashes match then the provided list of operations is accurate and exhaustive.</t>
        <t>Because the previous MST root hash is included in the commit event, commits can be validated for internal consistency independent of any local state. If the operation inversion process fails to produce a tree hash matching the declared previous root, the entire commit event should be treated as invalid.</t>
        <t>If the commit is internally consistent but its declared previous root does not match the previous MST root stored locally, then the consumer has become desynchronized, indicating missed events or a disjunction in the producer’s commit history.</t>
      </section>
      <section anchor="resync">
        <name>Re-synchronization</name>
        <t>When a consumer detects desynchronization, either through a disjunction in commit history or a <tt>sync</tt> event that does not match their local state, they must perform a complete re-synchronization process to restore consistency with the current repository state.</t>
        <t>Re-synchronization requires fetching and processing the full repository structure, though the record contents themselves are optional depending on the consumer's needs. If the repository data is delivered in pre-order traversal, it can be validated incrementally as it streams in, producing a mapping of keys to record hashes that represents the complete repository state.</t>
        <t>This key-to-hash mapping can be compared against existing local state to identify discrepancies and verify the integrity of the re-synchronization. Once validated, this mapping establishes the new baseline state against which future commit events can be applied.</t>
        <t>During the re-synchronization process, any incoming commit events for the repository should be buffered rather than processed immediately. Once re-synchronization completes successfully, these buffered commits can be validated and applied in sequence to bring the consumer fully up to date with the current repository state.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>Repositories constitute untrusted input as account holders have complete control over repository contents and repository hosts control binary encoding. Implementations must handle potential denial of service vectors from both malicious actors and accidental conditions such as corrupted data or implementation bugs.</t>
      <section anchor="security-cbor">
        <name>CBOR Processing limits</name>
        <t>Generic precautions must be followed when processing CBOR data, including enforcement of maximum serialized object size, maximum recursion depth for nested structures, and memory budget limits for deserialized data. While some CBOR implementations include these protections by default, implementations should verify and configure appropriate limits regardless of library defaults.</t>
      </section>
      <section anchor="security-mst">
        <name>MST Structure Attacks</name>
        <t>The efficiency of MST data structures depends on a uniform distribution of key hashes. Since account holders control record keys, they can perform key mining to generate sets of keys with specific layer assignments and sorting characteristics, resulting in inefficient tree structures. Such attacks can cause excessive storage overhead and network amplification during synchronization.</t>
        <t>To mitigate these attacks, implementations should:</t>
        <ul spacing="normal">
          <li>
            <t>Limit the number of entries per MST node to a statistically reasonable maximum</t>
          </li>
          <li>
            <t>Impose limits on overall repository height</t>
          </li>
          <li>
            <t>Monitor and restrict other structural parameters that could be exploited through sophisticated key mining</t>
          </li>
        </ul>
      </section>
      <section anchor="security-import">
        <name>Repository Import Validation</name>
        <t>When importing repositories, implementations should verify the completeness and integrity of the repository structure. Serialized repositories may contain additional unrelated blocks beyond those required for the repository structure. Care should be taken during storage to avoid resource waste on unreferenced blocks and to prevent potential storage exhaustion attacks.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="CBOR">
          <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="RFC7049">
          <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="October" year="2013"/>
            <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>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7049"/>
          <seriesInfo name="DOI" value="10.17487/RFC7049"/>
        </reference>
        <reference anchor="DID" target="https://www.w3.org/TR/2022/REC-did-core-20220719/">
          <front>
            <title>Decentralized Identifiers  (DIDs) v1.0</title>
            <author fullname="Manu Sporny">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Dave Longley">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Markus Sabadello">
              <organization>Danube Tech</organization>
            </author>
            <author fullname="Drummond Reed">
              <organization>Evernym/Avast</organization>
            </author>
            <author fullname="Orie Steele">
              <organization>Transmute</organization>
            </author>
            <author fullname="Christopher Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <date year="2022" month="July"/>
          </front>
        </reference>
        <reference anchor="CONTROLLEDID" target="https://www.w3.org/TR/2025/REC-cid-1.0-20250515/">
          <front>
            <title>Controlled Identifiers v1.0</title>
            <author fullname="Dave Longley">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Manu Sporny">
              <organization>Digital Bazaar</organization>
            </author>
            <author fullname="Markus Sabadello">
              <organization>Danube Tech</organization>
            </author>
            <author fullname="Drummond Reed">
              <organization>Evernym/Avast</organization>
            </author>
            <author fullname="Orie Steele">
              <organization>Transmute</organization>
            </author>
            <author fullname="Christopher Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <date year="2025" month="May"/>
          </front>
        </reference>
        <reference anchor="DWARF" target="https://dwarfstd.org/doc/DWARF5.pdf">
          <front>
            <title>DWARF Debugging Information Format Version 5</title>
            <author>
              <organization>DWARF Debugging Information Format Committee</organization>
            </author>
            <date year="2017" month="February"/>
          </front>
        </reference>
        <reference anchor="SEC2" target="https://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters</title>
            <author>
              <organization>Standards for Efficient Cryptography Group</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="MST" target="https://inria.hal.science/hal-02303490/document">
          <front>
            <title>Merkle Search Trees: Efficient State-Based CRDTs in Open Networks</title>
            <author fullname="Alex Auvolat">
              <organization/>
            </author>
            <author fullname="François Taïani">
              <organization/>
            </author>
            <date year="2019" month="October"/>
          </front>
        </reference>
        <reference anchor="AT-ARCH">
          <front>
            <title>Authenticated Transfer: Architecture Overview</title>
            <author fullname="Bryan Newbold">
              <organization>Bluesky Social</organization>
            </author>
            <author fullname="Daniel Holmgren">
              <organization>Bluesky Social</organization>
            </author>
            <date year="2025" month="September"/>
          </front>
        </reference>
        <reference anchor="DIDWEB" target="https://w3c-ccg.github.io/did-method-web/">
          <front>
            <title>did:web Method Specification (Draft)</title>
            <author fullname="Christian Gribneau">
              <organization>Ology Newswire, Inc.</organization>
            </author>
            <author fullname="Michael Prorock">
              <organization>mesur.io</organization>
            </author>
            <author fullname="Orie Steele">
              <organization>Transmute</organization>
            </author>
            <author fullname="Oliver Terbu">
              <organization>Consensys</organization>
            </author>
            <author fullname="Mike Xu">
              <organization>Consensys</organization>
            </author>
            <author fullname="Dmitri Zagidulin">
              <organization>Digital Bazaar</organization>
            </author>
            <date year="2024" month="July"/>
          </front>
        </reference>
        <reference anchor="DIDPLC" target="https://web.plc.directory/spec/v0.1/did-plc">
          <front>
            <title>did:plc Method Specification v0.1</title>
            <author fullname="Daniel Holmgren">
              <organization>Bluesky Social</organization>
            </author>
            <date year="2023" month="May"/>
          </front>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAH3yxmgAA+19W48bR5bmO39FQnqwZJBUVUmyrQIGWKlKsjQtWYaquj3Y
RgMMZgbJdCUz2RnJKtFSNfy0wL7u2wLdwDwsdh/3P8z8E/+SPde4ZJKSemcG
2IcVDLhIZkZGnDiX71zi5GQyGXVlV9nT7M7TbbeydVfmprNFdtma2i1sm72z
m8aVXdPuMlMX2cWuzldtU5e/mK5s6jsjM5+39hrvv6Rr/VV3RjjSEm48zVxX
jEZFk9dmDY8qWrPoJqumWi9bW09MN2n9QyZHRyO3na9L52D4breB6189v3wx
qrfruW1PR9tNAcO60xH+73SUN7WztdvCFzCJo5FprcHJbDYVrgTGcDSjd9ZU
k8tybbOncMWd0U3TXi3bZrs5HV3ZHXwqYABbb2HILFuW3Wo7h2Hm1da6q93E
NXlpqgel7RYTmr27MxoZIFgDM8omcEuWLbZVxes7N3Vpq+ylLJB+bdqlUaKd
Zs943OyCxqUL7NqUFdCG7v1P8uAbO5++3/0yfMSzdmfq7Ad7M2+q4u96wBzv
7I8/qpt2Dbde0/LPnr19d5q9e3H23ZNHT+Az/PXt0aMnp/oHfHX+6vyURlXu
Obc5ME9rqvIX4J5XBXLSorSty7J7cLG7n10fT4/u0D20c9k/bqtddnJ0csLj
mHZpu9Ns1XUbd/rgwc3NzfTm4RRW9eDy3QO87MG752eToiwmedPaCX5z9O3x
kwd0t98K+jeR/8cEe2PqbXaxadp6539NSXZewrabKntmfjGm/cRQ5+baZq+b
elnZf/NYb0x7tXXZhZmbwlZVc2g8mP3cZpc2X31qYu12vW6I2W1xYKTn1xZI
sH7w9Nq47hNjvW1Lm1101lb2wEikIdbbzn5ilLNVW7qu2axAkTytKpGFfeza
5Ff5ypR1dtbgGhyy4dsfLt+9ff36+YDZzkAztA2Ml3Jan8PeGGKwx1/GYI+J
wXJgMBgG+evx0ePjx1/KX/++TPHvxqv/n78O89f5T0/fvUgYi77Jzu18u1yW
9TJ7VS9YLzZ19oL+yv4AjIYfH0d89sLO261pkdmOv93LbMWNaRdgBIndwA4+
oCc9nm6KxSf5q7dLn58erq7sgKwwxMXzs5NUbuCb7ATUuM3hMlsXID/Pq6rc
gNHPzrYtcPB5s0Yi/WhaoG8Ha000NnCJLPPooEw5my9pmfDHyeT65O9c40UH
1tq0hctgbdnzxaLMS5Dw7Kzdbbpm2ZrNapd9j4Z7NCp1/Wy23lxcpst9Y9ur
CrjMmjZfAT9ZgA3RkPCozk6eGQdkOHt3fukyWPnbjUW72iE+SBb/Nu8aACC4
+Cd7F1/WbWmmK1NNHY6f2wfw9+To5OHRw0dPjnDXt0Dz7gv1ydPKvs+ebq+b
ynxKjF6AkPzr/2pKl12af/3fQEe45unl5Om7s5cpLfajO3gOkKbsbN5tW5u9
BeG9Lu1NvG4GazUjDcRqJrrjCxczRCv7RHSAWA5p2iG6+oLhwIj89PxZShRA
E6cAgbI3FlYAqHVjczAlDBsBtuDK7++DLI/2c//DfJID8zN6nJbNA0Qraxp7
Ao/5UlPCSq0Ein3flvPamu2BNb6tmuUOyepuytaOQR/k00/ZghI0IFDux7Zp
QR0eGHRt3baFyf+H6+63FchtCzannR9a4BmD+5375KqubPZP/5YRzkFjtmX2
n82yLLZVeYijBjYXOOrH12dDjtpU+X6Ouj6aHu/BJw/3cxNAcxhpWsDW5ugZ
PXAw2AMcg/gKfvtiaPJ/ITDT6XQ0mkwmmZk7gPV5NxpdrkDNqBrLHC/NugwU
S9amXqJLvcTMgfOByoe1+gFP897Ty/vjzGSbtumavKno2jzofbi+qnYTYBp4
rpmDZgfT35qlpUcWIDMgLlt6XrOA39ot6agi2zrbgtfgMSNQ30yzV11W2EVZ
ywrAfY0W0a3AmMJt1/Cr4QsWWzBMuHTgARzBP33dALSi8RbbtkMoEmjTJ8Qa
EBYQ3a0dPwJW1Nxk1tuk/iqiKeGNS5xsA3YKTLN1SL2NaTt40PTA9hDJYJ2m
ctkN6KVDm+WJPiUjAHdlNRvBLNb3GT7CuhymCM/W5YLZ/PBBrM7trfDNuiwK
0A+ju6CWgPAFbAau6cNd2o2yuMUZ20/xwueYyvOJKQqghpONBDohEkRSAQHn
27IqECwViYNq4vgA7URr/7wFUcswoACbQJuBuwyT0Cszk7eNc2GTYKD1turK
Ce7CDuiwaI3nuymupijxRuAYNDMbsOWIWFyGIKtDoIXE4OcgM2SuRAfCkx5Q
Kz14DGJg4S9YxjXANhALxLMTuB/pUpWgwPA3Ggw4ss53WYO6FchRwvCiuEpy
lTom5mY7r0q3ghWgYMAPsG2vapUEYulxNDvYd2R3uBweOpBJmPeyht/8hrFa
gCXlYMXAsVg1yKzjaAvxUyK2cPscpwaM3qw3sFgScJTANrtZlfBhA5uM+AQ3
kyimrKNrouk2NzXA1lW5mWbPDcC+WIJ4a4kvgNa2wz8w2DEBkjWIhpv5z8Do
LsNV0XryBqDoWFUlfAWwrMyTtcOsMUwF243MF5Mm6CCWc9ebDJKd5HmOMjmJ
SYHLyWH6gSrKEyTwebkBfUoS3WyVd5Ew8EDX4R6RiljbokTAjuRnFWGHqnkH
W7NGYboGBnGRLop0FWpiuGJjlsyF0TocomivnERCkI1kwrDp2w34snTfvOlw
RwAXdxiKg/VasybW5agerXu+ra6G0wTpNW3ZOKazl31ksMKiegKk2mw2uIkt
EWZlqyIZ1y8x3ST4ulnwElHtNRtQf6QXxkDEvNoWvGDkBHhSZeU3DDoyyYnP
4TtQvK2jCXnxNnm+bZE+tJ/A13C7zRBiu552JzL+v6XF78ax3w938XmgtJ/W
PVPpyQoiBdsMI15ZsNIG8ARz4cLkFkQYLFZG38KV8OdeuWstKH/4DDJhnIrf
NEuiuTQmABKmRE/lgGO4XCExyYkEt+7359GOiiJB6oExt221ww0UNxF40UYS
C+wGGqjPLAw+xBygGgESg7L036GUxRFzAmeon4DkYLCNKl2d6eGwKUdNh0qs
REBC8WgkNdHAvgdyAIM0tUVQOsZl0k2uqa4ZMXQD3QSbBHwKpAS0B1ySgwFF
VYFiQIvcJXKuEMOmPKvE8jzgLPEdmORrUFCGjPA1MVdRwhVbE4yF7PkpwIXs
ogTRwIUT82TAxUxhJZO3jFGioIJHVTSYoTnAHq/I5oEAMuf0L3HwpLN9sk+i
mAg4XiniCgDRZcutAWgCLo/YNeYOWANbKKKxqCHVPeOMkhj1Es1HBmq6oB0T
pu5LusqjQ+pThGn2cIYTG2JTDnpMs2eoTMEoXpfN1t/GwlVY+J4gFVtZJK8l
7MpyUDRZ3XSw7SxroqHxWWsU/ETyLzx2Zx0w8WD+FnmdVsMPLWEJqN+2dclG
1uMHUJfIxonM07yU4dnM4Z1/BrWBPIBkLOuepmPln0qDAyu5NhOzrMHKwZ4m
qp6Ae4PIXXBYZXYwJ+TyVbkEfhEeIUBBqIdtRYQPg/MSyzaBeyFbYG5lo0jl
gB67saAl4P9z0wERbkAfKBtRBoox5AbZKdxG+inwfU5xPeIkER/wrgUbinjH
VPoJgBGtgaSYn5sYth4/OIARYC3JplmeGg/pcGowhNp3wXOmAMQB7AXS3FrC
ZbVqI9mzAzDjngMl++EDL2cCpAcEdHt7Hyj7jCARfkGLaiPGCuhri+QAqqxA
RZJFA8uYgYEjAE5sE3SSoD28gfBejs4fOyGe7VrebN02GGCavfN/I07f4XJh
K8prNJVts84QuYAmX28cyTUpnXUD4gSLZUMNsAFwDU2VDV4fLdT2Jlkg4Ee5
FVwZFkmk4RBrtsCz3Rr4PKO9xrUEmgPUD2tM7ZCCunwHUyFQIRNlOAlEHOxX
2W2VW+agAxco0rR+4lk2DlWs0WAlKGh7Zu3AQalMSyRFCQah9YMIMEaB1K3D
2awMUWuvElDv22PrGucADuZ+aAeP/4WsV0+t+ftVrekXCHIuU2CRcqFBrPPH
YXT5T/f+zljw/ezehw9vLi5BAtiSm8O+FYuMIKQ6Z14S1ALL7MQ8w2hDaxyH
LhDGW4oZENEjsgYFAYjLkcSQizJR/7oIRAcV0nmIFFyGPjziSIvOS2GxS3mE
5BY4yLZkLGlUXN4efoAhg2PTyerrpvCLSTiSYjLAbLDkuZmXFWoDoamtFpO5
qQwREtTqYkFPj71/oAZZWtg9VH8IOS0FZnOkT6GefbWjfcD12ferco5yAmYM
nVJAABZYRqUevbgl6JFaXU9SMci9AotvSrQT1Y3Z0ZyRo1mXwt714SkxPWx7
tjIOod4S4G6FSIVI5HCHcQuQqqkq8H6nIZDLtpj1KgKYFtwxWiQZa3TASwSn
Ev+oi74YcHgSP+W7HExmRpsqcJ8ENcX2SE3CAo2gNQZ4MitajWUfz1n6NIkw
QjzemAcM3sKdOQZF3PiOuG1IO6RZQUYAgBl66e5UBckPgztHTIXwgHhpHKIJ
ykmj0WuMz2bzsjZeA21hGfDgck04F+8hvswWZSU6A0GWxE2YUJUHNgm0zl7V
wHQGIyQ4aC/kYt/z7Kqd6DohJAVjVPsSfiJmAOG5YnX3e1xC7FT46Btjty/3
U4x4E4R6iTKRDdVwJ82np6uF2vfU5pO1R0BrAYI0wOif84CQwhynLdhFhW9v
b0ncO7Qkm20LD0PXGS8nqi8rkHeklsDJMhpUYn3kGSHjwE3ZuahjR2wICoo0
wWFvicSA7b7tDMeiei4ZUiE8FkEFPJGjuqo1ATXaDSZh9+jNAQGdj/XoTSBH
cG0S05RNZF+t7zeuMTAUyWDfZ8RFkWAiRQT39FcFpCPwgTclPonGlsBUIe2Q
Wj3jostArvbsEpl3fKqaxa9cNospwsmUGexta8QFwCfg0mVdK6y+AGg6K+Ey
GJqwLAVuYPjZXdNRYGQmwNjjbZidozhjQn/O2DErCbYdImZ6LAgCexhlC59A
i5eFzIqcG/BIYAi3BScR2LAmumn8CsOvwlY40ryvi3HYGV/1O7t7gzOeG2dn
4v2hVCRi9+FDXC5ze8uPiTfEzxh3TxxL/d1US+Sc1ToODNGocMUkx9IARzEh
3KY28DLyCbh827YmZ0go1FIo3JcmzO0Oi0a6dD5xdA28CgbPMcdg0BJ/1CA4
quWKFCEm/PtKiIK0CAAsBh4ocFwim9fFpgHtTtGLRh0cUvcEdxAVoKEmbsbw
K1oq7w43PgDHUsGMMcVaCZAiFB+5FP2xiGtmklieER/MJCk4U+81kC9EWCmE
F2cLnag4tIPx2L394bQ2KEQcgD7++PqMw3d3pRokeysW+MNd1cGj0VliBTnQ
rpkuVSRMaEIZwC82VSjjYCeG6tIH4SNvnD23KHsXlJH4OxxKJmctDm5iYoSj
3lv0Img/ydKAIybxMbEyGFDhZEfAzfNd3yTR5CQiK3jU6/E9gTCf/BmmoIDK
T1M8EYbkyAN6Nz5hQYqJA15ff41cMfv663/553vIdghCJQNV3D8NfLLf4O6z
NjHFBlLsrf4tP1uCRfx8lIalbZMJvOuHmzS+NIZVvLcCWWGv/uWfYbiHNJDw
a5azdKTsLGsGMvBDPVJJHvsSv6UNRmwocQ3hv3SRv/363x1BNw+J+QmtvT5I
1WhRGDVzvVAAQQNwlXIfuDGgfJakl3LElgzxOMFCHr7tOf4S3YDBOahBM9r4
KUVrrrdVhVsLs3q7kdBUb90+spcy2ABigbVcYREcp4jLGo0cRrkFBRfEyXOT
X91gRFyTa6T3mHs04HiSYNIxwys2pvBHiFHMcPIznIje+bBvHnnlIIG88PkO
UyBovZP9SGOxIZKruUtdubosU6+2wrVLW4vXyp5ULLGgdwAkY+BXNCdIZhUb
NrhZVSWyEhaLEDdxonrtutvgVAfXi7InkafEkRnLHhvBCYqTBHcv5EPWZrMh
rmT/iB1A8hPqCQDiDrOJHbl5cFXiG+JVnn+C6qTAs3d3OaSceHF5vCY2fwKC
mfORuct6s0WTiU7hAe/zy13NSwlKfOViBz6uNREIC783lSUISs8hYni8hZ5T
o6xOATkhBHyzC+vXUGdykUYrx5KHvEncS5/IhMG2G+/h+GAKhxMi5TPO5tvO
/47rWpkNe+B4bbq21lIBJWgRmkNB3HWXwkNJyAmYK4k4kRlDPqMhvRUBDVQ6
DRYIEyHCLMXhTBkhB8EvEHDiRIEfnkdXyrfEP8xOGo5hiUhDMrSbY0H9VcWb
gwlNut+G4Rbwaz9ShwuHJYAVcJuGYTiRE5gO7wYKavSSEZHGflhgbSGBxsou
wHEchhMJbd8nxsdw6L5LKgNXAOl/pwIGFpPhAE6EyIBhfwzJY1iroYVRZkAY
CLQk5eE54isOByAnWy2m2Q/EIZgFwk3jBILsWCCWN8wpIaKnjCUdme4Mw5uu
ET6MPFIalo0UPkUo7hFquoEtx+uRc8k5AhwCz42eTkGsnw06kCHWDerJmjaJ
46P041RYCozeokzm3RdnAaMZLeOAnQb7yJ5i8NVgVWjV6P6gG8x6Xi63YI5E
Vl7TJM9MhXgv6OIJTV40ckjjmKBkUTPncpt3pC5ePp2cPP5G46snk3nZhfAz
JY8k4xES2bCNGDhdInvX6HSD/D0C3HY8pazgtmPNqEOTVhGEgtO4FylxCexK
3AjGgrtHJzjOtmalwgeb8H4gGfGIXPwL+ChO7T0+Y/Rwmp1jpskijU/AlmLA
neAlYFpVWTXsoCWMQrAOVMt7g9aZ9DXTLQ+0JTQ6g1kfz079guZ2icpndnxE
/46Pjo+Pp9PpLPvtv/w3GeJIbvt2z214C/yj//VuO5bbHh8/3n+jPHFw46PR
iDQ9qQjnXeTEMh/w0jmdzRkVGouVAaVdOaIp6kdCsgqgCP8kgAI+U/wDg+E1
pU2QA2EjseqG1Cjs7uH0mkSUxakDzsuvXBRxJhQRG1eOMjbbFu1ciDhzoMHH
ishgYI6DC8FcFJ6KhGzjK/pxFQrCYolEfwMfhWFsA+shSNV1BmOq7FIE+HRh
AeQjgETIBPyoWct7gKvkJ87q3d0HrYQhRawtfxLBDi4TFjpkwyRLrBGf+Ogn
CRmpsaeTV+IUUhaZCK8BYRNjbNesPbZA6UK0IEjACFKAKZStjyloGUW8FJF6
VIXyVNB6mCa4yu7Nvp7dD+lRp+HZHsxX7c8J3xLzOC/EkXLmitzhsqq2WITL
W+Kw0KjnXg7Emr3MGX1/7/x+9g/ZySx88fTj84+v8Mvj6MtnH88+vvj4/ceX
+MPRbDT6y1/+Yoy7XvqC4ezr8OdH/HMS/4MvPspv4ZKv+c/zcP/HLP4H12Cx
qP/HI33Mous+8n/gafvhsuw5/f1qlGXpiDqtdDy+5mM6XpY9g09n/OWLLPs+
y17imkcfTrO7i0nEmlzd/Q93lG+RoT2Wu3PLXP6c4DtDA2Fs/GZCZpzrphjh
92oAhZVrD+NZPkNSnfxQKQPwAJH4vW4UCwr0Lzns0NSgSnJ0T9nNMOEeNGaK
HzF4jp5C1xFM5alrNRuBGXiAGu9SwETR+F+HiJKSuTjlLk3TKdwDRSJGFsOB
jbMBRpAO2hJ40/GjR0+zlzDwNUJSSpAwNtIMi19FpnUL6K34DPkkfEf2wJak
HPc8BkOIc/F6OEnOZJT6Aa4Hghn2N3KKBUyY4q52Y5mbEjsefe98wegvAoFA
+eZ202nsbw/LGOfLBONitcix4wlUoLgFNfb9Boprb+sY3nYNh+rmTdfBV5Fa
GxbfJltbB67xVY+cYs5WluA5JWVxbatyo4WYggETBqK5uKuSPGTWaC6yIMie
2QXV+oh8qWR9T/iPCyBwaFNxUDFy7PYVrY29NHl7KLuMxYWCwbwgsvLlMgUu
+w81FdPsd4r4YfXkFJDAYbAdbl+U72lYzKFTBI2lkq5jXJyepQiAEHGkw0w7
5r9t5FNgdZctNLIvEDFKj3BCggdPppSEJ31BqtZb0eELmi8W0HcEahGFinqJ
FsEFUigxdUhpRnVQIqBY4N3AH8j1mMXEYhuuEKbZzKkySxWYTR4gyBwhFxZz
8qkMH8FPgxxpfEaegD5SD4gBO4U9V/lPLWkUo51Vs+xAzO5dHLo2npFpURSv
jt2tvS4clsruKya3i4YVqXe545AqPgBnZmFmw3jaWwSyqFXwFwrZEwP4TLfl
ULnOhs8MwWgbGG1fEPiHHiMSFxYJF3KE0jMaQWaapAx9NUu8oWT432G51naB
7MZRE8oQLDpKu6+ba8X48ljhTJqKDn+d7lAS6+0lF7TAkwLxmjymietg3X/0
dvPawoO/ciR5aFZl39l/e98lv+/jgVQt2gRQ4wUHUbVeCi7JDXm6HlKgLWIf
LV5Cd9P49QpyZbnGHwa2hcXYaxqCvaXEBtHukFy9xriOjHkaBTVnR++Pjr89
Pj755tHD+ZOHJ9+gCwjXYxRrdyreJrmEEWrv3XpSPDHmu2+t3PqOLNCnnvXo
W3vy3XffLIbPOj763MOOj+bfFOYkp3vZJDPQIqcjSukaJzuAigUg5s+uqUcf
PJiuTrM9S/c/w8T/GIC3/Psw+Eb/bWC08cFfr06zO0jIO4cvuQ7Tich58PIu
XB4Rc3D57fCBn1zDw0+v4fjoy1YQ7dGnVoDCPpyy/+ZPsFvoGkRJ1QtfVQ5i
F0rMh6lVhFtpLhKFurB5RWrtQH6S8ltRCjAuJvlBEKxm1DkTUjfhm1Av2E9L
xol5M28ksE0ZfiqQogpjDSlGVQpbJ5kkSeGrxxENp5HAZi5R5flOVqCaPEla
YUZ9WMUQMpWSS6CAS0tFQromepBkKuY2TimH2oncp+gjIkblB5I44JMGGAgM
P2G4Q0p0+2VMukQ6jofF9Qhks3KhgQGprKujSslh6vJQjsBzVPZ9SGoRb1Gi
igoYJN0lSDVJhXF88sdmQ+FPghBySZR8Vv+CykswP8ffY0TyQkr99HxMykcH
KwRJx+FvWto9b9rb2/sYq/xcrFSLC4lV0Ko/mhIRfMBzuJ9JRcun0+DMYqPH
U+2NkYqLkQpXPCVRmziY8/BkQpBl1nL9hv/sZhI6H31D8bhejfw3j/i68Awf
MYpFUYosYurz9vtSEmrFIWpFi2+oJnlveFOrVehsnSwhsvfa34PHYd4MRPB1
P2SZf3gFYOBH2qd7pnJg4GsMLKOU2nwDX7fHqB/wr/uw1dhgBAsK5Mer4/5d
V8mFPSY/06IfTZ3JentfY27s7PziaXSMRwttwTOowH3WGh6ja+7oFLHXSwBa
mlAFimgLDy8g2uaKrWhg9dpNjkHmkIkvr424SVjy35bLspZT4CFYjPwsUdGS
fUjQjxSSpZOvft3xpIE1+NwFqad525giN5zv80VqPEl/vEdlh7KyAwVFclCU
C8KrWk47BuTWccCaAkMsVf2Kf5CFxdZxVctllKjBeIs/fSmVUgSz2cUabA6f
Z422UfKLzc3kgopJpqEtQoUBE5aGGXl/TU11couesDKjwzzdYgfXZr/91/+R
1Q9OZupLz+qZD34R1pQRiOm/4jQfw1fO9p8P9dhz1WMf7pIK21c0HVYe1Ynv
jxQcdkIjLzak4NP656iUgY0/OmfIWVPschSOJXtndqwHTCkBsL+i8HxQs/Bc
fqf1D03xhZyWeTQ90YPSt7eSE16bTVK2H2kc3gQRkaQGKB324fQJDis95aSk
lytZhCRRpYpExfuFe1r9CwTw+BwxQXdjbZ1gqgiMpWQxAe5IpVOU/eQa+HCi
P7FiIe7ZC9fSXUkhBwf3O7PMHp2Mg7GKrkl8rsgI0ZPYx2IHOEBG/YBjUIEp
+KfeN5kBxV6GWXKCU1PLpgXt2SLXxvXsJdeg46Zw+mgP/SSTFTGX08inpk++
eJqPH/M0+8cN4xMHYrrBNMRf3/YO4hHEDmCC3HvqQFNKsIoAmfQKSe0+rkBn
hYEOqvPiI4usWvhUQdhizxf+IOOnxdGTTiLra7AmUja8LyopdbsJEegIixBV
wnQr2CgtWfOugQuBbpr1OCraGmCjZHawCxeBfsnRJywL0FCZHhbrn1sf+7MQ
NwiqhfZdNywMjQ7be7ELp3VqSY3Gh8+o3gcngTFETeRtaz3qE+J5jT+tgWl2
zEqK8cYzYKBJVgKzXzLp9nPWhAkrYROhculC0o/5Ouw/qZBasZ2X7P0BRS27
3B9ue5EUVmYzTs7hdu6N9l1QSmhi2bZI0K+nRULQQg0i7zqxB68xYeWw4JTh
0KqQBEtcOApsmDr4Cq+fPzs++U4rDwZ1qKr5v51+g/P58IEa2kkF3l1u0ndo
X1gMb9EMxIaGJzzuFyeLHJcu9TFivI/xT3SYJO48F481rHEApTHi5TEKnen8
AiKgZ4WPoAl95RJDP+5ROSjvPdaY/Sp0qwa7FpRWlLT9KGlZ5Xf5+DH7OBn8
y85R/w+//zj6I64j+6iD8JP+lOnXxF8fP/f1b7/+zyixmuo2Sa1S5+BU9b82
O5BjTa8yc7xVuNFnD8UhcDVf6YGJWCzeRiQ4A0TQUSiNWJrI++zLZePWFg3X
NpJW08Mivk4AtKHDaKjCra6pLDYJCAaUikPs+w2fkNMpYRrix+E89FxQaIpy
8FQQled6d0fnAYb9xlRXw7oYrgih0iMK2XbNRIKaUo+qjTE0g4ejIlIEV0VG
QvenxAMLazmFj9UZG9CtKHfigcYHQaMyHao6wrNziVkZtq7x2aj5Vk9jDuME
5HJha5JeH2pkCPhGm0pdDhtv4dl+OeJKaSv17OqcvCx/QjPur4On3aNjWugx
ci1RxCPSYUZpwseZqRkL7EeD/V88HqXmRlWpdUfa3GjYxEfP38sVVAkTzsgQ
uuGCIzwjM6XQgN8D7zcO2mWZDk/PuFNqDZfY8N6V1HdNd0P6X6ETeeCo+B5j
zoeeOgFCZIInlCnc+6jDHVaUNsH/wjQDmEgtNGZ8MxgWW94sqLOaP8vITiDY
Qj1novlhokZvAIIddXRgmcNP+c7fRScA5Ei1Z4EXe4aSMgv0LdgGLWyXr9jz
8ER2e8CX9PB6eXn548UAJb+T8wvclOPa3e458OcnbzI6FiG1/PdAI7ZcYfDb
r3/VgxC//fq3+9nnT0BoXQJs6VIztU0v/DkMeHJBPx3XuaRf5PCFNAmiAhea
lPhC/D0XFSTHLYYJU26AQ/ltqvNGeEMHnpU+cpSR4tekx8mvbNWgpzo16o1A
1/pQNlf0U51+EESUvrF2fkHX2krnHaoTJL8wtxJyuJtdat+I6JBrQDsdn8m9
lEyltuf1J8SI8nrYgZovxDT0pT97H3Lv8tX5fW0bA8/Ac7JSh4OUl2ZJwn0y
bOQL92BQaCBAoBajnqWvNtVq1+UEz19isxBEVGr54HJstwu+LeZDKbThQTR7
4/6gvctmJw8fPf7mWzPPC7tYrsqfr6p13Wz+3Lpue33zfvcLwmPGzMcPJ/5G
hW9aIbUxBYendYZY0CDYjVh8dhL/m933BcZS+Iur7y2y5KVfSuHMnI+eSUbi
SH6hPO7jhxl1BAju47rEyBBsMZ2AKGs5ZfH7H179Uwa8mK+m/ib0O7BKqtaY
8dq8L9fbdebMwvrJYC2InGXCMnaZKmg/ZhR2+rmmhOo4SRJAD/2juTYIzjfd
VGa8oJDN8RE/nQq6sI68ANa/w+IfZaHu9FXSeblYoDrC6GPveDl9pVHOABL6
mnKe+C9kL3DVFJxg75nzJd6gJgIcDnVhaTs9U0Gdi30fdtUG3rr6jvQgjqBG
hjtrKsK/akK8nBg52ar5Cf2Bm5btWM/TXCSYHA0RTdz7l73KnDDsoFMc01uP
IFM8OIXW4aRwbMwjbRcdUQheYaZlXiaEEzw9VRsjUb0IBMUrfuWEopSSI+Ne
Cpu4+ZXEVOS64MH3Ch367ViLspBCotL5c3CDHUHGk+JmCd0oPvcIX26lFaUV
176IzFFAiEqn2qpMY2Fy2o7ySlpPMcYkYFxNcWOcr4+pdnquaXh6T5AG9R3T
bl3hxDilL0vpn4rwV5sI6SkbDxVlMVpsLMP6X+KN45t4sy2XzjGk6eT8B5MI
sDGFVFSmgON4kl5UCNsZ1yXJiXSrJeL6Xo8iohklbQDD/aTsxzlJbRmTPERC
cWEdZhequUNFvOy09r3LbUlN2cT344P4EvnHUf4QY8zXmKKR0DxrrwkX0u/T
YbqPCUqNOs4ydNZekDerRlut+eLIoSyqSEvTk3B7swBABVIKzjQGbaNOuf0i
YnUptl1JGdy4LB7N2AY3iI/TE8FhmPZQVeTaUN0or9fQGQC0rHgUvNl40F5h
Zc0NV3jGxPCKSbyFcEaeC59QX1FN7Vw7R0oQPsk2q1b1tffiiXtwGfVsjJrj
JsfLOfDHL31Y+OCgXEyhRcHt0ohWW3vGRwrLDXuzDXYXxgbDlGQVhc6tw3rH
u+S0XtxsjSKY6Eqqrqa74/6vw6ZP/syKiHfcUK61gRcwyq+V0aEZoS8+rpub
yhZLG4X/xMfeY4Wkk6upkV+B8khGLF5GZtSKgmgesIGo/EKwMV2WqZraanaU
Czthyg7ZiFkLVYs1wU5gsKSnOzCDwPERf4bQcsG0GG4irULZutlT3aLbGs+c
qEqueZvqVLikbIqDSlXrrrGrk4zCcZME3wxahEo+3E+AmCSwBVJbHRRMDcrp
m2turueBQbp/6WBBrw7o77mjXCQsvZI8yD5lpGEjrsjGYzKpLVC8hFrWqTR4
MsXtAhXfmgCMInnIo/qQyBXuCVBvuzz2Q/AN+E9tj26OcTtwnqgzDG2T6DGk
hlIb7WtXdvjoJNQhcYFWKue9txg4N5BdxUI8fI3LA1Kq97VQlkAH6JHJkD+8
NvGyVvQ32CzRk+80aLWvt45G6frNH+76gOIkHBzT/r6+E/MgnIZdmvGn2zS8
1B66JWrcljZXb5RV9kTNJJksoUbM6MQxFpNttlU14TO6P9n5BRh5S8GgOmpy
mDaT7vdV9g2gqRKro6xw0jYMKfrbr39dwO6hr/Xbr3/zJfT0BWoQRhPcrTJ2
Udo+PEA247PQcdfrL+0uEoKm2r+JSzC8F2NCvwlEya6RDGAc5QJXqekoSigB
8KgSYc/bBCSwwWdoKZzIgUx/u4alxSDYTE8LbiqzE66NDp8caIQd1UswmxLw
JAkjHUcb6su/tWk1pfvb7UaL94ERJcAaHgO76J+CoTx9QQSBiU1p+wzRh0ZU
byD6/3NNoccxZEnlnF73QeeRB28WoC67JnnPgcdsXGekcyFLD9NfSRp+n3qO
3kcgTX6IEai7D/91m0hFv6+nSImCaFAzkzUy5dIKS/EbJta4Upum0ZkFuB7D
P5ZOE9HxpWsfk9AOE/u7pEQ94nk2Olj0mhAcdYHRPkq4CBzcJcnoUMSwNJtQ
9EEvhMy3NB1ZGDcO8QyD+p2RBPouIkcacqQzCbQrxEwqk1Zb8uuB+x3DWbl7
yMiR2sOwP5KQwnk8objGROBL+xXIWFNV2KkFfq6L5maKr+qh36I3RmBIi9E8
V8TyskSqhLRBQ1KbROZoBv2h30a8cO55VZU+Syq0EmwUVkZMd0G7BhRfmWs0
RdrPY8/AURZTxgojSSOkHxq9w1/79den2uWflq8HxJPCAn92zZeG8rT0LF0s
rBRLwjiF3wAtpC38qQwbTa3XBpE7+bzYcl9hmixO8Sd1sdH68+tYZCXo0drC
7ZseXzFOth4YvyZ/OgN117Q6S2a5qvFvNok2ASckUqMNJVPmGdBQicemQHmo
x5O6AI4XYp9eBOfSVR0XhpWT4UhNumwJOqCAlvXWJu8qSK00bAh2VTVbdB+3
m2Q5HGnjNu6fWZInW4T7YXpKPjyPlpsuSakNtgoD502DT5Xpp7wmBUSim2Fq
CMauTVkFWziWecSedTpxrQf6LF0SQvhKkKM9ewnb4lgFEZCXZfn8jLccYa4S
thqjqmBc8plVJdL2qcXFu669YA4sDw3WhU9wP2dEFUNUaQmumZAe23gshsif
+rnSMTe65zSbMRCWrnto+WaSe5EjGf55af9xf2RDEF4I1lP4o1ljdyp2S+L8
WvzaB91gJ/6/6WPDUGPC6BC9qj0QUfKadMeb31NnWo3ZJYFWij1UPvAlpkRA
Sz/yQQaIZmsLbr0YN6XnEfA6Oq7m+9T6Vi8i7fEIctCrFYljPyr0czRJY5nS
9Vtv7XNI/HkPBcuhHUuI8xFueu/rcAt9MY3WGgxagFEfToHPPmDt/dhhpjIY
g2R7P39jdIAPN09v8G2zhndgqHh411Px3nw8tBf9EfTTi2KHLGjwTuRYI15z
ZXfRp3g+oRO9agNqYKOR+HD4nezAA/am7h8YDBTJlwxWi1P2gEO997GJYvKa
A5VDClpHvQjWTCsY4OToKMkvR9ExiRxyVj+k1aWY3ZevwnBUlSKW5uTNs2n2
ZtvFuF0it4tSw/bOt1jRwLJUzM555tj2myCFOrBYpCJKR8/4hG+kZCUoIfpN
li7Hw3oAYk97zPEwgxHO5WqqKB6Z4vHSfkAjHBHNJUQSveBBowkccUGbUEpb
10GVdZSA40AZHkOmEhhsFyHN6P1ZAj4MSqVB65TyDJ9kLRh7phqPqMWNhG3C
vEdSw1Yh/KUf1W+UbAfw75VHUWSoup24WDiKGEcUwDyn1kzrctmaZKHhWEX6
ojdvlp2+Qk1i3HSQzHnax29KQvviC7L5hTLw2JZwWOLbwoXhnWlJGEjZIu3W
ykwyrCkahILJt4ZpReG6pGnsH0KToQMhJG82435EuNvhRUyGXs4BQrJRLa2r
5ZABhdNxNjSEbElPT0Ys55OtQqGv6IikHL8aerrM/C+wF8I4uU9nrEGLKAea
9OvhozfRBCRa4gVsD+9n97DY5unsfujHddP78dnsPh63wxKA3rzwDE7ZrsO0
uJWdhvaLPm3gIn4aCFyztPArg3CsoQaiR05MjIDjt+cAW3B79VJCzjLks5nY
42hzdQvLGiRZ/IhY9cYxSqkVi15HkVgsVBAYIdCuBL/9+lc2Mb/9+rco9klv
RKDULT5Rm+HAxWw60oubqGMdHQ/U9/hY/0aVqE9TMog8J0dUZnqTSc5boXGT
Xukwox1eysYsGsWnMQgk97u5EqrHly32TDvHecsoWU/zlxfIjcPbfFh4EQUn
wIAe3s8XSPiKQgPUSIRy5xRF98BDaqYIrwRrXrp4MKQgDkUWeU2vE0oWNcA5
uO/9GuZIykgfTjOhgRx68uMmcZFiT06Nqm3iV+uFpAm+ScjiETebzhAnFGZZ
ukE1QDyzsT9KJe87Un1RCNCVt0X4qGa+S9r5E8rZUefySpO7g/3mPYzlagEY
2XFLNm6/apjqNGWijk+16enxZAfGsZcWryfCPZ1WZZAY47ICL4Yu2rrCahfW
yEcnywBOek8PnV72MIgnv7zSgkhT7aIyBa8DMTMloljY9IWhkUMvATVBLdQH
sijdz1K7mIXYGhKST9Onpl5LKif7Uh9SSyyJYD81fsObS+alyQ89kq+Grzeb
9OE8YXZRZYsEcvZJWLYxG+lxGBRD7SaYZPEGq/Fml6AEEj/h2lACdLjQaA+N
/DnIUMya5C8CBN9fY+A77fm+LCEdvrJrZ+m9hZSz0e7YLF0czOuDAIywOy9i
/TdFkf9JcQMtbLGTXvE9vc5oIOtRjW+1EwUa4udj4S4uPJBKev9aH9+WWbWb
JEE9ukiiNIdeBCrV+qIA+AkyTS5jRUkWs0uqvZQXJlSazGy0Zm8n7+fb4DuP
4iOmOw8H6YhpQGD9XZ9mbzFq5+kjHcJ1XnESSnFPr+Rap8p1OguJp/b9D3rz
CNttrCaJSp4OsveY9C3sV7OWowTRkBoTi4ns9SEfNsCag+j1kSHoX66l0Vm1
k+XvmYRuo0tSBwrE/BMO2pQYqJCjJOcR8SS1X7xXQpyXwM7VDb1H/otk+O7B
lp14kkY6dvZOVZL15zR5r8UpwTDxk1YUr3XcZTjULfLb1rnye1ispM2rk5d9
OH+XnErV2mCQ7H2ND2CnCnqJi5xtBymvSz7Qo6//uAZ1jUkqwu3kbKyB6jmZ
JMM/CcoiKWGTXkgrPj3TKL6k1fdPtb0T3bDDS/Wd8OTvj0ENirsaaDyRs+XU
4YPOQyJYiRY111Jrdc8jpUqjc0FciLVZDH3nfAYQ2wZoiXAIfcjZRPSfx/73
FidE6AMUK9AFhaTmwLjX01IZxYd+YJXgPXaxB17Y/skcKfeh6CbNtn/2PQpn
On6Ls+SpMO8EfogBZ+5g/1xRVxJqXZRLOtuEp5A2LTUjlLmlEZGqnFOWUEZ3
od9/6Mf+lPvcxhsVuv+HRn84HN6YvoDQxQkweocp2WX/Om8J5KFLoq83u6C6
mL4IKfuHt1HG1WNq7+ldPlJ1FTWEofb9an04xuw7g/e6HksXEAk9995tN45c
aurpF7LcaTIcl0ESIrSjih4C3hi+cY6jEXzo2ie1qWm+vpKa3/krkVpJDw7f
sHLZZPh++yWf2UG28V2J9/MJx5WQFdgO+S520qQMKRkKdbmjG44QvcvBuIaL
uURcYEBQQU0IAOKWyhu2Yy1G9ZBw8RtYQNe0ouX4vUKf7MkstRN6tv79pmrK
OJLoms2KJygv2BYW6Bfh4yzbfvBGWbqkHxXX8qekjIWqwj8tfDFsoTcjc4R9
AB72nWz/kiPmUbA/HPKWHIV/kRRuRJICOPzMM+oNENwfc2UDrwl3IgtcNyVt
FbfAvsEuzrjJOAf/tj2ZBkWhQoOUYH98Z9BBA21gYzxmiwGB0f8BiBnV/3ST
AAA=

-->

</rfc>
