<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.6.4 (Ruby 2.7.4) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2544 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2544.xml">
]>


<rfc ipr="trust200902" docName="draft-ietf-bmwg-mlrsearch-02" category="info" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Multiple Loss Ratio Search">Multiple Loss Ratio Search for Packet Throughput (MLRsearch)</title>

    <author initials="M." surname="Konstantynowicz" fullname="Maciek Konstantynowicz" role="editor">
      <organization>Cisco Systems</organization>
      <address>
        <email>mkonstan@cisco.com</email>
      </address>
    </author>
    <author initials="V." surname="Polak" fullname="Vratko Polak">
      <organization>Cisco Systems</organization>
      <address>
        <email>vrpolak@cisco.com</email>
      </address>
    </author>

    <date year="2022" month="March" day="07"/>

    <area>ops</area>
    <workgroup>Benchmarking Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>TODO: Update after all sections are ready.</t>

<t>This document proposes changes to <xref target="RFC2544"></xref>, specifically to packet
throughput search methodology, by defining a new search algorithm
referred to as Multiple Loss Ratio search (MLRsearch for short). Instead
of relying on binary search with pre-set starting offered load, it
proposes a novel approach discovering the starting point in the initial
phase, and then searching for packet throughput based on defined packet
loss ratio (PLR) input criteria and defined final trial duration time.
One of the key design principles behind MLRsearch is minimizing the
total test duration and searching for multiple packet throughput rates
(each with a corresponding PLR) concurrently, instead of doing it
sequentially.</t>

<t>The main motivation behind MLRsearch is the new set of challenges and
requirements posed by NFV (Network Function Virtualization),
specifically software based implementations of NFV data planes. Using
<xref target="RFC2544"></xref> in the experience of the authors yields often not repetitive
and not replicable end results due to a large number of factors that are
out of scope for this draft. MLRsearch aims to address this challenge
in a simple way of getting the same result sooner, so more repetitions
can be done to describe the replicability.</t>



    </abstract>



  </front>

  <middle>



<section anchor="terminology"><name>Terminology</name>

<t>TODO: Update after most other sections are updated.</t>


<t><list style="symbols">
  <t>TODO: The current text uses Throughput for the zero loss ratio load.
Is the capital T needed/useful?</t>
  <t>DUT and SUT: see the definitions in https://gerrit.fd.io/r/c/csit/+/35545</t>
  <t>Traffic Generator (TG) and Traffic Analyzer (TA): see
https://datatracker.ietf.org/doc/html/rfc6894#section-4
TODO: Maybe there is an earlier RFC?</t>
  <t>Overall search time: the time it takes to find all required loads within
their precision goals, starting from zero trials measured at given
DUT configuration and traffic profile.</t>
  <t>TODO: traffic profile?</t>
  <t>Intended load: https://datatracker.ietf.org/doc/html/rfc2285#section-3.5.1</t>
  <t>Offered load: https://datatracker.ietf.org/doc/html/rfc2285#section-3.5.2</t>
  <t>Maximum offered load (MOL): see
https://datatracker.ietf.org/doc/html/rfc2285#section-3.5.3</t>
  <t>Forwarding rate at maximum offered load (FRMOL)
https://datatracker.ietf.org/doc/html/rfc2285#section-3.6.2</t>
  <t>Trial Loss Count: the number of frames transmitted
minus the number of frames received. Negative count is possible,
e.g. when SUT duplicates some frames.</t>
  <t>Trial Loss Ratio: ratio of frames received relative to frames
transmitted over the trial duration.
For bi-directional throughput tests, the aggregate ratio is calculated,
based on the aggregate number of frames transmitted and received.
If the trial loss count is negative, its absolute value MUST be used
to keep compliance with RFC2544.</t>
  <t>Safe load: any value, such that trial measurement at this (or lower)
intended load is correcrly handled by both TG and TA, regardless of SUT behavior.
Frequently, it is not known what the safe load is.</t>
  <t>Max load (TODO rename?): Maximal intended load to be used during search.
Benchmarking team decides which value is low enough
to guarantee values reported by TG and TA are reliable.
It has to be a safe load, but it can be lower than a safe load estimate
for added safety.
See the subsection on unreliable test equipment below.
This value MUST NOT be higher than MOL, which itself MUST NOT
be higher than Maximum Frame Rate
https://datatracker.ietf.org/doc/html/rfc2544#section-20</t>
  <t>Min load: Minimal intended load to be used during search.
Benchmarking team decides which value is high enough
to guarantee the trial measurement results are valid.
E.g. considerable overall search time can be saved by declaring SUT
faulty if min load trial shows too high loss rate.
Zero frames per second is a valid min load value</t>
  <t>Effective loss ratio: a corrected value of trial loss ratio
chosen to avoid difficulties if SUT exhibits decreasing loss ratio
with increasing load. It is the maximum of trial loss ratios
measured at the same duration on all loads smaller than (and including)
the current one.</t>
  <t>Target loss ratio: a loss ratio value acting as an input for the search.
The search is finding tight enough lower and upper bounds in intended load,
so that the measurement at the lower bound has smaller or equal
trial loss ratio, and upper bound has strictly larger trial loss ratio.
For the tightest upper bound, the effective loss ratio is the same as
trial loss ratio at that upper bound load.
For the tightest lower bound, the effective loss ratio can be higher
than the trial loss ratio at that lower bound, but still not larger
than the target loss ratio.</t>
  <t>TODO: Search algorithm.</t>
  <t>TODO: Precision goal.</t>
  <t>TODO: Define a &quot;benchmarking group&quot;.</t>
  <t>TODO: Upper and lower bound.</t>
  <t>TODO: Valid and invalid bound?</t>
  <t>TODO: Interval and interval width?</t>
</list></t>

<t>TODO: Mention NIC/PCI bandwidth/pps limits can be lower than bandwidth of medium.</t>

</section>
<section anchor="intentions-of-this-document"><name>Intentions of this document</name>


<t>The intention of this document is to provide recommendations for:
* optimizing search for multiple target loss ratios at once,
* speeding up the overall search time,
* improve search results repeatability and comparability.</t>

<t>No part of RFC2544 is intended to be obsoleted by this document.</t>


</section>
<section anchor="rfc2544"><name>RFC2544</name>

<section anchor="throughput-search"><name>Throughput search</name>

<t>It is useful to restate the key requirements of RFC2544
using the new terminology (see section Terminology).</t>

<t>The following sections of RFC2544 are of interest for this document.</t>

<t><list style="symbols">
  <t>https://datatracker.ietf.org/doc/html/rfc2544#section-20
Mentions the max load SHOULD not be larget than the theoretical
maximum rate for the frame size on the media.</t>
  <t>https://datatracker.ietf.org/doc/html/rfc2544#section-23
Lists the actions to be done for each trial measurement,
it also mentions loss rate as an example of trial measurement results.
This document uses loss count instead, as that is the quantity
that is easier for the current test equipment to measure,
e.g. it is not affected by the real traffic duration.
TODO: Time uncertainty again.</t>
  <t>https://datatracker.ietf.org/doc/html/rfc2544#section-24
Mentions &quot;full length trials&quot; leading to the Throughput found,
as opposed to shorter trial durations, allowed in an attempt
to &quot;minimize the length of search procedure&quot;.
This document talks about &quot;final trial duration&quot; and aims to
&quot;optimize overal search time&quot;.</t>
  <t>https://datatracker.ietf.org/doc/html/rfc2544#section-26.1
with https://www.rfc-editor.org/errata/eid422
finaly states requirements for the search procedure.
It boils down to &quot;increase intended load upon zero trial loss
and decrease intended load upon non-zero trial loss&quot;.</t>
</list></t>

<t>No additional constraints are placed on the load selection,
and there is no mention of an exit condition, e.g. when there is enough
trial measurements to proclaim the largest load with zero trial loss
(and final trial duration) to be the Throughput found.</t>



</section>
</section>
<section anchor="problems"><name>Problems</name>

<section anchor="repeatability-and-comparability"><name>Repeatability and Comparability</name>

<t>RFC2544 does not suggest to repeat Throughput search,

and from just one Throughput value, it cannot be determined
how repeatable that value is (how likely it is for a repeated Throughput search
to end up with a value less then the precision goal away from the first value).</t>

<t>Depending on SUT behavior, different benchmark groups
can report significantly different Througput values,
even when using identical SUT and test equipment,
just because of minor differences in their search algorithm
(e.g. different max load value).</t>

<t>While repeatability can be addressed by repeating the search several times,
the differences in the comparability scenario may be systematic,
e.g. seeming like a bias in one or both benchmark groups.</t>

<t>MLRsearch algorithm does not really help with the repeatability problem.
This document RECOMMENDS to repeat a selection of &quot;important&quot; tests
ten times, so users can ascertain the repeatability of the results.</t>

<t>TODO: How to report? Average and standard deviation?</t>

<t>Following MLRsearch algorithm leaves less freedom for the benchmark groups
to encounter the comparability problem,
alghough more research is needed to determine the effect
of MLRsearch&#39;s tweakable parameters.</t>





</section>
<section anchor="non-zero-target-loss-ratios"><name>Non-Zero Target Loss Ratios</name>

<t>https://datatracker.ietf.org/doc/html/rfc1242#section-3.17
defines Throughput as:
    The maximum rate at which none of the offered frames
    are dropped by the device.</t>

<t>and then it says:
    Since even the loss of one frame in a
    data stream can cause significant delays while
    waiting for the higher level protocols to time out,
    it is useful to know the actual maximum data
    rate that the device can support.</t>


<t>New &quot;software DUTs&quot; (traffic forwarding programs running on
commercial-off-the-shelf compute server hardware) frequently exhibit quite
low repeatability of Throughput results per above definition.</t>

<t>This is due to, in general, throughput rates of software DUTs (programs)
being sensitive to server resource allocation by OS during runtime,
as well as any interrupts or blocking of software threads involved
in packet processing.</t>

<t>To deal with this, this document recommends discovery of multiple throughput rates of interest for software DUTs that run on general purpose COTS servers (with x86, AArch64 Instruction Set Architectures):
* throughput rate with target of zero packet loss ratio.
* at least one throughput rate with target of non-zero packet loss ratio.</t>

<t>In our experience, the higher the target loss ratio is,
the better is the repeatability of the corresponding load found.</t>

<t>TODO: Define a good name for a load corresponding to a specific non-zero
target loss ration, while keeping Throughput for the load corresponding
to zero target loss ratio.</t>

<t>This document RECOMMENDS the benchmark groups to search for corresponding loads
to at least one non-zero target loss ratio.
This document does not suggest any particular non-zero target loss ratio value
to search the corresponding load for.</t>


</section>
</section>
<section anchor="solution-ideas"><name>Solution ideas</name>

<t>This document gives several independent ideas on how to lower the (average)
overall search time, while remaining unconditionally compliant with RFC2544
(and adding some of extensions).</t>

<t>This document also specifies one particular way to combine all the ideas
into a single search algorithm class (single logic with few tweakable parameters).</t>

<t>Little to no research has been done into the question of which combination
of ideas achieves the best compromise with respect to overal search time,
high repeatability and high comparability.</t>

<t>TODO: How important it is to discuss particular implementation choices,
especially when motivated by non-deterministic SUT behavior?</t>

<section anchor="short-duration-trials"><name>Short duration trials</name>

<t>https://datatracker.ietf.org/doc/html/rfc2544#section-24
already mentions the possibity of using shorter duration
for trials that are not part of &quot;final determination&quot;.</t>

<t>Obviously, the upper and lower bound from a smaller duration trial
can be used as the initial upper and lower bound for the final determination.</t>

<t>MLRsearch makes it clear a re-measurement is always needed
(new trial measurement with the same load but longer duration).
It also specifes what to do if the longer trial is no longer a valid bound
(TODO define?), e.g. start an external search.
Additionaly one halving can be saved during the shorter duration search.</t>

</section>
<section anchor="frmol-as-reasonable-start"><name>FRMOL as reasonable start</name>

<t>TODO expand: Overal search ends with &quot;final determination&quot; search,
preceded by &quot;shorter duration search&quot; preceded by &quot;bound initialization&quot;,
where the bounds can be considerably different from min and max load.</t>

<t>For SUTs with high repeatability, the FRMOL is usually a good approximation
of Throughput. But for less repeatable SUTs, forwarding rate (TODO define)
is frequently a bad approximation to Throughput, therefore halving
and other robust-to-worst-case approaches have to be used.
Still, forwarding rate at FRMOL load can be a good initial bound.</t>

</section>
<section anchor="non-zero-loss-ratios"><name>Non-zero loss ratios</name>

<t>See the &quot;Popularity of non-zero target loss ratios&quot; section above.</t>

<t>TODO: Define &quot;trial measurement result classification criteria&quot;,
or keep reusing long phrases without definitions?</t>

<t>A search for a load corresponding to a non-zero target loss rate
is very similar to a search for Throughput,
just the criterion when to increase or decrease the intended load
for the next trial measurement uses the comparison of trial loss ratio
to the target loss ratio (instead of comparing loss count to zero)
Any search algorithm that works for Throughput can be easily used also for
non-zero target loss rates, perhaps with small modifications
in places where the measured forwarding rate is used.</t>

<t>Note that it is possible to search for multiple loss ratio goals if needed.</t>

</section>
<section anchor="concurrent-ratio-search"><name>Concurrent ratio search</name>

<t>A single trial measurement result can act as an upper bound for a lower
target loss ratio, and as a lower bound for a higher target loss ratio
at the same time. This is an example of how
it can be advantageous to search for all loss ratio goals &quot;at once&quot;,
or at least &quot;reuse&quot; trial measurement result done so far.</t>

<t>Even when a search algorithm is fully deterministic in load selection
while focusing on a single loss ratio and trial duration,
the choice of iteration order between target loss ratios and trial durations
can affect the obtained results in subtle ways.
MLRsearch offers one particular ordering.</t>


</section>
<section anchor="load-selection-heuristics-and-shortcuts"><name>Load selection heuristics and shortcuts</name>

<t>Aside of the two heuristics already mentioned (FRMOL based initial bounds
and saving one halving when increasing trial duration),
there are other tricks that can save some overall search time
at the cost of keeping the difference between final lower and upper bound
intentionally large (but still within the precision goal).</t>

<t>TODO: Refer implementation subsections on:
* Uneven splits.
* Rounding the interval width up.
* Using old invalid bounds for interval width guessing.</t>

<t>The impact on overall duration is probably small,
and the effect on result distribution maybe even smaller.
TODO: Is the two-liner above useful at all?</t>

</section>
</section>
<section anchor="non-compliance-with-rfc2544"><name>Non-compliance with RFC2544</name>

<t>It is possible to achieve even faster search times by abandoning
some requirements and suggestions of RFC2544,
mainly by reducing the wait times at start and end of trial.</t>

<t>Such results are therefore no longer compliant with RFC2544
(or at least not unconditionally),
but they may still be useful for internal usage, or for comparing
results of different DUTs achieved with an identical non-compliant algorithm.</t>

<t>TODO: Refer to the subsection with CSIT customizations.</t>

</section>
<section anchor="additional-requirements"><name>Additional Requirements</name>

<t>RFC2544 can be understood as having a number of implicit requirements.
They are made explicit in this section
(as requirements for this document, not for RFC2544).</t>

<t>Recommendations on how to properly address the implicit requirements
are out of scope of this document.</t>


<section anchor="todo-search-stop-criteria"><name>TODO: Search Stop Criteria</name>

<t>TODO: Mention the timeout parameter?</t>


</section>
<section anchor="reliability-of-test-equipment"><name>Reliability of Test Equipment</name>

<t>Both TG and TA MUST be able to handle correctly
every intended load used during the search.</t>

<t>On TG side, the difference between Intended Load and Offered Load
MUST be small.</t>

<t>TODO: How small? Difference of one packet may not be measurable
due to time uncertainties.</t>


<t>TODO expand: time uncertainty.</t>

<t>To ensure that, max load (see Terminology) has to be set to low enough value.
Benchmark groups MAY list the max load value used,
especially if the Throughput value is equal (or close) to the max load.</t>


<t>Solutions (even problem formulations) for the following open problems
are outside of the scope of this document:
* Detecting when the test equipment operates above its safe load.
* Finding a large but safe load value.
* Correcting any result affected by max load value not being a safe load.</t>



<section anchor="very-late-frames"><name>Very late frames</name>


<t>RFC2544 requires quite conservative time delays
see https://datatracker.ietf.org/doc/html/rfc2544#section-23
to prevent frames buffered in one trial measurement
to be counted as received in a subsequent trial measurement.</t>

<t>However, for some SUTs it may still be possible to buffer enough frames,
so they are still sending them (perhaps in bursts)
when the next trial measurement starts.
Sometimes, this can be detected as a negative trial loss count, e.g. TA receiving
more frames than TG has sent during this trial measurement. Frame duplication
is another way of causing the negative trial loss count.</t>

<t>https://datatracker.ietf.org/doc/html/rfc2544#section-10
recommends to use sequence numbers in frame payloads,
but generating and verifying them requires test equipment resources,
which may be not plenty enough to suport at high loads.
(Using low enough max load would work, but frequently that would be
smaller than SUT&#39;s sctual Throughput.)</t>

<t>RFC2544 does not offer any solution to the negative loss problem,
except implicitly treating negative trial loss counts
the same way as positive trial loss counts.</t>

<t>This document also does not offer any practical solution.</t>

<t>Instead, this document SUGGESTS the search algorithm to take any precaution
necessary to avoid very late frames.</t>

<t>This document also REQUIRES any detected duplicate frames to be counted
as additional lost frames.
This document also REQUIRES, any negative trial loss ratio
to be treated as positive trial loss ratio of the same absolute value.</t>


<t>!!! Nothing below is up-to-date with draft v02. !!!</t>

</section>
</section>
</section>
<section anchor="mlrsearch-background"><name>MLRsearch Background</name>

<t>TODO: Old section, probably obsoleted by preceding section(s).</t>

<t>Multiple Loss Ratio search (MLRsearch) is a packet throughput search
algorithm suitable for deterministic systems (as opposed to
probabilistic systems). MLRsearch discovers multiple packet throughput
rates in a single search, each rate is associated with a distinct
Packet Loss Ratio (PLR) criterion.</t>

<t>For cases when multiple rates need to be found, this property makes
MLRsearch more efficient in terms of time execution, compared to
traditional throughput search algorithms that discover a single packet
rate per defined search criteria (e.g. a binary search specified by
<xref target="RFC2544"></xref>). MLRsearch reduces execution time even further by relying on
shorter trial durations of intermediate steps, with only the final
measurements conducted at the specified final trial duration. This
results in the shorter overall search execution time when compared to a
traditional binary search, while guaranteeing the same results for
deterministic systems.</t>

<t>In practice, two rates with distinct PLRs are commonly used for packet
throughput measurements of NFV systems: Non Drop Rate (NDR) with PLR=0
and Partial Drop Rate (PDR) with PLR&gt;0. The rest of this document
describes MLRsearch with NDR and PDR pair as an example.</t>

<t>Similarly to other throughput search approaches like binary search,
MLRsearch is effective for SUTs/DUTs with PLR curve that is
non-decreasing with growing offered load. It may not be as
effective for SUTs/DUTs with abnormal PLR curves, although
it will always converge to some value.</t>

<t>MLRsearch relies on traffic generator to qualify the received packet
stream as error-free, and invalidate the results if any disqualifying
errors are present e.g. out-of-sequence frames.</t>

<t>MLRsearch can be applied to both uni-directional and bi-directional
throughput tests.</t>

<t>For bi-directional tests, MLRsearch rates and ratios are aggregates of
both directions, based on the following assumptions:</t>

<t><list style="symbols">
  <t>Traffic transmitted by traffic generator and received by SUT/DUT
has the same packet rate in each direction,
in other words the offered load is symmetric.</t>
  <t>SUT/DUT packet processing capacity is the same in both directions,
resulting in the same packet loss under load.</t>
</list></t>

<t>MLRsearch can be applied even without those assumptions,
but in that case the aggregate loss ratio is less useful as a metric.</t>

<t>MLRsearch can be used for network transactions consisting of more than
just one packet, or anything else that has intended load as input
and loss ratio as output (duration as input is optional).
This text uses mostly packet-centric language.</t>

</section>
<section anchor="mlrsearch-overview"><name>MLRsearch Overview</name>

<t>The main properties of MLRsearch:</t>

<t><list style="symbols">
  <t>MLRsearch is a duration aware multi-phase multi-rate search algorithm:
  <list style="symbols">
      <t>Initial Phase determines promising starting interval for the search.</t>
      <t>Intermediate Phases progress towards defined final search criteria.</t>
      <t>Final Phase executes measurements according to the final search
criteria.</t>
      <t>Final search criteria are defined by following inputs:
      <list style="symbols">
          <t>Target PLRs (e.g. 0.0 and 0.005 when searching for NDR and PDR).</t>
          <t>Final trial duration.</t>
          <t>Measurement resolution.</t>
        </list></t>
    </list></t>
  <t>Initial Phase:
  <list style="symbols">
      <t>Measure MRR over initial trial duration.</t>
      <t>Measured MRR is used as an input to the first intermediate phase.</t>
    </list></t>
  <t>Multiple Intermediate Phases:
  <list style="symbols">
      <t>Trial duration:
      <list style="symbols">
          <t>Start with initial trial duration in the first intermediate phase.</t>
          <t>Converge geometrically towards the final trial duration.</t>
        </list></t>
      <t>Track all previous trial measurement results:
      <list style="symbols">
          <t>Duration, offered load and loss ratio are tracked.</t>
          <t>Effective loss ratios are tracked.
          <list style="symbols">
              <t>While in practice, real loss ratios can decrease with increasing load,
effective loss ratios never decrease. This is achieved by sorting
results by load, and using the effective loss ratio of the previous load
if the current loss ratio is smaller than that.</t>
            </list></t>
          <t>The algorithm queries the results to find best lower and upper bounds.
          <list style="symbols">
              <t>Effective loss ratios are always used.</t>
            </list></t>
          <t>The phase ends if all target loss ratios have tight enough bounds.</t>
        </list></t>
      <t>Search:
      <list style="symbols">
          <t>Iterate over target loss ratios in increasing order.</t>
          <t>If both upper and lower bound are in measurement results for this duration,
apply bisect until the bounds are tight enough,
and continue with next loss ratio.</t>
          <t>If a bound is missing for this duration, but there exists a bound
from the previous duration (compatible with the other bound
at this duration), re-measure at the current duration.</t>
          <t>If a bound in one direction (upper or lower) is missing for this duration,
and the previous duration does not have a compatible bound,
compute the current &quot;interval size&quot; from the second tightest bound
in the other direction (lower or upper respectively)
for the current duration, and choose next offered load for external search.</t>
          <t>The logic guarantees that a measurement is never repeated with both
duration and offered load being the same.</t>
          <t>The logic guarantees that measurements for higher target loss ratio
iterations (still within the same phase duration) do not affect validity
and tightness of bounds for previous target loss ratio iterations
(at the same duration).</t>
        </list></t>
      <t>Use of internal and external searches:
      <list style="symbols">
          <t>External search:
          <list style="symbols">
              <t>It is a variant of &quot;exponential search&quot;.</t>
              <t>The &quot;interval size&quot; is multiplied by a configurable constant
(powers of two work well with the subsequent internal search).</t>
            </list></t>
          <t>Internal search:
          <list style="symbols">
              <t>A variant of binary search that measures at offered load between
the previously found bounds.</t>
              <t>The interval does not need to be split into exact halves,
if other split can get to the target width goal faster.
              <list style="symbols">
                  <t>The idea is to avoid returning interval narrower than the current
width goal. See sample implementation details, below.</t>
                </list></t>
            </list></t>
        </list></t>
    </list></t>
  <t>Final Phase:
  <list style="symbols">
      <t>Executed with the final test trial duration, and the final width
goal that determines resolution of the overall search.</t>
    </list></t>
  <t>Intermediate Phases together with the Final Phase are called
Non-Initial Phases.</t>
  <t>The returned bounds stay within prescribed min_rate and max_rate.
  <list style="symbols">
      <t>When returning min_rate or max_rate, the returned bounds may be invalid.
      <list style="symbols">
          <t>E.g. upper bound at max_rate may come from a measurement
with loss ratio still not higher than the target loss ratio.</t>
        </list></t>
    </list></t>
</list></t>

<t>The main benefits of MLRsearch vs. binary search include:</t>

<t><list style="symbols">
  <t>In general, MLRsearch is likely to execute more trials overall, but
likely less trials at a set final trial duration.</t>
  <t>In well behaving cases, e.g. when results do not depend on trial
duration, it greatly reduces (&gt;50%) the overall duration compared to a
single PDR (or NDR) binary search over duration, while finding
multiple drop rates.</t>
  <t>In all cases MLRsearch yields the same or similar results to binary
search.</t>
  <t>Note: both binary search and MLRsearch are susceptible to reporting
non-repeatable results across multiple runs for very bad behaving
cases.</t>
</list></t>

<t>Caveats:</t>

<t><list style="symbols">
  <t>Worst case MLRsearch can take longer than a binary search, e.g. in case of
drastic changes in behaviour for trials at varying durations.
  <list style="symbols">
      <t>Re-measurement at higher duration can trigger a long external search.
That never happens in binary search, which uses the final duration
from the start.</t>
    </list></t>
</list></t>

</section>
<section anchor="sample-implementation"><name>Sample Implementation</name>

<t>Following is a brief description of a sample MLRsearch implementation,
which is a simplified version of the existing implementation.</t>

<section anchor="input-parameters"><name>Input Parameters</name>

<t><list style="numbers">
  <t><strong>max_rate</strong> - Maximum Transmit Rate (MTR) of packets to
be used by external traffic generator implementing MLRsearch,
limited by the actual Ethernet link(s) rate, NIC model or traffic
generator capabilities.</t>
  <t><strong>min_rate</strong> - minimum packet transmit rate to be used for
measurements. MLRsearch fails if lower transmit rate needs to be
used to meet search criteria.</t>
  <t><strong>final_trial_duration</strong> - required trial duration for final rate
measurements.</t>
  <t><strong>initial_trial_duration</strong> - trial duration for initial MLRsearch phase.</t>
  <t><strong>final_relative_width</strong> - required measurement resolution expressed as
(lower_bound, upper_bound) interval width relative to upper_bound.</t>
  <t><strong>packet_loss_ratios</strong> - list of maximum acceptable PLR search criteria.</t>
  <t><strong>number_of_intermediate_phases</strong> - number of phases between the initial
phase and the final phase. Impacts the overall MLRsearch duration.
Less phases are required for well behaving cases, more phases
may be needed to reduce the overall search duration for worse behaving cases.</t>
</list></t>

</section>
<section anchor="initial-phase"><name>Initial Phase</name>

<t><list style="numbers">
  <t>First trial measures at configured maximum transmit rate (MTR) and
discovers maximum receive rate (MRR).
  <list style="symbols">
      <t>IN: trial_duration = initial_trial_duration.</t>
      <t>IN: offered_transmit_rate = maximum_transmit_rate.</t>
      <t>DO: single trial.</t>
      <t>OUT: measured loss ratio.</t>
      <t>OUT: MRR = measured receive rate.
Received rate is computed as intended load multiplied by pass ratio
(which is one minus loss ratio). This is useful when loss ratio is computed
from a different metric than intended load. For example, intended load
can be in transactions (multiple packets each), but loss ratio is computed
on level of packets, not transactions.</t>
      <t>Example: If MTR is 10 transactions per second, and each transaction has
10 packets, and receive rate is 90 packets per second, then loss rate
is 10%, and MRR is computed to be 9 transactions per second.</t>
    </list>
If MRR is too close to MTR, MRR is set below MTR so that interval width
is equal to the width goal of the first intermediate phase.
If MRR is less than min_rate, min_rate is used.</t>
  <t>Second trial measures at MRR and discovers MRR2.
  <list style="symbols">
      <t>IN: trial_duration = initial_trial_duration.</t>
      <t>IN: offered_transmit_rate = MRR.</t>
      <t>DO: single trial.</t>
      <t>OUT: measured loss ratio.</t>
      <t>OUT: MRR2 = measured receive rate.
If MRR2 is less than min_rate, min_rate is used.
If loss ratio is less or equal to the smallest target loss ratio,
MRR2 is set to a value above MRR, so that interval width is equal
to the width goal of the first intermediate phase.
MRR2 could end up being equal to MTR (for example if both measurements so far
had zero loss), which was already measured, step 3 is skipped in that case.</t>
    </list></t>
  <t>Third trial measures at MRR2.
  <list style="symbols">
      <t>IN: trial_duration = initial_trial_duration.</t>
      <t>IN: offered_transmit_rate = MRR2.</t>
      <t>DO: single trial.</t>
      <t>OUT: measured loss ratio.</t>
      <t>OUT: MRR3 = measured receive rate.
If MRR3 is less than min_rate, min_rate is used.
If step 3 is not skipped, the first trial measurement is forgotten.
This is done because in practice (if MRR2 is above MRR), external search
from MRR and MRR2 is likely to lead to a faster intermediate phase
than a bisect between MRR2 and MTR.</t>
    </list></t>
</list></t>

</section>
<section anchor="non-initial-phases"><name>Non-Initial Phases</name>

<t><list style="numbers">
  <t>Main phase loop:
  <list style="numbers">
      <t>IN: trial_duration for the current phase. Set to
initial_trial_duration for the first intermediate phase; to
final_trial_duration for the final phase; or to the element of
interpolating geometric sequence for other intermediate phases.
For example with two intermediate phases, trial_duration of the
second intermediate phase is the geometric average of
initial_trial_duration and final_trial_duration.</t>
      <t>IN: relative_width_goal for the current phase. Set to
final_relative_width for the final phase; doubled for each
preceding phase. For example with two intermediate phases, the
first intermediate phase uses quadruple of final_relative_width
and the second intermediate phase uses double of
final_relative_width.</t>
      <t>IN: Measurement results from the previous phase (previous duration).</t>
      <t>Internal target ratio loop:
      <list style="numbers">
          <t>IN: Target loss ratio for this iteration of ratio loop.</t>
          <t>IN: Measurement results from all previous ratio loop iterations
of current phase (current duration).</t>
          <t>DO: According to the procedure described in point 2:
          <list style="numbers">
              <t>either exit the phase (by jumping to 1.5),</t>
              <t>or exit loop iteration (by continuing with next target loss ratio,
jumping to 1.4.1),</t>
              <t>or calculate new transmit rate to measure with.</t>
            </list></t>
          <t>DO: Perform the trial measurement at the new transmit rate and
current trial duration, compute its loss ratio.</t>
          <t>DO: Add the result and go to next iteration (1.4.1),
including the added trial result in 1.4.2.</t>
        </list></t>
      <t>OUT: Measurement results from this phase.</t>
      <t>OUT: In the final phase, bounds for each target loss ratio
are extracted and returned.
      <list style="numbers">
          <t>If a valid bound does not exist, use min_rate or max_rate.</t>
        </list></t>
    </list></t>
  <t>New transmit rate (or exit) calculation (for point 1.4.3):
  <list style="numbers">
      <t>If the previous duration has the best upper and lower bound,
select the middle point as the new transmit rate.
      <list style="numbers">
          <t>See 2.5.3. below for the exact splitting logic.</t>
          <t>This can be a no-op if interval is narrow enough already,
in that case continue with 2.2.</t>
          <t>Discussion, assuming the middle point is selected and measured:
          <list style="numbers">
              <t>Regardless of loss rate measured, the result becomes
either best upper or best lower bound at current duration.</t>
              <t>So this condition is satisfied at most once per iteration.</t>
              <t>This also explains why previous phase has double width goal:
              <list style="numbers">
                  <t>We avoid one more bisection at previous phase.</t>
                  <t>At most one bound (per iteration) is re-measured
with current duration.</t>
                  <t>Each re-measurement can trigger an external search.</t>
                  <t>Such surprising external searches are the main hurdle
in achieving low overall search durations.</t>
                  <t>Even without 1.1, there is at most one external search
per phase and target loss ratio.</t>
                  <t>But without 1.1 there can be two re-measurements,
each coming with a risk of triggering external search.</t>
                </list></t>
            </list></t>
        </list></t>
      <t>If the previous duration has one bound best, select its transmit rate.
In deterministic case this is the last measurement needed this iteration.</t>
      <t>If only upper bound exists in current duration results:
      <list style="numbers">
          <t>This can only happen for the smallest target loss ratio.</t>
          <t>If the upper bound was measured at min_rate,
exit the whole phase early (not investigating other target loss ratios).</t>
          <t>Select new transmit rate using external search:
          <list style="numbers">
              <t>For computing previous interval size, use:
              <list style="numbers">
                  <t>second tightest bound at current duration,</t>
                  <t>or tightest bound of previous duration,
if compatible and giving a more narrow interval,</t>
                  <t>or target interval width if none of the above is available.</t>
                  <t>In any case increase to target interval width if smaller.</t>
                </list></t>
              <t>Quadruple the interval width.</t>
              <t>Use min_rate if the new transmit rate is lower.</t>
            </list></t>
        </list></t>
      <t>If only lower bound exists in current duration results:
      <list style="numbers">
          <t>If the lower bound was measured at max_rate,
exit this iteration (continue with next lowest target loss ratio).</t>
          <t>Select new transmit rate using external search:
          <list style="numbers">
              <t>For computing previous interval size, use:
              <list style="numbers">
                  <t>second tightest bound at current duration,</t>
                  <t>or tightest bound of previous duration,
if compatible and giving a more narrow interval,</t>
                  <t>or target interval width if none of the above is available.</t>
                  <t>In any case increase to target interval width if smaller.</t>
                </list></t>
              <t>Quadruple the interval width.</t>
              <t>Use max_rate if the new transmit rate is higher.</t>
            </list></t>
        </list></t>
      <t>The only remaining option is both bounds in current duration results.
      <list style="numbers">
          <t>This can happen in two ways, depending on how the lower bound
was chosen.
          <list style="numbers">
              <t>It could have been selected for the current loss ratio,
e.g. in re-measurement (2.2) or in initial bisect (2.1).</t>
              <t>It could have been found as an upper bound for the previous smaller
target loss ratio, in which case it might be too low.</t>
              <t>The algorithm does not track which one is the case,
as the decision logic works well regardless.</t>
            </list></t>
          <t>Compute &quot;extending down&quot; candidate transmit rate exactly as in 2.3.</t>
          <t>Compute &quot;bisecting&quot; candidate transmit rate:
          <list style="numbers">
              <t>Compute the current interval width from the two bounds.</t>
              <t>Express the width as a (float) multiple of the target width goal
for this phase.</t>
              <t>If the multiple is not higher than one, it means the width goal
is met. Exit this iteration and continue with next higher
target loss ratio.</t>
              <t>If the multiple is two or less, use half of that
for new width if the lower subinterval.</t>
              <t>Round the multiple up to nearest even integer.</t>
              <t>Use half of that for new width if the lower subinterval.</t>
              <t>Example: If lower bound is 2.0 and upper bound is 5.0, and width
goal is 1.0, the new candidate transmit rate will be 4.0.
This can save a measurement when 4.0 has small loss.
Selecting the average (3.5) would never save a measurement,
giving more narrow bounds instead.</t>
            </list></t>
          <t>If either candidate computation want to exit the iteration,
do as bisecting candidate computation says.</t>
          <t>The remaining case is both candidates wanting to measure at some rate.
Use the higher rate. This prefers external search down narrow enough
interval, competing with perfectly sized lower bisect subinterval.</t>
        </list></t>
    </list></t>
</list></t>

</section>
</section>
<section anchor="fdio-csit-implementation"><name>FD.io CSIT Implementation</name>

<t>The only known working implementation of MLRsearch is in
the open-source code running in Linux Foundation
FD.io CSIT project <xref target="FDio-CSIT-MLRsearch"></xref> as part of
a Continuous Integration / Continuous Development (CI/CD) framework.</t>

<t>MLRsearch is also available as a Python package in <xref target="PyPI-MLRsearch"></xref>.</t>

<section anchor="additional-details"><name>Additional details</name>

<t>This document so far has been describing a simplified version of
MLRsearch algorithm. The full algorithm as implemented in CSIT contains
additional logic, which makes some of the details (but not general
ideas) above incorrect. Here is a short description of the additional
logic as a list of principles, explaining their main differences from
(or additions to) the simplified description, but without detailing
their mutual interaction.</t>

<t><list style="numbers">
  <t>Logarithmic transmit rate.
  <list style="symbols">
      <t>In order to better fit the relative width goal, the interval
doubling and halving is done differently.</t>
      <t>For example, the middle of 2 and 8 is 4, not 5.</t>
    </list></t>
  <t>Timeout for bad cases.
  <list style="symbols">
      <t>The worst case for MLRsearch is when each phase converges to
intervals way different than the results of the previous phase.</t>
      <t>Rather than suffer total search time several times larger than pure
binary search, the implemented tests fail themselves when the
search takes too long (given by argument <em>timeout</em>).</t>
    </list></t>
  <t>Intended count.
  <list style="symbols">
      <t>The number of packets to send during the trial should be equal to
the intended load multiplied by the duration.
      <list style="symbols">
          <t>Also multiplied by a coefficient, if loss ratio is calculated
from a different metric.
          <list style="symbols">
              <t>Example: If a successful transaction uses 10 packets,
load is given in transactions per second, but loss ratio is calculated
from packets, so the coefficient to get intended count of packets
is 10.</t>
            </list></t>
        </list></t>
      <t>But in practice that does not work.
      <list style="symbols">
          <t>It could result in a fractional number of packets,</t>
          <t>so it has to be rounded in a way traffic generator chooses,</t>
          <t>which may depend on the number of traffic flows
and traffic generator worker threads.</t>
        </list></t>
    </list></t>
  <t>Attempted count. As the real number of intended packets is not known exactly,
the computation uses the number of packets traffic generator reports as sent.
Unless overridden by the next point.</t>
  <t>Duration stretching.
  <list style="symbols">
      <t>In some cases, traffic generator may get overloaded,
causing it to take significantly longer (than duration) to send all packets.</t>
      <t>The implementation uses an explicit stop,
      <list style="symbols">
          <t>causing lower attempted count in those cases.</t>
        </list></t>
      <t>The implementation tolerates some small difference between
attempted count and intended count.
      <list style="symbols">
          <t>10 microseconds worth of traffic is sufficient for our tests.</t>
        </list></t>
      <t>If the difference is higher, the unsent packets are counted as lost.
      <list style="symbols">
          <t>This forces the search to avoid the regions of high duration stretching.</t>
          <t>The final bounds describe the performance of not just SUT,
but of the whole system, including the traffic generator.</t>
        </list></t>
    </list></t>
  <t>Excess packets.
  <list style="symbols">
      <t>In some test (e.g. using TCP flows) Traffic generator reacts to packet loss
by retransmission. Usually, such packet loss is already affecting loss ratio.
If a test also wants to treat retransmissions due to heavily delayed packets
also as a failure, this is once again visible as a mismatch between
the intended count and the attempted count.</t>
      <t>The CSIT implementation simply looks at absolute value of the difference,
so it offers the same small tolerance before it starts marking a &quot;loss&quot;.</t>
    </list></t>
  <t>For result processing, we use lower bounds and ignore upper bounds.</t>
</list></t>

<section anchor="fdio-csit-input-parameters"><name>FD.io CSIT Input Parameters</name>

<t><list style="numbers">
  <t><strong>max_rate</strong> - Typical values: 2 * 14.88 Mpps for 64B
10GE link rate, 2 * 18.75 Mpps for 64B 40GE NIC (specific model).</t>
  <t><strong>min_rate</strong> - Value: 2 * 9001 pps (we reserve 9000 pps
for latency measurements).</t>
  <t><strong>final_trial_duration</strong> - Value: 30.0 seconds.</t>
  <t><strong>initial_trial_duration</strong> - Value: 1.0 second.</t>
  <t><strong>final_relative_width</strong> - Value: 0.005 (0.5%).</t>
  <t><strong>packet_loss_ratios</strong> - Value: 0.0, 0.005 (0.0% for NDR, 0.5% for PDR).</t>
  <t><strong>number_of_intermediate_phases</strong> - Value: 2.
The value has been chosen based on limited experimentation to date.
More experimentation needed to arrive to clearer guidelines.</t>
  <t><strong>timeout</strong> - Limit for the overall search duration (for one search).
If MLRsearch oversteps this limit, it immediately declares the test failed,
to avoid wasting even more time on a misbehaving SUT.
Value: 600.0 (seconds).</t>
  <t><strong>expansion_coefficient</strong> - Width multiplier for external search.
Value: 4.0 (interval width is quadroupled).
Value of 2.0 is best for well-behaved SUTs, but value of 4.0 has been found
to decrease overall search time for worse-behaved SUT configurations,
contributing more to the overall set of different SUT configurations tested.</t>
</list></t>

</section>
</section>
<section anchor="example-mlrsearch-run"><name>Example MLRsearch Run</name>

<t>The following list describes a search from a real test run in CSIT
(using the default input values as above).</t>

<t><list style="symbols">
  <t>Initial phase, trial duration 1.0 second.</t>
</list></t>

<t>Measurement 1, intended load 18750000.0 pps (MTR),
measured loss ratio 0.7089514628479618 (valid upper bound for both NDR and PDR).</t>

<t>Measurement 2, intended load 5457160.071600716 pps (MRR),
measured loss ratio 0.018650817320118702 (new tightest upper bounds).</t>

<t>Measurement 3, intended load 5348832.933500009 pps (slightly less than MRR2
in preparation for first intermediate phase target interval width),
measured loss ratio 0.00964383362905351 (new tightest upper bounds).</t>

<t><list style="symbols">
  <t>First intermediate phase starts, trial duration still 1.0 seconds.</t>
</list></t>

<t>Measurement 4, intended load 4936605.579021453 pps (no lower bound,
performing external search downwards, for NDR),
measured loss ratio 0.0 (valid lower bound for both NDR and PDR).</t>

<t>Measurement 5, intended load 5138587.208637197 pps (bisecting for NDR),
measured loss ratio 0.0 (new tightest lower bounds).</t>

<t>Measurement 6, intended load 5242656.244044665 pps (bisecting),
measured loss ratio 0.013523745379347257 (new tightest upper bounds).</t>

<t><list style="symbols">
  <t>Both intervals are narrow enough.</t>
  <t>Second intermediate phase starts, trial duration 5.477225575051661 seconds.</t>
</list></t>

<t>Measurement 7, intended load 5190360.904111567 pps (initial bisect for NDR),
measured loss ratio 0.0023533920869969953 (NDR upper bound, PDR lower bound).</t>

<t>Measurement 8, intended load 5138587.208637197 pps (re-measuring NDR lower bound),
measured loss ratio 1.2080222912800403e-06 (new tightest NDR upper bound).</t>

<t><list style="symbols">
  <t>The two intervals have separate bounds from now on.</t>
</list></t>

<t>Measurement 9, intended load 4936605.381062318 pps (external NDR search down),
measured loss ratio 0.0 (new valid NDR lower bound).</t>

<t>Measurement 10, intended load 5036583.888432355 pps (NDR bisect),
measured loss ratio 0.0 (new tightest NDR lower bound).</t>

<t>Measurement 11, intended load 5087329.903232804 pps (NDR bisect),
measured loss ratio 0.0 (new tightest NDR lower bound).</t>

<t><list style="symbols">
  <t>NDR interval is narrow enough, PDR interval not ready yet.</t>
</list></t>

<t>Measurement 12, intended load 5242656.244044665 pps (re-measuring PDR upper bound),
measured loss ratio 0.0101174866190136 (still valid PDR upper bound).</t>

<t><list style="symbols">
  <t>Also PDR interval is narrow enough, with valid bounds for this duration.</t>
  <t>Final phase starts, trial duration 30.0 seconds.</t>
</list></t>

<t>Measurement 13, intended load 5112894.3238511775 pps (initial bisect for NDR),
measured loss ratio 0.0 (new tightest NDR lower bound).</t>

<t>Measurement 14, intended load 5138587.208637197 (re-measuring NDR upper bound),
measured loss ratio 2.030389804256833e-06 (still valid PDR upper bound).</t>

<t><list style="symbols">
  <t>NDR interval is narrow enough, PDR interval not yet.</t>
</list></t>

<t>Measurement 15, intended load 5216443.04126728 pps (initial bisect for PDR),
measured loss ratio 0.005620871287975237 (new tightest PDR upper bound).</t>

<t>Measurement 16, intended load 5190360.904111567 (re-measuring PDR lower bound),
measured loss ratio 0.0027629971184465604 (still valid PDR lower bound).</t>

<t><list style="symbols">
  <t>PDR interval is also narrow enough.</t>
  <t>Returning bounds:</t>
  <t>NDR_LOWER = 5112894.3238511775 pps; NDR_UPPER = 5138587.208637197 pps;</t>
  <t>PDR_LOWER = 5190360.904111567 pps; PDR_UPPER = 5216443.04126728 pps.</t>
</list></t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>No requests of IANA.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>Benchmarking activities as described in this memo are limited to
technology characterization of a DUT/SUT using controlled stimuli in a
laboratory environment, with dedicated address space and the constraints
specified in the sections above.</t>

<t>The benchmarking network topology will be an independent test setup and
MUST NOT be connected to devices that may forward the test traffic into
a production network or misroute traffic to the test management network.</t>

<t>Further, benchmarking is performed on a &quot;black-box&quot; basis, relying
solely on measurements observable external to the DUT/SUT.</t>

<t>Special capabilities SHOULD NOT exist in the DUT/SUT specifically for
benchmarking purposes. Any implications for network security arising
from the DUT/SUT SHOULD be identical in the lab and in production
networks.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Many thanks to Alec Hothan of OPNFV NFVbench project for thorough
review and numerous useful comments and suggestions.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>

&RFC2544;


    </references>

    <references title='Informative References'>

<reference anchor="FDio-CSIT-MLRsearch" target="https://s3-docs.fd.io/csit/rls2110/report/introduction/methodology_data_plane_throughput/methodology_data_plane_throughput.html#mlrsearch-tests">
  <front>
    <title>FD.io CSIT Test Methodology - MLRsearch</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="November"/>
  </front>
</reference>
<reference anchor="PyPI-MLRsearch" target="https://pypi.org/project/MLRsearch/0.4.0/">
  <front>
    <title>MLRsearch 0.4.0, Python Package Index</title>
    <author >
      <organization></organization>
    </author>
    <date year="2021" month="April"/>
  </front>
</reference>


    </references>



  </back>

<!-- ##markdown-source:
H4sIAPdZJmIAA+19aZPbSJbYd/wKTHWMl9SSrCrWXRO9slpHj2xdW1XqjvXG
WgGSIAsjEOAAYJU4Dvu3+92ZCYCSumf2k90x0y0RQB4vX777GI/HUZM1eXod
v93mTbbJ0/hNWdfxTdJkZXybJtX8Pl6WVfwhmX9Om/juviq3q/vNtokHb9/c
1PTCMEpmsyp9+Nog0aKcF8kaJlpUybIZZ2mzHM/Wj6vxOq94mPHRNFokDbwy
PZpOx0cn46OLKMo21XXcVNu6mR4dXcErSZUm13G5qaPH1XX8U1rM79dJ9Tkr
VvGvJf/3Z1jkJvr8eB2/Lpq0KtJm/AJnjeZJcx1nxbKMonm5gFev4209Tup5
lkWb7DqGf36I50kBv6ZxUlXJLh5kyzjJ83iX1sMYAHGf1PfxfVqlURw35fwa
H8Af67JqqnRZX9MQi3SZAChqeEOf79b8GP8aJdvmvqyuo5j+Gct/Y1gavPF2
Ev/3sqibpGh2RfmYzf9mzxmCb5N5ln7e+1JZwbaeZ/UcYL+rm3Rd26OqxKNO
F1lTVvZjuk6y/Dpef+bx/uscP53My3X/8n6ZxB/KPPncWtQvVdJ8LluPvrIU
mfWh2uAX3qRRUVZrwJyHFOFz8+r59Oz09BoQAY7Ne/DqRVaOn9++vhsbHjI8
m6RapXDM902zqa8PD+uTMeBePVkuJll5OK+z5rDK6+nx8dFhlW7g2A6zoqnK
xXYO2FocrlM4mkWZl6vdJ8DG5NMmT4r0U2OI/+03JvfNOv/B4XWT1g1vXO7a
wasXsJYYVx/fwcP4rRsyHse2oQP6yO7E8fj4GH75sPvw+lub3uw22QSgf7ip
yr+k8+bQ3j88mpxOjg6D5djDmB6OYApYT0GXPlmlcIsW6ZfOYo5Oo2g8HsfJ
rG6qZN5E0d37F++v448bfCmG+5ZWdHXqlEBbw41KY7i9i90E3r3P6hgOZrtO
iyaGZW7KOq3j+X1SrFK6OP8uZ/8fo7jepPNsmc1htB0+2hA1ihzIY1m/dzaj
eLbDi5gVSBKSuEgf9a0kX5VV1tyvI7iTaVWlCxw0qXvpl3zjyB3RwxrubzOc
AGgArZNFVC5hZ/kOpwLAzbIiqXb66SNMBTtMxzVQULhiVUOvLWFqmDkvk8Uo
zprIYABrLR/SPE428FMCAyzwcjykFX7W3KdujE0JuAvXkn6FjTZZkkcbIFHp
KE6KBf5cyCrwdVw4gy72QDeD1xe4agIW/FGgmyMMKoLB4MObmyFMgK/PAXKw
lIQm0E/g30kOZBrmjxdb+ggWla3TSfS+SGGvtMLPKZ5Ina0KAEdWzBHUdTxL
YXELh/UxIMYaNrPO/iYbjpqyweHxqtjoOH24tbWeXneP8A3Q3UGa6HEk8byE
g683ZYF8IKYNzstivoVfiyYH9Mn4aHHxixLfgTOq079u4XGGiEhInMZAx4p4
XQJd4nX1bQc3z/jX4HCA5HmeEp7DLgAJ/7rNqhQvQh0jCiwQdd+9+iUevEub
R2Bq8attQXco/iWrmm2SZ3+jyYajKLgadblsHvGW8Zlma4AGDpvw/YOpcVQk
WjERrXoSf6xha5HdNUWm9MsGDhmYqx0e86w63mVpvsCxGsCtogTYppsUKAnQ
5QjPRH7KYUkzOIsUfgI4EzdcbFO6aHGO5CoutusZkAgYfwnkA8du7pMGqURU
bglQgPablM62IXKBTHzigTbJ1kQqksUC5qj5LYMusAyYqyYoxI/Ay2FEoJKN
XSNgXLI2gFxZpBVQmhLOksgUbwrAFqFAMEsBCQpaPmAw3AH4AcfQnWZ51iBG
IEFcZ4tFnkbR/7q+BoaG8P/fRDuf1fFjSqLF5ypZL8rHAocDpIOr3cTLqlzH
KMnggxF9IG/TrmT9KurIwDWBG0aB5TxkdYYQh10DCi+IuDDEaDDjhw3cDqQm
y7x8RI57mByeTk+mJydXR/Ti62VcwtYqOLoVXG7EX1gF0ChdKUynS7r+5tDT
o8vLs6vLI4DGoUEj+gH4XgWXnCh1L+NYl3DZeR0B/9jSS4tJF7x4GZdlDlPT
Za2RqcwAB3cEoyJNFwCQAeCSEq00r9NHFOWGMBqO8CR+VSFO1NnfgMnhvxHk
cPovcR0gRsZvkl1ajadwWPheyXflES4vkot5vkVaIiJOUuziX948ewe8eVXH
g0XZHP91FON/ksWQqJeN+ur5LXArQPn0i4xhz2Qw4B7JGg8Xv8tQqB3zElbJ
Bi5EmtRbPG44+tkOKB1sc96kTT2cyL5EfJeN4YfA7Za2WZgdQA0EtlrzYfMc
zIwRhDrOi/QhA5LwEdGLRZfBi493QxS0HfEpmGjBNkbxwYK+OACgwykgwZMd
Kd2KN1nKRMa+b5L6MyyB2SYvHI5yDhcchpzEt1tkiTSsjAVnDfsHYl8s9DvB
HB0SEAUoPV2YQY3fw/aBtCArAWDXJJvKYJ8R7jmy9gYHRtwBmsxXCzC/2hYy
eU0zIaVK8poeFMqvRPqlNbipmSffJ9XikSWhutxWOA7+rYbfkfAD7FIgrHge
k/iViembbcXCAVJjgDsBl5DvHmR6ZSw2NjHH7uYdvJBfwHQHvPV4SweKAx/E
g1s40QlSK/iDcq8NSBzKCWhKGYp4Msy+3cQATpLQhWc83mcAZ6Gda8VQYGyO
17C0Vo90rEAk3OJuaQWOD7tPAesmio1u8TIQ4aRODXKXCviIHCgRJSCs7Go6
LFy+sqct/QTrbtJZ+cU2OL8vMuD6NV/RcJFwEPPPxIJmOWAqfKanozeG9Z7g
xtzSjbltQ54fIMATH9yyDj5nD9zwA/AGH+hZLZxgpkox0Ekii4gBedr0HBrQ
9AYEmFqQFeeFjfaOnWb0SpKTCC9DwUhAH7L6HhkE0Fa8LglItnPjsjNfQ2dQ
K2x+ysYLoJ1E3VG+c/IaqUyoqj+U+YMKdPUhUSwgXErjC1kFU68qKep11hDy
w6gpSCSxjQ87fECeBv/a0fBK5ED2QHyVkeAIDgm3hGLiVIinVTbne2qYDNBx
o/PVZoyTkVi5hBeB1CSrVZWukLmhLEOr9RYGnx6iSpEC9OGdXGGL75LEanPa
R6h4MIucJ3hPZi1ImsYZiwQh0s6g3q15N0NSPIhjhMvRw/lY/KNOpyyAB6Pw
5IErm6QTxSg7ONhv59xGdG6KbftO7/vPzbjzQtRROSVSILpwDvmnZ/66IUV4
nXzJ1tu1silfp0MSdYj0C0YGMrzQ80CmIUK28ED4QMb31E5SufiYUZLgYyaJ
M7F7vAAhtUBZnIdz/Fz5JRNcWcgk/jPJ86LeKc0NdKT47cfbOyQhf92WjfJS
Y9XeBIDUclQ4hQymOwYdTW+/gBSJJbGzXkwdfX1NoGtv8wXT8u+8UxMZypeM
BE3HcHFBEwfCB9LgZsNWPUbd4NESHilnQgXtIcmR4gtOGQkDRHrMFjB5BzeS
mIdCSwB/hVx3vs0TwjcU97+6bWZHSIHhk+t49viJfv4x3nxu+I9PYJW48E90
JP8s47w5/oRX5j5FOfNJfInkHLDS/51AZuInS65p7aTMwaVeXRYj+8TOeHA8
1edfOVql0Aan33u6ivPujOOXXzYVYzmSsax1trONk39RwQCujRoVKgLMxWGa
jGS8bIE6/RzXXKrF0TvPpzL1O7hnL6pyQ+cLuvmLm2GbAhx+ZZ/bGjmtUSB3
MWNQeuG2I5bBEv6WVnD76d9CVdAQM3S3ENUvooDKJuxWDvAkvnqDN04P+H1X
WAgV7N1RSyP0fTcMLxfeJA8D8OPUOzoFyDcPMFuKGjeClcvFaEgqXyefUzzM
eZ4maCxAfFfRU61CbANyrNUeDIqyGCPAh7GzeRkJuYY9V2jx8c/+w286e1V5
FAN6zh6wPUG1twGVS1BAVxWgQVt7MmT4HWigY3WR4XvRAMAgg6y/QWh70ODD
70SD6/gGrba49Vc3b9+/UQXBaL6cyo2IEnxib2/wxDonRVcTKU21yNGCBKIE
HMfXDowFdse6dbo7lWJkvrubYXAtWChQCQEGBLFniYexSgtURMuq/9A82td/
jdHYeHfz7RMMTyo4RwDOd59gh6Djx+lvo8R/AcCCop1uhMkdsOXYW9qBEt07
fELMFF7MAzQE7SvdTOLbNPUUQzEWxdOTYEbRWsz2A8s015I3kZmXYcZ1uS1Y
CcvQ1oPaA+u0Ah2SH1V2deRYjI79iw2sYL4BK7COKZ6T6sYGabjlX0Qn9gQN
toymTDA8ez2iGm7/NYuM82SToQH9TsjnIYyz3OZPYaIXSILgjABVrgF2rCqw
14SVE9iOmvdWaVVljTjSqsM5O9P++fDk7Oz0DBctCP2zInQ8uPuZZQd99Aw1
b1gtPHk2pAkjZz5EuzR6kj6n1QT9w+TAAlX7EP1ph9Vyfn55dfqDHPD4FL5k
ML1NdmyNrUhPBQIKTCDPYBY4Ytzkezg7dkSR1RjP85o2SicLV7YB9kHK8xJN
9/iq2ORZlK9FaEeX732aVSgozbMa0WxVJjnIr+aRIbGOjoNQunbXCgj9Ci4n
DoJAh5uxzFa+M0PpAcjuyyxPJ4YGrQe4I/Rrk7ELl3f9/RCcTi/PDIInk7PJ
MYLH01r+nrGmMJZSw0ATGgCV/u2n3Rn/BMZ/xcoU2RLIWNwYFw6nJNYw/Dvm
O6f9MFUgvew50gPGG89zwTpvSAbWWbGt+19UEj2J36F4i/xpTnQmq83MiCQ2
nawmbKxiIk5eBrSf1uVaNL16Eq6P9MZroQDdGdE/yRMintMzxGe3cCZxdC0C
UoiEpE+8b9kD2Bzp5HZeB5saRenBjZm3MXz7axD1DTpM1pbeMonsGQwLgSp6
VGt0TZf5FoYH5W3rlFu0cFP4BvMgso5lZOYijiuMAcF7myxTuReohdMwcNvR
gky+qg7fQoQk5QL5ZV4+phXiYOZfV4IJOh/nVb6LQd5b5MyySYe9+5kJ5rNR
SyxBPJil98lDBpICHknFvkhyVZqp+nOBbqVHWhsZfWT98HzC11PuB3FF4CwA
7KfDa763sJVwpWxOJIeAyBFMQnH+IPIG5K81sI15hmokc0kGOSwLLTFpgbjC
MF9tEzjbJpVTqZ3eBzCw7Yt1Bs5lhrQwRnP8faIWzsTtjM2yKPuzvE9AZzna
ewsNlbBBksWRayYL3CQ+bsi5cSusr97OVIKA/20LXQHbTJEpbOiYZym6uJAF
4WF76PXuPaHYfba612UAIRoJUAAp03xpb+J9aL0rxIwdUTe84O8nYYC2RsKm
R3jgwL8Zf9+iS/0/54RxA3uO2N1T/5KoxR3PGEbJ6Fa/RJIHbLGGKSqCednl
23rKdSJyLiwpT2jhcEHwcDHwaoeq4lq2LvPX9+Ujok/Jy1VpiXDrfyDDFsKz
YY8jCq5kiqf1ucFo0wDYl2zkfkg9uetawwrmiM0MHpQfHZ2i12DCORrYyf2b
PJQZGhyRw6NCCivI+LKnX+4zFKVxiyC8kqAcDELEKiu8hyD1iduKNDZjjJ0l
IOn3JRMzEFt4BQoleS7iT71Gd5Gg6ICNQeKpHLJQZHJqWbDkQgFJLdh4EioD
J2E3QUJCG4eXqEjr0PDO/oYbQwmN8BEOsRGkkzuP69pu8Pxm6Aok2TXAduQ/
dSmUO1RpFQg8En1P5EZ3jqZ4NM8QywxhOWpPzB+iwQ+IM8c6VJ2vlKuyGAp7
QfriDcLsNO3BMj1eceP2rIg3kwTjmU7QmdTb8lcmlXvHtIrOPCnaXDicPBgX
aTRQYMAo5FIMk2CUNr448fe2FbTlnnwIxHD3+wtS8gDhDgLn0wrDQg/cax8J
OgnBxpbqHv9CF5+RnYkAvfDUXqDgUnjirKP4F1KKn2pMw1u0LMIC371+fvjh
+WunNh9uNsAaszVe8C7ncto1xnyki2wL245+YLnfgnkCX2Q3IOK1c5yC9kcg
SGborwb9A8Ou8Ac0Mi3ShoIxMvRm0pe4IVBVFhiTc7BK4NnqAG9TWS3Y8IJn
NUsbtFh56qiQdTYRSJQqDiWxoRZbhfqTWHBwYbIqicTByBvgcxpREyjGdxTm
JiDoQEAcoKAmPQALQYmRPlxI9NMSI26fxOWm0dAyL57PjIEdRKwRoUsQDkfw
cb0BBRo/3W4IbXs4FL6WrXERRraU3QVbY48hiJ7AKi186F1prl+1Q6N9WokY
c+sSpdpUBKYAAr1RMT6E1slOXb7AX5I1BeCJpx5+rpIFEC2b2g9MM7yot6sV
ClPmZbnDyy7iJ+reIItXyYqpKhnvO3dQgmFLoAjlRhBRhfCmJYO3wobkd/jj
Dz7mMaCjiJkfmzcoWgP9001q0YdBqJ0DcsRmKA3Ta1xsUjxAo4iKhF7Q0lDC
/1zEkYUpeYeHAg78lYgD0loXyuZO7Mnvl+9ipS/G8FlIuf3z+49vXtCJIF1h
lHa09j4tq5QcHigGiJRQqbOl5UoUVQ2JUPL3rPYE5noDJIaXmgisGKMptM7c
3R15EQlKJmE2a92wCXAiPgg6O2mnR+A0gT2MMvFVSKaZIxy0EcTG9QLvh3mb
HfMs+hmlLiBiCjJnqAsUBXRO8EJMrXfaGkdK6EWm4OjczD2+/i32QBSAt0CK
KrzASEJW8N+/51BOfRQ6gEsDnDwtVo0cQn0Af01Y3ipphYHxETk7DECxVBy3
incaI6NN4NFNYPATXhQ2vaJuBsxjvWlYXziQeF++qLICDAlj+knebBgpPege
IDKQWjjIQV8Y8gH7+jlSFD4/EAagxNun3Qd/DyzPJ8cqlOsIj4+PE3hvzBkX
9H1awbKSwzRbnE6nqK/gkncxkak6pE+hKOygINrwrMxyBASHkR6IIpC2FLzt
piw8gyThehRL8Pb+L8z55L46YP4EmnMmJiBU1gBAWSGq3CZP5s64Q4OBuitx
HJEEpLORtrCbLCGW6RdU4TEam6M+nAHMvhENs3O7leuDIpiteWqkeLW4XOhE
2hAgJaYPXYZCkvqQ/ZtBp8on2sGnwpB4AxJsCgyMDeU54OLCOBg7molliUrS
YXMuso2whv3l8YEBj8h6rPCnRBINejcPkr0sq/kq+jCENFIawFQvd8ovbSAT
EL6GVsFICJl9o3G2CQcutIBg7yCYD/qMgHjYB7IxohYYjsr3iWJpbACCsUAz
RZXUhWaoD4dFlT0MhVU/tHFln1NOTUHUqbZkmEbDF+nPBpolkFR6JCYIeCbL
dDHtc1KF52W1KYm7mWSKNoKUWIxtQETtBFkY69F2WThlIs9WFNdAgjsCWeNL
4T0OeB0wS1qS6ULhQpDqisLKtvjQMjboxsLPiDsHTw3gGggro7O8iZyX8VQU
5PZsGpXNvO/PAEyMlkdpG5CdUCqp63KeJeYqJckK5Wc0pSSVh01PQznSv8Xe
HO9w9VuEn2gWnjWQbMsUQp4UjJfuHt9yisEsk5cV8+QoULgpZw9Zua1ZgubX
28lITg7H0AaTkbtJTj6TuNbRZtlfNGRNlD/44lqhag4rjFPvWrrkmw/KYa75
78eT+DlFgjpTGiE43i/1tuNLwBU4qsbJOv6NdGbb4MMpJp+kvv+SjjQQpgLF
XD6SJams68g1/iR2JRE10Kjua9IqyKI27Zb/geNcEeM793wgRNgXjRyrYO+T
mVZ0W+yf4MNvMR4GCdr2m21VuF0kvl/XxjphEPlv+dDxzDv8Cbx/QzomSIlN
lrMzV8jGPLXL7xu52rarzFI026YvFQE3LauLAyTs28m2rHXYTvec6p6NAxBf
Aqm8lsNGpcwHQEIXBlWYOEEhbkVif68V0Ifl33XQRBCCkz6d9HiiiGbLuY/M
nO0EoqSW3Tx2VnjGm+7/SHXTvq2dT+L/tl2DJg2yqp4S2xpw4Sdyu58VEuOt
2QykfQfc1Jk0Aps7EPZlUjGx5xh4p/GjygKcL+ljTyNdOI1CaZMyKmrmoOox
jevgFI5NISIJHIckvsH5hi+NWoKbMdk9SI+XCB8rLROo/Hqf5ZJi5SixiATJ
HLhESflGpNl0zUW8ga7J6MC3qdPu2Y5QrjnjiP1HQ59/snV0nVGWi+P6Ykoi
HGUGgVEETl6gETyvyU7tcj3niJE9mKmbzVMSZQPLChB/QArgO2hauelYqp77
lqooUgPHokxFJmCzEB8toV5Hbh35fNfk41k6TzRGnS6f5LKQU9nidjhCA6Uc
f9kkU6G0RtiCfNabVJy17BkUU4iaOtNFdA8ChRrkchG3zaM1wKci1PHxsEjE
HwA6dG1PsPGUSI/K2jxYznmJLHK18TzBrD7aAO0+q2pZA8o+Lyi6WzKKfe/v
yLtrZlxTyxqiLjtUY0y0pdRQsrm6b3jtBiIQItOHtGBliw1hLiD2VuKDQqvG
KCKA69GV5GzDzDq7drUkkmZVR86JWOR06zH2ZlvnSxmaS/VOcqonM3d+w/I5
eaI6ZcxHlIe9heRA1xVaXuN6nhbAVEoykKJ7kZJzYOg5AAdXC7d3TT42wAk4
21mW0Egk2kn0efsoYB9epqrRFrsxQjnv03yj4mt7zxu+k5NWtvzNy+fv3759
+e7FrXfdEqdr44EcAOEAJICzP5B0EMzXZZggQYdzq9jzkNRiUOpZgMhMZj6L
AmGc8exp/Ex4MAm3MOUiqRaUJEeE+WkUvTINuQ8ieQpMvOabsqxAkIT7oLaP
Dn7TNSMhShhkeJACsVEEw9+Tb1DSeZ0HUcR4yuQVauC5vTCT3xb5T3B1H9Pk
M1EInGWNX9Q9doAPzFR37EEr8wU7WR6R1sOtaTjBb5PvmFbXTWqJ+xhP5jKt
RsrHMCWoFWfmD8cp1L5PBl3iPVRf+RwFAGtKIC0Oj4sRD14bp2h0zChSsXVA
omUW5WOySHZ1P5r4CjrfVFln+WhKKqy2ix4xlU4IyKrnS2IGWYcczg+Y6JNI
9+p6TtX7CJRxx7v/YCjpZUurQjhmrp6uSJypYPGAnPpXfLaTv/mf3SHOcNAg
7mMDaIUHZDY1T6N2IrS4LtX/zrk9SLKe8gH+VDq3CAf92rpFxPZ5kgkaGcGN
zyxYPQ2KTK3hRLIe9kRCCvC/74LoWwzBJ+2ZhCk6swcKyLM86xEzwkWK3itP
fdZdeChlKjSvhF0qx9PTKW3d840BXMmLGiPHVp+loxp8vxDdRdbyLgxcuTlB
Zu2ImcYkkThwjzdKkA1zoSXhmDVOCuCs1syIskLPq+nzd3kmQpMKYQ9110b1
mIIEtKQkdc8pSxuQl3+SIImO55Z3SRN0c1gkbkVuE2XkWZAO0cIluTFD+VQU
EIfkEjbGQdQS0v06iF2kkJaqQhGVeBILQfCUFAK0BbJQRQYwZTk+XjKtaIS0
1w27z9iiuGj7W1X257MlS8gOj4O0K4U2iRbwI+UOklIrsd0g5nm5xekXkIzh
yPMHiWqJ2WTJ+2ddQyJfNOBmJtEdNp59wFIffmOmFa4aQU74QibrcMKBmZDw
ZroLDn8h3Y2X9ZgxjgDyKsI7/KWZ0Wef7g46519/4ybDZXz5BVhTTXUvegzc
zWMZlmMwMd6v2GEEH9a8cwIPe7u8bUktmPl9ien0RhB+iF9QnKnGXgDHDWJ1
amezw8QDeOtav/A1etSpOAy/16EYW10eLeix4BAkZoywH/ozUlbLCEVtoBAF
G00iwvvUvUujvhS3OucVvAG2Vsx3v9+nNNU7a0kFi85W+SJyyKAzQvzuKU+8
KSnGlFNsu/PWk56TeF10X7RCLTUlDMMFONBzNQVfJLcDPhv4mKopDCwXfthj
tOFDYneLHqJVPvJ9tnHghUcFD+3hD2LsH9LrHH/mpLxeT7JYLJC2ze+z9EGS
ct30siahjYVk9+TGFBMq0mByKgevspS9LTh6t7UQPQ3VcccLENfoisKwuseR
J67FWuHCGaRxiIXWmlm1M54U10HJETnm11Qs7cVORjMahX52rqnVXguvG+Y9
EK8Tj/V+iUbPCmtSUfB66OnzJPKWv5MVagMkZkCHgubIbdBbH6F6zSqZZywz
81AQlkYkIDBHMudBTd75n7sxAHHbceVSZsI1ekTtrWSjsxWOhFcJw+9eolti
U3fPP3AcPEdLkGANpzFHlk0qe7b08wGIIMP9b3qvZcimlxSebmJoQwqhr5Nz
wjKt0hk9KUSXAtfcp+yjDVNUOKxCJKc8xWJm3j56PA8IH4n2Q5cmOktBmtn7
TKZrmbB+wAzdMcXySvipy4sAIH83PUQx00sEOb6IWOAJUq8SIfB3XqCtZqSw
na4oXeUzzU2xvIuYDmtRlYChFv7BdWUAJFa7LUN32k6mus2QEtPBq2BGt7fQ
eB2MrOCrjhW+6gbTuQlp2Ezj2YNQBkdV7hENLcwMk6zRQmo4enB4cKxNOS9z
ouGcDrdtfOOli7hCEqYRPug0UNjgkuiDKvGd27xlwewNSjCTHvecZ6RFAw2b
StXTSnZlvAW2Sl6Z6fzof5qhCVjU7HQxmQS+xWcLyQjPs+Iz1SJMq3x3HYRx
ZM12AgzkEFjbIRUYzIpPm+1sktSbp3lSrH5M/0u2+PFufPPy+fjfJsdnp8fj
6dHx8fF0/PoPf/jw4tX45X9pdpv0x8yqYPLcGBKlSodYAgE0auoZ8W/HR/9z
fILQPX2CfzyX1cM2kN6wVd+OiBwg6EbAkhEGCrQnU1EOhhXLwch8erRSDQ5V
pVtyGzHMAIjPhgymE1ChAZjNtqCSJZL9Y49F8PcqVOiSjBAznCniXRkWEjyQ
MxeAQpbbSmWdkBFvJLySqC9q0yoQuUD70BCfxgOP1lKCd9ucYDGV2yJDeYR9
GRutXte2kr9LH4G5+UaUg3igtG/pUtNgayu4kbUVhQIWTKNUc5AnxkANxrCw
cX2PySBowMIcpTqtMAFLazgN0RYmGT6aC8A2lSj3TNd9BhiNN6Xw5hkGojr2
pKU3My3HRx5hkVJGcStzvQ4Kc5HVaKCbG0aMJTUKAJpYJpvQ2lbkiZ1LYcRd
/P5Ws0wqdFDiaSai81IQ345ltGq7wfBM4Mnw8WculumVB7tHl0Ct5WcWkSUs
+2XCYJto4KOAbAkNGLXChS1AuLYKm1xjz2KBe4ARhHKGkKGbi/XBSif2Sd2u
+Pn7u1sBDoCQlvTl8nwUP3sGFOr8lGK1Ky5BG9/CTvBnOGqgoTDZEOOW2/Uk
eFuM8bCudqUAF0WPkSggwLJ/5Buj9NUc0JGiCKQwOFWvNuTIZxW9YfyAZ2yC
F69Utsd8yOq+X5GT1HYNu2rF9a/KckF1h8UtQ++Gn1OdSQt30n1FnQUWI2aC
lAqIH/akV3eHRzM0e/a7eQtfMdb3GLRbjsUuDMjkHZyhi83rTh7O3fHO4RXz
AmT2jyT2Ire4vQdU9VjDfxUH8WPpxP7OxgfizqS/Pf1TPM+4TqmoA0yrKbGa
kldRNjCYBCrYgu1ZB1Qv9wtl+bmMeNEn+YxZcEDNhuV2MlH5Nc1Z8NoiA4QN
aYKExaY7s4FY2IadAPVbTDglvQaIT91GBvTd1uah8q2G9DpSjnv2rWgyCDAx
CXEYRn3ZBrKzCutpE6sBfdoFApK/oS+wngMgMZYTKTieD5nA1PYz7KAxhXdp
1QuOafIQCf2YVMt0PaMbmnPsCcOATCZmvugYveZ5UmNZRn6MktWcl7rEUPwe
9wsu7k3WNGxtLMoeSY8Cyj1TDScseGUJaaEcN4BEnYAfaPQzvC4IO5C/QMvs
GPO7jpZRREbNbpIH/dzO9HCONHPUiSyNjilgR9s6iGULa/mqzWwU0YqoHjFr
YlKJmJWKro3Y9yM/JZ3pFuO1vaLNFPf9G7SldkC5euwtUJ/sI6R3Cq1nH7PG
iVv8BlFbLpqgdYC5+qYkxEh0t+6Hg7sBku85tE5l0G1fVpfFdEpMU7hdrfBL
abASsiLVtPcNp3kS3SUFbt81hS1YYSIMIBi3bJRJ/oiaGBO9aED5Jx1Dl/mH
a7bxoUV721A8hLcbuBivg5tKyT0J4euiVDOTfMSTcCi2/KTJrmww8W39T4cS
kU30mC3Y2FnBbsAkemZx4VzsTyzpYcKuV0+off42ECIlF/ahkjZJDWNyuBJM
zRfHrBrvg1tIohyBqhdXLAwF3VxkcYIrcrBnHQdx8JYExzFSSPVtYC0uQFlS
TmW3gbvSWVW4xnPG9T5c5GCEOZm35C+m7IEOGWHMlmpHqG1vJeiKBCHH94Sc
eeYncxeRrc+Ld7klZ9GyVU4j8O9EWe3rIEk8S1qTIWL59jiKelyiw11OnywZ
rIRV5WxbN+OmHKNU0IzJnqcl7tFalLAGIfdwEt0is+4uEdCZAcFSmUSFMCT0
0kp4nJqE2uptFGm6/8GHcoPkVSjTfnmoPrDgftKo2jJpt4KRRrkTeyOzCxNu
KZ8PyAOnQvUnqnQr+duoOt5XVOpRawt7tXiAXj/zZcX9cu++faR4pOwHy9YZ
shXmzG5M7zQ5xofkPl5zKTFC8I1lC5CnUv7c3Ldi/iMlkwUWL+pCaKs1LZk5
ZrUkdbbz5YWNd4VU338nY2iSPIcei5g+jJ4Vu67kQWzG5QZ0QxjQzweYz3wB
ySq8Fu0FLtaxTKv7ZCP3mG0s63Jhp1+TropZMrWX22CJ+G1Ul8rrlHejRrOs
427ty2JtRRjUrnQe34rn1ulA3tL0k2d7fWaGzxgyNG8k684PHVacBDbZ1bPY
LUOZKm1GmpgG2f4oaodRTmI1XoQZfyA0R64ESLJ4AHEKRGaMuA8hxDUNWsA5
kAxfvpOmax3gxUwP9oOCpEwOjgWwvrQguqSLakhKt0izQ3FM4+otdCticX4J
YnctoX8mOfs59sWiFf7KWjaLhWSnaFKt5EDxDpb40ZPf3BmMwwjFX0v265kU
wlPTEtoRt7OGGyvUE0/kIVN3R0HQBJQeZdHVWWchScQUKyihqSuY7YNS+YFv
eMbPyCLO34ryJGdFf2UWWfjjmI/rkUqPUu6C6mRwXdOc6QGyO19erjUCejXG
MLW+9hqO1et0tcUmYA2kspIUyUcJU8YyEbOtxUGRlckSK+POC6oBurRKM6cm
Hpk2PYfISDAIQTFZHNh3gLHEnzPV2EXS5MjvhEoufVfVOiArbwJcju9TEPcQ
zyXvBSWt+Rb9988oKEnsPhhU4L8aKhCpFvPSpiY+j69JwIBVij/SpE66h16o
RivJj24L1snH/Gy2EVdcyV0zwiiajhXjrtYdtQJU1Ha0J/SchdHe9ITIyhmQ
RMfhJANXLcOrFh0GZw1NAuFqmC390GUu4VVE++HHgu5JvQGBkmpB3eD8uuqw
fAWsEN/4yCQob1XA4NvR+mK1dYbXe7obyCQQF1soGyRHEou01FAJwcSvlML6
qLumOn+8C9bjJgICqXMIiDTOgUyp1Vu8UqhL5jlquyQN7in3pcUDgkgmtgjw
nEvgCWnlo0GNqkGCGUYlml4iQpcghbdVMMErDTCK0GDD4UrA+7dzPQl0xMno
SWP61kJd0hpURF0w/DpKTvZ2Ct0+24/P5Sg/NbQZwfXgNI90F/rbBKB2/IjW
2xoYLdX+Z/ulSGGRri2gihx3qmY7DpQvvHDzwNrml3wJcF3kQS87j0aifmrA
N5tyLRpaTUVTnGYK33sVLSyJQdV/rOwKX5ckp9wzUUm80nR4x7J51gRnjDZX
gBPVmE8W1DmJX6Jri0FIwtkHSW9+t2dkG9Fh4M/OvBjdtMqYOBOhOiq99kdp
/xojonN+T6V27ZQ+r+uzvOEQasJrlLW3GiM8VJMZh4BR8n8npeSHsIDPLaYb
PRf1p10fRzlO6Ue+PN2bqYkCY04VoNR6xlKPIp0FWc85WmPJCnbQ0qKpJL2C
uGdRrhMRzzSNsr2bG6oF5xxuaCF8qSkRUfRTUL7Pig0mQku40J/WB8t3ETcz
aCVJ1y0jidpE3hc4NHLN0T4uYzVBiQvjKrSwJ/4Q6XqIdAYGSPrlafzCDSlR
BeIEQhIg+TMsWOGWImnm1YQ1KbK0HR3P6c1UDOg6PrZOCYyMx0dvR8Rz/6mG
Pz95Mr5AHzLMMN+Jj5trB11T2SoR+Efx3U36hbVHFdsOUI1LqwP1Do64lIg2
boNr88hRUJVyPblHa3aJcEVf0hUwLsj14iAnqpQlYT8vx1VIzB12BLVcbk5/
dxUvWHImr9/iWzVDY6JCfKwuJQhdbVQgBAv9S+XNoTi8MWgkZZ6i9UBb1ZJ8
S1nrnHbsIIXvOWI7AeJjeTiUq+bXuvFSeDE7i90TWnyNVjOJfmr7d94++7c4
z8SEEOb4cEMx33YtQn87YJXKPlDyKfKsOWgt6VDJv2c/61KJ+329wL5KBV2K
o7MII8MjaZIiDcWVIejhk89uxBVlw/oKkxifA089l75sqzSYYYTrrreo8mJt
eLXYSJUBy2pGlPvw4VZLiWGLv9fPewMzgSZRvBEFKAjC08YQiOpEIyG1DsxA
Fm9Bdl9eU9/wP9PdIQNMSr4LnoJlWZkX5WZWQIO0TS0fgKa0UaucwT6rSJg5
LNl+kqjS+H7pgML2rdxyLvBmN9xPUs4BF8Q3/Z00qzmY36fzz2xL4AgnV2gG
U+AOSGL75zoHleCfcd8HFu1ltURr8RFaR0SrMH6fKhnxrqrGryKEpc70oUFU
qdJA2I49IAOYd9bDNnm4tVUMSL6VkFTtOEKPhs7TYbcJLo69bJKFr8/13y3U
QV4wd1X9jJh+WC6Jm7KltUjwiNJWwxVVkldS/lF7SBJ2WZFXIUVP4ufMZZm7
71Sb8MsttQgS8zce2Ztwn/yhYsvV0R85TjRfUptfLWUJwlHYGvGbbrTL6fGV
udGuJtPJsZcbQmpJxscJ6PLi3a1rAodZ3fI7NjjJgvYTdnuR1WU1E6Q8RfMY
NbF+Gn2jMMYHcb6JRzLjyqA/vf31Z2x8mnNKJPYu8yyeWO0IY1aC9Uvcs5AP
pdHOQJbUsYvDR3YDWoz0vMSQwkz6KmoF/lY3OknY5FIs68xSQj15T+tioFdX
Gs6gREhUb1CULiJbIMupr7WxYJesbd/DheTPtdUITLxKXCVjQwsztojrk8Gk
tUvhymutk5+klDHNQCRxlnJtVDTnsa6j8p6W7r/7WWKk18mKw2Ng6gFx03bV
fYTbUEsRSxoQCXP4vZNRsfzM2icuWO2wZDUAb6djk5ukVht+cAfwB9cGgI4L
z3QtVaatKYorBqrZfIn4rMhvKZVwMQdDTDNk7t+5AYghI7cYCzhn26pmPmhm
ZfZsEYJK2Kt1WaSXaSAmJzwIJchqYYk2+1knDfmrNDBoOHF4jggLNJgSdDTf
37WLqC27f8DmKeKOZC5lJQU/227Q1coxvrQhBADCzrX0oow10yO6isoP8S+o
WVBvHI0w71zs1wXry49sBKNK7LA4ztuqP2fCr9EE5RkkLBgzyR0SYJwGwJt0
e/Li+bDUHUougDbnIQu+OAbJxQsHvtPFAOgo9EYr5DuHTkfGjVq1KmtJO0UF
EM1THJeI7JWPPsJj+d0VDEnpxsNpVIjn3XFVO4qv6ySMaLYgZiwvgi4t3CkE
jRjkYu1+C5sF/Qw1nJGLciY/cdaEhhnfaMVLUvDzOkcR1T0WOwV/ptIaodNA
PVeZ3ophZDx6j/uOhBE4kdsSS7FQYjk3YJZ+ycTstTyZHWa3Fg4FFsC1YcAg
paecbVWTkC4ARaOiyhTUpupxVveATNKgtGMCSpgerglHwXh4V/Bzz8ImvzcI
5vgo8kJLJbXCMqlYD6ytDhPQhx3xADa6STcgtUtg13fLMlk7LG+JTdZLFkMS
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

-->

</rfc>

