<?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.6.17 (Ruby 3.0.2) -->
<?rfc docindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-qlog-main-schema-06" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>Main logging schema for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-06"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>Akamai</organization>
      <address>
        <email>rmarx@akamai.com</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Meta</organization>
      <address>
        <email>lniccolini@meta.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
      <address>
        <email>marten@protocol.ai</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucaspardue.24.7@gmail.com</email>
      </address>
    </author>
    <date year="2023" month="July" day="10"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document defines qlog, an extensible high-level schema for a standardized
logging format. It allows easy sharing of data, benefitting common debug and
analysis methods and tooling. The high-level schema is independent of protocol;
separate documents extend qlog for protocol-specific data. The schema is also
independent of serialization format, allowing logs to be represented in many
ways such as JSON, CSV, or protobuf.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove this section before publication.</t>
        </li>
      </ul>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>. Readers are
advised to refer to the "editor's draft" at that URL for an up-to-date version
of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Endpoint logging is a useful strategy for capturing and understanding how
applications using network protocols are behaving, particularly where protocols
have an encrypted wire image that restricts observers' ability to see what is
happening.</t>
      <t>Many applications implement logging using a custom, non-standard logging format.
This has an effect on the tools and methods that are used to
analyze the logs, for example to perform root cause analysis of an
interoperability failure between distinct implementations. A lack of a common
format impedes the development of common tooling that can be used by all parties
that have access to logs.</t>
      <t>This document defines qlog, an extensible high-level schema and harness that
provides a shareable, aggregatable and structured logging format. This
high-level schema is independent of protocol, with logging entries for specific
protocols and use cases being defined in other documents (see for example
<xref target="QLOG-QUIC"/> for QUIC and <xref target="QLOG-H3"/> for HTTP/3 and QPACK-related event
definitions).</t>
      <t>The goal of this high-level schema is to provide amenities and default
characteristics that each logging file should contain (or should be able to
contain), such that generic and reusable toolsets can be created that can deal
with logs from a variety of different protocols and use cases.</t>
      <t>As such, qlog provides versioning, metadata inclusion, log aggregation, event
grouping and log file size reduction techniques.</t>
      <t>The qlog schema can be serialized in many ways (e.g., JSON, CBOR, protobuf,
etc). This document describes only how to employ <xref target="JSON"/>, its subset
<xref target="I-JSON"/>, and its streamable derivative
<xref target="JSON-Text-Sequences"/>.</t>
      <section anchor="data_types">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <section anchor="schema-definition">
          <name>Schema definition</name>
          <t>To define events and data structures, all qlog documents use the Concise
Data Definition Language <xref target="CDDL"/>. This document uses the basic
syntax, the specific <tt>text</tt>, <tt>uint</tt>, <tt>float32</tt>, <tt>float64</tt>, <tt>bool</tt>, and
<tt>any</tt> types, as well as the <tt>.default</tt>, <tt>.size</tt>, and <tt>.regexp</tt> control
operators, the <tt>~</tt> unwrapping operator, and the <tt>$</tt> extension point
syntax from <xref target="CDDL"/>.</t>
          <t>Additionally, this document defines the following custom types for
clarity:</t>
          <figure anchor="cddl-custom-types-def">
            <name>Additional CDDL type definitions</name>
            <sourcecode type="cddl"><![CDATA[
; CDDL's uint is defined as being 64-bit in size
; but for many protocol fields it is better to be restrictive
; and explicit
uint8 = uint .size 1
uint16 = uint .size 2
uint32 = uint .size 4
uint64 = uint .size 8

; an even-length lowercase string of hexadecimally encoded bytes
; examples: 82dc, 027339, 4cdbfd9bf0
; this is needed because the default CDDL binary string (bytes/bstr)
; is only CBOR and not JSON compatible
hexstring = text .regexp "([0-9a-f]{2})*"
]]></sourcecode>
          </figure>
          <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
          <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
          <ul empty="true">
            <li>
              <t>Note to RFC editor: Please remove the following text in this section before
publication.</t>
            </li>
          </ul>
          <t>The main general CDDL syntax conventions in this document a reader
should be aware of for easy reading comprehension are:</t>
          <ul spacing="normal">
            <li>
              <tt>? obj</tt> : this object is optional</li>
            <li>
              <tt>TypeName1 / TypeName2</tt> : a union of these two types (object can be either type 1 OR
type 2)</li>
            <li>
              <tt>obj: TypeName</tt> : this object has this concrete type</li>
            <li>
              <tt>obj: [* TypeName]</tt> : this object is an array of this type with
minimum size of 0 elements</li>
            <li>
              <tt>obj: [+ TypeName]</tt> : this object is an array of this type with
minimum size of 1 element</li>
            <li>
              <tt>TypeName = ...</tt> : defines a new type</li>
            <li>
              <tt>EnumName = "entry1" / "entry2" / entry3 / ...</tt>: defines an enum</li>
            <li>
              <tt>StructName = { ... }</tt> : defines a new struct type</li>
            <li>
              <tt>;</tt> : single-line comment</li>
            <li>
              <tt>* text =&gt; any</tt> : special syntax to indicate 0 or more fields that
have a string key that maps to any value. Used to indicate a generic
JSON object.</li>
          </ul>
          <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
          <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
        </section>
        <section anchor="serialization-examples">
          <name>Serialization examples</name>
          <t>Serialization examples in this document use JSON (<xref target="JSON"/>) unless
otherwise indicated.</t>
        </section>
      </section>
    </section>
    <section anchor="design-goals">
      <name>Design goals</name>
      <t>The main tenets for the qlog schema design are:</t>
      <ul spacing="normal">
        <li>Streamable, event-based logging</li>
        <li>A flexible format that can reduce log producer overhead, at the cost of
increased complexity for consumers (e.g. tools)</li>
        <li>Extensible and pragmatic</li>
        <li>Aggregation and transformation friendly (e.g., the top-level element
for the non-streaming format is a container for individual traces,
group_ids can be used to tag events to a particular context)</li>
        <li>Metadata is stored together with event data</li>
      </ul>
    </section>
    <section anchor="top-level">
      <name>The high level qlog schema</name>
      <t>A qlog file should be able to contain several individual traces and logs from
multiple vantage points that are in some way related. To that end, the top-level
element in the qlog schema defines only a small set of "header" fields and an
array of component traces. For this document, the required "qlog_version" field
<bcp14>MUST</bcp14> have a value of "0.4".</t>
      <t>As qlog can be serialized in a variety of ways, the "qlog_format" field is used to
indicate which serialization option was chosen. Its value <bcp14>MUST</bcp14> either be one of
the options defined in this document (e.g., <xref target="concrete-formats"/>) or the field
must be omitted entirely, in which case it assumes the default value of "JSON".</t>
      <t>In order to make it easier to parse and identify qlog files and their
serialization format, the "qlog_version" and "qlog_format" fields and their values
<bcp14>SHOULD</bcp14> be in the first 256 characters/bytes of the resulting log file.</t>
      <t>An example of the qlog file's top-level structure is shown in <xref target="qlog-file-def"/>.</t>
      <t>Definition:</t>
      <figure anchor="qlog-file-def">
        <name>QlogFile definition</name>
        <sourcecode type="cddl"><![CDATA[
QlogFile = {
    qlog_version: text
    ? qlog_format: text .default "JSON"
    ? title: text
    ? description: text
    ? traces: [+ Trace /
                 TraceError]
}
]]></sourcecode>
      </figure>
      <t>JSON serialization example:</t>
      <figure anchor="qlog-file-ex">
        <name>QlogFile example</name>
        <artwork><![CDATA[
{
    "qlog_version": "0.4",
    "qlog_format": "JSON",
    "title": "Name of this particular qlog file (short)",
    "description": "Description for this group of traces (long)",
    "traces": [...]
}
]]></artwork>
      </figure>
      <section anchor="traces">
        <name>traces</name>
        <t>It is often advantageous to group several related qlog traces together in a single
file. For example, it is possible to simultaneously perform logging on the client, on the
server and on a single point on their common network path. For analysis, it is
useful to aggregate these three individual traces together into a single file, so
it can be uniquely stored, transferred and annotated.</t>
        <t>As such, the "traces" array contains a list of individual qlog traces. Typical
qlogs will only contain a single trace in this array. These can later be combined
into a single qlog file by taking the "traces" entry/entries for each qlog file
individually and copying them to the "traces" array of a new, aggregated qlog
file. This is typically done in a post-processing step.</t>
        <t>The "traces" array can thus contain both normal traces (for the definition of the
Trace type, see <xref target="trace"/>), but also "error" entries. These indicate that an attempt
to find/convert a file for inclusion in the aggregated qlog was made, but there was an
error during the process. Rather than silently dropping the erroneous file, it can
be explicitly included in the qlog file as an entry in the "traces" array,
as shown in <xref target="trace-error-def"/>.</t>
        <t>Definition:</t>
        <figure anchor="trace-error-def">
          <name>TraceError definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceError = {
    error_description: text

    ; the original URI used for attempted find of the file
    ? uri: text
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
        <t>JSON serialization example:</t>
        <figure anchor="trace-error-ex">
          <name>TraceError example</name>
          <artwork><![CDATA[
{
    "error_description": "File could not be found",
    "uri": "/srv/traces/today/latest.qlog",
    "vantage_point": { type: "server" }
}
]]></artwork>
        </figure>
        <t>Note that another way to combine events of different traces in a single qlog file
is through the use of the "group_id" field, discussed in <xref target="group-ids"/>.</t>
      </section>
      <section anchor="trace">
        <name>Individual Trace containers</name>
        <t>The exact conceptual definition of a Trace can be fluid. For example, a trace
could contain all events for a single connection, for a single endpoint, for a
single measurement interval, for a single protocol, etc. As such, a Trace
container contains some metadata in addition to the logged events, see
<xref target="trace-def"/>.</t>
        <t>In the normal use case however, a trace is a log of a single data flow collected
at a single location or vantage point. For example, for QUIC, a single trace only
contains events for a single logical QUIC connection for either the client or the
server.</t>
        <t>The semantics and context of the trace can mainly be deduced from the entries in
the "common_fields" list and "vantage_point" field.</t>
        <t>Definition:</t>
        <figure anchor="trace-def">
          <name>Trace definition</name>
          <sourcecode type="cddl"><![CDATA[
Trace = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
    events: [* Event]
}
]]></sourcecode>
        </figure>
        <t>JSON serialization example:</t>
        <figure anchor="trace-ex">
          <name>Trace example</name>
          <artwork><![CDATA[
{
    "title": "Name of this particular trace (short)",
    "description": "Description for this trace (long)",
    "common_fields": {
        "ODCID": "abcde1234",
        "time_format": "absolute"
    },
    "vantage_point": {
        "name": "backend-67",
        "type": "server"
    },
    "events": [...]
}
]]></artwork>
        </figure>
        <section anchor="timeoffset">
          <name>time_offset</name>
          <t>The time_offset field indicates by how many milliseconds the starting time of the current
trace should be offset. This is useful when comparing logs taken from various
systems, where clocks might not be perfectly synchronous. Users could use manual
tools or automated logic to align traces in time and the found optimal offsets can
be stored in this field for future usage. The default value is 0.</t>
          <section anchor="originaluris">
            <name>original_uris</name>
            <t>The original_uris field is used when merging multiple individual qlog files or
other source files (e.g., when converting .pcaps to qlog). It allows to keep
better track where certain data came from. It is a simple array of strings. It is
an array instead of a single string, since a single qlog trace can be made up out
of an aggregation of multiple component qlog traces as well. The default value is
an empty array.</t>
          </section>
        </section>
        <section anchor="vantage-point">
          <name>vantage_point</name>
          <t>The vantage_point field describes the vantage point from which the trace
originates, see <xref target="vantage-point-def"/>. Each trace <bcp14>MUST</bcp14> have a single
vantage_point. By virtue of this, a single qlog file can only include events
from multiple vantage_points if it includes multiple traces.</t>
          <t>Definitions:</t>
          <figure anchor="vantage-point-def">
            <name>VantagePoint definition</name>
            <sourcecode type="cddl"><![CDATA[
VantagePoint = {
    ? name: text
    type: VantagePointType
    ? flow: VantagePointType
}

; client = endpoint which initiates the connection
; server = endpoint which accepts the connection
; network = observer in between client and server
VantagePointType = "client" /
                   "server" /
                   "network" /
                   "unknown"
]]></sourcecode>
          </figure>
          <t>JSON serialization examples:</t>
          <figure anchor="vantage-point-ex">
            <name>VantagePoint example</name>
            <artwork><![CDATA[
{
    "name": "aioquic client",
    "type": "client"
}

{
    "name": "wireshark trace",
    "type": "network",
    "flow": "client"
}
]]></artwork>
          </figure>
          <t>The flow field is only required if the type is "network" (for example, the trace
is generated from a packet capture). It is used to disambiguate events like
"packet sent" and "packet received". This is indicated explicitly because for
multiple reasons (e.g., privacy) data from which the flow direction can be
otherwise inferred (e.g., IP addresses) might not be present in the logs.</t>
          <t>Meaning of the different values for the flow field:
  * "client" indicates that this vantage point follows client data flow semantics (a
    "packet sent" event goes in the direction of the server).
  * "server" indicates that this vantage point follow server data flow semantics (a
    "packet sent" event goes in the direction of the client).
  * "unknown" indicates that the flow's direction is unknown.</t>
          <t>Depending on the context, tools confronted with "unknown" values in the
vantage_point can either try to heuristically infer the semantics from
protocol-level domain knowledge (e.g., in QUIC, the client always sends the first
packet) or give the user the option to switch between client and server
perspectives manually.</t>
        </section>
      </section>
      <section anchor="field-name-semantics">
        <name>Field name semantics</name>
        <t>Inside of the "events" field of a qlog trace is a list of events logged by the
endpoint. Each event is specified as a generic object with a number of member
fields and their associated data. Depending on the protocol and use case, the
exact member field names and their formats can differ across implementations. This
section lists the main, pre-defined and reserved field names with specific
semantics and expected corresponding value formats.</t>
        <t>Each qlog event <bcp14>MUST</bcp14> contain the mandatory fields: "time"
(<xref target="time-based-fields"/>), "name" (<xref target="name-field"/>), and "data" (<xref target="data-field"/>).</t>
        <t>Each qlog event <bcp14>MAY</bcp14> contain the optional fields: "time_format"
(<xref target="time-based-fields"/>), "protocol_type" (<xref target="protocol-type-field"/>), "trigger"
(<xref target="trigger-field"/>), and "group_id" <xref target="group-ids"/>. Some of these fields will
contain identical values across individual events in a trace, it is possible
to optimize out this duplication using "common_fields" (<xref target="common-fields"/>).</t>
        <t>The specific values for each of these fields and their semantics are defined in
separate documents, specific per protocol or use case. For example: event
definitions for QUIC, HTTP/3 and QPACK can be found in <xref target="QLOG-QUIC"/> and
<xref target="QLOG-H3"/>.</t>
        <t>Events are intended to be extended with custom fields, therefore they <bcp14>MAY</bcp14>
contain other fields not defined in this document. Custom fields may be known or
unknown to tools. Tools <bcp14>SHOULD</bcp14> allow for the presence of unknown event fields,
but their semantics depend on the context of the log usage.</t>
        <t>An example of a qlog event with its component fields is shown in
<xref target="event-def"/>.</t>
        <t>Definition:</t>
        <figure anchor="event-def">
          <name>Event definition</name>
          <sourcecode type="cddl"><![CDATA[
Event = {
    time: float64
    name: text
    data: $ProtocolEventBody
    ? time_format: TimeFormat
    ? protocol_type: ProtocolType
    ? group_id: GroupID
    ? system_info: SystemInformation

    ; events can contain any amount of custom fields
    * text => any
}
]]></sourcecode>
        </figure>
        <t>JSON serialization:</t>
        <figure anchor="event-ex">
          <name>Event example</name>
          <artwork><![CDATA[
{
    "time": 1553986553572,

    "name": "quic:packet_sent",
    "data": { ... },

    "protocol_type":  ["QUIC","HTTP3"],
    "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",

    "time_format": "absolute",

    "ODCID": "127ecc830d98f9d54a42c4f0842aa87e181a"
}
]]></artwork>
        </figure>
        <section anchor="time-based-fields">
          <name>Timestamps</name>
          <t>The "time" field indicates the timestamp at which the event occurred. Its value is
typically the Unix timestamp since the 1970 epoch (number of milliseconds since
midnight UTC, January 1, 1970, ignoring leap seconds). However, qlog supports two
more succinct timestamps formats to allow reducing file size. The employed format
is indicated in the "time_format" field, which allows one of three values:
"absolute", "delta" or "relative".</t>
          <t>Definition:</t>
          <figure anchor="time-format-def">
            <name>TimeFormat definition</name>
            <sourcecode type="cddl"><![CDATA[
TimeFormat = "absolute" /
             "delta" /
             "relative"
]]></sourcecode>
          </figure>
          <ul spacing="normal">
            <li>Absolute: Include the full absolute timestamp with each event. This approach
uses the largest amount of characters. This is also the default value of the
"time_format" field.</li>
            <li>Delta: Delta-encode each time value on the previously logged value. The first
event in a trace typically logs the full absolute timestamp. This approach uses
the least amount of characters.</li>
            <li>Relative: Specify a full "reference_time" timestamp (typically this is done
up-front in "common_fields", see <xref target="common-fields"/>) and include only
relatively-encoded values based on this reference_time with each event. The
"reference_time" value is typically the first absolute timestamp. This approach
uses a medium amount of characters.</li>
          </ul>
          <t>The first option is good for stateless loggers, the second and third for stateful
loggers. The third option is generally preferred, since it produces smaller files
while being easier to reason about. An example for each option can be seen in
<xref target="time-format-ex"/>.</t>
          <figure anchor="time-format-ex">
            <name>Three different approaches for logging timestamps</name>
            <artwork><![CDATA[
The absolute approach will use:
1500, 1505, 1522, 1588

The delta approach will use:
1500, 5, 17, 66

The relative approach will:
- set the reference_time to 1500 in "common_fields"
- use: 0, 5, 22, 88
]]></artwork>
          </figure>
          <t>One of these options is typically chosen for the entire trace (put differently:
each event has the same value for the "time_format" field). Each event <bcp14>MUST</bcp14>
include a timestamp in the "time" field.</t>
          <t>Events in each individual trace <bcp14>SHOULD</bcp14> be logged in strictly ascending timestamp
order (though not necessarily absolute value, for the "delta" format). Tools <bcp14>MAY</bcp14>
sort all events on the timestamp before processing them, though are not required
to (as this could impose a significant processing overhead). This can be a problem
especially for multi-threaded and/or streaming loggers, who could consider using a
separate post-processor to order qlog events in time if a tool do not provide this
feature.</t>
          <t>Timestamps do not have to use the UNIX epoch timestamp as their reference. For
example for privacy considerations, any initial reference timestamps (for example
"endpoint uptime in ms" or "time since connection start in ms") can be chosen.
Tools <bcp14>SHOULD NOT</bcp14> assume the ability to derive the absolute Unix timestamp from
qlog traces, nor allow on them to relatively order events across two or more
separate traces (in this case, clock drift should also be taken into account).</t>
        </section>
        <section anchor="name-field">
          <name>Event Names</name>
          <t>Events differ mainly in the type of metadata associated with them. The "name"
field is an identifier that parsers can use to decide how to interpret the event
metadata contained in the "data" field (see <xref target="data-field"/>).</t>
          <t>Event names indicate a category and type. The "name" field <bcp14>MUST</bcp14> contain a
non-empty character sequence representing a category, followed by a colon (':'),
followed by a non-empty character sequence representing a type.</t>
          <t>Category allows a higher-level grouping of events per specific event type. For
example for QUIC and HTTP/3, the different categories could be "quic", "http",
"qpack", and "recovery". Within these categories, the event type provides
additional granularity. For example for QUIC and HTTP/3, within the "quic"
category, there would be "packet_sent" and "packet_received" events.</t>
          <t>JSON serialization example:</t>
          <figure anchor="name-ex">
            <name>An event with category "quic" and type "packet_sent".</name>
            <artwork><![CDATA[
{
    "name": "quic:packet_sent"
}
]]></artwork>
          </figure>
        </section>
        <section anchor="data-field">
          <name>Data</name>
          <t>The data field is a generic object. It contains the per-event metadata and its
form and semantics are defined per specific sort of event. For example, data
field value definitions for QUIC and HTTP/3 can be found in <xref target="QLOG-QUIC"/> and
<xref target="QLOG-H3"/>.</t>
          <t>This field is defined here as a CDDL extension point (a "socket" or
"plug") named <tt>$ProtocolEventBody</tt>. Other documents <bcp14>MUST</bcp14> properly extend
this extension point when defining new data field content options to
enable automated validation of aggregated qlog schemas.</t>
          <t>The only common field defined for the data field is the <tt>trigger</tt> field,
which is discussed in <xref target="trigger-field"/>.</t>
          <t>Definition:</t>
          <figure anchor="protocoleventbody-def">
            <name>ProtocolEventBody definition</name>
            <sourcecode type="cddl"><![CDATA[
; The ProtocolEventBody is any key-value map (e.g., JSON object)
; only the optional trigger field is defined in this document
$ProtocolEventBody /= {
    ? trigger: text
    * text => any
}
; event documents are intended to extend this socket by using:
; NewProtocolEvents = EventType1 /
;                     EventType2 /
;                     ... /
;                     EventTypeN
; $ProtocolEventBody /= NewProtocolEvents
]]></sourcecode>
          </figure>
          <t>One purely illustrative example for a QUIC "packet_sent" event is shown in
<xref target="data-ex"/>:</t>
          <figure anchor="data-ex">
            <name>Example of the 'data' field for a QUIC packet_sent event</name>
            <artwork><![CDATA[
TransportPacketSent = {
    ? packet_size: uint16
    header: PacketHeader
    ? frames:[* QuicFrame]
    ? trigger: "pto_probe" /
               "retransmit_timeout" /
               "bandwidth_probe"
}

could be serialized as

{
    "packet_size": 1280,
    "header": {
        "packet_type": "1RTT",
        "packet_number": 123
    },
    "frames": [
        {
            "frame_type": "stream",
            "length": 1000,
            "offset": 456
        },
        {
            "frame_type": "padding"
        }
    ]
}
]]></artwork>
          </figure>
        </section>
        <section anchor="protocol-type-field">
          <name>protocol_type</name>
          <t>The "protocol_type" array field indicates to which protocols (or protocol
"stacks") this event belongs. This allows a single qlog file to aggregate traces
of different protocols (e.g., a web server offering both TCP+HTTP/2 and
QUIC+HTTP/3 connections).</t>
          <t>Definition:</t>
          <figure anchor="protocol-type-def">
            <name>ProtocolType definition</name>
            <sourcecode type="cddl"><![CDATA[
ProtocolType = [+ text]
]]></sourcecode>
          </figure>
          <t>For example, QUIC and HTTP/3 events have the "QUIC" and "HTTP3" protocol_type
entry values, see <xref target="QLOG-QUIC"/> and <xref target="QLOG-H3"/>.</t>
          <t>Typically however, all events in a single trace are of the same few protocols, and
this array field is logged once in "common_fields", see <xref target="common-fields"/>.</t>
        </section>
        <section anchor="trigger-field">
          <name>Triggers</name>
          <t>Sometimes, additional information is needed in the case where a single event can
be caused by a variety of other events. In the normal case, the context of the
surrounding log messages gives a hint as to which of these other events was the
cause. However, in highly-parallel and optimized implementations, corresponding
log messages might separated in time. Another option is to explicitly indicate
these "triggers" in a high-level way per-event to get more fine-grained
information without much additional overhead.</t>
          <t>In qlog, the optional "trigger" field contains a string value describing
the reason (if any) for this event instance occurring, see
<xref target="data-field"/>. While this "trigger" field could be a property of the
qlog Event itself, it is instead a property of the "data" field instead.
This choice was made because many event types do not include a trigger
value, and having the field at the Event-level would cause overhead in
some serializations. Additional information on the trigger can be added
in the form of additional member fields of the "data" field value, yet
this is highly implementation-specific, as are the trigger field's
string values.</t>
          <t>One purely illustrative example of some potential triggers for QUIC's
"packet_dropped" event is shown in <xref target="trigger-ex"/>:</t>
          <figure anchor="trigger-ex">
            <name>Trigger example</name>
            <artwork><![CDATA[
TransportPacketDropped = {
    ? packet_type: PacketType
    ? raw_length: uint16
    ? trigger: "key_unavailable" /
               "unknown_connection_id" /
               "decrypt_error" /
               "unsupported_version"
}
]]></artwork>
          </figure>
        </section>
        <section anchor="group-ids">
          <name>group_id</name>
          <t>As discussed in <xref target="trace"/>, a single qlog file can contain several traces taken
from different vantage points. However, a single trace from one endpoint can also
contain events from a variety of sources. For example, a server implementation
might choose to log events for all incoming connections in a single large
(streamed) qlog file. As such, a method for splitting up events belonging
to separate logical entities is required.</t>
          <t>The simplest way to perform this splitting is by associating a "group identifier"
to each event that indicates to which conceptual "group" each event belongs. A
post-processing step can then extract events per group. However, this group
identifier can be highly protocol and context-specific. In the example above,
the QUIC "Original Destination Connection ID" could be used to uniquely identify a
connection. As such, they might add a "ODCID" field to each event. However, a
middlebox logging IP or TCP traffic might rather use four-tuples to identify
connections, and add a "four_tuple" field.</t>
          <t>As such, to provide consistency and ease of tooling in cross-protocol and
cross-context setups, qlog instead defines the common "group_id" field, which
contains a string value. Implementations are free to use their preferred string
serialization for this field, so long as it contains a unique value per logical
group. Some examples can be seen in <xref target="group-id-ex"/>.</t>
          <t>Definition:</t>
          <figure anchor="group-id-def">
            <name>GroupID definition</name>
            <sourcecode type="cddl"><![CDATA[
GroupID = text
]]></sourcecode>
          </figure>
          <t>JSON serialization example for events grouped by four tuples
and QUIC connection IDs:</t>
          <figure anchor="group-id-ex">
            <name>GroupID example</name>
            <artwork><![CDATA[
"events": [
    {
        "time": 1553986553579,
        "protocol_type": ["TCP", "TLS", "HTTP2"],
        "group_id": "ip1=2001:67c:1232:144:9498:6df6:f450:110b,
                   ip2=2001:67c:2b0:1c1::198,port1=59105,port2=80",
        "name": "quic:packet_received",
        "data": { ... }
    },
    {
        "time": 1553986553581,
        "protocol_type": ["QUIC","HTTP3"],
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "name": "quic:packet_sent",
        "data": { ... }
    }
]
]]></artwork>
          </figure>
          <t>Note that in some contexts (for example a Multipath transport protocol) it might
make sense to add additional contextual per-event fields (for example "path_id"),
rather than use the group_id field for that purpose.</t>
          <t>Note also that, typically, a single trace only contains events belonging to a
single logical group (for example, an individual QUIC connection). As such,
instead of logging the "group_id" field with an identical value for each event
instance, this field is typically logged once in "common_fields", see
<xref target="common-fields"/>.</t>
        </section>
        <section anchor="systeminfo">
          <name>system_info</name>
          <t>The "system_info" field can be used to record system-specific details related to an
event. This is useful, for instance, where an application splits work across
CPUs, processes, or threads and events for a single trace occur on potentially
different combinations thereof. Each field is optional to support deployment
diversity.</t>
          <t>Definition:</t>
          <sourcecode type="cddl"><![CDATA[
SystemInformation = {
  ? processor_id: uint32
  ? process_id: uint32
  ? thread_id: uint32
}
]]></sourcecode>
        </section>
        <section anchor="common-fields">
          <name>common_fields</name>
          <t>As discussed in the previous sections, information for a typical qlog event varies
in three main fields: "time", "name" and associated data. Additionally, there are
also several more advanced fields that allow mixing events from different
protocols and contexts inside of the same trace (for example "protocol_type" and
"group_id"). In most "normal" use cases however, the values of these advanced
fields are consistent for each event instance (for example, a single trace
contains events for a single QUIC connection).</t>
          <t>To reduce file size and making logging easier, qlog uses the "common_fields" list
to indicate those fields and their values that are shared by all events in this
component trace. This prevents these fields from being logged for each individual
event. An example of this is shown in <xref target="common-fields-ex"/>.</t>
          <figure anchor="common-fields-ex">
            <name>CommonFields example</name>
            <artwork><![CDATA[
JSON serialization with repeated field values
per-event instance:

{
    "events": [{
            "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
            "protocol_type": ["QUIC","HTTP3"],
            "time_format": "relative",
            "reference_time": 1553986553572,

            "time": 2,
            "name": "quic:packet_received",
            "data": { ... }
        },{
            "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
            "protocol_type": ["QUIC","HTTP3"],
            "time_format": "relative",
            "reference_time": 1553986553572,

            "time": 7,
            "name": "http:frame_parsed",
            "data": { ... }
        }
    ]
}

JSON serialization with repeated field values instead
extracted to common_fields:

{
    "common_fields": {
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "protocol_type": ["QUIC","HTTP3"],
        "time_format": "relative",
        "reference_time": 1553986553572
    },
    "events": [
        {
            "time": 2,
            "name": "quic:packet_received",
            "data": { ... }
        },{
            "time": 7,
            "name": "http:frame_parsed",
            "data": { ... }
        }
    ]
}
]]></artwork>
          </figure>
          <t>The "common_fields" field is a generic dictionary of key-value pairs, where the
key is always a string and the value can be of any type, but is typically also a
string or number. As such, unknown entries in this dictionary <bcp14>MUST</bcp14> be disregarded
by the user and tools (i.e., the presence of an unknown field is explicitly NOT an
error).</t>
          <t>The list of default qlog fields that are typically logged in common_fields (as
opposed to as individual fields per event instance) are shown in the listing
below:</t>
          <t>Definition:</t>
          <figure anchor="common-fields-def">
            <name>CommonFields definition</name>
            <sourcecode type="cddl"><![CDATA[
CommonFields = {
    ? time_format: TimeFormat
    ? reference_time: float64
    ? protocol_type: ProtocolType
    ? group_id: GroupID
    * text => any
}
]]></sourcecode>
          </figure>
          <t>Tools <bcp14>MUST</bcp14> be able to deal with these fields being defined either on each event
individually or combined in common_fields. Note that if at least one event in a
trace has a different value for a given field, this field <bcp14>MUST NOT</bcp14> be added to
common_fields but instead defined on each event individually. Good example of such
fields are "time" and "data", who are divergent by nature.</t>
        </section>
      </section>
    </section>
    <section anchor="guidelines-for-event-definition-documents">
      <name>Guidelines for event definition documents</name>
      <t>This document only defines the main schema for the qlog format. This is intended
to be used together with specific, per-protocol event definitions that specify the
name (category + type) and data needed for each individual event. This is with the
intent to allow the qlog main schema to be easily re-used for several protocols.
Examples include the QUIC event definitions <xref target="QLOG-QUIC"/> and HTTP/3 and QPACK
event definitions <xref target="QLOG-H3"/>.</t>
      <t>This section defines some basic annotations and concepts the creators of event
definition documents <bcp14>SHOULD</bcp14> follow to ensure a measure of consistency, making it
easier for qlog implementers to extrapolate from one protocol to another.</t>
      <section anchor="event-design-guidelines">
        <name>Event design guidelines</name>
        <t>There are several ways of defining qlog events. In practice, two main
types of approach have been observed: a) those that map directly to concepts seen in the protocols
(e.g., <tt>packet_sent</tt>) and b) those that act as aggregating events that combine
data from several possible protocol behaviors or code paths into one (e.g.,
<tt>parameters_set</tt>). The latter are typically used as a means to reduce the amount
of unique event definitions, as reflecting each possible protocol event as a
separate qlog entity would cause an explosion of event types.</t>
        <t>Additionally, logging duplicate data is typically prevented as much as possible.
For example, packet header values that remain consistent across many packets are
split into separate events (for example <tt>spin_bit_updated</tt> or
<tt>connection_id_updated</tt> for QUIC).</t>
        <t>Finally, logging additional state change events, if
those state changes can be directly inferred from data on the wire (for example
flow control limit changes) is typically avoided, if the implementation is bug-free and spec-compliant.
Exceptions have been made for common events that benefit from being easily
identifiable or individually logged (for example <tt>packets_acked</tt>).</t>
      </section>
      <section anchor="event-importance-indicators">
        <name>Event importance indicators</name>
        <t>Depending on how events are designed, it may be that several events allow the
logging of similar or overlapping data. For example the separate QUIC
<tt>connection_started</tt> event overlaps with the more generic
<tt>connection_state_updated</tt>. In these cases, it is not always clear which event
should be logged or used, and which event should take precedence if e.g., both are
present and provide conflicting information.</t>
        <t>To aid in this decision making, each event <bcp14>SHOULD</bcp14> have an
"importance indicator" with one of three values, in decreasing order of importance
and expected usage:</t>
        <ul spacing="normal">
          <li>Core</li>
          <li>Base</li>
          <li>Extra</li>
        </ul>
        <t>The "Core" events are the events that <bcp14>SHOULD</bcp14> be present in all qlog files for a
given protocol. These are typically tied to basic packet and frame parsing and
creation, as well as listing basic internal metrics. Tool implementers <bcp14>SHOULD</bcp14>
expect and add support for these events, though <bcp14>SHOULD NOT</bcp14> expect all Core events
to be present in each qlog trace.</t>
        <t>The "Base" events add additional debugging options and <bcp14>MAY</bcp14> be present in qlog
files. Most of these can be implicitly inferred from data in Core events (if those
contain all their properties), but for many it is better to log the events
explicitly as well, making it clearer how the implementation behaves. These events
are for example tied to passing data around in buffers, to how internal state
machines change and help show when decisions are actually made based on received
data. Tool implementers <bcp14>SHOULD</bcp14> at least add support for showing the contents of
these events, if they do not handle them explicitly.</t>
        <t>The "Extra" events are considered mostly useful for low-level debugging of the
implementation, rather than the protocol. They allow more fine-grained tracking of
internal behavior. As such, they <bcp14>MAY</bcp14> be present in qlog files and tool
implementers <bcp14>MAY</bcp14> add support for these, but they are not required to.</t>
        <t>Note that in some cases, implementers might not want to log for example data
content details in the "Core" events due to performance or privacy considerations.
In this case, they <bcp14>SHOULD</bcp14> use (a subset of) relevant "Base" events instead to
ensure usability of the qlog output. As an example, implementations that do not
log QUIC <tt>packet_received</tt> events and thus also not which (if any) ACK frames the
packet contains, <bcp14>SHOULD</bcp14> log <tt>packets_acked</tt> events instead.</t>
        <t>Finally, for event types whose data (partially) overlap with other event types'
definitions, where necessary the event definition document should include explicit
guidance on which to use in specific situations.</t>
      </section>
      <section anchor="custom-fields">
        <name>Custom fields</name>
        <t>Event definition documents are free to define new category and event types,
top-level fields (e.g., a per-event field indicating its privacy properties or
path_id in multipath protocols), as well as values for the "trigger" property
within the "data" field, or other member fields of the "data" field, as they see
fit.</t>
        <t>They however <bcp14>SHOULD NOT</bcp14> expect non-specialized tools to recognize or visualize
this custom data. However, tools <bcp14>SHOULD</bcp14> make an effort to visualize even unknown
data if possible in the specific tool's context. If they do not, they <bcp14>MUST</bcp14> ignore
these unknown fields.</t>
      </section>
    </section>
    <section anchor="generic-events-and-data-classes">
      <name>Generic events and data classes</name>
      <t>There are some event types and data classes that are common across protocols,
applications and use cases that benefit from being defined in a single location.
This section specifies such common definitions.</t>
      <section anchor="raw-info">
        <name>Raw packet and frame information</name>
        <t>While qlog is a high-level logging format, it also allows the inclusion of most
raw wire image information, such as byte lengths and byte values. This is useful
when for example investigating or tuning packetization behavior or determining
encoding/framing overheads. However, these fields are not always necessary, can
take up considerable space, and can have a considerable privacy and security
impact (see <xref target="privacy"/>). Where applicable, these fields are grouped in a
separate, optional, field named "raw" of type RawInfo. The exact definition of
entities, headers, trailers and payloads depend on the protocol used.</t>
        <t>Definition:</t>
        <figure anchor="raw-info-def">
          <name>RawInfo definition</name>
          <sourcecode type="cddl"><![CDATA[
RawInfo = {

    ; the full byte length of the entity (e.g., packet or frame),
    ; including possible headers and trailers
    ? length: uint64

    ; the byte length of the entity's payload,
    ; excluding possible headers or trailers
    ? payload_length: uint64

    ; the (potentially truncated) contents of the full entity,
    ; including headers and possibly trailers
    ? data: hexstring
}
]]></sourcecode>
        </figure>
        <t>The RawInfo:data field can be truncated for privacy or security purposes, see
<xref target="truncated-values"/>. In this case, the length and payload_length fields should
still indicate the non-truncated lengths when used for debugging purposes.</t>
        <t>This document does not specify explicit header_length or trailer_length fields.
In protocols without trailers, header_length can be calculated by subtracting
the payload_length from the length. In protocols with trailers (e.g., QUIC's
AEAD tag), event definition documents <bcp14>SHOULD</bcp14> define how to support header_length
calculation.</t>
      </section>
      <section anchor="generic-events">
        <name>Generic events</name>
        <t>In typical logging setups, users utilize a discrete number of well-defined logging
categories, levels or severities to log freeform (string) data. This generic
events category replicates this approach to allow implementations to fully replace
their existing text-based logging by qlog. This is done by providing events to log
generic strings for the typical well-known logging levels (error, warning, info,
debug, verbose).</t>
        <t>For the events defined below, the "category" is "generic" and their "type" is the
name of the heading in lowercase (e.g., the "name" of the error event is
"generic:error").</t>
        <section anchor="error">
          <name>error</name>
          <t>Importance: Core</t>
          <t>Used to log details of an internal error that might not get reflected on the wire.</t>
          <t>Definition:</t>
          <figure anchor="generic-error-def">
            <name>GenericError definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericError = {
    ? code: uint64
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="warning">
          <name>warning</name>
          <t>Importance: Base</t>
          <t>Used to log details of an internal warning that might not get reflected on the
wire.</t>
          <t>Definition:</t>
          <figure anchor="generic-warning-def">
            <name>GenericWarning definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericWarning = {
    ? code: uint64
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="info">
          <name>info</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Definition:</t>
          <figure anchor="generic-info-def">
            <name>GenericInfo definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericInfo = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="debug">
          <name>debug</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Definition:</t>
          <figure anchor="generic-debug-def">
            <name>GenericDebug definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericDebug = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="verbose">
          <name>verbose</name>
          <t>Importance: Extra</t>
          <t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>
          <t>Definition:</t>
          <figure anchor="generic-verbose-def">
            <name>GenericVerbose definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericVerbose = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="simulation-events">
        <name>Simulation events</name>
        <t>When evaluating a protocol implementation, one typically sets up a series of
interoperability or benchmarking tests, in which the test situations can change
over time. For example, the network bandwidth or latency can vary during the test,
or the network can be fully disable for a short time. In these setups, it is
useful to know when exactly these conditions are triggered, to allow for proper
correlation with other events.</t>
        <t>For the events defined below, the "category" is "simulation" and their "type" is
the name of the heading in lowercase (e.g., the "name" of the scenario event is
"simulation:scenario").</t>
        <section anchor="scenario">
          <name>scenario</name>
          <t>Importance: Extra</t>
          <t>Used to specify which specific scenario is being tested at this particular
instance. This supports, for example, aggregation of
several simulations into one trace (e.g., split by <tt>group_id</tt>).</t>
          <t>Definition:</t>
          <figure anchor="simulation-scenario-def">
            <name>SimulationScenario definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationScenario = {
    ? name: text
    ? details: {* text => any }
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="marker">
          <name>marker</name>
          <t>Importance: Extra</t>
          <t>Used to indicate when specific emulation conditions are triggered at set times
(e.g., at 3 seconds in 2% packet loss is introduced, at 10s a NAT rebind is
triggered).</t>
          <t>Definition:</t>
          <figure anchor="simulation-marker-def">
            <name>SimulationMarker definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationMarker = {
    ? type: text
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="concrete-formats">
      <name>Serializing qlog</name>
      <t>This document and other related qlog schema definitions are intentionally
independent of serialization format. This means that implementers themselves can
choose how to represent and serialize qlog data practically on disk or on the
wire. Some examples of possible formats are JSON, CBOR, CSV, protobuf,
flatbuffers, etc.</t>
      <t>All these formats make certain tradeoffs between flexibility and efficiency, with
textual formats like JSON typically being more flexible but also less efficient
than binary formats like protocol buffers. The format choice will depend on the
practical use case of the qlog user. For example, for use in day to day debugging,
a plaintext readable (yet relatively large) format like JSON is probably
preferred. However, for use in production, a more optimized yet restricted format
can be better. In this latter case, it will be more difficult to achieve
interoperability between qlog implementations of various protocol stacks, as some
custom or tweaked events from one might not be compatible with the format of the
other. This will also reflect in tooling: not all tools will support all formats.</t>
      <t>This being said, the authors prefer JSON as the basis for storing qlog,
as it retains full flexibility and maximum interoperability. Storage
overhead can be managed well in practice by employing compression. For
this reason, this document details how to practically transform qlog
schema definitions to <xref target="JSON"/>, its subset <xref target="I-JSON"/>,
and its streamable derivative <xref target="JSON-Text-Sequences"/>s. Concrete options
to bring down JSON size and processing overheads are discuseed in <xref target="optimizations"/>.</t>
      <t>As depending on the employed format different deserializers/parsers should be
used, the "qlog_format" field is used to indicate the chosen serialization
approach. This field is always a string, but can be made hierarchical by the use
of the "." separator between entries. For example, a value of "JSON.optimizationA"
can indicate that a default JSON format is being used, but that a certain
optimization of type A was applied to the file as well (see also
<xref target="optimizations"/>).</t>
      <section anchor="format-json">
        <name>qlog to JSON mapping</name>
        <t>When mapping qlog to normal JSON, the "qlog_format" field <bcp14>MUST</bcp14> have the value
"JSON". This is also the default qlog serialization and default value of this
field.</t>
        <t>When using normal JSON serialization, the file extension/suffix <bcp14>SHOULD</bcp14>
be ".qlog" and the Media Type (if any) <bcp14>SHOULD</bcp14> be "application/qlog+json"
per <xref target="RFC6839"/>.</t>
        <t>JSON files by definition (<xref target="RFC8259"/>) <bcp14>MUST</bcp14> utilize the UTF-8 encoding,
both for the file itself and the string values.</t>
        <t>While not specifically required by the JSON specification, all qlog field
names in a JSON serialization <bcp14>MUST</bcp14> be lowercase.</t>
        <t>In order to serialize CDDL-based qlog event and data structure
definitions to JSON, the official CDDL-to-JSON mapping defined in
Appendix E of <xref target="CDDL"/> <bcp14>SHOULD</bcp14> be employed.</t>
        <section anchor="i-json">
          <name>I-JSON</name>
          <t>For some use cases, it should be taken into account that not all popular
JSON parsers support the full JSON format. Especially for parsers
integrated with the JavaScript programming language (e.g., Web browsers,
NodeJS), users are recommended to stick to a JSON subset dubbed
<xref target="I-JSON"/> (or Internet-JSON).</t>
          <t>One of the key limitations of JavaScript and thus I-JSON is that it
cannot represent full 64-bit integers in standard operating mode (i.e.,
without using BigInt extensions), instead being limited to the range of
<tt>[-(2**53)+1, (2**53)-1]</tt>. In these circumstances, Appendix E of
<xref target="CDDL"/> recommends defining new CDDL types for int64 and
uint64 that limit their values to this range.</t>
          <t>While this can be sensible and workable for most use cases, some
protocols targeting qlog serialization (e.g., QUIC, HTTP/3), might
require full uint64 variables in some (rare) circumstances. In these
situations, it should be allowed to also use the string-based
representation of uint64 values alongside the numerical representation.
Concretely, the following definition of uint64 should override the
original and (web-based) tools should take into account that a uint64
field can be either a number or string.</t>
          <figure anchor="cddl-ijson-uint64-def">
            <name>Custom uint64 definition for I-JSON</name>
            <artwork><![CDATA[
uint64 = text /
         uint .size 8
]]></artwork>
          </figure>
        </section>
        <section anchor="truncated-values">
          <name>Truncated values</name>
          <t>For some use cases (e.g., limiting file size, privacy), it can be
necessary not to log a full raw blob (using the <tt>hexstring</tt> type) but
instead a truncated value (for example, only the first 100 bytes of an
HTTP response body to be able to discern which file it actually
contained). In these cases, the original byte-size length cannot be
obtained from the serialized value directly.</t>
          <t>As such, all qlog schema definitions <bcp14>SHOULD</bcp14> include a separate,
length-indicating field for all fields of type <tt>hexstring</tt> they specify,
see for example <xref target="raw-info"/>. This not only ensures the original length
can always be retrieved, but also allows the omission of any raw value
bytes of the field completely (e.g., out of privacy or security
considerations).</t>
          <t>To reduce overhead however and in the case the full raw value is logged,
the extra length-indicating field can be left out. As such, tools <bcp14>MUST</bcp14>
be able to deal with this situation and derive the length of the field
from the raw value if no separate length-indicating field is present.
The main possible permutations are shown by example in
<xref target="truncated-values-ex"/>.</t>
          <figure anchor="truncated-values-ex">
            <name>Example for serializing truncated hexstrings</name>
            <artwork><![CDATA[
// both the full raw value and its length are present
// (length is redundant)
{
    "raw_length": 5,
    "raw": "051428abff"
}

// only the raw value is present, indicating it
// represents the fields full value the byte
// length is obtained by calculating raw.length / 2
{
    "raw": "051428abff"
}

// only the length field is present, meaning the
// value was omitted
{
    "raw_length": 5,
}

// both fields are present and the lengths do not match:
// the value was truncated to the first three bytes.
{
    "raw_length": 5,
    "raw": "051428"
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="format-json-seq">
        <name>qlog to JSON Text Sequences mapping</name>
        <t>One of the downsides of using pure JSON is that it is inherently a non-streamable
format. Put differently, it is not possible to simply append new qlog events to a
log file without "closing" this file at the end by appending "]}]}". Without these
closing tags, most JSON parsers will be unable to parse the file entirely. As most
platforms do not provide a standard streaming JSON parser (which would be able to
deal with this problem), this document also provides a qlog mapping to a
streamable JSON format called JSON Text Sequences (JSON-SEQ) (<xref target="RFC7464"/>).</t>
        <t>When mapping qlog to JSON-SEQ, the "qlog_format" field <bcp14>MUST</bcp14> have the value
"JSON-SEQ".</t>
        <t>When using JSON-SEQ serialization, the file extension/suffix <bcp14>SHOULD</bcp14> be
".sqlog" (for "streaming" qlog) and the Media Type (if any) <bcp14>SHOULD</bcp14> be
"application/qlog+json-seq" per <xref target="RFC8091"/>.</t>
        <t>JSON Text Sequences are very similar to JSON, except that JSON objects are
serialized as individual records, each prefixed by an ASCII Record Separator
(&lt;RS&gt;, 0x1E), and each ending with an ASCII Line Feed character (\n, 0x0A). Note
that each record can also contain any amount of newlines in its body, as long as
it ends with a newline character before the next &lt;RS&gt; character.</t>
        <t>Each qlog event is serialized and interpreted as an individual JSON Text Sequence
record, and can simply be appended as a new object at the back of an event stream
or log file. Put differently, unlike default JSON, it does not require a file to
be wrapped as a full object with "{ ... }" or "[... ]".</t>
        <t>For this to work, some qlog definitions have to be adjusted however.
Mainly, events are no longer part of the "events" array in the Trace
object, but are instead logged separately from the qlog "header", as
indicated by the TraceSeq object in <xref target="trace-seq-def"/>. Additionally,
qlog's JSON-SEQ mapping does not allow logging multiple individual
traces in a single qlog file. As such, the QlogFile:traces field is
replaced by the singular QlogFileSeq:trace field, see
<xref target="qlog-file-seq-def"/>. An example can be seen in <xref target="json-seq-ex"/>. Note
that the "group_id" field can still be used on a per-event basis to
include events from conceptually different sources in a single JSON-SEQ
qlog file.</t>
        <t>Definition:</t>
        <figure anchor="trace-seq-def">
          <name>TraceSeq definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceSeq = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
        <t>Definition:</t>
        <figure anchor="qlog-file-seq-def">
          <name>QlogFileSeq definition</name>
          <sourcecode type="cddl"><![CDATA[
QlogFileSeq = {
    qlog_format: "JSON-SEQ"
    qlog_version: text
    ? title: text
    ? description: text
    trace: TraceSeq
}
]]></sourcecode>
        </figure>
        <t>JSON-SEQ serialization examples:</t>
        <figure anchor="json-seq-ex">
          <name>Top-level element</name>
          <artwork><![CDATA[
// list of qlog events, serialized in accordance with RFC 7464,
// starting with a Record Separator character and ending with a
// newline.
// For display purposes, Record Separators are rendered as <RS>

<RS>{
    "qlog_version": "0.4",
    "qlog_format": "JSON-SEQ",
    "title": "Name of JSON Text Sequence qlog file (short)",
    "description": "Description for this trace file (long)",
    "trace": {
      "common_fields": {
        "protocol_type": ["QUIC","HTTP3"],
        "group_id":"127ecc830d98f9d54a42c4f0842aa87e181a",
        "time_format":"relative",
        "reference_time": 1553986553572
      },
      "vantage_point": {
        "name":"backend-67",
        "type":"server"
      }
    }
}
<RS>{"time": 2, "name": "quic:parameters_set", "data": { ... } }
<RS>{"time": 7, "name": "quic:packet_sent", "data": { ... } }
...
]]></artwork>
        </figure>
        <t>While not specifically required by the JSON-SEQ specification, all qlog
field names in a JSON-SEQ serialization <bcp14>MUST</bcp14> be lowercase.</t>
        <t>In order to serialize all other CDDL-based qlog event and data structure
definitions to JSON-SEQ, the official CDDL-to-JSON mapping defined in
Appendix E of <xref target="CDDL"/> <bcp14>SHOULD</bcp14> still be employed.</t>
        <section anchor="supporting-json-text-sequences-in-tooling">
          <name>Supporting JSON Text Sequences in tooling</name>
          <t>Note that JSON Text Sequences are not supported in most default programming
environments (unlike normal JSON). However, several custom JSON-SEQ parsing
libraries exist in most programming languages that can be used and the format is
easy enough to parse with existing implementations (i.e., by splitting the file
into its component records and feeding them to a normal JSON parser individually,
as each record by itself is a valid JSON object).</t>
        </section>
      </section>
      <section anchor="optimizations">
        <name>Other optimized formatting options</name>
        <t>Both the JSON and JSON-SEQ formatting options described above are serviceable in
general small to medium scale (debugging) setups. However, these approaches tend
to be relatively verbose, leading to larger file sizes. Additionally, generalized
JSON(-SEQ) (de)serialization performance is typically (slightly) lower than that
of more optimized and predictable formats. Both aspects make these formats more
challenging (<eref target="https://qlog.edm.uhasselt.be/anrw/">though still practical</eref>) to use
in large scale setups.</t>
        <t>During the development of qlog, a multitude of alternative formatting
and optimization options were compared. The results of this study are <eref target="https://github.com/quiclog/internet-drafts/issues/30#issuecomment-617675097">summarized on the qlog
github
repository</eref>.
The rest of this section discusses some of these approaches implementations could
choose and the expected gains and tradeoffs inherent therein. Tools <bcp14>SHOULD</bcp14> support
mainly the compression options listed in <xref target="compression"/>, as they provide the
largest wins for the least cost overall.</t>
        <t>Over time, specific qlog formats and encodings can be created that more formally
define and combine some of the discussed optimizations or add new ones. It was
decided to define these schemes in separate documents to keep the main qlog definition
clean and generalizable, as not all contexts require the same performance or
flexibility as others and qlog is intended to be a broadly usable and extensible
format (for example more flexibility is needed in earlier stages of protocol
development, while more performance is typically needed in later stages). This is
also the main reason why the general qlog format is the less optimized JSON
instead of a more performant option.</t>
        <t>To be able to easily distinguish between these options in qlog compatible tooling
(without the need to have the user provide out-of-band information or to
(heuristically) parse and process files in a multitude of ways, see also
<xref target="tooling"/>), it is recommended that explicit file extensions are used to indicate specific
formats. As there are no standards in place for this type of extension to format
mapping, a commonly used scheme is proposed: list the
applied optimizations in the extension in ascending order of application (e.g., if
a qlog file is first optimized with technique A and then compressed with technique
B, the resulting file would have the extension ".(s)qlog.A.B"). This allows
tooling to start at the back of the extension to "undo" applied optimizations to
finally arrive at the expected qlog representation.</t>
        <section anchor="structure-optimizations">
          <name>Data structure optimizations</name>
          <t>The first general category of optimizations is to alter the representation of data
within an JSON(-SEQ) qlog file to reduce file size.</t>
          <t>The first option is to employ a scheme similar to the CSV (comma separated value
<xref target="RFC4180"/>) format, which utilizes the concept of column "headers" to prevent
repeating field names for each datapoint instance. Concretely for JSON qlog,
several field names are repeated with each event (i.e., time, name, data). These
names could be extracted into a separate list, after which qlog events could be
serialized as an array of values, as opposed to a full object. This approach was a
key part of the original qlog format (prior to draft-02) using the "event_fields"
field. However, tests showed that this optimization only provided a mean file size
reduction of 5% (100MB to 95MB) while significantly increasing the implementation
complexity, and this approach was abandoned in favor of the default JSON setup.
Implementations using this format should not employ a separate file extension (as
it still uses JSON), but rather employ a new value of "JSON.namedheaders" (or
"JSON-SEQ.namedheaders") for the "qlog_format" field (see <xref target="top-level"/>).</t>
          <t>The second option is to replace field values and/or names with indices into a
(dynamic) lookup table. This is a common compression technique and can provide
significant file size reductions (up to 50% in tests, 100MB to 50MB). However,
this approach is even more difficult to implement efficiently and requires either
including the (dynamic) table in the resulting file (an approach taken by for
example <eref target="https://www.chromium.org/developers/design-documents/network-stack/netlog">Chromium's NetLog
format</eref>)
or defining a (static) table up-front and sharing this between implementations.
Implementations using this approach should not employ a separate file extension
(as it still uses JSON), but rather employ a new value of "JSON.dictionary" (or
"JSON-SEQ.dictionary") for the "qlog_format" field (see <xref target="top-level"/>).</t>
          <t>As both options either proved difficult to implement, reduced qlog file
readability, and provided too little improvement compared to other more
straightforward options (for example <xref target="compression"/>), these schemes are not
inherently part of qlog.</t>
        </section>
        <section anchor="compression">
          <name>Compression</name>
          <t>The second general category of optimizations is to utilize a (generic) compression
scheme for textual data. As qlog in the JSON(-SEQ) format typically contains a
large amount of repetition, off-the-shelf (text) compression techniques typically
succeed very well in bringing down file sizes (regularly with up to two orders of
magnitude in tests, even for "fast" compression levels). As such, utilizing
compression is recommended before attempting other optimization options, even
though this might (somewhat) increase processing costs due to the additional
compression step.</t>
          <t>The first option is to use GZIP compression (<xref target="RFC1952"/>). This generic
compression scheme provides multiple compression levels (providing a trade-off
between compression speed and size reduction). Utilized at level 6 (a medium
setting thought to be applicable for streaming compression of a qlog stream in
commodity devices), gzip compresses qlog JSON files to 7% of their initial size on
average (100MB to 7MB). For this option, the file extension .(s)qlog.gz <bcp14>SHOULD</bcp14> BE
used. The "qlog_format" field should still reflect the original JSON formatting of
the qlog data (e.g., "JSON" or "JSON-SEQ").</t>
          <t>The second option is to use Brotli compression (<xref target="RFC7932"/>). While similar to
gzip, this more recent compression scheme provides a better efficiency. It also
allows multiple compression levels. Utilized at level 4 (a medium setting thought
to be applicable for streaming compression of a qlog stream in commodity devices),
brotli compresses qlog JSON files to 7% of their initial size on average (100MB to
7MB). For this option, the file extension .(s)qlog.br <bcp14>SHOULD</bcp14> BE used. The
"qlog_format" field should still reflect the original JSON formatting of the qlog
data (e.g., "JSON" or "JSON-SEQ").</t>
          <t>Other compression algorithms of course exist (for example xz, zstd, and lz4). The
gzip and brotli are recommended because of their tweakable behaviour and wide
support in web-based environments, which is envisioned as the main tooling ecosystem
(see also <xref target="tooling"/>).</t>
        </section>
        <section anchor="binary">
          <name>Binary formats</name>
          <t>The third general category of optimizations is to use a more optimized (often
binary) format instead of the textual JSON format. This approach inherently
produces smaller files and often has better (de)serialization performance.
However, the resultant files are no longer human readable and some formats require
hard tradeoffs between flexibility for performance.</t>
          <t>The first option is to use the CBOR (Concise Binary Object Representation
<xref target="RFC7049"/>) format. For the purposes of qlog, CBOR can be viewed as a straightforward
binary variant of JSON. As such, existing JSON qlog files can be trivially
converted to and from CBOR (though slightly more work is needed for JSON-SEQ qlogs
to convert them to CBOR-SEQ, see <xref target="RFC8742"/>). While CBOR thus does retain the
full qlog flexibility, it only provides a 25% file size reduction (100MB to 75MB)
compared to textual JSON(-SEQ). As CBOR support in programming environments is not
as widespread as that of textual JSON and the format lacks human readability, CBOR
was not chosen as the default qlog format. For this option, the file extension
.(s)qlog.cbor <bcp14>SHOULD</bcp14> BE used. The "qlog_format" field should still reflect the
original JSON formatting of the qlog data (e.g., "JSON" or "JSON-SEQ"). The media
type should indicate both whether JSON or JSON Text Sequences are used, as well as
whether CBOR or CBOR Sequences are used (see the table below).</t>
          <t>A second option is to use a more specialized binary format, such as <eref target="https://developers.google.com/protocol-buffers">Protocol
Buffers</eref> (protobuf). This format
is battle-tested, has support for optional fields and has libraries in most
programming languages. Still, it is significantly less flexible than textual JSON
or CBOR, as it relies on a separate, pre-defined schema (a .proto file). As such,
it it not possible to (easily) log new event types in protobuf files without
adjusting this schema as well, which has its own practical challenges. As qlog is
intended to be a flexible, general purpose format, this type of format was not
chosen as its basic serialization. The lower flexibility does lead to
significantly reduced file sizes. A straightforward mapping of the qlog main
schema and QUIC/HTTP3 event types to protobuf created qlog files 24% as large as
the raw JSON equivalents (100MB to 24MB). For this option, the file extension
.(s)qlog.protobuf <bcp14>SHOULD</bcp14> BE used. The "qlog_format" field should reflect the
different internal format, for example: "qlog_format": "protobuf".</t>
          <t>Note that binary formats can (and should) also be used in conjunction with
compression (see <xref target="compression"/>). For example, CBOR compresses well (to about 6%
of the original textual JSON size (100MB to 6MB) for both gzip and brotli) and so
does protobuf (5% (gzip) to 3% (brotli)). However, these gains are similar to the
ones achieved by simply compression the textual JSON equivalents directly (7%, see
<xref target="compression"/>). As such, since compression is still needed to achieve optimal
file size reductions event with binary formats, the more flexible
compressed textual JSON options are likely a better default for the qlog format in
general.</t>
          <t/>
        </section>
        <section anchor="format-summary">
          <name>Overview and summary</name>
          <t>In summary, textual JSON was chosen as the main qlog format due to its high
flexibility and because its inefficiencies can be largely solved by the
utilization of compression techniques (which are needed to achieve optimal results
with other formats as well).</t>
          <t>Still, qlog implementers are free to define other qlog formats depending on their
needs and context of use. These formats should be described in their own
documents, the discussion in this document mainly acting as inspiration and
high-level guidance. Implementers are encouraged to add concrete qlog formats and
definitions to <eref target="https://github.com/quiclog/qlog">the designated public
repository</eref>.</t>
          <t>The following table provides an overview of all the discussed qlog formatting
options with examples:</t>
          <table>
            <thead>
              <tr>
                <th align="left">format</th>
                <th align="left">qlog_format</th>
                <th align="left">extension</th>
                <th align="left">media type</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">JSON <xref target="format-json"/></td>
                <td align="left">JSON</td>
                <td align="left">.qlog</td>
                <td align="left">application/qlog+json</td>
              </tr>
              <tr>
                <td align="left">JSON Text Sequences  <xref target="format-json-seq"/></td>
                <td align="left">JSON-SEQ</td>
                <td align="left">.sqlog</td>
                <td align="left">application/qlog+json-seq</td>
              </tr>
              <tr>
                <td align="left">named headers <xref target="structure-optimizations"/></td>
                <td align="left">JSON(-SEQ).namedheaders</td>
                <td align="left">.(s)qlog</td>
                <td align="left">application/qlog+json(-seq)</td>
              </tr>
              <tr>
                <td align="left">dictionary <xref target="structure-optimizations"/></td>
                <td align="left">JSON(-SEQ).dictionary</td>
                <td align="left">.(s)qlog</td>
                <td align="left">application/qlog+json(-seq)</td>
              </tr>
              <tr>
                <td align="left">CBOR <xref target="binary"/></td>
                <td align="left">JSON(-SEQ)</td>
                <td align="left">.(s)qlog.cbor</td>
                <td align="left">application/qlog+json(-seq)+cbor(-seq)</td>
              </tr>
              <tr>
                <td align="left">protobuf <xref target="binary"/></td>
                <td align="left">protobuf</td>
                <td align="left">.qlog.protobuf</td>
                <td align="left">NOT SPECIFIED BY IANA</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">gzip <xref target="compression"/></td>
                <td align="left">no change</td>
                <td align="left">.gz suffix</td>
                <td align="left">application/gzip</td>
              </tr>
              <tr>
                <td align="left">brotli <xref target="compression"/></td>
                <td align="left">no change</td>
                <td align="left">.br suffix</td>
                <td align="left">NOT SPECIFIED BY IANA</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="conversion">
        <name>Conversion between formats</name>
        <t>As discussed in the previous sections, a qlog file can be serialized in a
multitude of formats, each of which can conceivably be transformed into or from
one another without loss of information. For example, a number of JSON-SEQ
streamed qlogs could be combined into a JSON formatted qlog for later processing.
Similarly, a captured binary qlog could be transformed to JSON for easier
interpretation and sharing.</t>
        <t>Secondly, other structured logging approaches contain
similar (though typically not identical) data to qlog, like raw packet capture
files (for example .pcap files from tcpdump) or endpoint-specific logging formats
(for example the NetLog format in Google Chrome). These are sometimes the only
options, if an implementation cannot or will not support direct qlog output for
any reason, but does provide other internal or external (e.g., SSLKEYLOGFILE
export to allow decryption of packet captures) logging options For this second
category, a (partial) transformation from/to qlog can also be defined.</t>
        <t>As such, when defining a new qlog serialization format or wanting to utilize
qlog-compatible tools with existing codebases lacking qlog support, it is
recommended to define and provide a concrete mapping from one format to default
JSON-serialized qlog. Several of such mappings exist. Firstly,
[pcap2qlog]((https://github.com/quiclog/pcap2qlog) transforms QUIC and HTTP/3
packet capture files to qlog. Secondly,
<eref target="https://github.com/quiclog/qvis/tree/master/visualizations/src/components/filemanager/netlogconverter">netlog2qlog</eref>
converts chromium's internal dictionary-encoded JSON format to qlog. Finally,
<eref target="https://github.com/quiclog/quictrace2qlog">quictrace2qlog</eref> converts the older
quictrace format to JSON qlog. Tools can then easily integrate with these
converters (either by incorporating them directly or for example using them as a
(web-based) API) so users can provide different file types with ease. For example,
the <eref target="https://qvis.edm.uhasselt.be">qvis</eref> toolsuite supports a multitude of formats
and qlog serializations.</t>
      </section>
    </section>
    <section anchor="methods-of-access-and-generation">
      <name>Methods of access and generation</name>
      <t>Different implementations will have different ways of generating and storing
qlogs. However, there is still value in defining a few default ways in which to
steer this generation and access of the results.</t>
      <section anchor="set-file-output-destination-via-an-environment-variable">
        <name>Set file output destination via an environment variable</name>
        <t>To provide users control over where and how qlog files are created, two
environment variables are defined. The first, QLOGFILE, indicates a full path to where an
individual qlog file should be stored. This path <bcp14>MUST</bcp14> include the full file
extension. The second, QLOGDIR, sets a general directory path in which qlog files
should be placed. This path <bcp14>MUST</bcp14> include the directory separator character at the
end.</t>
        <t>In general, QLOGDIR should be preferred over QLOGFILE if an endpoint is prone to
generate multiple qlog files. This can for example be the case for a QUIC server
implementation that logs each QUIC connection in a separate qlog file. An
alternative that uses QLOGFILE would be a QUIC server that logs all connections in
a single file and uses the "group_id" field (<xref target="group-ids"/>) to allow post-hoc
separation of events.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> provide support for QLOGDIR and <bcp14>MAY</bcp14> provide support for
QLOGFILE.</t>
        <t>When using QLOGDIR, it is up to the implementation to choose an appropriate naming
scheme for the qlog files themselves. The chosen scheme will typically depend on
the context or protocols used. For example, for QUIC, it is recommended to use the
Original Destination Connection ID (ODCID), followed by the vantage point type of
the logging endpoint. Examples of all options for QUIC are shown in
<xref target="qlogdir-example"/>.</t>
        <figure anchor="qlogdir-example">
          <name>Environment variable examples for a QUIC implementation</name>
          <artwork><![CDATA[
Command: QLOGFILE=/srv/qlogs/client.qlog quicclientbinary

Should result in the the quicclientbinary executable logging a
single qlog file named client.qlog in the /srv/qlogs directory.
This is for example useful in tests when the client sets up
just a single connection and then exits.

Command: QLOGDIR=/srv/qlogs/ quicserverbinary

Should result in the quicserverbinary executable generating
several logs files, one for each QUIC connection.
Given two QUIC connections, with ODCID values "abcde" and
"12345" respectively, this would result in two files:
/srv/qlogs/abcde_server.qlog
/srv/qlogs/12345_server.qlog

Command: QLOGFILE=/srv/qlogs/server.qlog quicserverbinary

Should result in the the quicserverbinary executable logging
a single qlog file named server.qlog in the /srv/qlogs directory.
Given that the server handled two QUIC connections before it was
shut down, with ODCID values "abcde" and "12345" respectively,
this would result in event instances in the qlog file being
tagged with the "group_id" field with values "abcde" and "12345".
]]></artwork>
        </figure>
      </section>
      <section anchor="access-logs-via-a-well-known-endpoint">
        <name>Access logs via a well-known endpoint</name>
        <t>After generation, qlog implementers <bcp14>MAY</bcp14> make available generated logs and traces
on an endpoint (typically the server) via the following .well-known URI:</t>
        <ul empty="true">
          <li>
            <t>.well-known/qlog/IDENTIFIER.extension</t>
          </li>
        </ul>
        <t>The IDENTIFIER variable depends on the context and the protocol. For example for
QUIC, the lowercase Original Destination Connection ID (ODCID) is recommended, as
it can uniquely identify a connection. Additionally, the extension depends on the
chosen format (see <xref target="format-summary"/>). For example, for a QUIC connection with
ODCID "abcde", the endpoint for fetching its default JSON-formatted .qlog file
would be:</t>
        <ul empty="true">
          <li>
            <t>.well-known/qlog/abcde.qlog</t>
          </li>
        </ul>
        <t>Implementers <bcp14>SHOULD</bcp14> allow users to fetch logs for a given connection on a 2nd,
separate connection. This helps prevent pollution of the logs by fetching them
over the same connection that one wishes to observe through the log. Ideally, for
the QUIC use case, the logs should also be approachable via an HTTP/2 or HTTP/1.1
endpoint (i.e., on TCP port 443), to for example aid debugging in the case where
QUIC/UDP is blocked on the network.</t>
        <t>qlog implementers <bcp14>SHOULD NOT</bcp14> enable this .well-known endpoint in typical
production settings to prevent (malicious) users from downloading logs from other
connections. Implementers are advised to disable this endpoint by default and
require specific actions from the end users to enable it (and potentially qlog
itself). Implementers <bcp14>MUST</bcp14> also take into account the general privacy and security
guidelines discussed in <xref target="privacy"/> before exposing qlogs to outside actors.</t>
      </section>
    </section>
    <section anchor="tooling">
      <name>Tooling requirements</name>
      <t>Tools ingestion qlog <bcp14>MUST</bcp14> indicate which qlog version(s), qlog format(s),
compression methods and potentially other input file formats (for example .pcap)
they support. Tools <bcp14>SHOULD</bcp14> at least support .qlog files in the default JSON format
(<xref target="format-json"/>). Additionally, they <bcp14>SHOULD</bcp14> indicate exactly which values for and
properties of the name (category and type) and data fields they look for to
execute their logic. Tools <bcp14>SHOULD</bcp14> perform a (high-level) check if an input qlog
file adheres to the expected qlog schema. If a tool determines a qlog file does
not contain enough supported information to correctly execute the tool's logic, it
<bcp14>SHOULD</bcp14> generate a clear error message to this effect.</t>
      <t>Tools <bcp14>MUST NOT</bcp14> produce breaking errors for any field names and/or values in the
qlog format that they do not recognize. Tools <bcp14>SHOULD</bcp14> indicate even unknown event
occurrences within their context (e.g., marking unknown events on a timeline for
manual interpretation by the user).</t>
      <t>Tool authors should be aware that, depending on the logging implementation, some
events will not always be present in all traces. For example, using a circular
logging buffer of a fixed size, it could be that the earliest events (e.g.,
connection setup events) are later overwritten by "newer" events. Alternatively,
some events can be intentionally omitted out of privacy or file size
considerations. Tool authors are encouraged to make their tools robust enough to
still provide adequate output for incomplete logs.</t>
    </section>
    <section anchor="privacy">
      <name>Security and privacy considerations</name>
      <t>Protocols such as TLS <xref target="RFC8446"/> and QUIC <xref target="RFC9000"/> provide varying degrees
of secure protection for the wire image <xref target="RFC8546"/>. There is inevitably
tension between security and observability, when logging can reveal aspects of
the wire image, that would ordinarily be protected. This tension equally applies
to any privacy considerations that build on security properties, especially if
data can be correlated across data sources.</t>
      <t>qlog operators and implementers should be mindful of the security and privacy
risks inherent in handling qlog data. This includes but is not limited to
logging, storing, or using the data. Data might be considered as non-sensitive,
potentially-sensitive, or sensitive; applying the considerations in this section
may produce different risks depending on the nature of the data itself, or its
handling. However, in many cases the largest risk factors arise from data that
can be considered as potenially-sensitive or sensitive.</t>
      <t>The following is a non-exhaustive list of such fields and types of data that can
be carried in qlog data:</t>
      <ul spacing="normal">
        <li>IP addresses and transport protocol port numbers, which can be used to
uniquely identify individual connections, endpoints, and potentially users.</li>
        <li>Session, Connection, or User identifiers which can be used to correlate
nominally separate contexts. For example, QUIC Connection IDs can be used to
identify and track users across geographical networks <xref section="9.5" sectionFormat="of" target="RFC9000"/>).</li>
        <li>System-level information such as CPU, process, or thread identifiers.</li>
        <li>Stored State which can be used to correlate individual connections or sessions
over time. Examples include QUIC address validation and retry tokens, TLS
session tickets, and HTTP cookies.</li>
        <li>Decryption keys, passwords, and tokens which can be used with other data
sources (e.g., captures of encrypted packets) to correlate qlog data to a
specific connection or user or leak additional information. Examples include
TLS decryption keys and HTTP-level API access or authorization tokens.</li>
        <li>Data that can be used to correlate qlogs to other data sources (e.g., captures
of encrypted packets). Examples include high-resolution event timestamps or
inter-event timings, event counts, packet and frame sizes.</li>
        <li>Full or partial encrypted raw packet and frame payloads, which can be used
with other data sources (e.g., captures of encrypted packets) to correlate
qlog data to a specific connection or session.</li>
        <li>Full or partial plaintext raw packet and frame payloads (e.g., HTTP Field
values, HTTP response data, TLS SNI field values), which can contain directly
sensitive information.</li>
      </ul>
      <t>The simplest and most extreme form of protection against abuse of this
information is the complete deletion of a given field, which is equivalent to
not logging the field(s) in question. While deletion completely protects the
data in the deleted fields from the risk of compromise, it also reduces the
utility of the dataset as a whole. As such, a balance should be found between
logging these fields and the potential risks inherent in their (involuntary)
disclosure. This balance depends on the use case at hand (e.g., research
datasets might have different requirements to live operational troubleshooting).
Capturing the minimal amount of data required for a specific purpose can help to
minimize the risks associated with data usage. qlog implementations that provide
fine-grained control over the inclusion of data fields, ideally on a
per-use-case or per-connection basis, improve the ability to minimize data.</t>
      <t>Any data that is determined to be necessary for a use case at hand could be
logged or captured. As per <xref target="RFC6973"/>, operators must be aware that such data
will be at risk of compromise. As such, measures should be taken to firstly
reduce the risk of compromise and secondly reduce the risk of abuse of
compromised data. While a full discussion of both aspects is out of scope for
this document, the following paragraphs discuss high-level considerations that
can be applied to qlog data.</t>
      <t>To reduce the risk of compromise, operators can take measures such as: limiting
the length of time that data is stored, encrypting data in transit and at rest,
limiting access rights to the data, and auditing data usage practices. qlog
deployments that provide integrated options for automated or manual data
deletion and (aggressive) aggregation, improve the ability to minimize the risk
of compromise.</t>
      <t>To reduce the risk of data abuse after compromise, data can be anonymized,
pseudonymized, otherwise permutated/replaced, truncated, (re-)encrypted, or
aggregated. A partial discussion of applicable techniques (especially for IP
address information) can be found in <xref section="B" sectionFormat="of" target="DNS-PRIVACY"/>.
Operators should, however, be aware that many of these techniques have been
shown to be insufficient to safeguard user privacy and/or to protect user
identity, especially if a qlog data set is large or easily correlated against
other data sources.</t>
      <t>Finally, qlog operators should consider the interplay between their use case
needs and end user rights or preferences. While active user participation (as
indicated by <xref target="RFC6973"/>) on a per-qlog basis is difficult, as logs are often
captured out-of-band to the main user interaction and intent, general user
expectations should be taken into account. qlog deployments that provide
mechanisms to integrate the capture, storage and removal of qlogs with more
general, often pre-existing, user preference and privacy control systems,
improve the ability to protect data sensitive or confidential to the end user.
In qlog, these data are typically (but not exclusively) contained in fields of
the RawInfo type (see <xref target="raw-info"/>). qlog users should thus be particularly
hesitant to include these fields for all but the most stringent use cases.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO: primarily the .well-known URI</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="JSON">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="I-JSON">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="JSON-Text-Sequences">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </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>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC6839">
          <front>
            <title>Additional Media Type Structured Syntax Suffixes</title>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>A content media type name sometimes includes partitioned meta- information distinguished by a structured syntax to permit noting an attribute of the media as a suffix to the name. This document defines several structured syntax suffixes for use with media type registrations. In particular, it defines and registers the "+json", "+ber", "+der", "+fastinfoset", "+wbxml" and "+zip" structured syntax suffixes, and provides a media type structured syntax suffix registration form for the "+xml" structured syntax suffix. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6839"/>
          <seriesInfo name="DOI" value="10.17487/RFC6839"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC7464">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC8091">
          <front>
            <title>A Media Type Structured Syntax Suffix for JSON Text Sequences</title>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+json-seq" as a structured syntax suffix for JSON text sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8091"/>
          <seriesInfo name="DOI" value="10.17487/RFC8091"/>
        </reference>
        <reference anchor="RFC4180">
          <front>
            <title>Common Format and MIME Type for Comma-Separated Values (CSV) Files</title>
            <author fullname="Y. Shafranovich" initials="Y." surname="Shafranovich"/>
            <date month="October" year="2005"/>
            <abstract>
              <t>This RFC documents the format used for Comma-Separated Values (CSV) files and registers the associated MIME type "text/csv". This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4180"/>
          <seriesInfo name="DOI" value="10.17487/RFC4180"/>
        </reference>
        <reference anchor="RFC1952">
          <front>
            <title>GZIP file format specification version 4.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1952"/>
          <seriesInfo name="DOI" value="10.17487/RFC1952"/>
        </reference>
        <reference anchor="RFC7932">
          <front>
            <title>Brotli Compressed Data Format</title>
            <author fullname="J. Alakuijala" initials="J." surname="Alakuijala"/>
            <author fullname="Z. Szabadka" initials="Z." surname="Szabadka"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7932"/>
          <seriesInfo name="DOI" value="10.17487/RFC7932"/>
        </reference>
        <reference anchor="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="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="DNS-PRIVACY">
          <front>
            <title>Recommendations for DNS Privacy Service Operators</title>
            <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
            <author fullname="B. Overeinder" initials="B." surname="Overeinder"/>
            <author fullname="R. van Rijswijk-Deij" initials="R." surname="van Rijswijk-Deij"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <date month="October" year="2020"/>
            <abstract>
              <t>This document presents operational, policy, and security considerations for DNS recursive resolver operators who choose to offer DNS privacy services. With these recommendations, the operator can make deliberate decisions regarding which services to provide, as well as understanding how those decisions and the alternatives impact the privacy of users.</t>
              <t>This document also presents a non-normative framework to assist writers of a Recursive operator Privacy Statement, analogous to DNS Security Extensions (DNSSEC) Policies and DNSSEC Practice Statements described in RFC 6841.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="232"/>
          <seriesInfo name="RFC" value="8932"/>
          <seriesInfo name="DOI" value="10.17487/RFC8932"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="QLOG-QUIC">
          <front>
            <title>QUIC event definitions for qlog</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="13" month="February" year="2023"/>
            <abstract>
              <t>   This document describes concrete qlog event definitions and their
   metadata for QUIC events.  These events can then be embedded in the
   higher level schema defined in [QLOG-MAIN].

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-04"/>
        </reference>
        <reference anchor="QLOG-H3">
          <front>
            <title>HTTP/3 and QPACK qlog event definitions</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="13" month="February" year="2023"/>
            <abstract>
              <t>   This document describes concrete qlog event definitions and their
   metadata for HTTP/3 and QPACK-related events.  These events can then
   be embedded in the higher level schema defined in [QLOG-MAIN].

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-04"/>
        </reference>
        <reference anchor="RFC8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq". A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC8546">
          <front>
            <title>The Wire Image of a Network Protocol</title>
            <author fullname="B. Trammell" initials="B." surname="Trammell"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>This document defines the wire image, an abstraction of the information available to an on-path non-participant in a networking protocol. This abstraction is intended to shed light on the implications that increased encryption has for network functions that use the wire image.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8546"/>
          <seriesInfo name="DOI" value="10.17487/RFC8546"/>
        </reference>
      </references>
    </references>
    <section anchor="change-log">
      <name>Change Log</name>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-05">
        <name>Since draft-ietf-quic-qlog-main-schema-05:</name>
        <ul spacing="normal">
          <li>Updated qlog_version to 0.4 (due to breaking changes) (#314)</li>
          <li>Renamed 'transport' category to 'quic' (#302)</li>
          <li>Added 'system_info' field (#305)</li>
          <li>Removed 'summary' and 'configuration' fields (#308)</li>
          <li>Editorial and formatting changes (#298, #303, #304, #316, #320, #321, #322, #326, #328)</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-04">
        <name>Since draft-ietf-quic-qlog-main-schema-04:</name>
        <ul spacing="normal">
          <li>Updated RawInfo definition and guidance (#243)</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-03">
        <name>Since draft-ietf-quic-qlog-main-schema-03:</name>
        <ul spacing="normal">
          <li>Added security and privacy considerations discussion (#252)</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-02">
        <name>Since draft-ietf-quic-qlog-main-schema-02:</name>
        <ul spacing="normal">
          <li>No changes - new draft to prevent expiration</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-01">
        <name>Since draft-ietf-quic-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-00">
        <name>Since draft-ietf-quic-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>Changed the streaming serialization format from NDJSON to JSON Text Sequences
(#172)</li>
          <li>Added Media Type definitions for various qlog formats (#158)</li>
          <li>Changed to semantic versioning</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-draft-02">
        <name>Since draft-marx-qlog-main-schema-draft-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to this document.</li>
          <li>Added basic event definition guidelines</li>
          <li>Made protocol_type an array instead of a string (#146)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-01">
        <name>Since draft-marx-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>
            <t>Decoupled qlog from the JSON format and described a mapping instead (#89)
            </t>
            <ul spacing="normal">
              <li>Data types are now specified in this document and proper definitions for
fields were added in this format</li>
              <li>64-bit numbers can now be either strings or numbers, with a preference for
numbers (#10)</li>
              <li>binary blobs are now logged as lowercase hex strings (#39, #36)</li>
              <li>added guidance to add length-specifiers for binary blobs (#102)</li>
            </ul>
          </li>
          <li>Removed "time_units" from Configuration. All times are now in ms instead (#95)</li>
          <li>Removed the "event_fields" setup for a more straightforward JSON format
(#101,#89)</li>
          <li>Added a streaming option using the NDJSON format (#109,#2,#106)</li>
          <li>Described optional optimization options for implementers (#30)</li>
          <li>Added QLOGDIR and QLOGFILE environment variables, clarified the .well-known URL
usage (#26,#33,#51)</li>
          <li>Overall tightened up the text and added more examples</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-00">
        <name>Since draft-marx-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>All field names are now lowercase (e.g., category instead of CATEGORY)</li>
          <li>Triggers are now properties on the "data" field value, instead of separate field
types (#23)</li>
          <li>group_ids in common_fields is now just also group_id</li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, and Jeremy Laine for
their feedback and suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+2923Yb2ZE2eL+fIhv6vUSUAfAg6gT/ZTdLUtl062RJZY9H
riUlgASZFoCEMxOkWGz5WeZ23mGu5n+xifgiYh8SoEoq98xFr/HqVhFAHvYh
dhy/iBgOh64t20Uxzp7l5SpbVGdn5eosa6bnxTLP5lWd/YO+c7NqusqXdNWs
zuftsCza+fAfm3I65F+HS7p1KLcMD+65ad4WZ1V9Nc6aduZcua7HWVtvmvbo
4ODhwZHL6yIfZ2/qfNWsq7p1l1X94ayuNutx9qcfTh+5D8UVfTUbZ6ertqhX
RTt8zG91rmnz1exdvqhWNJKronHrcpy9bavpIKMBlqtZsWoHWUPPrIt5Q39d
LfWPti6n9NO0Wq5z/WNJF9NP5WpRroofncs37XlVj12WDen/M/qhGWevRrQu
9Ud8IQvwqprQOvkvq/psnJ18yGkJ8JmWoFyMs3pJF/x7ju9H9DL8Vle8zsWs
bKs6fc3TUfa8nE4rGkoZvevpZpp3fsD7nhVtHr9tsbJr/n1JP33BC5+NstcF
3b1aRa+jSbXFKvkBr3tZV7TG1SJ7mk+a+L1L3PDva/19pGvQfa2f48u8nm2K
zgSb+Gu879Gi2szmCyKTZJJ87RqXjo6OR/f//Yy/3z1Xt6poB9ryohgT/a3m
4VOW/enpi98Pmc7GuO90+HjUIWf8VVwwfTi74Q93brz8/I6/2A2Hw4wWqa2J
ypx7c142TJkbprVsVsyJ0hocqEGWr7LiI61eU04WRXZenp0PF/SYRXz08gwU
T3Mufypmzg6nTGeUnbZZvlhUl01W5M1V1pznNf9czbNZ3uaDbFKs6JVty18y
wVcrGsNkc0bvnrl8lS+uGhofUcx5NWv4y6ytmIrORtmb811joqv5kK0LnDR+
kW39b1xT0N7QwffzbWR+M8wX07GLh826mJbzcopxysvCG/JFU7nOa5qiLvNF
+RNtIk1C5j+QyfPk6AUNjZ0mnNXFui4auq2Y0ViJQldX7jK/arJmMz3PiNj+
+PrF80H26PWfB5kNabKZj2TrVlVbvHvO/7TVu1dFPitq2tXfZvwVv+DV94+U
xOhULGjV+YXL6oJ+5K1uiikGOCloiEW23kwW5RRjpud/XxSzST79gIWelc10
0zR8MZF5dlksaIOKLG/d2/O2XTfj/f2zsj3fTJi+95nWLs/2eSF/3Pv87/1R
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
sbNzbB2bzbqLPTPAVKkbGHZHCPb6Gr8PyUADtd1iaInnu3LOvZXHMTs56MJU
aErsWCP1uFi3fH3KKXK7XwExi00560jMXKblpkksmQ0aXQKFkcl86feVODAH
6Q+F4l/0a6dfL0lnJt1RDSni9qTFdu4MEICinY4yL6J07C5YuF5CwY6LwsSk
UIjr2ji6Om5kBmCQzo62HerTlVrWYLgWouaALashfl3EyuZdxnLqmPHe+aK6
pDEtFrQgJLrghtHfF9VULaM6tUc7i2/Qg0FXZLI4dX6+u3aChsTSR5ALYVtE
CKqH1Ss2aiypXqMCqWGQJvAFIhhh8RvRtp5u2GVDPHbCUoidKDMJR4E5q+At
V7DneqIQvRPTpSdqBCyb9CzLMbjRYhCSNZb6Nfp+8v5x9ggfv8enL2CbYOBY
aXiSn/CfP24x0y4b/QUc1LPQn9XtZRd+gV6vNybafLo7Y11f/PTi8aPTx/yw
fDKdFYdHd8wy0WEui8g6ySdwdxZij326iV2H+xmpyzcydpH4xPDe/eTpxNV7
ga0nD5XtSA2QLYafsvqYy7MD9Ba8vu/EvyuEH31hjg7ViBpWNBmzgThm5OMV
d0HT8tawZlIuPXufbmqWDk6WPDiy5AVBXVQjgIEGEsSrA/A0p3WRY6XARtdc
keq4JN4lcL4pcZQPpGCVZ+etSVY2ZejQs+p/tZqS7FnRjXCR143KYGZrNBUS
DE4QdMxBNm21hN4GFgKrZMFO1yDeMD2LSwuKkn01SwCb5gYSYiVMHYKm4ctq
MhXON/AZbBqiCcHnpr4WuvhgpBtkKtE7Ug8a7FDyTccZhQVcFjXMN+/165oq
4ompavFNk8TY1NNCv1W3ku4EVF1+1mg91YCDwmADOpq++1AUa2cx7Jqxfroz
dDdLTIiEKZ9j3kfcDNHRACoYTAsJcjR6gfNBI+LzbZHPEjEj1w7447ToKB1t
LNhZ8c7YkN+0DlDGGCzFj/TrFNyPsXmtKIfdG8VjZOX0Sg04iSsk5520Ev08
xGfVTtJrZBsDQKo97zhr5QSIt87LIKe00BaNWTrJq1SgZ0/Y8JNFiX2j6ipI
RjLKvrvKLsq63XimO9hldPLiwq5V+0Klg8Mwu/7md+pvLucw+uWOJlymtnMs
9JpY6sWiKBJ+kuXgZZyowPG1HDvUa1kh2fHjJ8Y+qB7wrVfUdJ0xFHA+iYaY
HkG3qBNk6xYGn67bHTeYI+RbjyNmxmDYWR0BkKP40XVHymFNuaq3y1OXBdV/
96/6/pt+3qw+rMjOC2iILToyQZLsxZfK92aHgDfJl5cVo8l1Dbx7TSWffssb
1bmPkdoMwf0g5NO90SasX/P+p89LxGU63SA2k9lG0pNPMHRcz39xGHxcolRN
kXeOfgzLvzePddxwktnfCFxDa0okx5wQyhRQfNE3vmkhKrKUcjLIzjbsrlA1
eFF+KFxPb2xALVAy9Zu6mBblRTHrBdHro5Kx08CAOQyC8qeUI4AcklARsWak
5fSqrwp/yp6wNjNaClG8hRUnsVD1wunDTl+ynUIb2hRNvyPKJePEXBQK6n5W
5CvFJcEJ5A1RDV2bdyhsEmcYfRMOUVBrYOpCRHc4biUCTg9nsGuCcbAniWLp
gkvM76yyiHERLYQOV85qfyRDspP7pUMy7vNfOSKZpI3I2MH2kGRFObPFP4FJ
Uq4HB2cEe+w9FttpoGkK9JFIZSWpFu159CrdOBlgKpRAP2a41fBFnBcbQYDD
yQhy0pW1lUDk0ydFScBmViHIzm9cFDNaViU/+k5MzcgszBeS2VSYhotgkpOF
RYjtrFQ4Ex0VebsG+9i1TrOjs3AzgycNldEgjPJrVA9diP6QwSqDdIumc30L
VDzkr4f+609srDeMljeHipoFypigMUU6URm7sI1niEOA3ci08CbQVGsQ0uHw
loBGBfLhkSUG8cFe5tlqs5wwkoCUqoL/cluRurxpqmkJfiPpaVsE49EaMTx+
IGODR0cerRPk5Yifr0FQQZWAKZBMrqum2U5LQSKGQc54TWSbmUKYu8GcFWin
4Fh432bJazFrn4OR+gyIm8L3QRRPjK4hxRKTFMVRR0nb/cT75GWloZ+Zp0mG
s5oxGPYqM9MdNmfP7V1fA7MD1MdQfoSLWyQkY1JAK/gFP0AS8KrjR/7D/7hr
JCd/TQZiSLd0HGb7fmY4tqHA0uPV/lTyN9EAe6TTEy3W8jT5uzv+4DBMnYPZ
68rbnY0HUXH8xXxFGo9mx5DyGqOMYB/pkYAbEyemGzbjOADsPWDVNsqlZxuf
6KVZXV1/zx4H6vmbsDTmajI0diS5EKnpziUQeURpdRFBBHakiQ7C84njhMNF
L7GzlfjdxtvJO5Enrpvxk2YTwmEbZw8xYjxKGmIiUzh8LSkKq5moMghZ6Ecc
KoViy8wHEjJB1idnITBp+k0VG1aXiFWGmxATo+xR/FA6WHDcQfqwMayCCG5S
FlUMgGGJpaACWLterRClZAqCsxvl2OiQnUZ6kt2S9K6OZDTOzSdPXAJdAEIe
H0ssD2e9BGvVoOQhWEOrLpCwz+MPsBveoOLjO84UzBelkXsDiznGOPsflrCO
u7+rZlfeF+nZwTh7Qx++x9/6a8IFQtZ7ZKLZyR5nv+e/Th/r9+LueceJ5uPs
NT6cWtI5J1vwVb+xk8sE6R31nIK5JNKUhMJ493FTAs+MnJl+6cwKkHX6OWNn
pxMTtsrh3bt3Hj64R//evX80cKkdw8bPWLSKd01kAYFRjw2HanelzHScZW97
fNh6gx6fzTu9H/VuzybpDYdH94vp9MGdg9nDB/OHs7vH+fHR9Hh+8OD4KM8f
3C8OHxzmPXvBTQ5N+927Q7/oqV07S5Y22Feysgkq4hZoR5Gp17e2hYqFjHlt
t3yUrfowcT8DGYNNIuenmsIpOYthWKQHhIA1X/rDqvwYPUZ8TPzD4cP7B1mx
ruiRe5GyEztDcbFblrMVrJgf3hDf/CPrdyTCDwd4AgmVs1UlPs4iZ3QHbiUL
7w8WYhFIneJVGS/ugA1uNtMpkmwj9K6pPHBWMpMCuDNkQpKkEueVZNpJVJUP
ZmL9+QhwtP8Wk1PfhphDAlJTdIbIrLGL6ISd8AvWMYhV9oBXIRW3d3NEwzMK
dnH4x3T9FPbQ7tf+BSEUwQQjE0gCEuE96UH+JjvRl3JJFHFmQd3fcGqT/hQR
g+A6vW6slnS+ppNJX9LwfObVIq/PCg7zBB7kUWjBAAcaYSfgjlXebNeOjGjQ
j3k9xvKfoSTjyKjgoNZnmEZdXJQC8VFdXxHjb7xVk5mi7xWfCMIhfvibl6Sz
BFgATlzgJSjymxaA5vBKN4/YOpQUBoziHT2UU2AB+06OeVj+vfikygoyxITX
fT2EacmT6Khf5h3tqmACU9RNR1wxy4yiFldDy3FSzUzw1ZXqFekQd5EFdq87
E+/iTzmOIBV/dm2NvHKygmblZnnD0jq/s2aSsn+pqiT+0DDkicHpQg6WhaeI
fVEzyzq6lvbE6aVCNPJ79GhJyWEMGeYLsJVwzbI1hHkjYGBoawyzJ67C6CUk
zQX4qHiZaCVIuR5lkSIU9OJ15FPijVWNJz74xUeoPV728KD94npCBTqL1nPs
Du8eEFemf+/yv0dH/O+DB7KO4Dw338R33B9k9+7J1UY+6Q1jNwQIWiCnCeHQ
nPlBO6iW7uH3ZPISHhQNKY3yJVP2rA6sObjEbCRqXBi8L4gQZoMvVpH1ZOjj
hEwFvuxVYIERWzR1Tequf+PiauzCUdDMJNqq3HMme8gO5tZPPA9sDzs7oXnE
B2J5FaLmT7z9hvd3wYNZQAgrJ2TkO7ItGQPXTNUV4V/jBOi8154DvcL2xapg
fFZel3yHkRRmNQjTUmklE+ubKcF2C9fPiiEkVsTDT8zK2wSgHOPx+IhiCGw6
8TDM1cwG6V5I/eLIZkmGQSMBnrMVm365lB2w51mihyXo60lCogyZuEtXaJ6S
5tXAAzxkgZ/PxB2yD85gOReei1yeV5nHyrBXqrYaJ8EyjVGAFU68LHEwcUKY
tWTbh40xYvGYtJWG4Mm6eZGzX5y5XVCG9EJEuOjZll36w/PT/031tkg7bNRC
8ycSprCLOY56uf2ExHk0gG0h8aFFuD3WymJHv+v5MNFmLTNbZctGVCR8Fl4Z
QVUQTtfL+r7shCQQuMQw5Rx2we0L9jDUpkExBPtWCbWj2cJJGkU7uQhNrWqk
UOZSmLLJRN0tS2sXBwqnM2r2Wthow2maHS5uPATrs1ldzlvDA0ABotlJpF9Q
rtMpizXL0xIr4Tl8bte3Iq+WP/Dq6lM8jvIGRF/gi1Q0VOR8hLjm6YlAE2vM
+WhObt6ieSkYzFbyGmo5LSArXuApU6MWsvA1F4K14fyrDakVFG1xxMkb90Q9
2XLJYd7ia4yy+qwCoIhqmmQ8B31i4kfMHSdJSZzaqwkkj6QmRqjqpeWI9PED
DTdosR2GcxFJ7N0e3+4PXPrT1zweA3bukZ+EmBU5EqOKWj31vnpJ8FOz/8o7
s0Q6yOS7Z9YXrBF31aATIdL5MThraoAUWOFsu3CtKy648Q+2yK3kRk2aEfHM
q94o+wvRjewgvGf2pEFkYYLsrHqLy0Pm+FlNZqCUFEh8brsHfenfpKNzYWMU
QuxHH7sP4oDfOx/w00UcfXlKxo3+ichTgqMYFI+TVeyk8mT6Nzzjbz1Pr/RN
9MC/9UZm+aPchVRe8SccKhgiXf5wdqIPCIx6QCAsHqIjGUk4+1IsBpWnNA6z
y4maEBlktRFgB56InD4Zkqg0uzym0YZ+tav0TQANRWUmsPGIwCD9vVMUgzSB
rEc8jpaWhYvrrRebM5IfvE+z7P226+79KJOk3JCPC86xRqkvLvMAt6wDB+++
DCAhmTYKsV3G+wTv5qr1qmRbuWIl9bE8yIoWrpx5HE4XNS8JhWbNaBIFskoM
LSNL4hMBEiLhb95rDOG9OjKc4jqaLsq4E2u40VnxGzDarVUUiXHF2dlDIYZl
vo7rIymhcvUKzCOJp+jLt/e668F22/uX7UdYUHlO5LDtOjh/Y/mofrO7jngt
KinVGEBHzOChxI3p9ufFZTKEJvtWhDO7cQ+zfbpk1//8JUc3XsJOzp+9/Tld
sHsNtgbmWZQ5TDHzCV0eO4W2n5X6htgoWm84WTIjI26DWoWsUsWMO5eTnvLg
EDYNHnlwNTZMY0exr9MreeuvY4f87zJ7ZvkTmYFS5wW/SB7tWJPd/yDVLeSW
ec3qwvjtN9mfiOl+z59+7BJIb91W71jZ3/azwWOBNKll2cJAJTt811UT4liX
5aw91wcxQseL0yirNm88cieaDTvFjx4cqLNa04ITYKxebHCew1dv3sTIWP1Z
fLB42p0EHSvLwOhYf891Mge5wj9frJnoDbhGquHw4w8ODjq/CdqTfju+e8//
8mnwZa9bs1qwOuuFG/HXFoxXaca7y9Os1Nv88+0IWaq0GJGiUKLJ1yR6QIJ2
VyBW3eudqK0AMbe87ZX6hkNRu72oFK2jZaWhsAUjAgSnYlIw9No8oF7924IY
pimBkip5QyU9ZbV5dllMDB1T8WUsmJA89ubRy19DEB9B1PIy/doEs7e6UBhi
N+eP41V0QN/+Gqz1xy02Iyu5g8W8SSsG8Y4k+kRXXVClVwxZ3hCEeUS5k1BP
uptOErnEVWn+zo6GkXU0DO/aCZkdizQGniReaMkc78qZk8T3eyD1wUIuYxBn
6mmpVpLu+GWuWbX83gjLktSeWEY7x/F+GLKDLNKxyxAZjApNqR6NLBaBJofk
nAuxCQDZBupNbZqoEoDEmFWDztLsGI9O6cRzXbOpa9b1LLd8yV4jrsB7BsgP
2zvsm4sOUXC/Re9DoiA/D2OLIkQ0J7aYFldDNrgXi0IQMwZOmHUBL4MUieKS
MQnizmz3mXlg2AErgwm+XmgJUXqh8AInIzcER9MT+olqfHISWdDLObOZlAst
eLMqhmQcaZZr2EA2IxhjsUR16bDJ5sCSVCWp5JqoVB5IEimjmr+rhXRMZwfg
mpdDPLPwPe+x32l11Q8pIxYc4eq8HPRHDFHg50ifig13shHh2MaN2wOxUh6q
YrdXRi9gfGLxk51SLOYGPTH0+9YtqQ9BL9NKwdPzqpwWPvPUIzqRvBHsVO8w
i1ysMmKnLk2pgHthOafyLoUCYrS2veL3w0tsfwBJqZZFam5yReDdB9Z8oaoQ
m19yNgNdaMYFmW9sLIQnxHiwZufS6FSuitZZzEiOTueM+NLpqG2YC9wk1c9v
Ny6mILZOfk5J5MQGXoR1xQZRGTT+YCfSU02jQYavN9g7hSWMB/6MFvlYnrGt
SCr2Ah8i5EWdX74TVSfRMmONkUybd5tVfpGXCzbidmmEioN5F+QpYFrbF84K
VNt+pxnYu56kke9i5otCbCc42VKEFCfZpw6awJAQJEICXgzp/ltGIJLEb0x3
6FbdsXIE7LaUvIcYhRwX2om4dkek4jaOqHsHMb8JRfrtdZbguFVSWPJ2mq2c
VUsvSEjbCYcntlCJ7zJyt8/F5cs8oFpKDTyvESVqAALabk905WLWDwuU5KZK
GXItUL3QFgmbtb1O9D/w3MqLHJ+zyUcERZ8RYpUYhyHlMKWmtXxkq1ch1qp/
U4lMNfP1itNR8DCRT7fHL49iVHDx7lBso/RheUYvvsursiduV3UDLWRQoMg4
u0VjVyaeFlFGqDniItez8kBlVwk2VvUNz7S8ZmKMJ58QIx5AsomJ+sLy6x8X
XKtdmO6jEHQ4fdwLEsrSDHwRDV/OJ3eBQKKNBzRPyIy4My+6YIWUCSfrHZ8I
J30DJtVHH5o8fcnxBNLZ+ZjM2RUnz62lJoKkJmzqYbtBYTZ2vuvgoqGJSmpj
4evf4foQLQxDD1XHEeihzVtNxb+O0pUsVLQQPZ0HBD2G8V44+co0QLILN+tG
QTwmvuOas+rH2s5+B9G5G9QV2uBUpYOImnOwN4S6yjrE4PXu7VJLWchI5JIp
GVMxi7yyjVUl2XlVlZhk9Yw6JV0gbn11vDQeH6FzLRi/27BSrJ+WafX2lL85
MqXs0i/NOhLIgJw4PE9Ue6aETCjHAcnayRI/fZykK0WJti6163fB+x7GPooO
Vu9tjyiagwxvnr7m/7AZd2SIPdwRo/bK9eG3RwcHh+N796fjw6M7R+PD4+Px
w+OHD8b3ZvN74/nx3YPx4eHBZNCVn/y/cn0U7j6a0JXTw/H48OGDAcvVw2/v
Pjw8uIu/j759cBB7Vnb5/X0YIbouxSfGzpfPrtCDw8+u0C4w49bSfCGg8bNT
iqCWN07H/ZjqHBFFd2lyZ/0MK6unfCENCtMBe4bUqrw9l8JEvBuexff5MILr
OdRYo/GK4AY/C9qvPpsFVLCuVBdOXtfjF/EC9geujmrLWIjc60nBnSRxz03N
cIKRTkzhaqjVZv6DnSUaAifpyn3MwnVqNYiATtPjOAobEBydc9oPosdFCcIe
3bKjuoimqWxlAgRskURtzdAbRHwyxcJ8gU/D3eTTiPDM6muLvvGGYlqOkiOQ
9UxvjTo8FbTCi8aXBUNBWBfjEn1y/UBLFdnM1A2yipvUiBLVZMhUldi+e/Ty
h2Zg6BF2toAuGAqieS476m8oEbCVnCFapIbP4spFYVhUk1FBhoBmNVfoT0iq
9DGSysCwDKJfVFeIhxBpsHXQXt0oXbbg4moT/c5mVNVAnEu19PiH7tcy5/hb
CYNiS5PtJ0Mj3fhtYyNGZVrVa3TLi8qgYkGV4uIEAFgAjdjDLPqR0ZbmBvkc
IOg/3YyrbmF80AF3s+KTbcYNHDOoRTe1pCerFwpwyLL8CNxeZJz4re10o/Hc
r0wy1eBCVPRYyqc6nmdSr8JB7kPLXXJl2p544HpRu5vzoEwbNjl41Ww2Pimt
jrS9tsMDgrOnw5ISGv98GZothoXGEFp6N3RjQecmKeDme/wADqkKpMcT76oh
4+KCzy3jg26qjpn5aq9oXOQ7KEWYK0ZVdWqwKhthYi2kZGyUkYRtFwCnMkS/
iIFvGzvqFtUsm45zIzk0WwjOHWoeuHldrKUXT+TqaVwQhbaPYx+GCvpcJ0Tz
L6gYX6nNeN0oyrTwSPbOZR0A8e5skq7CddR5yBcqdTdpQqLc/fddrvs3LBej
gcYSuQP864vXykfzvo5uzVh06i8QkZ6WbvJ0/JmaRf+KsvwVOvnPb8nPbMcN
BY1uiqH+f0jc/68TRmJYdFmfWRdxla5u+YmuNNgBj5qVEDyceUQsN6BT1nlZ
+/JJHHvgtgKIxSLl3XsdrMyR3KUqKWroXGl5Tc5yTBRjKBG5+chJGkiEPnIT
+XRJXyBNUS5hsIAgcVG1suHwb83+f0lPl1R7a6bK6NJRoTXi45RMNmv0NX5Z
oqAVILNae9PScC0p3rJw1LUZ6T11sW0AlKuO7reXN65as8Ek2niSXazXrC24
54VTX+WyysJWx8O+G7aaLsc36bcJgcRl4T6XipmeyTTl85cnat6UTZnSduTO
Scae+nQULq9kYGXvucmeB+4GLSTtcahlIqpVatBFpW7RtkBq6m7t3yiLrPc5
x7kkg6myspfwh2s9M3Tj7JYeURWQg7wr87BFVqR1QfOBLelDGJMQzlTiNJyl
08ni6Yyy33NeTxxsomMW67iaIhGy/wWoD9QjG1Bn8GRfZSuD09/Kfr8hRX0B
d6X3ocXlMz2ArNtdE4Z/7OmEdRI1XebvrGWxb4cpUU5BoTlJB1fDN+6lEIJz
rN1592t3cHpcG80oY/aGUhp7Ho/6azCvfmjKpiiBHcpr1rGljfrQDlXC2GIP
+XnFE9bMdlLmURto6EvampXlDaWRexK6jIQcRFgQ2xPcBnZ0E/PdjTfF6FIr
fmEbBmcV+sVZZWzxMosRF1W24vaXVd14bKzbRRuWoKBFa9j/v+KCp4gQofSp
9Hzw/vaBmUFl6zQhjBdLvOjm+eawqQAV63xdsdsjBNE8TcAPAuCCVFSxBG5p
ueKJG5xfrF+/JZCAIgcE1xolpsD2XLNiVsI5dFlhu51E0lnuWM4XYDsTdoVr
uS9ilnlfDTRr4KM1dBZaXFcX2Bzo7XncqVgRTu8j7+V7oeBJ8lgOMjFbshJ3
wUaX3i/C+Fyo2eRJ0erC+0WUHsrYZuaYswJV3BvJ0ODlljG59xzBWxa8MzQu
GpakIyxy1ANMxSZOQC75izlQwWYPI0sFyYwONRUQetiiYgTmSX5xXVkxlBl8
tjV0uY/fE/JRZB85uniVgBXQAni9qBqFIUfgiK0ugmafW70PBR0nGpCayjLP
pfZFtyGOUtCXVmkS/GNip9cFGEnkn9BcG+kiiPukCTl8drIpfq665Ylf5X2z
LlfvJmX7brPmtuOz94wQf59E68NPhkxg9ej7sjP9yP2M/FDO+lid2WsHJDmd
kGT8q48Qear3RcDEfcQrqQgQdOFOMqi0oDDaR5JutORIlTy231FALyo63rOB
lWBLw+AIDm/OhgiaIQuAxAQaTS3KnDuuP/nIpxBsL5xhIGik3RHidvGJmpCu
PS/b2BciDN9HcaG+JA2Igv6Y7pBu6zv+z+x9P+ZdnNNXi0NK3T10MDvltjgP
yRKzkNLA7A5L0Vq1ExGNeuTtWhNgzjd+mHOsveQqu5X0hVpoa07xIMa5K5I5
rHTHFJOQFNLYmJ60+II8KshR8TNam7LOnW3h6dFi2+bpM2wUQ5fUapkuuDOt
RO1FKIV6s+auR+h4JnHh6ErLRGMoB5/fKakDWGniBmC7gJDyYbNidNLTykeM
54tS+FHkwRVvX15GOH7SSMBlRMwNYpVOZaU2pHe9Xfvdk2XbUYABaECG1TDp
we6aSWWK8BiXFKVCoRm0EXvESXvfZN/RqkrbrjpX+5J/6cUE5VOclPRDMm1U
o883tZV6slLxXLRhY8/WayEVDW2ptYCgfyhn5EHDzEb6ndqkDvoH6qxHLWjV
YNL7kYwn6DBO79VqPqkaIeN3sigeK2BxBtVWm8DWNAM3yru0WxcLrKMVQRW9
L1qU0HlDnKq6wrzoYYXTuN6sID4lp3Ed1DAuypU+2jffoCk+k4Zt/qCA3fKU
PVhzi+GWq3jkgD6CdXv4Ec/NYAVAH5LNrn005tbUttvEFhP1xOIiy1v3K9L0
5NzSfeeqRXcYNrSQ0J9DHwngQ8yFlHjWuaBvJOWrtlyryYZttAZAD36Ppw5w
Gbek7YECrHIMmMdisYZFbmlOcnblJJCWJWxcsJVWF8KcTk7Y5E0UF8zKLr3x
+yx4qQlUjXYEa2LxKlgbn+u8mgkjXkZODqMxnOjkGFsqM42Z4yiilXH5bSkO
cGm1EgMBCkA13ZhBFgeRY2UVW3VlcaIuwFcKRMtjnd8H0zW7cKLd9B73EqM1
dska8y07z7HvvnK1lURPjxntDNyrrImfH4qTXuZiAao564kRqYGW/2YhWkvl
TLjqbFNEQDbBFt+Ucz6Stgw+kxoTUYJiPXYvpylPpNNenyPCBYMQO0zG/ArI
xmu0CrlmjMetzqpNu0b9DekR41tIdfBHWCwhQ+DJYa++77hg38dN0NHWB05C
rCBksMdbc0U5SdwBwVn9W42xDWy2/KaOrtSZX6y0BgeGmGmX0EzBIPbQToAv
65tqoiI2APDlrtsuMULEc2qVIK6i5N8dhrBpF75StnXzZkNU9tz68CmMi8nP
56CWxGqUAFgdTIrYWYr4TvM7Bodpg1XO0Uyyx6MpDlxobGfOTEur6SBLTCUR
Dt54gg0Sgk0LxZugiIEHuniLtp8I707V3gCbN8i7i9OhI2w38AiyXT+LAx9o
xYcrwDNIaRce6dNfdkj2lYHCNZtNvM4KyDhboQgkGW5ls8EFAi/XSnMiBAK+
My7aAEgPn6z5nHkUPdA/A3ti7msx1Ol8eBtX18DTBz/2dmNBdtKTE+FgbJS9
jqg5ZokaiXu8EaefRg2i0yqlCxY5Iz8SZwmQf9Gh6l4cXOZqMqn1GtKFXIQ7
aZJarzcbVlFi7FY7mVHq0rJytSJNbBTRIZbT9Cq/3FY1YxjG9a06vxzyN5+c
k8QO8Uc1aXaLmU5z7WNZapsxa5LAio1vE8Y1KUjyOnq0mLrlksHi0XsHMuyc
ocwMjgY4X5YJX2jyQQfj46CqxKKoXF0w1Fc9QXy6NnBqyZwtIGnSN0PTK5Jy
S7i+HOpf0R/7vC5x5ZgmwS3HNUpVsKpN5jnkABlWsK826yDYmKCbNcqswslI
J0J7EySXGH+RtP3phisosNBnZ5eWztBLuG5G9hehU6GvidZZT8docFB48818
HXi80SAq88v1H/LLHhgK5/ARyTCeSEvqoSJx0ljKGYJ9oH6dBn0HiXJq2cB1
frWo8lm3HKh3XrGJeiOgSd+OWI9WvmytMltEKsb+1N9lJduF0rkFCRN6f6BP
EMkEujA2o0O3Bs0YvYZ/4kyRe8fxKG4cwO3GZm2vLD7e+Mqq7r5R731385v3
IowZ3b1ZoahhP1aiwzrJmLYnH89ZR3XVHYrUQD0vPiq0OsS5jE/EIS7brU50
69xT0TiumCD2mh99Un8IQQOhfENkRs279A4J76Ia8pauaPsSUaCup50LUVMc
sYvFIsYUSYvtMCxjRmA2PqQRzAUb3qgbHJpxAXrmDhabMU1IV97GEwggHSE0
4IAts+xA26FB5zFWNClfcMOoVhBPpCIDWWEpf92lsPZd8lkd/vEbw1nWQ6X5
WydPTh5z1/D+4DPhMhP/qo5p4SCzVJLhOxu3uJJudeWzdGlTeKBJH0s82KBS
0YZ2EgAzgA+5R3RUoJ01L1/h3HrGxwVtINeazKJVkpRj1g6plUi92ZNj0Fdl
B/tt3jzVI7y+WRfqNNdiZT5Y4oNoW+ZFhQMrtzLcThwRxUd19SD9Jel6z1vM
8jlIRvQfnVypty6Oh2AqzrAS2nvIq6C2tFgn0ZXsHboye8APkDGQ1yu48/j0
DxwOwiCjJZvQKYD/3CrmqdGni47IvrabtUXqoVuIjqkXYfikr4kWNpGAprI0
phpNTOGKTDWSnJU221AWyvixdHvU3EJnrxpLLp4V3MInd+qdh2NxE7ofFNbA
NGCGrcAtvCUvL5AQl7eUz9B7ZC7dAGMn/81pITKutIXo7xCG8vxfvtIcZi17
Evixzmy7w2fy6JQz89x1O5PZwzv6JbPXm79k/u5L5v8Xfd6/tAI6qB1rYI/f
XgWg0+MlUM8w1kDLrAFQvssjYI4R1uihLftKe3wYpXP04sqlOjO8MyJ87H5j
jJuV77RuOU0+df3nVtBrS7xWP7dSXfkdP2N7jXDS/1ss0mOeyRevEua9Y5nk
KdvrpKzwv8VK/Vnm8sVrpXPfsVr2pO56Za+5K7smsqmo/wtySFm7s4RWby10
vbK8JCGogn6EZHEhKxh+GXW6slfFO/64z/hqer7Ma2kjTiajhJSifnOcdxt8
UZIQDW+5Y6NQq0UkwW1ojtr2zFcL4pexMsbplfyMC3afRe2v+T0DpwLT7rbS
adAFuO3VxNdeQvtPfbsPEZoa1O0wz2Jc1FbYbVKIq4FHfFaGjEp1PqFhfBU1
fhBflEMZjUUE5U3Kg/wCcd/4Dd8p8aGn/nKJz0VtuXFmJPTDC8f2qxf99sWN
p5UPkurvQh7BVWlvKg2Ux7tZaLmIpHurT7FSRc0q3Q9i78Wg06nRWeA6jD9C
o2gqiSyDgCJI7XtvYMX3N9f2CQfutc3gxiaDvzPJP86uE8SjtdzG6Q8DHNqi
xBxgxwu3uSafxqL+3DZ4Gw0kHUpjevZxE11nAAFoEwGDFtF3d6wTAZPW0a/M
X7BAkxwstVTynuHqwwP2gT0/eUOqzYQ7szOp2iu+ZLWfYYYxbBWI02itb+Ku
0frKMu1eXX1BZ22z14rG9+guTthawUDSYtrSZCK2XSFlcM4t1y6qUZjg7HxJ
PYMNMfoUnp5CCrVvZWMHHKSCohCCSgBv9JamWFwIiMZpFQc1H319VWsvJs5q
GSD8CwpZE/Qr98VqPsBtHumhnWTuKvI4W38JnhhnMwyyR9+9eEX/vv7zQOTQ
ZDMfuDkti4+zcrty504kdtyEZ8DvbW1hiZhnBZdR823SSEP+WKpUQniCc/9L
wQYyq3WW6mrP436HUmExyDxhPRJ4xPO4yvxG/bEoe2+P5XIwLFpKoM6TZwYU
nExJmyWIamHFdVi5SJx4zq906Joeh9XYLt/R5lxjPjMpa8H/8d6UgaPtW+Sl
FBbgFEQIv70rWBS+KjMqc/RtfGFVkLpVTeieK+fLAkTO2+jtUqVfYRWyfKGW
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

-->

</rfc>
