<?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.18 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dijkhuis-cfrg-hdkeys-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="HDK">Hierarchical Deterministic Keys</title>
    <seriesInfo name="Internet-Draft" value="draft-dijkhuis-cfrg-hdkeys-00"/>
    <author initials="S. Q." surname="Dijkhuis" fullname="Sander Dijkhuis" role="editor">
      <organization>Cleverbase</organization>
      <address>
        <email>mail@sanderdijkhuis.nl</email>
      </address>
    </author>
    <date year="2024" month="August" day="23"/>
    <area>IRTF</area>
    <workgroup>Crypto Forum</workgroup>
    <keyword>KDF</keyword>
    <abstract>
      <?line 108?>

<t>Hierarchical Deterministic Keys enables managing large sets of keys bound to a secure cryptographic device that protects a single key. This enables the development of secure digital identity wallets providing many one-time-use public keys.</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-dijkhuis-cfrg-hdkeys/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/sander/hierarchical-deterministic-keys"/>.</t>
    </note>
  </front>
  <middle>
    <?line 112?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies the algorithms to apply Hierarchical Deterministic Keys (HDKs). The purpose of an HDK architecture is to manage large sets of keys bound to a secure cryptographic device that protects a single key. This enables the development of secure digital identity wallets providing many one-time-use public keys.</t>
      <t>The core idea has been introduced in <xref target="BIP32"/> to create multiple cryptocurrency addresses in a manageable way. The present document extends the idea towards devices commonly used for digital wallets, and towards common interaction patterns for document issuance and authentication.</t>
      <t>To store many HDKs, only a seed string needs to be securely stored, associated with the device private key. Each HDK is then deterministically defined by a path of self-generated indices or provided key handles. Such a path can efficiently be stored and requires less confidentiality than the seed.</t>
      <t>To prove possession of many HDKs, the secure cryptographic device only needs to perform common cryptographic operations on a single key. The HDK acts as a blinding factor that enables blinding the device public key.</t>
      <t>This document provides a specification of the generic HDK scheme, generic HDK instantiations, and fully specified concrete HDK instantiations.</t>
      <t>An HDK instantiation is expected to be applied in a solution deployed as (wallet) solution instances. One solution instance can have multiple HDK instantiations, for example to manage multiple identities or multiple cryptographic algorithms or key protection mechanisms.</t>
      <t>This document represents the consensus of the authors, based on working group input and feedback. It is not a standard. It does not include security or privacy proofs.</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>The following notation is used throughout the document.</t>
        <ul spacing="normal">
          <li>
            <t>byte: A sequence of eight bits.</t>
          </li>
          <li>
            <t><tt>I2OSP(n, w)</tt>: Convert non-negative integer <tt>n</tt> to a <tt>w</tt>-length, big-endian byte string, as described in <xref target="RFC8017"/>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="the-hierarchical-deterministic-keys-algorithm">
      <name>The Hierarchical Deterministic Keys algorithm</name>
      <t>An HDK instantiation applies local key derivation to create many key pairs from a single seed value. It applies asynchronous remote key generation to enable providers to derive more key pairs. Additionally, an HDK instantiation applies these key pairs to blind a single key pair and proofs of its possession, such as required in <xref target="RFC7800"/>.</t>
      <t>Solutions <bcp14>MAY</bcp14> omit application of the asynchronous remote key generation functionality. In this case, a solution instance can only derive keys locally.</t>
      <section anchor="introductory-examples">
        <name>Introductory examples</name>
        <section anchor="local-key-derivation-example">
          <name>Local key derivation example</name>
          <t>The following example illustrates the use of key derivation. An HDK tree is defined by an initial public key and a seed value, which is a byte array containing sufficient entropy. Now tree nodes are constructed as follows.</t>
          <artwork><![CDATA[
              +------------------------+
              |Confidential static data|
              |+---------+ +----+      |
              ||pk_device| |seed|      |
              |+----+----+ +--+-+      |
              +-----+---------+--------+
  +-----------------+---------+---------------------------+
  |Level 0          v         v                           |
  |+-----------------------------------------------------+|
  ||(pk0, sdk0, salt0) = hdk0 = HDK-Root(pk_device, seed)||
  |+----+------------------------------------------------+|
  +-----+-------------------------------------------------+
Level 1 v
+-------------------------++-----------------++-----------------+
|(pk1, sk1, salt1) =      ||HDK-Derive-Local(||HDK-Derive-Local(|
|HDK-Derive-Local(hdk0, 0)||    hdk0, 1)     ||    hdk0, 2)     |
+-----------+--------+----++-----------------++-----------------+
            |        +---------------+
            |                        |
+-----------+------------------------+--------------------+
|Level 2    v                        v                    |
|+-----------------------++-----------------------+       |
||HDK-Derive-Local(      ||HDK-Derive-Local(      |       |
||    (pk1,sk1,salt1), 0)||    (pk1,sk1,salt1), 1)|       |
|+-----------------------++-----------------------+       |
+---------------------------------------------------------+
]]></artwork>
          <t>The solution instance computes the Level 0 HDK at the root node using a deterministic function called HDK-Root. The HDK consists of a key pair <tt>(pk0, sk0)</tt>, and a byte string <tt>salt0</tt> to derive next-level keys.</t>
          <t>The solution instance computes the Level <tt>n &gt; 0</tt> value is using a deterministic function called HDK-Derive-Local. The function takes the previous-level salt as input, and a sequence number <tt>i</tt> starting at 0. The function returns a new HDK as output.</t>
        </section>
        <section anchor="remote-key-derivation-example">
          <name>Remote key derivation example</name>
          <t>Instead of a locally generated index, an HDK can also be derived using a key handle as per Asynchronous Remote Key Generation (ARKG) <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>. To enable ARKG, the solution instance uses HDK-Seed-Remote and provides the output public key to an issuer. The issuer returns a key handle, using which the solution instance can derive a next-level key pair and seed using HDK-Derive-Remote.</t>
          <t>Locally derived parents can have remotely derived children. Remotely derived parents can have locally derived children.</t>
        </section>
        <section anchor="blinding-example">
          <name>Blinding example</name>
          <t>The next concept to illustrate is blinding. Blinding enables a solution instance to prove possession of a private key without disclosing the directly associated public key. This way, solutions can avoid linkability across readers of a document that is released with proof of possession.</t>
          <t>In this example, a document is issued in such a way that it can be presented with proof of possession using <tt>pk</tt> as derived using HDK. The solution instance applies the HDK-Authenticate function to the associated <tt>sk</tt> along with the device private key <tt>sk_device</tt> and reader-provided <tt>reader_data</tt>. The output is <tt>device_data</tt>, which the solution instance can subsequently use to prove possession to the reader. The reader does not need to be aware that HDK was used.</t>
          <artwork><![CDATA[
In secure
cryptographic
device
+-----------+
|sk_device  +-------------+
+-----------+             |
-------------             |
HDK in                    |
solution                  |
instance                  v        +-----------+
+-----------+    HDK-Authenticate->|device_data|
|pk         |       ^     ^        +-----------+
+-----------+       |     |
+-----------+       |     |
|sk         +-------+     |
+-----------+             |
-------------             |
+-----------+             |
|reader_data+-------------+
+-----------+
]]></artwork>
          <t>Blinding methods can be constructed such that the secure cryptographic device does not need to be designed for it. In such cases, <tt>sk_device</tt> does not contain the value of the private device key but a reference to it.</t>
        </section>
      </section>
      <section anchor="instantiation-parameters">
        <name>Instantiation parameters</name>
        <t>The parameters of an HDK instantiation are:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: A domain separation tag, represented as a string of ASCII bytes.</t>
          </li>
          <li>
            <t><tt>Nk</tt>: The amount of bytes needed to create a uniformly random key. Note that <tt>Nk</tt> usually needs to be higher than the size of the key space, for example to maintain uniform distribution when deriving RNG({1,2,...,n-1}) from RNG({0,1,2,...,2^k-1}) for <tt>k=8*Nk</tt> and <tt>2^k &gt;= n</tt> as per <xref target="TR03111"/> Section 4.1.1 Algorithm 2.</t>
          </li>
          <li>
            <t><tt>Ns</tt>: The amount of bytes of a salt value with sufficient entropy.</t>
          </li>
          <li>
            <t><tt>key(bytes)</tt>: Deterministically outputs a key pair <tt>(pk, sk)</tt> from a uniformly random string of <tt>Nk</tt> bytes.</t>
          </li>
          <li>
            <t><tt>serialize(pk)</tt>: Serializes a public key <tt>pk</tt> to a fixed-size string.</t>
          </li>
          <li>
            <t><tt>expand(msg, DST, L)</tt>: Outputs a uniformly random string of <tt>L</tt> bytes using a cryptographic hash or extendable-output function and input byte strings <tt>msg</tt> and <tt>DST</tt>.</t>
          </li>
          <li>
            <t><tt>BL</tt>: An asymmetric key blinding scheme <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>BL-Blind-Public-Key(pk, tau, info): Outputs <tt>pk</tt> blinded with blinding factor <tt>tau</tt> and domain separation parameter <tt>info</tt>, both byte strings.</t>
              </li>
              <li>
                <t>BL-Blind-Private-Key(sk, tau, info): Outputs <tt>sk</tt> blinded with blinding factor <tt>tau</tt> and domain separation parameter <tt>info</tt>, both byte strings.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>ARKG</tt>: An asynchronous remote key generation instantiation <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/>, encapsulating an asymmetric key blinding scheme instantiation <tt>BL</tt> and a key encapsulation mechanism <tt>KEM</tt>, and consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>ARKG-Derive-Public-Key(pk, info): Outputs <tt>(pk', kh)</tt> where <tt>pk'</tt> is a derived public key and <tt>kh</tt> is a key handle to derive the associated private key, based on an ARKG public seed <tt>pk = (pk_kem, pk_bl)</tt> and application-specific information <tt>info</tt>.</t>
              </li>
              <li>
                <t>ARKG-Derive-Private-Key(sk, kh, info): Outputs <tt>sk'</tt>, a blinded private key Scalar based on ARKG private seed <tt>sk = (sk_kem, sk_bl)</tt>, a key handle <tt>kh</tt>, and application-specific information <tt>info</tt>.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>HDK-Root(pk_device, seed)</tt>: See <xref target="the-hdk-root-function">The HDK-Root function</xref>.</t>
          </li>
          <li>
            <t><tt>HDK-Derive-Remote(pk_device, (pk, sk, salt), kh)</tt>: See <xref target="the-hdk-derive-remote-function">The HDK-Derive-Remote function</xref>.</t>
          </li>
          <li>
            <t><tt>HDK-Authenticate(sk_device, sk_hdk, reader_data)</tt>: See <xref target="the-hdk-authenticate-function">The HDK-Authenticate function</xref>.</t>
          </li>
        </ul>
        <t>A concrete HDK instantiation <bcp14>MUST</bcp14> specify the instantiation of each of the above functions and values.</t>
      </section>
      <section anchor="the-hdk-root-function">
        <name>The HDK-Root function</name>
        <t>A solution instance creates a root HDK using a seed and a device public key. The generation of the seed is out of scope for this specification.</t>
        <artwork><![CDATA[
Inputs:
- pk_device, a device public key.
- seed, a string of Ns bytes.

Outputs:
- pk, the root public key.
- sk, the root private key.
- salt, the root salt.

def HDK-Root(pk_device, seed)
]]></artwork>
      </section>
      <section anchor="the-hdk-derive-local-function">
        <name>The HDK-Derive-Local function</name>
        <t>A solution instance derives a key pair and a salt from an HDK and an index.</t>
        <artwork><![CDATA[
Inputs:
- pk, a public key.
- sk, a private key.
- salt, a string of Ns bytes.
- index, an integer between 0 and 2^32-1 (inclusive).

Outputs:
- pk', the next-level public key at the provided index.
- sk', the next-level private key at the provided index.
- salt', the next-level salt at the provided index.

def HDK-Derive-Local((pk, sk, salt), index):
    msg = serialize(pk) || I2OSP(index, 4)
    okm = expand(msg, ID || salt, Nk + Ns)
    tau = okm[0:Nk]
    info = "HDK-Derive-Local"
    sk' = BL-Blind-Private-Key(sk, tau, info)
    pk' = BL-Blind-Public-Key(pk, tau, info)
    salt' = okm[Nk:]
    return (pk', sk', salt')
]]></artwork>
      </section>
      <section anchor="the-hdk-seed-remote-function">
        <name>The HDK-Seed-Remote function</name>
        <t>A solution instance derives an ARKG seed from an HDK.</t>
        <artwork><![CDATA[
Inputs:
- pk, a public key.
- sk, a private key.
- salt, a string of Ns bytes.

Outputs:
- pk', an ARKG public seed.
- sk', an ARKG private seed.

def HDK-Seed-Remote((pk, sk, salt)):
    okm = expand("seed", ID || salt, Nk)
    (pk_kem, sk_kem) = key(okm)
    pk_bl = pk
    sk_bl = sk
    return ((pk_kem, pk_bl), (sk_kem, sk_bl))
]]></artwork>
        <t>Given an ARKG public seed <tt>pk</tt>, an issuer can derive an ARKG key handle <tt>kh</tt> and blinded public key <tt>pk'</tt> using:</t>
        <artwork><![CDATA[
(pk', kh) = ARKG-Derive-Public-Key(pk, "")
]]></artwork>
      </section>
      <section anchor="the-hdk-derive-remote-function">
        <name>The HDK-Derive-Remote function</name>
        <t>A solution instance derives a key pair and a salt from an HDK and an ARKG key handle.</t>
        <artwork><![CDATA[
Inputs:
- pk_device, the device public key.
- pk, a public key.
- sk, a private key.
- salt, a string of Ns bytes.
- kh, an ARKG key handle.

Outputs:
- pk', the next-level public key for the provided key handle.
- sk', the next-level private key for the provided key handle.
- salt', the next-level salt for the provided key handle.

def HDK-Derive-Remote(pk_device, (pk, sk, salt), kh)
]]></artwork>
      </section>
      <section anchor="the-hdk-authenticate-function">
        <name>The HDK-Authenticate function</name>
        <t>A solution instance authenticates the device by creating a blinded proof applying the device private key and an HDK private key. This yields device data which it can use to prove possession of the device-bound document. The application-specific data for proof of possession is out of scope for HDK.</t>
        <artwork><![CDATA[
Inputs:
- sk_device, a (reference to a) device private key.
- sk_hdk, an HDK private key.
- reader_data, a byte string of solution instance-specific data.

Outputs:
- device_data, a byte string of device data for proving possession.

def HDK-Authenticate(sk_device, sk_hdk, reader_data)
]]></artwork>
        <t>Implementations of this function typically perform pre-processing on the <tt>reader_data</tt>, invoke the device key operation on the result, and perform post-processing on the output.</t>
        <t>A HDK instantiation <bcp14>MUST</bcp14> define HDK-Authenticate such that the <tt>device_data</tt> can be verified using the public key in the same HDK as <tt>sk_hdk</tt>. The reader does not need to know that HDK was applied: the public key will look like any other public key used for proofs of possession.</t>
      </section>
    </section>
    <section anchor="generic-hdk-instantiations">
      <name>Generic HDK instantiations</name>
      <section anchor="using-elliptic-curves">
        <name>Using elliptic curves</name>
        <t>Instantiations of HDK using elliptic curves requires the following cryptographic construct:</t>
        <ul spacing="normal">
          <li>
            <t><tt>EC</tt>: An elliptic curve with elements of type Element and scalars of type Scalar, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>EC-Add(A, B): Outputs the sum between Elements <tt>A</tt> and <tt>B</tt>.</t>
              </li>
              <li>
                <t>EC-Scalar-Mult(A, k): Outputs the scalar multiplication between Element <tt>A</tt> and Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>EC-Scalar-Base-Mult(k): Outputs the scalar multiplication between the base Element and Scalar <tt>k</tt>.</t>
              </li>
              <li>
                <t>EC-Order(): Outputs the order of the base Element.</t>
              </li>
              <li>
                <t>EC-Serialize-Element(A): Outputs a byte string representing Element <tt>A</tt>.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>These instantiations instantiate the following:</t>
        <artwork><![CDATA[
def serialize(pk):
    return EC-Serialize-Element(pk)

def key(bytes):
    sk' = OS2IP(bytes) mod (EC-Order() - 1)
    sk = sk' + 1
    pk = EC-Scalar-Base-Mult(sk)
    return (pk, sk)
]]></artwork>
      </section>
      <section anchor="using-ecdh-message-authentication-codes-for-proof-of-possession">
        <name>Using ECDH message authentication codes for proof of possession</name>
        <t>Such instantiations of HDK use elliptic curves (see <xref target="using-elliptic-curves">Using elliptic curves</xref>) and require the following cryptographic construct:</t>
        <ul spacing="normal">
          <li>
            <t><tt>ECDH</tt>: An Elliptic Curve Key Agreement Algorithm - Diffie-Hellman (ECKA-DH) <xref target="TR03111"/> with elliptic curve <tt>EC</tt>, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>ECDH-Create-Shared-Secret(sk_self, pk_other): Outputs a shared secret byte string representing an Element.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>In such instantiations, the reader provides an ephemeral public key <tt>reader_data</tt>. The HDK-Authenticate function returns <tt>device_data</tt> consisting of a binary encoded x-coordinate <tt>Z_AB</tt> of an ECDH operation with <tt>sk_device</tt> and <tt>sk_hdk</tt>. Subsequently, the solution instance creates a message authentication code (MAC), such as in ECDH-MAC authentication defined in <xref target="ISO18013-5"/>. The reader verifies this MAC by performing an ECDH operation with its ephemeral private key and the HDK public key.</t>
        <t>These instantiations instantiate the following:</t>
        <artwork><![CDATA[
def HDK-Root(pk_device, seed):
    msg = serialize(pk_device)
    okm = expand(msg, ID || seed, Nk + Ns)
    (_, sk') = key(okm[0:Nk])
    pk' = EC-Scalar-Mult(pk_device, sk')
    salt' = okm[Nk:]
    return (pk', sk', salt')

def HDK-Derive-Remote(pk_device, (pk, sk, salt), kh):
    (pk_arkg, sk_arkg) = HDK-Seed-Remote((pk, sk, salt))
    sk' = ARKG-Derive-Private-Key(sk_arkg, kh, "")
    pk' = EC-Scalar-Mult(pk_device, sk')
    msg = serialize(pk')
    salt' = expand(msg, ID || salt, Ns)
    return (pk', sk', salt')

def HDK-Authenticate(sk_device, sk_hdk, reader_data):
    P' = EC-Scalar-Mult(reader_data, sk_hdk)

    # Compute Z_AB within the secure cryptographic device.
    Z_AB = ECDH-Create-Shared-Secret(sk_device, P')

    return Z_AB
]]></artwork>
      </section>
      <section anchor="using-ec-sdsa-signatures-for-proof-of-possession">
        <name>Using EC-SDSA signatures for proof of possession</name>
        <t>Such instantiations of HDK use elliptic curves (see <xref target="using-elliptic-curves">Using elliptic curves</xref>) require the following cryptographic construct:</t>
        <ul spacing="normal">
          <li>
            <t><tt>DSA</tt>: an EC-SDSA (Schnorr) digital signature algorithm <xref target="TR03111"/>, consisting of the functions:
            </t>
            <ul spacing="normal">
              <li>
                <t>DSA-Sign(sk, message): Outputs the signature <tt>(c, r)</tt> created using private signing key <tt>sk</tt> over byte string <tt>message</tt>.</t>
              </li>
              <li>
                <t>DSA-Verify(signature, pk, message): Outputs whether <tt>signature</tt> is a signature over <tt>message</tt> using public verification key <tt>pk</tt>.</t>
              </li>
              <li>
                <t>DSA-Serialize(c, r): Outputs the byte array serialization of the signature <tt>(c, r)</tt>.</t>
              </li>
              <li>
                <t>DSA-Deserialize(bytes): Outputs the signature <tt>(c, r)</tt> represented by byte string <tt>bytes</tt>.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The reader <bcp14>MUST</bcp14> create an input byte string <tt>reader_data</tt> with sufficient entropy for each challenge.</t>
        <t>The reader <bcp14>MUST</bcp14> verify the proof <tt>device_data</tt> using DSA-Verify with the HDK public key.</t>
        <artwork><![CDATA[
def HDK-Root(pk_device, seed):
    msg = serialize(pk_device)
    okm = expand(msg, ID || seed, Nk + Ns)
    (_, sk') = key(okm[0:Nk])
    pk' = EC-Add(pk_device, EC-Scalar-Base-Mult(sk'))
    salt' = okm[Nk:]
    return (pk', sk', salt')

def HDK-Derive-Remote(pk_device, (pk, sk, salt), kh):
    (pk_arkg, sk_arkg) = HDK-Seed-Remote((pk, sk, salt))
    sk' = ARKG-Derive-Private-Key(sk_arkg, kh, "")
    pk' = EC-Add(pk_device, EC-Scalar-Base-Mult(sk'))
    msg = serialize(pk')
    salt' = expand(msg, ID || salt, Ns)
    return (pk', sk', salt')

def HDK-Authenticate(sk_device, sk_hdk, reader_data):
    # Compute signature within the secure cryptographic device.
    signature = DSA-Sign(sk_device, reader_data)

    (c, s) = DSA-Deserialize(proof)
    s' = s + c * sk_hdk mod EC-Order()
    proof = DSA-Serialize(c, s')
    return proof
]]></artwork>
      </section>
      <section anchor="using-ecdsa-signatures-for-proof-of-possession">
        <name>Using ECDSA signatures for proof of possession</name>
        <t>Due to potential patent claims and potential related-key attacks, this document does not specify an implementation for threshold ECDSA.</t>
      </section>
    </section>
    <section anchor="concrete-hdk-instantiations">
      <name>Concrete HDK instantiations</name>
      <t>The <bcp14>RECOMMENDED</bcp14> instantiation is the HDK-ECDH-P256. This avoids the risk of having the holder unknowingly producing a potentially non-repudiable signature over reader-provided data. Secure cryptographic devices that enable a high level of assurance typically support managing ECDH keys with the P-256 elliptic curve.</t>
      <section anchor="hdk-ecdh-p256">
        <name>HDK-ECDH-P256</name>
        <t>This instantiation uses ECDH (see <xref target="using-ecdh-message-authentication-codes-for-proof-of-possession">Using ECDH message authentication codes for proof of possession</xref>).</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: <tt>"HDK-ECDH-P256-v1"</tt></t>
          </li>
          <li>
            <t><tt>Nr</tt>: 48</t>
          </li>
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>expand</tt>: <tt>expand_message_xmd</tt> from <xref target="RFC9380"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/></t>
              </li>
              <li>
                <t><tt>b_in_bytes</tt>: 32</t>
              </li>
              <li>
                <t><tt>s_in_bytes</tt>: 64</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>ARKG</tt>: ARKG instantiation as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> with the identifier <tt>ARKG-P256MUL-ECDH</tt>, <tt>KEM</tt> as defined above, and <tt>BL</tt> with elliptic curve arithmetic as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> Section 3.1, but with multiplicative instead of additive blinding.</t>
          </li>
          <li>
            <t><tt>EC</tt>: The NIST curve <tt>secp256r1</tt> (P-256) <xref target="SEC2"/>.</t>
          </li>
          <li>
            <t><tt>ECDH</tt>: ECKA-DH with curve <tt>EC</tt></t>
          </li>
        </ul>
        <t>The holder <bcp14>MUST</bcp14> generate <tt>sk_device</tt> as an <tt>ECDH</tt> private key in the secure cryptographic device.</t>
      </section>
      <section anchor="hdk-ecsdsa-p256">
        <name>HDK-ECSDSA-P256</name>
        <t>This instantiation uses EC-SDSA (see <xref target="using-ec-sdsa-signatures-for-proof-of-possession">Using EC-SDSA signatures for proof of possession</xref>).</t>
        <ul spacing="normal">
          <li>
            <t><tt>ID</tt>: <tt>"HDK-ECSDSA-P256-v1"</tt></t>
          </li>
          <li>
            <t><tt>Nr</tt>: 48</t>
          </li>
          <li>
            <t><tt>Ns</tt>: 32</t>
          </li>
          <li>
            <t><tt>expand</tt>: <tt>expand_message_xmd</tt> from <xref target="RFC9380"/> with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>H</tt>: SHA-256 <xref target="FIPS180-4"/></t>
              </li>
              <li>
                <t><tt>b_in_bytes</tt>: 32</t>
              </li>
              <li>
                <t><tt>s_in_bytes</tt>: 64</t>
              </li>
            </ul>
          </li>
          <li>
            <t><tt>ARKG</tt>: ARKG instantiation as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> with the identifier <tt>ARKG-P256ADD-ECDH</tt>, <tt>KEM</tt> as defined above, and <tt>BL</tt> with elliptic curve arithmetic as described in <xref target="I-D.draft-bradleylundberg-cfrg-arkg-02"/> Section 3.1.</t>
          </li>
          <li>
            <t><tt>EC</tt>: The NIST curve <tt>secp256r1</tt> (P-256) <xref target="SEC2"/>.</t>
          </li>
          <li>
            <t><tt>DSA</tt>: EC-SDSA-opt (the optimised EC-SDSA) with curve <tt>EC</tt>.</t>
          </li>
        </ul>
        <t>The holder <bcp14>MUST</bcp14> generate <tt>sk_device</tt> as a <tt>DSA</tt> private key in the secure cryptographic device.</t>
      </section>
    </section>
    <section anchor="application-considerations">
      <name>Application considerations</name>
      <section anchor="secure-cryptographic-device">
        <name>Secure cryptographic device</name>
        <t>The HDK algorithm assumes that the holder controls a secure cryptographic device that protects the device key pair <tt>(pk_device, sk_device)</tt>. The device key is under sole control of the holder.</t>
        <t>In the context of <xref target="EU2024-1183"/>, this device is typically called a Wallet Secure Cryptographic Device (WSCD), running a personalised Wallet Secure Cryptographic Application (WSCA) that exposes a Secure Cryptographic Interface (SCI) to a Wallet Instance (WI) running on a User Device (UD). The WSCD is certified to protect access to the device private key with high attack potential resistance to achieve high level of assurance authentication as per <xref target="EU2015-1502"/>. This typically means that the key is associated with a strong possession factor and with a rate-limited Personal Identification Number (PIN) check as a knowledge factor, and the verification of both factors actively involve the WSCD.</t>
        <t>The HDK algorithm can support any of the following WSCD architectures:</t>
        <ol spacing="normal" type="1"><li>
            <t>Local external standalone device, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>GlobalPlatform secure element, running for example a Java Card applet as WSCA for:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Personal Identity Verification (PIV)</t>
                  </li>
                  <li>
                    <t>Fast IDentity Online 2 (FIDO2)</t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <t>Local internal standalone programmable cryptographic chip, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>Smartphone embedded universal integrated circuit card (eUICC), running for example a Subscriber Identity Module (SIM) as WSCA; also called eSIM</t>
              </li>
              <li>
                <t>Smartphone embedded secure element (eSE), running for example a Java Card applet as WSCA</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Local internal preprogammed security platform, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>Android trusted execution environment acting as WSCA</t>
              </li>
              <li>
                <t>Android StrongBox secure element acting as WSCA</t>
              </li>
              <li>
                <t>iOS Secure Enclave system-on-chip acting as WSCA</t>
              </li>
              <li>
                <t>Trusted Platform Module (TPM) acting as WSCA</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Remote HSM, for example:
            </t>
            <ul spacing="normal">
              <li>
                <t>Cryptographic module certified against EN 419221-5:2018 with a local client application acting as WSCA, remotely controlled for example using:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>PIV card as possession factor and PIN verification using a HSM-backed Device-Enhanced Augmented PAKE (an approach proposed by Sweden)</t>
                  </li>
                  <li>
                    <t>Android/iOS security platform or standalone device, applying asymmetric cryptography to enable detection of remote HSM corruption as described in <xref target="SCAL3"/></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ol>
        <t>In all cases, the WSCD may implement a Cryptographic Service Provider <xref target="TR03181"/> to reduce the scope for Common Criteria certification of the WSCA.</t>
        <t>The solution proposal discussed herein works in all four WSCD architectures that support the required cryptographic primitives within the WSCD:</t>
        <ul spacing="normal">
          <li>
            <t>In the case of HDK-ECDH-P256:
            </t>
            <ul spacing="normal">
              <li>
                <t>P-256 ECDH key pair generation</t>
              </li>
              <li>
                <t>P-256 ECDH key agreement</t>
              </li>
            </ul>
          </li>
          <li>
            <t>In the case of HDK-ECSDSA-P256:
            </t>
            <ul spacing="normal">
              <li>
                <t>P-256 EC-SDSA key pair generation</t>
              </li>
              <li>
                <t>P-256 EC-SDSA signature creation</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>The other HDK operations can be performed in the WI running on any UD, including hostile ones with limited sandboxing capabilities, such as in a smartphone's rich execution environment or in a personal computer web browser.</t>
        <t>If the user enters the PIN in the WI instead of on the WSCD directly, the WI <bcp14>MUST</bcp14> process it directly after entering, the WI <bcp14>MUST</bcp14> keep the plaintext PIN confidential, and the WI <bcp14>MUST</bcp14> delete the PIN from memory as soon as the encrypted PIN or data derived from the PIN is passed over the SCI.</t>
        <t>The rate-limiting of the PIN check <bcp14>MUST</bcp14> be managed within the WSCD or on securely managed SCI infrastructure. In particular, the rate-limiting <bcp14>MUST NOT</bcp14> be managed solely in local WI software since it is aassumed that attackers could modify this without detection.</t>
      </section>
      <section anchor="trust-evidence">
        <name>Trust evidence</name>
        <t>Some issuers could require evidence from a solution provider of the security of the holder's cryptographic device. This evidence is in the context of <xref target="EU2024-1183"/> divided into initial "Wallet Trust Evidence" and related "Issuer Trust Evidence". Each is a protected document that contains a trust evidence public key associated with a private key that is protected in the secure cryptographic device. In HDK, these public keys are specified as follows.</t>
        <section anchor="wallet-trust-evidence">
          <name>Wallet Trust Evidence</name>
          <t>The Wallet Trust Evidence public key is the root HDK public key. To achieve reader unlinkability, the wallet <bcp14>SHOULD</bcp14> limit access to a trusted person identification document provider only.</t>
          <t>To prevent association across identities, the solution provider <bcp14>MUST</bcp14> before issuing Wallet Trust Evidence ensure that the root HDK public key is associated with a newly generated device key pair. For example, the solution provider could rely on freshness of a key attestation and ensure that each device public key is attested only once.</t>
        </section>
        <section anchor="issuer-trust-evidence">
          <name>Issuer Trust Evidence</name>
          <t>The Issuer Trust Evidence public key can be any non-root HDK public key. The solution provider <bcp14>MUST</bcp14> verify that the wallet knows the associated private key before issuing Issuer Trust Evidence. The solution provider <bcp14>MUST</bcp14> ensure that <tt>sk_device</tt> is under sole control of the solution instance holder. To achieve reader unlinkability, the solution instance <bcp14>MUST</bcp14> limit access of Issuer Trust Evidence to a single issuer. Subsequent issuers within the same HDK tree do not need to receive any Issuer Trust Evidence, since they can derive equally secure keys by applying ARKG to presented keys attested by trusted (other) issuers.</t>
        </section>
      </section>
      <section anchor="applying-hdk-in-openid-for-verifiable-credential-issuance">
        <name>Applying HDK in OpenID for Verifiable Credential Issuance</name>
        <t>In <xref target="draft-OpenID4VCI"/>, the following terminology applies:</t>
        <table>
          <thead>
            <tr>
              <th align="left">OpenID4VCI</th>
              <th align="left">HDK</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Credential</td>
              <td align="left">attestation</td>
            </tr>
            <tr>
              <td align="left">Credential Issuer</td>
              <td align="left">issuer</td>
            </tr>
            <tr>
              <td align="left">Verifier</td>
              <td align="left">reader</td>
            </tr>
            <tr>
              <td align="left">Wallet</td>
              <td align="left">solution instance</td>
            </tr>
          </tbody>
        </table>
        <t>HDK enables solution instances and issuers cooperatively to establish the cryptographic key material that issued attestations will be bound to.</t>
        <t>For asynchronous batch issuance, HDK proposes an update to the OpenID4VCI endpoints. This proposal is under discussion in <eref target="https://github.com/openid/OpenID4VCI/issues/359">openid/OpenID4VCI#359</eref>. In the update, the solution instance shares an ARKG public seed with the issuer, and the issuer shares a key handle for each attestation, generated using:</t>
        <artwork><![CDATA[
ARKG-Derive-Public-Key(key_generation_public_key, "")
]]></artwork>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <section anchor="confidentiality-of-key-handles">
        <name>Confidentiality of key handles</name>
        <t>The key handles <bcp14>MUST</bcp14> be considered confidential, since they provide knowledge about the blinding factors. Compromise of this knowledge could introduce undesired linkability. In HDK, both the holder and the issuer know the key handle during issuance.</t>
        <t>In an alternative to HDK, the holder independently generates blinded key pairs and proofs of association, providing the issuer with zero knowledge about the blinding factors. However, this moves the problem: the proofs of association would now need to be considered confidential.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.draft-bradleylundberg-cfrg-arkg-02">
          <front>
            <title>The Asynchronous Remote Key Generation (ARKG) algorithm</title>
            <author fullname="Emil Lundberg" initials="E." surname="Lundberg">
              <organization>Yubico</organization>
            </author>
            <author fullname="John Bradley" initials="J." surname="Bradley">
              <organization>Yubico</organization>
            </author>
            <date day="27" month="May" year="2024"/>
            <abstract>
              <t>   Asynchronous Remote Key Generation (ARKG) is an abstract algorithm
   that enables delegation of asymmetric public key generation without
   giving access to the corresponding private keys.  This capability
   enables a variety of applications: a user agent can generate
   pseudonymous public keys to prevent tracking; a message sender can
   generate ephemeral recipient public keys to enhance forward secrecy;
   two paired authentication devices can each have their own private
   keys while each can register public keys on behalf of the other.

   This document provides three main contributions: a specification of
   the generic ARKG algorithm using abstract primitives; a set of
   formulae for instantiating the abstract primitives using concrete
   primitives; and an initial set of fully specified concrete ARKG
   instances.  We expect that additional instances will be defined in
   the future.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bradleylundberg-cfrg-arkg-02"/>
        </reference>
        <reference anchor="FIPS180-4" target="https://csrc.nist.gov/pubs/fips/180-4/upd1/final">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and Technology (NIST)</organization>
            </author>
            <date year="2012" month="June"/>
          </front>
          <seriesInfo name="FIPS" value="180-4"/>
          <seriesInfo name="DOI" value="10.6028/NIST.FIPS.180-4"/>
        </reference>
        <reference anchor="ISO18013-5" target="https://www.iso.org/standard/69084.html">
          <front>
            <title>Personal identification - ISO-compliant driving licence - Part 5: Mobile driving licence (mDL) application</title>
            <author>
              <organization>ISO/IEC</organization>
            </author>
            <date year="2019" month="September"/>
          </front>
          <seriesInfo name="ISO/IEC" value="18013-5:2021"/>
        </reference>
        <reference anchor="RFC7800">
          <front>
            <title>Proof-of-Possession Key Semantics for JSON Web Tokens (JWTs)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="April" year="2016"/>
            <abstract>
              <t>This specification describes how to declare in a JSON Web Token (JWT) that the presenter of the JWT possesses a particular proof-of- possession key and how the recipient can cryptographically confirm proof of possession of the key by the presenter. Being able to prove possession of a key is also sometimes described as the presenter being a holder-of-key.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7800"/>
          <seriesInfo name="DOI" value="10.17487/RFC7800"/>
        </reference>
        <reference anchor="RFC8017">
          <front>
            <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
            <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
            <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
            <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
            <author fullname="A. Rusch" initials="A." surname="Rusch"/>
            <date month="November" year="2016"/>
            <abstract>
              <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
              <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
              <t>This document also obsoletes RFC 3447.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8017"/>
          <seriesInfo name="DOI" value="10.17487/RFC8017"/>
        </reference>
        <reference anchor="RFC9380">
          <front>
            <title>Hashing to Elliptic Curves</title>
            <author fullname="A. Faz-Hernandez" initials="A." surname="Faz-Hernandez"/>
            <author fullname="S. Scott" initials="S." surname="Scott"/>
            <author fullname="N. Sullivan" initials="N." surname="Sullivan"/>
            <author fullname="R. S. Wahby" initials="R. S." surname="Wahby"/>
            <author fullname="C. A. Wood" initials="C. A." surname="Wood"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>This document specifies a number of algorithms for encoding or hashing an arbitrary string to a point on an elliptic curve. This document is a product of the Crypto Forum Research Group (CFRG) in the IRTF.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9380"/>
          <seriesInfo name="DOI" value="10.17487/RFC9380"/>
        </reference>
        <reference anchor="SEC2" target="https://www.secg.org/sec2-v2.pdf">
          <front>
            <title>SEC 2: Recommended Elliptic Curve Domain Parameters, Version 2.0</title>
            <author>
              <organization>Certicom Research</organization>
            </author>
            <date year="2010" month="January"/>
          </front>
          <seriesInfo name="SEC" value="2 Version 2.0"/>
        </reference>
        <reference anchor="TR03111" target="https://www.bsi.bund.de/EN/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/Technische-Richtlinien/TR-nach-Thema-sortiert/tr03111/tr-03111.html">
          <front>
            <title>Elliptic Curve Cryptography</title>
            <author>
              <organization>Federal Office for Information Security (BSI)</organization>
            </author>
            <date year="2018" month="June"/>
          </front>
          <seriesInfo name="BSI" value="TR-03111 Version 2.10"/>
        </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="BIP32" target="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki">
          <front>
            <title>Hierarchical Deterministic Wallets</title>
            <author initials="P." surname="Wuille" fullname="Pieter Wuille">
              <organization/>
            </author>
            <date year="2021" month="February"/>
          </front>
          <seriesInfo name="BIP" value="32"/>
        </reference>
        <reference anchor="draft-OpenID4VCI" target="https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html">
          <front>
            <title>OpenID for Verifiable Credential Issuance, draft 13</title>
            <author initials="T." surname="Lodderstedt" fullname="T. Lodderstedt">
              <organization/>
            </author>
            <author initials="K." surname="Yasuda" fullname="K. Yasuda">
              <organization/>
            </author>
            <author initials="T." surname="Looker" fullname="T. Looker">
              <organization/>
            </author>
            <date year="2024" month="February" day="08"/>
          </front>
        </reference>
        <reference anchor="EU2015-1502" target="https://eur-lex.europa.eu/legal-content/TXT/?uri=CELEX%3A32015R1502">
          <front>
            <title>Commission Implementing Regulation (EU) 2015/1502 of 8 September 2015 on setting out minimum technical specifications and procedures for assurance levels for electronic identification means</title>
            <author>
              <organization>European Commission</organization>
            </author>
            <date year="2025" month="September"/>
          </front>
          <seriesInfo name="(EU)" value="2015/1502"/>
        </reference>
        <reference anchor="EU2024-1183" target="https://data.europa.eu/eli/reg/2024/1183/oj">
          <front>
            <title>Amending Regulation (EU) No 910/2014 as regards establishing the European Digital Identity Framework</title>
            <author>
              <organization>The European Parliament and the Council of the European Union</organization>
            </author>
            <date year="2024" month="April"/>
          </front>
          <seriesInfo name="(EU)" value="2024/1183"/>
        </reference>
        <reference anchor="SCAL3" target="https://github.com/cleverbase/scal3">
          <front>
            <title>SCAL3: Verify that systems operate under your sole control, version de8c5ae</title>
            <author>
              <organization>Cleverbase ID B.V.</organization>
            </author>
            <date year="2024" month="March"/>
          </front>
        </reference>
        <reference anchor="TR03181" target="https://www.bsi.bund.de/EN/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/Technische-Richtlinien/TR-nach-Thema-sortiert/tr03181/TR-03181_node.html">
          <front>
            <title>Cryptographic Service Provider 2 (CSP2)</title>
            <author>
              <organization>Federal Office for Information Security (BSI)</organization>
            </author>
            <date year="2023" month="April"/>
          </front>
          <seriesInfo name="BSI" value="TR-03181 Version 0.94"/>
        </reference>
      </references>
    </references>
    <?line 604?>

<section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This design is based on ideas introduced to the EU Digital Identity domain by Peter Lee Altmann.</t>
      <t>Helpful feedback came from Emil Lundberg and Remco Schaar.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+09aXPbyJXf+St6NbVlMiZ4yZ7I2niysiiPtZYlxbQnh8sx
QaApIgQBBg1I5kTJb9nfsr9s39HdaICgDldSm61dlcsSgT5ev353v370PK+V
R3ksD8WbSGZ+FiyiwI/FWOYyW0VJpPIoEG/lRrX82SyT19Bu/LYV+Lm8SrPN
oYiSedoK0yDxVzBGmPnz3AujPy0XRaS8YJ5deYtwCd29waClitkqUipKk3yz
ltg3lGsJ/yV5Cwbeb/mZ9A/F6fsPr1s3aba8ytJifSiOs806T8XrNCtWLRgL
XoWHLQE/nng7ft26lkkh+cFVlC+K2aFQPoya9RfOkrzQXZK3pCUV+SLNzFjz
Io55GRPqLsZ6HfReiCxFNMkwytNMP4LR8siPFXTpid/09FNVZDxObYA0u/KT
6Gc/BwzAsmJ5LbOZr6R+LVd+FB8K/P/feQEGkb0kbkXr7FDkWaHy0WDwYjBq
JWm2gqGu9dJPvXGP0T/L/DCWm7hIwpmEDaBd8AGd3mDEbV+fXk6GBwPv2aGe
WghNBBMZFJkUb3y1EJMcgPCzULQnbyadsqWfXcn8UCzyfK0O+/1AZUEPsdq7
Sq/762Km+vNorfo0Qb9Yh0P4nPixHUDJLJIKCaec3kB1KKhb5fn44hQeD3rf
D0YH/fPTyYcetuxVG7pbaX68GsbP6TdQ92kCNJAXuRTp3C5TCfgtPshgkaRx
erURbZyrXHcINH8oRoPhyBt8zyifXAAQw33v+RYe9y5lpmiuCMk7mgMJ4uQA
E/TygnS1jiM/yYFjousouRJxFMgkkPD+0s9y8fxQvEtnUSy3GrRX47OO8NfQ
n4fc27kzNzc3vUilPcBCX+lV9r9/MTh41lvkq/s3BCDtn54c057QKkeD0fBR
GNcjbOPwhTd4QU/fvz7+5cFgcGg+wEy/tB9e7B/oN5OT49E2kuGpGB2K9xLw
uUJBEoqTOI7WKLOOi+xainEK7JQgToEhgf9VV/wE/+NOjHqDu1GnZHDFuJPB
yLse9dbh/F6cTRBfI3eSRyHsWGYAfLqCNSmJomsbdQNvwJvw4f1gfzgcbqGl
hgIWn1eZv15s7lzvTEW9GQiNXij7J+f9DwsJOO1/TABtiVzA3x689C4IXkXw
wmvLPfTyDwj+PPoZ5G6RXPWJmSIVLKT3PgoWeQzyEvp8eO8lfrDwcAbfUyn0
gX79PKP1wG+P/ngYkb6agHSAEamLg/fh4xD/WoK8BXa9mAOrSjFPM5AScxax
MB7JxSgHoQDzNciEA5QJkelgZPKr08v9bbK9Q9H+1o9jmaud28T6rQcE0p9F
eZBGCfwGWTuL01l/5SsYCx+Ast0f9VagqvybaBndj8PTS1C/o3sQxjrtMkKI
xW+LCEDdQsRoCEqGnrIuugD9fjp+9tPx6RYa+BVhGnYNqMafxUitkgQmSmml
Ch9EXpfHEsP9nXhJYawo7CUy76u1DJR+4D3zru3QXmCH9iI9tDf8MqiS2V1L
/9ATZ2kIdAJ4DvPGJm974ve+KkJ/9wDpUmbbeHsGePMGB/Ti5CNQ1HNv+Hyw
TTzHIOnYhhKnoEOQRXNUD+/lVREzrbZPPnaQJp/3cQRUcQdAv+tcrsAcoBcC
WimZU8e0yAXS36pYiZz4FckSsWiVFmvGdZYGMgTrQNGe+YDCDHEo0I6J+aGM
ZZBnKYxR13sr6Se76VoWmRfLrz34na59+NWP5RXsUwCmIgzT//C7D/1fAwO+
PD45O/ndv+4f7eMy3uP6HsXlJzg+QOKg8V7mQHQelvjc3rrnRpfhvsFGDocH
+1v7doT6qWmjzlPxYjjow/jPAKcig3WjLSJBYc/iSC2wT76QJejjCKQAsgch
GETSa9RtaC/vRC+A6ju4lXHUh3n6CG0foe2nf3oUGj+48IBuBVMG6ZDIBGE9
ToskiGIkvQroH5PHIFwD18grbPhNjo/OtlG9x49ZqmwAAj8XagM8u1IC4Mhg
GFGQgb9Ji0woMOsFEhrY911xrRVIKA+C577cbSE4ojiwlnxfAfPsPwqXpRsg
QBq+6v3Ua1zwfqnyD7ZVvqPjgfUmMrtGJXaZpdcRrnMk2seTy9FuG/6fRv0f
DPusyw+GX5I0lA8Rzn8PRf4A6+KgtC4GvRfPtndpH8my5Xme8Gcqz/wgb7Xu
caqFTFA1KXD6Ev+KzHzcGRTOCrkHvVQxA24CvkqFD8/JPQsq2x1K2m2icxDS
IMShM7SF4YCyYYgeMGxUzoUsGaLMTtfEtTCPHjfUoiUyouWG7REcFigJ4QNA
N6A+pJdHK+kVQLXg8YErQqD2ePmrKAQHtNX6DjAPXBUWAaK+1SIowjQoaFqt
YjRAfnyVwr4sgEdxpeDebO6LSIj2m/Fb1emROFoX2TpV5NCBoIEXgnoiMnBl
EQ1LWJb/63GM6w1SXFUofbEArTGTMhGRRjZ4QeDyfCLj8zOuCQwflHmrIs6j
dWyWBtBk4FFuhB+GoNQVQA3dfI0kMsZu/I3GLjTAZdjNk19BL4e8ToIiT29I
bzGilECPLE1gEwH8kLjQLFyvt8vaQnfj5rgEiYyDTLb2cxQ9bFjYiY3lRr1R
HiAW2cZAzKRC5YgZQiGSR1cQFLitAAewJSI4gb+JIGZSbws0oY5hFw2bNIgA
YaG4AYI0W4nbvwZfHDFJ+30CMowILSI0oMpwKBQWuYEn8yiBcWYIAKxnwXQQ
z70rmZAiwq0KCWGwSKYAeAbjw7YmwESqJyYFzKO7B0DbEgUbyNEcJkD4CWxC
Ryb/XERon0E/RGkyj7TBi3QGtJvQYhATjCucEFaV4uaTYAPwHMxx493cQJi1
uATNimLWbGW1B+tdsiXTZItxJDMs8RSyFRA7G0tzeAaIIbYzrGVfuhtj+aNX
FzMaqcStrlFrjBPaCeiLEKCqWoG/4T6LEgydABIJeqZajBRurAALEdXAY7ls
6ADwHCXbz5Fo5FcYAEmACZFCOsy7PholRc52yDpON7jBIO+YdTrlWx4zQDK5
SOT2cyKYhX/tMH/Tmsh0/+qjP+GISdtFi6qIqbQmRswOOwIcGiEFaznJ1n+w
QLNhpbb2J5NauLAwAVTCB1Uosz+s8wFINJFCpB40dXH/KTwMa1kXbHnOgRJn
frDsiVOUEyJJc8SktlDoaZhKfh4lQVyEmryRO4j9gLsDgjudI6DffQeWbHKN
izdOEHF0RJ9ZDuNCMSCtxN67j5MPe13+Lc4v6O/3J7/5ePr+ZIx/T94cnZ3Z
P1q6xeTNxcezcflX2fP44t27k/Mxd4anovKotffu6Pd7TI97F5cfTi/Oj872
kHryCn79TGoCI+G6RjpFamoBTwRZNGOKe3V8+V//CR7IX/7yL+9fH4+Gwxd/
/av+cDD85TP4cAMijmcjtuePsEGbFhCu9DOi2zgGilujmEdOUUIt0hsgQJlJ
QOcvPiFmPh+KX82C9fDZD/oBLrjy0OCs8pBwtv1kqzMjseFRwzQWm5XnNUxX
4T36feWzwbvz8Fe/BvkkhTc8+PUPLaaReRrH6Q0pnjS37E+KMV8AEV8t0Akn
caZ3DQ0p0BpoWB4Bjf65oNAvcISMrha5mEU50Kcnpqeji8llGzbipjM9ZGLN
cpgl8RLwIzEQRbt+BT7ANJmyfTO9mYKvnVzlC+Cp6MpDvxSkBM6m9SNtXYU8
PunI7GfkChbY99hmVhzskH8s7UBVpTgAchGY7ahd8aVjs6A2ImHiRxmYAlm6
KrUHqfRrPy4kMbcZ0lebJAC8JmmB/vQqZY0ttM7VE7A6MeohIxVGIMCkaEHY
SXviKAwjPjmIN11jXjYvBzZROX2J81BfVVQevTMxFRA1uLERWoBWEXeFIq2v
jE63u4DBctyFiRb1SgBNinQV5e6ZgBWe96NiDq46Lw7EIOBRy48ApG3XVUQV
lUIiQGOL7GfaxnjDQtNa/Wm2MXpF4ZvvxFnTdusmdWYxGimK4wL9qVzb1QWb
+dVBYJd4X/JMkrnv2l6JOahzDAU2IB0aAiYCal5gX5+5wc8yf0OhAR/6A0Sq
MLYXkA+scQ0IO09veE50VxWJW9RheVYELGj1ilCh/O1vf6t4l0I89Xb8PK01
vD12zDlUashpGNe5rTcsh3zKwz/VL+oNb9fLL2w/3YpbxMPtjoY8ih3x6a4R
eWZnfncx2yttaLgDEbdn6EqJQTnVdcNf2z8I4O1dg98xLfW9ba+XA2DGkP73
43zQES/FAj7CL6A2732a5m2Lxy6RU+e2nPfRk9O8dUQ+uHOLETUU163dvZ82
bEXDoxYufghLov9g7UNcuyYdXPuY+N8jlm43PWptP1sQJgeAIhyHP8G4PGj5
aKQfVVbxtPLHQ1dRoYcqpd7bbJueGuHZmrTxYUtT8ehOqm18AZjcNVnDmvWL
su/2NuzcxioCsC/+JkJAOmAyKDdw68Wwc/t3gfnbmJbGIClLqqRBd6Ur8Ba0
HjFChXxPtr9AHeckyEHJoMD3q069VZYCtR1IdyMCSicWZT+0JZ3ul8p+qgXJ
ctCZdrXqcSwuMSXhMnWMkER+zT06WnHDPg9a0jQRPwgYjNQam5oPXYxLDLwo
2yr3l3oW8CGuI7AoNHgIOuo58sS6Vq9qozUp6NhpGk1Ra2V05gTYHtRGB7ek
wGCPDwu/4S1ReDYFQ/bYdHhfmi9NtgPmdEg/ZLxrc0RUwizyqzXe0IYBH4Xc
IsZ3aJFUBl8QhDXAfuRaURoMMHLFj6UV1T56//bHjvj0sCycz7B4a4FiTx1r
2drcAqNyuC8T0CuenlobjhzVwH6MJte2QUM/oViZzBjR/LeD5nKZXb10Nn+a
AUGEacL0a6RZWrNkS/FYDi0x1LCJZ6mJijHC12ArodtvYxRsoDotwL2IQ2jU
01i/q3NcG932Zep5ZaJGFWMTV0LRG7nOEWmlqYlsYyJNPae3DkI1GcZ5c0DN
d8OGFFJEby+MVBCnysaxwMYPMKLnRB+doBYHl298cD+UNfyJiK/TKBQA3dKf
RRTm84MMpgdc+uTVEAA2GECBtAjfxpLCKRThJC8EW5aA95Ch2BPQCOu648Bj
IihyS9hVQej0+DmBNrNh4zvm0eQyXS+n7HS6vAhExMS7jWvH3yJaOyojwa7I
SrUXZHE6VThRnCK57w7uYjNt0k11ZBWx6dkA7ZQffEEDfMowaiYEzEy5J7/s
3stWqpixsMw5Wt5IR3olPC1PyH+XIS0MxJpQ4g1FfXAzUNrd+Bxt0B7IaaKj
uq1KBK/FYFdNnNatxUTdanpabVkzWCpNa+/YfW42dCyOGt5ZtO22mp7eDWCd
VLwfbp3NApNlvSzn07//6Px//wy24+2d7wCtoj7i0zv6PQStd/W7dQj2zm1k
68nKu5UEcRUqw9CuZ0tsTzR23zlBE4mC7oquEn00FOUUeKARMfCguhUOtP21
K04TsnGj4xyGd/WEyMIzjAoDk8xlJrV0jnITn3BDN2ubG8g6ofzsHCbWoj2Z
PGxR/G08xQhdyFmGSmJfbSxddcvQNscBfGPswbBHk+PTU7IAOZB3vpxyWoW/
Sgs+L6SXhDJGmo6I+aJIIjxoAWmRgWxKV6whztE0oO3AwYDfC1KH7lHXIrpa
yMw5CIp+thhElKm1jz7s1mlAxFjX86LqgnXMmE1v+ORLJ6m+P/+x/Zdhd9Tt
9XrdxBv+tcMhO3o+6Jo3oz8u+R3MNF2+PPgFQoxydgpvxA8vRTI1ttcnneX4
GU/uacZnvWFvKI5MfFGMGIFqBwJJAZKJyhRDYr8hkIODABLa1AujqeOt4zwW
8apu16NZ35ma2OTW7pSbThtT7jnmHPgx7AGMgRNOzGecwTHmSDlS6HYefQUz
kLaNR6Vx5Nc1zNReKSC58eRDV5zhaBcW2LsgOtMAWeu3ysALzAMncsDjXsqi
03rO6ljcNj6DcfwZUIIAjt5TgGlKgL46Q25JMCq5Ag7L9PrsgR4fvz3YiO4a
Z0svJnf8CYVpHJ54deaRKPMuCZ0eWO20YblfdOnqQqdEFKGZYDH2Sv0Ycgrd
eE3bDG+lBng6MC7o/VmKQzg46dVAYplFMKldMKl/OEywL+iB2J25L15clYQP
3ysQwv5aUeobEtq9VFCdB2lHe5bY2BnMPV0U07cn77R/fS9t4KqNj1Ijj/ou
wMMnXbFcAJff4GEW0sqTKUeKrUNSjSxPlwvdwPEnS+++ZpY6tqdz0AlIQiDN
0ORewcziJcZdvizlqivg9yzuaNSU8X/PHHWLyMl9Yiroba++RonLRRMhPkHE
WmJ0reUJiEc/K+FmoHUDhloR1EpDrRjqbhU7iLLu41YCxLszCksSFaSJjsxQ
I0sDn9vfwRbg3SQPYz6eed6xY1a8V3dwLfE5JtphsqhNVenbNCdTgccc1jC5
a6O2lbOw5Rfo3hWONbc1eaMr5Mztu/avM3Xr6I48BkEntbwXG876qbzGo0nM
hzHnTjP0XyzD0aaS+tXH6o17ghA0uEhk9iAjUXAOITO6ikiLhcJ2HgjN4cgt
DRn1iSi0RMk4QbrmJEHydSsZItZdQg44hK1xiKBpRmiBo3crht65Mhq/pXmJ
R+qW8cbaEJVXTsIRvgOKc97iRxg3lPPdZxFszzsodyN896CeqbRi7+jgHppT
bO/oXDt8nHCQrQFt3YpBY1bpNy+vGXueE8EzR9ozmd9g4tuA5h/9cX/kDUWb
UjsUAN6p4/wJ484JX7lCO9eehHbx9VoQ1IZ+jvTb3RGWs92Vo6XNfexWVmLy
dYFDjTucpwpWFgjWiiWJBymcF6Ax9ozTXNPlCpq6xuLpGNsy1s+X4imgm5uC
TQFNocOnweH58jM9Q4kLD/fq4HGGNCAJXj7AtqHW61rrXcYZD41o1OCcLw8Z
Go5jClbMtEPUbJvc3cDpA6ldKzCSFA6R/2PoeotCG5S+pUK/Qbc6VOOstUY0
mloqJLCHvffqVMA4t/YFa2w8+EPfCPqbDQQFDg/XS737/FEtK5tTs1K6dQNA
79aPgPadxs60W0ayK1Fo3bxmP5AksDZKxYd6MmXFccj7aG06gPsOU3Bvb6cI
fRxVPVSG1lZ1lxLakQD5d5O4aAc2QvRwqcqaVTaltj5Ett7XfbeEvbNnXc4+
yMjbIoNGQ6uZClybS7n7NtuwgcMGTWlcY6CckuDria6u4mGCQdqpJCbTWcEm
krFNx6ZEEZPewtH5XYFmbSZxP4/T4m1WGgdYmoxzmmDOOcxbMf4mc6tJoCrX
vmpXQnd+pykHm/uQRdyACHjr2Mnd2okrQlPfp+p6qoTuxIkbhnLxPDep3PCq
cqJiqO4x1j1Tnb3qZ3Ko52yvlicdm7UOUpk07HUmPbqyp8haTjnkVzm4QC17
nS6lS2BIWDZZ2/TKJPja+mjXjp+qvGECe2R7tMuJ4MSsbQ6qxpMrhygm/MyX
Oe35EPF3KWt0YFj5K2kOkKeM0undJybLBHO43NMSnYt9WJ/iJopjEafpUsTR
EpUQICvHmKrTxl54KJP7KlTwHZ8bN6aXk3z5SIuT5hZ3gLe4FR9wly1x2NIX
qjUubwLklYy6anDPBvM5ln1yzDGg6lgcdZJMfUx4G2DhE37Ax77k/pfvOBzw
gOjcybF3FIbto6545YQaaA+LlbXuT8zc0yMdUHylYxjQn+fy3gF54jjL+jgc
mdAp6yY5sjayHVjHMabLrfFf+UryJI+bAVvQ1T4XXw3TXGRAmO3a0Ck+NKhz
RymhM3a/p9+0jzpu5NcVUvYwAj84K+fEElVz6JXzUVapSNtPKMwqfseha/s1
AgeNWAiWcfZDx3u4mIxOL/VzsUpD0S4xA+sdandgSYbmE3BXhtoWhQdNW6W0
MVv6ChSpt3qc+ezkePxGrIA78cpD9UIRUHCobzs3qLVWi27mRDvYUm4xZVth
mKaRuz+3vyNG9sxzj593Ou7Fnsdx8/gN83OtHAQmrhxdZZIJoDxG8cQ4moNw
9d4ADCsfbycfvz3yxm86zhmMFgYVAYGC40HMPn7jHVMwx5ss/AxclYnEaBNq
QLwTRW4CSdMKDStqi+eL0HY3RftJyR0tc5ZYv+dSHqE714JA4q0x4pxV04Mb
jvh3JxqYtJqa1qrgBNgxSvyMgtcpWnlfvSAFHoeHMNT0D1+OXk31iSPRZKmF
Cev1lIRStU2cBIJdiURlFO0OUhftd0fHnTL3PGJIPHhab26yqzErvSyD87mi
Z7W2Vmyq4CAza56YLWtYKGbCOztSM3h1wkf9xtc3CrCdYbNd0RXd6p6ICkUB
KxGV9hcKUziONIdW3HhITZ25IEHPb4iFfJObc2gDAHh2Q0Yp/tHRCc93xBgc
Ub77dEGPiq4lutaPWv32dtTQsjO4peqaYBemHmOaM6YuG4CvuB3cFebA1nij
jPI1BfI7EbwxW3cnUHBFAOrw8m45asC9fKLn0yvGvlt6z5uMJ+CsRlcggGxZ
j/85RfcNSg7gBx3nJ3Yx7QlW78qyjr1tbJdX3kgq9dkD1BaM6k1gDApjatlZ
NwHtFNN2ACTSmWpxa/wUG66DhvhZZ5iBtL/GKLabBqxn0JYhTs5VLNp2ki5F
d7YhuVlI8kSmtqU+fyzBo+nsFAY4FqQsrLV0N1kHJRTWmOMVVhHgXJYxzFk9
c9lCUDnwWJb8rE3C+5DrptWARqngj4bQNq3RQ+R1muyZZDtZoarqdyWIcFoM
nnEFC8yXTq5kwzTXpuaI1JxUtQgY5eW2lkmIWzrtn1VFocfmgNJseD/p/F/Q
V49CxT+l8irVUclnj9FJZa+XrqS0M1ciWbxRwMSqo5u7zE/sojGC6FBAmoH4
hQae/MHSHeR9IAZ7uS2f1JMKxqjdttf3QN03LjhQmub67t3ax79EEPvRSlfG
su8yGaPc9/hcMPeDJXkd7n1sG30yh+kokirhPR27BqgWaRwyqBQ3Ot5dZoAl
kXNtebvcgEmVJgPicvT8ex0pphRyfp1F4F3D+hf+tYmvIQgg3IoEg2R4g5Xu
x4dFwBFru3RMNUwTD2RzEXIlt5reqadQU4TV1BttojDlln2AqTB7kWuNkZdk
y4+VoU9VrNdplpfFdMi9oPupVs5eerDymlXCOQkV3OgqBVUk0m0MGtO1cL45
gFDaQkG48PQIXnUEj0bwYASPRvDgXzlCp9Mr01Cne5UVeNfDvSllRmbw8tmB
TZLcH5VJg9iN//qi5//ydRXqXMZPugInu/1sDk0xqDB5c0RY/GTryH7ml7Mv
UfKFVbCuJ4hpju7D75+5CWd4sFTLrK1fPH9gflm5wabuHJo6JNYRGe8+nhFm
pl1OEeN52IWlXJWujiyeTRtjHD4ZjhIffDOEJn91vzfsUnYyTeQGDq/ZhzW3
mOjWOTyz11BslBZ5HYvTmggMyOk1rDIbTkWbCLwjPmHF1M89JxSkwzk8bRm6
Ycmh2ZxsGHNpqhpyoEgJj1Vxyh+iKkr2Qiv9XgbTtnyFxx7qrDhM5alQ+V7Z
5VFcZAH9fz5y+OhoPP5n4qNv5Qj2GzVReek6F20KuAOkqwiPb/SrTp1Zeo/g
Fp7mG3hFHDmFHMhBDU3xJOKkO3Qmg0eHX9bbRU25MtrUUem65KF6VMmz2kmh
zYF3bU3tf+igqdMab6JS3UW35KJxEhkqc++MX+PtPHj9ySms+dnYUzws2jVW
/+t7rL4uo2sQVS2OOOaO7d9OjsfgQWRFkmhTRlfsJgK4awR3e3AYIBO2VL5i
BTrEZ2O3Uyy/M/dx7snxaYcz+vU8pyZO2/4tvDEwUaWsjwor0WugP451uTuE
HhcfcMVFPsfUuyT8AA9lzZ2xhswBomqyp9hIrViwGA8x9xnB3Y3A4tppe9XM
HXNnwylg+1lbmeUuUSXYkho1YdSrrlFOSlo5QTcp7yhhdBtkPC8GpsV+tuT6
abX07DnfQG5fnp53wHmXsF7iT7RogV7AauOBuzbAXAmG4E0STJvnRgrLlIFW
jjd0eB7rXG7cj14T9/ENP7ZL6bh4Xgtw0U66tQrVYas17OlKKXjxIku44kcS
4sVFs6GVezrkzXnixzid+fEl+CB0RK/ZWh/elrTuXvDxxX/41744xjr/eOot
6So3UjU208UwvTpu842u2WzY4PL0p45p+9pXQNFj3e4ioXpII9F+fTq+GHVa
I7M2qkdVWxuQMPDLakU2fy32t4jWTYuerPwsXy+wN1Y4DtG5KJIIC7nqSa74
CngQZUFB6S/4nQby4+nxcWcXUvBMhXRTVq74Hbg9MXLv6buOQdK/8TVyLXkk
vNoNVHU7AILJyc75d21Ka38Le2uMh6VXgDQzBwK71kTQhLGjJMzw2jB9mwSC
/RV68W365DoCruOj6oAP1vTElZ4T4s1X6df6opo6RRcTIxFPEnCbgWW4HK+H
/g3samOvDxo4S80G/R8uEf3VHs/MDXHxZvKuaclVUbzioUrh6V/5aD+Jk3Px
bPhiNBrSlx0MD4yc4SpVQUwBQbfOUhWObnmFXWu3WOeCmJ3VGYiGq05/Ymr0
1Q45BzKrKo1M7jus08NidzA+KwfvJFmgTA7FUXG14ujo5dHbE9H2qTxVlmLs
En6hkqLA6eQG66FbttV728ft2iIjvATWIIJsippzmcfh2o1TaAtrTwRGoGZ2
s7CQaVasm41WKuT8mUwCLi1HV0ONvAU/f1OGTgAn91RB/qSrJ1NN1ExipVSd
wmGS0o65dOUxLB3jSYZAqjW1cKPr1TgYrUAieK2/UIhgvCcUcbFCZWrjzbHe
9LbAZ2VotAQfUuuqX1URCDp8RT6hcqN0OCCdhxjLyecCWZVwALsdHP0wYRE2
38o7Ek1NfJMqsGt86yhVZ2B/7b5Jal6dzoXkWsFSp1ahPnXKh5rSAnyOzIRC
WDit2E2gaj+Ou7rOIz5cpCrH71MB8tXhIGM34HftzNKvdNrkr7mOQoSE5pyD
gzliJfoTJTLMpGwWmylXQrTmpCnQkokbOROzLL1RbObOTTGzDI8YqAIdxqeA
4csVOeGAtNxsWy2ia9qRJ6KT8TDDsywnMc/N+FTYz22/lHLNJxUxXvFFYxtn
d+vGliaR6RSCpNcH6tiYHNwVcHO2oXqPKbMxvpYJEa9kIYY1fDE50lyXo452
wSD+fOIaChXiYzCRzfGKtfGcUzoClEw5gmomddHSsM4YOHFqCh6g9ambwfh4
xyDz+TwRXtIV9DVWqAkKyl/LtyY35Srd+dCXIWNQKwlAlErnOVVgAFmNPgpV
hfDZDwuZ2dnuxk0P0iIOUSPxuVGkyhIhRmLqO1OoEIVEWZagpzdJV6asixnF
HKGaRrZeoiOnWBba21Cm/KnrhAGBN/qmusS1GZzCN3f6akCH5n4LXr/XNfj2
tNPDCzrRw+3pTCcKoIu9U874r7XRVZfpXFN7OzKslTfRRQKwSV5BWeW2z5a7
4fpHpkxKOcUDPHckH5BVRDfVkt1UFLCsFlwpCYi1aRrxwcTf+KqS9KrK+2C1
M0SsMWQcOH1GWSROqRim8Bvt6XKRVCJ1x4H0rZHI8qz+tR71MssZlYY01aXl
NSlmjWu2l6g6TVlRuJawZIfRbD2nMudAC+QqNSIDqwWbaic7UNHsYCbyplIi
qhbX6OE3zpXVb5rBNHyH1QHAcMMzmwRRZ6t/YRFzpc91kMBdaOk0eesCBwFL
vaSutYv1iTSpNLIFk0rjK3dcrTlRNdJRTSPJ7N4Me7St8awJB71odcd95vom
NoJ558Quytwg253hpO0UOB1gehhXbHcnUCrsATM145y/RoDLvZoaXGWSnpXZ
7kGryVmnSqJhWklPB1Uu+crTpnnCrlY0MNLGvSMF8/G5GEst/qKDTWm0U9yY
4kYmnYKllSE+aGu4v82JmQZ21khHZiBd0OfB3+hEFv2n+jdEfe7WQiNcf4O/
jE8XfAI791aUXYT+uSUQqj+30NKr/4jGZ9DSgdKO6fJuOWZtPbAbt+Z+Wm12
RoL7/NaQXK2llmzu0wYSvG1R6SRTg2y7CjwX47AmgbaaKViFjpj5SiHW2RUd
hoy68snriY36o/peDg4UX38AEWK+LQPI4DV9FZRTNWLm56ShzXd38a2cVIdG
wYFdh5SRycFJZytlEq5TMBSUtjOsT2X5XDtXvGTxib/jq18O8d3+8xef2w1f
0LPVsk+rU33o0OkZv4Yh28X/lIdc3g51rymWZyaE+tJo1mRhurqXFW02kYPg
rqOM3KuKO64nwmhfSr/qC0P0hUpIlLcWyy+8aThJOK59RYSuqqy/eqIscK8f
WFvbDMVffeB4C44c0jLcibL6M1PmvFbEBHYc01DAVo2UtHebyo6sZO3XmxA1
KHKPHbld2l8UrXUOOmq7oW/7uCsTYUGJYIZq+RSCakRSkI2OYYFijXlnRna+
wNaxJJS9x1fWAa8W+3Ysoq7zvS8OkERSP8ssfSD+3qQ3+DVS+nBklV7bUp0p
yIrVYZmRVgdA3BB2ESlOea4dO6y/4AcDT3RQFVjo6IpO6y+HXO5Thi/35n6s
5N5fzfc9UL0vqqpoyoTg98Yo91trtEw4+bj9HWe6uA1opEsqaHMGavIozsEJ
Q+/ojYzX8yK23wABSnClnZ+TVRSLM32SSNvwXq6CVEyChe+DH/7fLLcY7gF5
AAA=

-->

</rfc>
