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


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

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC5226 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5226.xml">
<!ENTITY RFC5681 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml">
<!ENTITY RFC7942 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml">
<!ENTITY SELF "[RFCXXXX]">
]>


<rfc ipr="trust200902" docName="draft-chung-ccwg-search-06" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="search">SEARCH -- a New Slow Start Algorithm for TCP and QUIC</title>

    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization abbrev="viasat">Viasat Inc</organization>
      <address>
        <postal>
          <street>300 Nickerson Rd,</street>
          <city>Marlborough, MA</city>
          <code>1002</code>
          <country>United States of America</country>
        </postal>
        <email>jaewon.chung@viasat.com</email>
      </address>
    </author>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization abbrev="WPI">Worcester Polytechnic Institute</organization>
      <address>
        <postal>
          <street>100 Institute Rd</street>
          <city>Worcester, MA</city>
          <code>01609</code>
          <country>United States of America</country>
        </postal>
        <email>mataeikachooei@wpi.edu</email>
      </address>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization abbrev="viasat">Viasat Inc</organization>
      <address>
        <postal>
          <street>300 Nickerson Rd,</street>
          <city>Marlborough, MA</city>
          <code>1002</code>
          <country>United States of America</country>
        </postal>
        <email>feng.li@viasat.com</email>
      </address>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization abbrev="WPI">Worcester Polytechnic Institute</organization>
      <address>
        <postal>
          <street>100 Institute Rd</street>
          <city>Worcester, MA</city>
          <code>01609</code>
          <country>United States of America</country>
        </postal>
        <email>claypool@cs.wpi.edu</email>
      </address>
    </author>

    <date year="2025" month="March" day="17"/>

    <area>Web and Internet Transport</area>
    <workgroup>ccwg</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 188?>

<t>TCP slow start is designed to ramp up to the network congestion point
quickly, doubling the congestion window each round-trip time until the
congestion point is reached, whereupon TCP exits the slow start phase.
Unfortunately, the default Linux TCP slow start implementation -- TCP
Cubic with HyStart <xref target="HYSTART"/> -- can cause premature exit from slow
start, especially over wireless links, degrading link utilization.
However, without HyStart, TCP exits slow start too late, causing
unnecessary packet loss.  To improve TCP slow start performance, this
document proposes using the Slow start Exit At Right CHokepoint
(SEARCH) algorithm <xref target="KCL24"/> where the TCP sender determines the
congestion point based on acknowledged deliveries -- specifically, the
sender computes the delivered bytes compared to the expected delivered
bytes, smoothed to account for link latency variation and normalized
to accommodate link capacities, and exits slow start if the delivered
bytes are lower than expected.  We implemented SEARCH as a Linux
kernel v5.16 module and evaluated it over WiFi, 4G/LTE, and low earth
orbit (LEO) and geosynchronous (GEO) satellite links.  Analysis of the
results show that the SEARCH reliably exits from slow start after the
congestion point is reached but before inducing packet loss.</t>



    </abstract>



  </front>

  <middle>


<?line 210?>

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

<t>The TCP slow start mechanism starts sending data rates cautiously yet
rapidly increases towards the congestion point, approximately doubling
the congestion window (cwnd) each round-trip time (RTT).
Unfortunately, default implementations of TCP slow start, such as TCP
Cubic with HyStart <xref target="HYSTART"/> in Linux, often result in a premature
exit from the slow start phase, or, if HyStart is disabled, excessive
packet loss upon overshooting the congestion point.  Exiting slow
start too early curtails TCP&#39;s ability to capitalize on unused link
capacity, a setback that is particularly pronounced in high
bandwidth-delay product (BDP) networks (e.g., GEO satellites) where
the time to grow the congestion window to the congestion point is
substantial.  Conversely, exiting slow start too late overshoots the
link&#39;s capacity, inducing unnecessary congestion and packet loss,
particularly problematic for links with large (bloated) bottleneck
queues.</t>

<t>To determine the slow start exit point, we propose that the TCP sender
monitor the acknowledged delivered bytes in an RTT and compare that to
what is expected based on the bytes acknowledged as delivered during
the previous RTT.  Large differences between delivered bytes and
expected delivered bytes is then the indicator that slow start has
reached the network congestion point and the slow start phase should
exit.  We call our approach the Slow start Exit At Right CHokepoint
(SEARCH) algorithm.  SEARCH is based on the principle that during slow
start, the congestion window expands by one maximum segment size (MSS)
for each acknowledgment (ACK) received, prompting the transmission of
two segments and effectively doubling the sending rate each RTT.
However, when the network surpasses the congestion point, the delivery
rate does not double as expected, signaling that the slow start phase
should exit.  Specifically, the current delivered bytes should be
twice the delivered bytes one RTT ago.  To accommodate links with a
wide range in capacities, SEARCH normalizes the difference based on
the current delivery rate and since link latencies can vary over time
independently of data rates (especially for wireless links), SEARCH
smooths the measured delivery rates over several RTTs.</t>

<t>This document describes the current version of the SEARCH algorithm,
version 3. Active work on the SEARCH algorithm is continuing.</t>

<t>This document is organized as follows: Section 2 provides terminology
and definitions relevant used throughout this document; Section 3
describes the SEARCH algorithm in detail; Section 4 provides
justification for algorithm settings; Section 5  describes the
implementation status; Section 6 describes security considerations;
Section 7 notes that there are no IANA considerations; Section 8
closes with acknowledgments; and Section 9 provides references.</t>

</section>
<section anchor="terminology-and-defitions"><name>Terminology and Defitions</name>

<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this
document are to be interpreted as described in RFC 2119, BCP 14
<xref target="RFC2119"/> and indicate requirement levels for compliant CoAP
implementations.</t>

<t>In this document, the term &quot;byte&quot; is used in its now customary sense
as a synonym for &quot;octet&quot;.</t>

<t><em>ACK:</em> a TCP acknowledgement.</t>

<t><em>bins:</em> the aggregate (total) of acknowledged delivery bytes over a
 small time window.</t>

<t><em>congestion window (cwnd):</em> A TCP state variable that limits the
 amount of data a TCP can send. At any given time, a TCP flow MUST NOT
 send data with a sequence number higher than the sum of the highest
 acknowledged sequence number and the minimum of the cwnd and receiver
 window.</t>

<t><em>norm:</em> the normalized difference in current delivered bytes and
 previously delivered bytes.</t>

<t><em>round-trip time (RTT):</em> the round-trip time for a segment sent until
 the acknowledgement is received.</t>

<t><em>THRESH:</em> the norm value above which SEARCH will consider the
 congestion point to be reached and the slow start phase exits.</t>

</section>
<section anchor="search-algorithm"><name>SEARCH Algorithm</name>

<t>The concept that during the slow start phase, the delivered bytes
should double each RTT until the congestion point is reached is core
to the SEARCH algorithm. In SEARCH, when the bytes delivered one RTT
prior is half the bytes delivered currently, the bitrate is not yet at
capacity, whereas when the bytes delivered prior are more than half
the bytes delivered currently, the link capacity has been reached and
TCP exits slow start.</t>

<t>One challenge in monitoring delivered data across multiple RTTs is
latency variability for some links. Variable latency in the absence of
congestion - common in some wireless links - can cause RTTs to differ
over time even when the network is not yet at the congestion point.
This variability complicates comparing delivered bytes one RTT prior
to those delivered currently in that a lowered latency can make it
seem like the total bytes delivered currently is too low compared to
the total delivered one RTT ago, making it seem like the link is at
the congestion point when it is not.</t>

<t>To counteract link latency variability, SEARCH tracks delivered data
over several RTTs in a sliding window providing a more stable basis
for comparison.  Since tracking individual segment delivery times is
prohibitive in terms of memory use, the data within the sliding window
is aggregated over bins representing small, fixed time periods. The
window then slides over bin-by-bin, rather than sliding every
acknowledgement (ACK), reducing both the computational load (since
SEARCH only triggers at the bin boundary) and the memory requirements
(since delivered byte totals are kept for a bin-sized time interval
instead of for each segment).</t>

<section anchor="algorithm-overivew"><name>Algorithm Overivew</name>

<t>An overview of the SEARCH algorithm (that runs on the TCP server only)
is provided below.</t>

<t>In lines 1-2, upon initialization of a TCP connetion, the SEARCH
window (W) is set based on the initial round trip time (init_rtt), and
the delivery history (hist) is cleared.</t>

<t>The main part of the SEARCH algorithm runs in lines 3-10 when an
ACK is received.  Line 3 does bookkeeping, updating the delivery
history (hist) based on the current time and the TCP ACK sequency
number (sequence_num).</t>

<t>Line 4 computes the number of bytes delivered in the current SEARCH
window, using hist to tally the delivered bytes from the current time
(now) to now minus W.  Line 5 does the same computation, but for the
delivered bytes for the previous rtt - i.e,. from now minus
an rtt to now minus an rtt minus W.</t>

<t>Line 6 computes the difference between the current delivered bytes and
the previous delivered bytes, doubling the latter value since under
normal slow start congestion window growth the delivered bytes will
approximately double each round-trip time.  Line 7 normalizes this
difference since it is the relative delivered bytes that matter -
i.e., it is the delivered bytes no longer doubling - independently of
the actual byte amounts - that indicates the chokepoint has been
reaced.  Line 8 compares this normalized difference (norm_diff) to the
SEARCH threshold (THRESH), and if this threshold has been surpassed
then slow start exits.</t>

<t>SEARCH ALGORITHM OVERVIEW</t>

<figure><artwork><![CDATA[
upon TCP connection:
1:  W = 3.5 * init_rtt  // SEARCH window size
2:  hist[] = {}  // Array holding delivery history

on ACK arrived (sequence_num, rtt):

    // Update delivery history.
3:  update_hist(hist, sequence_num)

    // Compute current and previous RTT deliveries.
4:  curr_delv = compute_delv(hist, now - W, now)
5:  prev_delv = compute_delv(hist, now - W - rtt, now - rtt)

    // Check if rate has not doubled.
6:  diff = curr_delv - 2 * prev_delv
7:  norm_diff = diff / (2 * prev_delv)
8:  if (norm_diff >= THRESH) then
9:     exit_slow_start()
10: end if
]]></artwork></figure>

</section>
<section anchor="the-complete-algorithm"><name>The Complete Algorithm</name>

<t>The complete SEARCH algorithm (that runs on the TCP server only) is
shown below.</t>

<t>The core of the algorithm overview presented above is preserved in the
complete algorithm below.  But in order to made the code practical,
the delivery history information from the TCP ACKs is binned,
aggregating delivered byte information over a small time period.
Maintaining the bins is done via a circular array, with checks to make
sure the array has enough data for the SEARCH computations (i.e., bins
over time period W for the current delivery window, and bins over time
period W for the delivery window for the previous round-trip time).
In addition, the total memory footprint used by the bins is managed
via bit shifting, decreasing the delivered byte values stored when
they get too large.</t>

<t>The parameters in CAPS (lines 1-7) are constants, with the INITIAL_RTT
(on line 1) obtained via the first round-trip time measured in the TCP
connection.</t>

<t>The variables in Initialization (lines 9-12) are set once, upon
establishment of a TCP connection.</t>

<t>The variable *now* on lines 13 and 27 is the current system time when
the code is called.</t>

<t>The variable sequence_num and rtt in the ACK_arrived() function (above
line 13) are obtained upon arrival of an acknowledgement from the
receiver.</t>

<t>The variable *cwnd* on lines 54 and 55 is the current congestion
window.</t>

<t>Lines 1-8 set the predefined parameters for the SEARCH algorithm.  The
window size (WINDOW_SIZE) is 3.5 times the initial RTT.  The delivered
bytes over a window is approximated using 10 (W) bins, with an
additional 15 additional bins (EXTRA_BINS) bins (for a total of 25
(NUM_BINS)) to allow comparison of the current delivered bytes to the
previously delivered bytes one RTT earlier.  The bin duration
(BIN_DURATION) is the window size divided by the number of bins.  The
threshold (THRESH) is set to 0.35, and is the upper bound of the
permissible difference between the previously delivered bytes and the
current delivered bytes (normalized) above which slow start exits.
The maxium value for each (MAX_BIN_VALUE) can be less than largest TCP
sequence number.</t>

<t>Lines 9-12 do one-time initialization of search variables when a TCP
connection is established.  By setting the bound boundary (bin_end) to
0 intially, that means the first ack that arrives is placed in the
first bin.</t>

<t>Once a TCP flow starts, SEARCH only acts when acknowledgements (ACKs)
are received and even then, only for the first ACK that arrives after
the end of the latest bin boundary (stored in the variable bin_end).
This check happens on line 13 and, if the bin boundary is passed, the
bin statistics are updated in the call to update_bins() on line 14.</t>

<t>In update_bins() (lines 27-48), in most TCP connections, the time
(*now*) will be in the successive bin, but in some cases (such as an
RTT spike or a TCP connection without data to send), more than one bin
boundary may have been passed.  Line 27 computes how many bins have
been passed.</t>

<t>On line 28, if more than one RTT of bins has been missed (see the
&quot;Missed Bins&quot; section for an explanation), then the SEARCH parameters
are reset via <spanx style="verb">reset_search()</spanx>.  The <spanx style="verb">reset_search()</spanx> function (lines
56-62) re-initializes the bin index (curr_index), the scale factor
(scale_factor) and the bin end time (bin_end).  On line 59, if there
has been a whole SEARCH window (W) of bins missed, the bin duration
(BIN_DURATION) is reset, too, based on the current RTT (lines 60 and
61).</t>

<t>Otherwise, if more than one bin has been passed, any such &quot;skipped&quot;
bins are updated with the most recently updated bin.  These skipped
bins are updated via the loop in lines 31-33.  Line 34 updates the
current bin index (curr_idx) based on the number of bins that have
been passed (again, typically this will be 1) and line 35 updates the
next bin boundary (bin_end) based on the number of passed bins
(passed_bins) and the bin duration (BIN_DURATION)</t>

<t>In lines 36-47, the memory used by each bin can be reduece (e.g., a
u16) to be less than the memory used for a TCP sequence number (e.g.,
a u32).  To handle this, when updating the bin value, on line 36 the
sequence number is first scaled by the scale factor (initially set to
0).  If the scaled value is larger than the maximum value the bin can
hold (MAX_BIN_VALUE, set to the largest u16 by default), then lines
39-42 shift (scale) the value (bin_value) until it fits.  In lines
43-45, all the previous bin values that had only been scaled by the
previous scale factor are re-scaled by the additional amount
(shift_amount) and the total scaling (scale_factor) updated in line
46.</t>

<t>Lastly, on line 48, the latest bin is updated to the most recent
scaled bin value - i.e., the latest ACKed TCP sequence number
(sequence_num), scaled/shifted by shift_amount.</t>

<t>Once the bins are updated, lines 15-17 check if enough bins have been
filled to run SEARCH.  This requires more than W (10) bins, but also
enough to shift back by an RTT to compute a window (10) of bins there.</t>

<t>If there are enough bins to run SEARCH, lines 18 and 20 compute the
current and previously delivered bytes over a window (W) of bins.
This delivered bytes over the window is computed in the function
compute_delv().  For previously delivered bytes, shifting by an RTT
may land between bin boundaries, so the computation is interpolated by
the fraction on either side, computed on line 18.</t>

<t>Lines 49-51 compute the delivered bytes over the bins, first by taking
the &quot;upper&quot; delivered window (which is 0, if fraction is 0), then
adding the &quot;lower&quot; delivered window, and finally returning this sum.</t>

<t>Once computed, the difference between expected delivered bytes (2 x
prev_delv) and the current delivered bytes (curr_delv) is normalized
(line 21) and then compared to the threshold (THRESH) in line 21.  If
this difference is larger than THRESH, slow start exits, which is
handled by the function exit_slow_start().</t>

<t>The exit_slow_start() function is on lines 52-55.  When exiting slow
start at the chokepoint, SEARCH is delayed in its prediction by almost
exactly two RTTs.  SEARCH can compute exactly how many extra bytes
have been added to the congestion window (cwnd) beyond this point.
The cwnd is reduced by this amount, before setting ssthresh to the
cwnd (line 55).  This exits slow start.</t>

<t>SEARCH 3.1 ALGORITHM</t>

<figure><artwork><![CDATA[
Parameters:
1: WINDOW_SIZE = INITIAL_RTT x 3.5  
2: W = 10  
3: EXTRA_BINS = 15
4: NUM_BINS = W + EXTRA_BINS  
5: BIN_DURATION = WINDOW_SIZE / W  
6: THRESH = 0.35
7: MAX_BIN_VALUE = 0xFFFF  // 16-bit
8: MISSED_BIN_LIMIT = alpha x (INITIAL_RTT / BIN_DURATION)

Initialization():
9: bin[NUM_BINS] = {}
10: curr_idx = -1 
11: bin_end = 0
12: scale_factor = 0

ACK_arrived(sequence_num, rtt):
    // Check if passed bin boundary.
13: if (*now* > bin_end) then  
14:   update_bins()

      // Check if enough data for SEARCH.
15:   prev_idx = curr_idx - (rtt / BIN_DURATION)
16:   if (prev_idx > W) and
17:      (curr_idx - prev_idx) < EXTRA_BINS then  

        // Run SEARCH check.
18:     curr_delv = compute_delv(curr_idx - W, curr_idx)
19:     frac = (rtt mod BIN_DURATION) / BIN_DURATION
20:     prev_delv = compute_delv(prev_idx - W, prev_idx, frac)
21:     norm_diff = (2 x prev_delv - curr_delv) / (2 x prev_delv)
22:     if (norm_diff >= THRESH) then
23:       exit_slow_start()
24:     end if

25:   end if // Enough data for SEARCH.

26: end if // Each ACK.

// Update bin statistics.
// Handle cases where more than one bin boundary passed.
// Scale bins (shift) if larger than max bin size.
update_bins():
27: passed_bins = (*now* - bin_end) / BIN_DURATION + 1

    // Missed too many bins, or app limit rate --> reset SEARCH
28: if (passed_bins > MISSED_BIN_LIMIT || is_app_limited()) then
29:   return reset_search()
30: end if

    // For remaining skipped, propagate prev bin value.
31: for i = curr_idx+1 to (curr_idx + passed_bins)
32:   bin[i mod NUM_BINS] = bin[curr_idx]
33: end for 
34: curr_idx += passed_bins
35: bin_end += passed_bins x BIN_DURATION

    // Scale bins (shift) if too large.
36: bin_value = sequence_num >> scale_factor
37: if (bin_value > MAX_BIN_VALUE) then
38:   shift_amount = 0
39:   while (bin_value > MAX_BIN_VALUE)
40:     shift_amount += 1
41:     bin_value >>= 1
42:   end while
43:   for i = 0 to NUM_BINS
44:     bin[i] >>= shift_amount
45:   end for
46:   scale_factor += shift_amount
47: end if

48: bin[curr_idx mod NUM_BINS] = bin_value

// Compute delivered bytes over bins, interpolating a fraction of each
// bin on the ends (default is 0).
compute_delv(idx1, idx2, frac = 0):
49: delv = (bin[idx2+1 mod NUM_BINS] - bin[idx1+1 mod NUM_BINS]) x frac
50: delv += (bin[idx2 mod NUM_BINS] - bin[idx1 mod NUM_BINS]) x (1-frac)
51: return delv

// Exit slow start by setting cwnd and ssthresh.
exit_slow_start():
52: cong_idx = curr_idx - 2 x INITIAL_RTT / BIN_DURATION
53: overshoot = compute_delv(cong_idx, curr_idx)
54: cwnd -= overshoot
55: ssthresh = cwnd

// Reset SEARCH parameters.
reset_search():
56: curr_idx = -1
57: scale_factor = 0
58: bin_end = *now*
59: if passed_bins > W then
60:   WINDOW_SIZE = rtt x 3.5  
61:   BIN_DURATION = WINDOW_SIZE / W  
62: end
]]></artwork></figure>

</section>
</section>
<section anchor="search-parameters"><name>SEARCH Parameters</name>

<section anchor="window-size-windowsize"><name>Window Size (WINDOW_SIZE)</name>

<t>The SEARCH window smooths over RTT fluctuations in a connection that
are unrelated to congestion. The window size must be large enough to
encapsulate meaningful link variation, yet small in order to allow
SEARCH to respond near when slow start reaches link capacity. In order
to determine an appropriate window size, we analyzed RTT variation
over time for GEO, LEO, and 4G LTE links for TCP during slow start.
See <xref target="KCL24"/> for details.</t>

<t>The SEARCH window size should be large enough to capture the observed
periodic oscillations in the RTT values. In order to determine the
oscillation period, we use a Fast Fourier Transform (FFT) to convert
measured RTT values from the time domain to the frequency domain.  For
GEO satellites, the primary peak is at 0.5 Hz, meaning there is a
large, periodic cycle that occurs about every 2 seconds. Given the
minimum RTT for a GEO connection of about 600 ms, this means the cycle
occurs about every 3.33 RTTs.  Thus, a window size of about 3.5 times
the minimum RTT should smooth out the latency variation for this type
of link.</t>

<t>While the RTT periodicity for the LEO link is not as pronounced as in
the GEO link, the FFT still has a dominant peak at 10 Hz, so a period
of about 0.1 seconds. With LEO&#39;s minimum RTT of about 30 ms, the
period is also about 3.33 RTTs. Thus, a window size of about 3.5 times
the minimum RTT should smooth out the latency variation for this type
of link, too.</t>

<t>Similarly to the LEO link, the LTE network does not have a strong RTT
periodicity. It has a dominant peak at 6 Hz, with a period of about
0.17 seconds. With the minimum RTT of the LTE network about 60 ms,
this means a window size of about 2.8 times the minimum RTT is
needed. A SEARCH default of 3.5 times the minimum RTT exceeds this, so
should smooth out the variance for this type of link as well.</t>

</section>
<section anchor="threshold-thresh"><name>Threshold (THRESH)</name>

<t>The threshold determines when the difference between the bytes
delivered currently and the bytes delivered during the previous RTT is
great enough to exit the slow start phase. A small threshold is
desirable to exit slow start close to the `at capacity&#39; point, but the
threshold must be large enough not to trigger an exit from slow start
prematurely due to noise in the measurements.</t>

<t>During slow start, the congestion window doubles each RTT. In ideal
conditions and with an initial cwnd of 1, this results in a sequence
of delivered bytes that follows a doubling pattern (1, 2, 4, 8, 16,
...). Once the link capacity is reached, the delivered bytes each RTT
cannot increase despite cwnd growth.</t>

<t>For example, consider a window that is 4x the size of the RTT. After 5
RTTs, the current delivered window comprises 2, 4, 8, 16, while the
previous delivered window is 1, 2, 4, 8. The current delivered bytes
is 30, exactly double the bytes delivered in the previous
window. Thus, SEARCH would compute the normalized difference as zero.</t>

<t>Once the cwnd ramps up to meet full link capacity, the delivered bytes
plateau.  Continuing the example, if the link capacity is reached when
cwnd is 16, the delivered bytes growth would be 1, 2, 4, 8, 16,
16. The current delivered window is 4+8+16+16 = 44, while the
previously delivered window is 2+4+8+16 = 30. Here, the normalized
difference between 2x the previously delivered window and the current
window is about (60-44)/60 = 0.27. After 5 more RTTs, the previous
delivered and current delivered bytes would both be 16 + 16 + 16 + 16
= 64 and the normalized difference would be (128 - 64) / 64 = 0.5.</t>

<t>Thus, the norm values typically range from 0 (before the congestion
point) to 0.5 (well after the congestion point) with values between 0
and 0.5 when the congestion point has been reached but not surpassed
by the full window.</t>

<t>To generalize this relationship, the theoretical underpinnings of this
behavior can be quantified by integrating the area under the
congestion window curve for a closed-form equation for both the
current delivered bytes (curr_delv) and the previously delivered bytes
(prev_delv), the normalized difference can be computed based on the
RTT round relative to the &quot;at capacity&quot; round. While SEARCH seeks to
detect the &quot;at capacity&quot; point as soon as possible after reaching it,
it must also avoid premature exit in the case of noise on the
link. The 0.35 threshold value chosen does this and can be detected
with 2 RTTs of reaching capacity.</t>

</section>
<section anchor="number-of-bins-numbins"><name>Number of Bins (NUM_BINS)</name>

<t>Dividing the delivered byte window into bins reduces the server&#39;s
memory load by aggregating data into manageable segments instead of
tracking each packet. This approach simplifies data handling and
minimizes the frequency of window updates, enhancing server
efficiency. However, more bins provide more fidelity to actual
delivered byte totals and allow SEARCH to make decisions (i.e.,
compute if it should exit slow start) more often, but require more
memory for each flow. The sensitivity analysis conducted here aims to
identify the impact of the number of bins used by SEARCH and the
ability to exit slow start in a timely fashion.</t>

<t>Using a window size of 3.5x the initial RTT and a threshold of 0.35,
we varied the number of bins from 5 to 40 and observe the impact on
SEARCH&#39;s performance over GEO, LEO and 4G LTE downloads.  For all
three links, a bin size of provides nearly identical performance as
SEARCH running with more bins, while 10 minimizes early exits while
having an at chokepoint percentage that is close to the maximum.</t>

</section>
<section anchor="missed-bins-missedbinlimit"><name>Missed Bins (MISSED_BIN_LIMIT)</name>

<t>For most TCP connections, each bin covers about 1/2 an RTT of time.
Thus, most bins have multiple ACKs that arrive before the bin boundary
passes.  However, in some cases, when an ACK arrives it may be after
more than one bin boundary in time.  This could be because of
intermittent network congestion, delayed end host scheduling, or end
hosts without data to send.  In such cases, the sender won&#39;t get
confirmation of the expected doubling of the delivered bytes each RTT
even though this lack of doubling is probably not due to congestion on
the forward link.  So, in this case, SEARCH does not exit slow start.
However, the delivered byte data in the bins that is used as the
congestion signal (i.e., the lack of doubling) is no longer clean and
so the SEARCH variables are reset (in <spanx style="verb">reset_search()</spanx>).  By default,
SEARCH does this if more than about two RTTs of bins are missed (Line 8
sets the MISSED_BIN_LIMIT), representing not receiving ACKs for a full
round-trip time multiplied by an alpha factor - the current
recommendation is for an alpha of 2, but this can be tuned as needed.</t>

</section>
<section anchor="maxbinvalue"><name>MAX_BIN_VALUE</name>

<t>Based on our analysis (see <xref target="KCC25"/> for details), storing the
incoming values in a u32 is not needed - since SEARCH compares
previously delivered bytes to currently delivered bytes, the
<em>relative</em> amounts are all SEARCH really needs.  This means fewer
bytes - u16 or even u8 - can be used for each bin without sacrificing
SEARCH accuracy.  In fact, the approach presented -- bit-shifting on
demand, only when values get too large - is tunable to different
environments by adjusting the MAX_BIN_VALUE constant (line 7), doing
so based on the memory needs and possibly the link capacity of the
server.  TCP servers that handle only a few connections but are on a
high-capacity link may choose to use large bins - u32 or even larger
if the kernel uses larger values for TCP - since per-flow memory
overhead is not an issue but fidelity to the acked bytes could
be. Conversely, TCP servers on resource-constrained devices may use
small bins - u8 or even smaller - if the per-memory overhead is
critical and the network capacity is not large.</t>

<t>When bit-shifting is required - i.e., the incoming value is too large
to fit into the bin - there is some CPU overhead in the shift itself
and in the shift for each previously-stored bin.  There could be
multiple shifts required (i.e., the shifting is done in a loop in
lines 39-42, but in practice, there is typically only one shift or at
most two.</t>

</section>
<section anchor="app-limited-isapplimited"><name>App Limited (<spanx style="verb">is_app_limited()</spanx>)</name>

<t>If the sending rate for TCP flow is limited by the application and not
by the congestion window, then the delivery rate will not double each
RTT during slow start.  SEARCH (and any congestion-point detection
algorithm) will not be able to tell when the chokepoint has been
reached.  Line 28 detects if the flow is application-limited via
<spanx style="verb">is_app_limited()</spanx> that is intended to be a query to the TCP stack.
When it is, SEARCH resets its parameters.</t>

</section>
</section>
<section anchor="deployment-and-performance-evaluations"><name>Deployment and Performance Evaluations</name>

<t>Evaluation of hundreds of downloads of SEARCH across GEO, LEO, and 4G
LTE network links compared to TCP with HyStart and TCP without HyStart
shows SEARCH almost always exits after capacity has been reached but
before packet loss has occurred. This results in capacity limits being
reached quickly while avoiding inefficiencies caused by lost packets.</t>

<t>Evaluation of a SEARCH implementation in an open source QUIC library
(QUICly) over an emulated GEO satellite link validates the
implementation, illustrating how SEARCH detects the chokepoint and
exits slow start before packet loss occurs. Evaluation over a
commercial GEO satellite link shows SEARCH can provide a median
improvement of up to 3 seconds (14%) compared to the baseline by
limiting cwnd growth when capacity is reached and delaying any packet
loss due to congestion.</t>

<t>Details can be found at <xref target="KCL24"/> and <xref target="CKC24"/>.</t>

</section>
<section anchor="implementation-status"><name>Implementation Status</name>

<t>This section records the status of known implementations of the
algorithm defined by this specification at the time of posting of this
Internet-Draft, and is based on a proposal described in <xref target="RFC7942"></xref>. The
description of implementations in this section is intended to assist
the IETF in its decision processes in progressing drafts to
RFCs. Please note that the listing of any individual implementation
here does not imply endorsement by the IETF. Furthermore, no effort
has been spent to verify the information presented here that was
supplied by IETF contributors. This is not intended as, and must not
be construed to be, a catalog of available implementations or their
features. Readers are advised to note that other implementations may
exist.</t>

<t>According to <xref target="RFC7942"></xref>, &quot;this will allow reviewers and working groups
to assign due consideration to documents that have the benefit of
running code, which may serve as evidence of valuable experimentation
and feedback that have made the implemented protocols more mature. It
is up to the individual working groups to use this information as they
see fit&quot;.</t>

<t>As of the time of writing, the following implementations of SEARCH
have been publicly released:</t>

<t>Linux TCP</t>

<t>Source code URL:</t>

<t><eref target="https://github.com/Project-Faster/tcp_ss_search.git">https://github.com/Project-Faster/tcp_ss_search.git</eref></t>

<t>Source: WPI
Maturity: production
License: GPL?
Contact: claypool@cs.wpi.edu
Last updated: May 2024</t>

<t>QUIC</t>

<t>Source code URLs:</t>

<t><eref target="https://github.com/Project-Faster/quicly/tree/generic-slowstart">https://github.com/Project-Faster/quicly/tree/generic-slowstart</eref>
<eref target="https://github.com/AmberCronin/quicly">https://github.com/AmberCronin/quicly</eref>
<eref target="https://github.com/AmberCronin/qperf">https://github.com/AmberCronin/qperf</eref></t>

<t>Source: WPI
Maturity: production
License: BSD-style
Contact: claypool@cs.wpi.edu
Last updated: May 2024</t>

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

<t>This proposal makes no changes to the underlying security of transport
protocols or congestion control algorithms. SEARCH shares the same
security considerations as the existing standard congestion control
algorithm <xref target="RFC5681"></xref>.</t>

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

<t>This document has no IANA actions. Here we are using that phrase,
suggested by <xref target="RFC5226"></xref>, because SEARCH does not modify or extend the
wire format of any network protocol, nor does it add new dependencies
on assigned numbers. SEARCH involves only a change to the slow start
part of the congestion control algorithm of a transport sender, and
does not involve changes in the network, the receiver, or any network
protocol.</t>

<t>Note to RFC Editor: this section may be removed on publication as an RFC.</t>

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

<t>Much of the content of this draft is the result of discussions with
the Congestion Control Research Group (CCRG) at WPI
<eref target="https://web.cs.wpi.edu/~claypool/ccrg">https://web.cs.wpi.edu/~claypool/ccrg</eref>. In addition, feedback and
discussions of early versions of SEARCH with the technical group at
Viasat has been invaluable.</t>

</section>
<section anchor="references"><name>References</name>

</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC5226;
&RFC5681;
&RFC7942;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="CKC24" target="https://web.cs.wpi.edu/~claypool/papers/quic-search-lanman-24/paper.pdf">
  <front>
    <title>Improving QUIC Slow Start Behavior in Wireless Networks with SEARCH</title>
    <author initials="A." surname="Cronin" fullname="Amber Cronin">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="B." surname="Peters" fullname="Benjamin Peters">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <date year="2024"/>
  </front>
  <seriesInfo name="Proceedings of the IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN), Boston, MA, USA" value=""/>
</reference>
<reference anchor="KCL24" >
  <front>
    <title>Improving TCP Slow Start Performance in Wireless Networks with SEARCH</title>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="B." surname="Peters" fullname="Benjamin Peters">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Josh Chung">
      <organization>Lexington Christian Academy</organization>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <date year="2024"/>
  </front>
  <seriesInfo name="The IEEE World of Wireless, Mobile and Multimedia Networks conference (WoWMoM), Perth, Australia" value=""/>
</reference>
<reference anchor="KCC25" >
  <front>
    <title>Reducing Per-flow Memory Use in TCP SEARCH</title>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="A." surname="Cronin" fullname="Andrew Cronin">
      <organization>Akamai</organization>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="B." surname="Peters" fullname="Benjamin Peters">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <date year="2025"/>
  </front>
  <seriesInfo name="The IEEE World of Wireless, Mobile and Multimedia Networks conference (WoWMoM), Fort Worth, TX, USA" value=""/>
</reference>
<reference anchor="HYSTART" target="https://doi.org/10.1016/j.comnet.2011.01.014">
  <front>
    <title>Taming the Elephants: New TCP Slow Start</title>
    <author initials="S." surname="Ha" fullname="Sangtae Ha">
      <organization></organization>
    </author>
    <author initials="I." surname="Rhee" fullname="Injong Rhee">
      <organization></organization>
    </author>
    <date year="2008"/>
  </front>
  <seriesInfo name="Computer Networks vol. 55, no. 9, pp. 2092-2110, DOI 10.1016/j.comnet.2011.01.014" value=""/>
</reference>


    </references>


<?line 900?>

<section anchor="compat"><name>Historical Note</name>

<!--  LocalWords:  SEARCH: a New Slow Start Algorithm for TCP and QUIC 
-->
<!--  LocalWords:  
-->

</section>


  </back>

<!-- ##markdown-source:
H4sIAEhy2GcAA+19+XMbR5bm7/lX5NKxYcAGIAI8RHHa2qYoSuI0KWlIqtmz
PQ52AUgQZRaq0HWQQms8f/u8773MrKwCIHscMdvRu6uwJbKOPF6+43tHZvX7
fVXGZWKO9fXZydXpO93v60i/N0/6OsnorzLKS32S3Gd5XM4Xepbl+ub0o47S
qf6XT+enWkXjcW4ej3Vhonwy12qaTdJoQe1N82hW9ifzKr3vTyZP9315or97
qKZRSQ+MdkcH/d29/vC5Ut/ooqQ276IkS+lWmVdGqXiZ849FOdrdfbE7UlFu
omN9a8bc/3lamjw1pb7Jo7RYZnmpnu6PNfpSD0/H/n7/NUaiJlFJoyynqiip
mQXdP7t5o9Qkm8YpvVYV/aiYxLFaxsea/nyjJ1FKV42O8jxa6U4801GS6JUp
upqoMI+KuZ6b3NDYdV+X2UR+KGgcuZkV9rfVgn/ReOAYL9OP7pFj7mZqZlGV
lAU94e7LS/K4iqpynuXHSvOfvv1X6zilJ/55oE9BYe0vC/H/OTL6Nkvlpr+X
5TTRP8ZREZVEnYm/7tbwkW/5yyCUIaLt7e7q9/HkweQFNXk17elvhru7/rFJ
XK6O9WWUJ+Msz6r7eU9fntR3symNZ3f4/GAUXKvSMqeXPqVxaabgstIUOpvp
k4XJ40nknzSLKE6O9U+RecrSATPT72WUg0m22EyTy4H+QzSZZ5mJW1ShMa6i
hT4pIxOvP8PUuc3yiSmIcfTHLFmVZjJP4wkRqyApqUqzRrLbj+dr9CLi1G8Q
vVqU8l1spNPh7otfTyfdJtQiwtwe7NR+/7SMB2ZababTm4G+aFPojSFeuoj/
8TlmRhMZJPGvYZbTJFotsyxZZ5aH9Xv/NzDJxE7q95Ni4DhEpVlOzBM/mmNo
Lksrnc8mo+HwRevSwWh02L50eDRsXXr+Yh8LePXmFE0cy4941f1Ir9gf8egx
Kfx0Vo9C69M/nI72RfFZG7Vzvljm2SMpbLE+gY16ZebRY0yKOU71bZybxBQF
2bHyKcsfCv1E1stauB1usKlVacBNtjghtsizlNpqccXJYkzLLvd+E1P8HZTV
f4fN2KRL2g1aZaK3taW3Uf/VQH80NK2i3eIrk/4ULWhV5PYvDlKvEfu/R9gL
EjRTgH2JRz/m2cQYoAqWwnJuCGqcnVk8QtydpVGir1eLZVbE1UITyS+yCV0C
qLk0ZZ4tsyQmOKRPCKjUPNy5OHl/efK+29OvsqLMUmiGnv50fSIcTVJwD8Uy
L8tlcfzs2ZMZD2oBf/YfTuqfLaMl0e7ZX6t44jBZEqWLKO2P9uXmYDmdCek8
UtunX+m/P5xebBdJAMNAIj+anMU5nZjfKJT/X1T+bqKydeYZwd4N074wn4kF
SqZJHhNVwb6TaGoWK719Pf8PSOONEz96M5lCIB0jkvxk4zgxIncEweMFSW0g
cJMsnRHAB/92brPby+ySZI+4uiS8ckJeSR4lcSSc+81/Vfqs4D1lT4ts8XXB
Y7E7HR00xe6Kmp1A6mhA/Rmk7tIssnylPxUsbiyM/6/JljfbbaudTnNyaTeZ
7ZOHiFDRP7Ss/mMK0hvygtEWpOnmT4Ehq6MDYP13/3p9c3J102T+G1Drnk3r
WWKW8ygtiQ6IWjRt0K9h/euBfhe16HYdkS4jPqxvtF46H+iruTGt187TnzIa
lr/ToN9ptlhWoLcny2OWDPTBQU+n2UC/6OnlckDTfjHqE17e7enXH87JSxgM
Ce4/+wkeTGrKwWh3OBzs4r/9zWZ/msUDWuBnX3uzQebdI6VMWsLr8NO5Prt4
Q0P+M0HzP9GfH3cQoen3+zTS0tydn12/vXtPPymFa9EYqnBSKgXiFyB+wQAg
LvSUpn+fkldSZjqPFktdLfEjFi4VMoA57okRCRXpZRanpQIweUhWPT3NqnHi
1jl47ClOp9SJIWWkyX1Mp/0yj6ldYjtNvlCc4AXVbhfDyfGOIXf0CZGbapmJ
niTbhfgL9RKMnriqMAP1CT5JWRFuMxgTHrIRG9IBafVZtye9WCZmQQRloIdw
Gj2gTqsxSRcDnncrgUdfvljW/vlnPIVo0yRCvGmZk59WVrnhcelZni24A8Ud
9LQplmYSR0my0tkj8dOTA1ZEqwcSxqm5zyPAT76gKyJI/DcezUC9y57MI5xK
DCWrSjeaXkCHYDJllumEZt7joVGTqkpTQ3qjIKuglxF5+KVOsqIYaH2TYe4E
BU2bJMsaCIKAcYEgYQUa0VwJ7BbkrnLrTN3r+sUzzP+k1Ffx/bzUp++yByMs
0hHL1tWRj0x++cLYlIjJa8tN8ThMOiUiTaFZSWmYYjNzjGmxp4DiNKc0e0rM
9J5+n5qEfFEIMZaI6T4jjzqxnKBs4xMR7cJyB79Db49XuIabUS4igPvmMzVT
1o2bqeIHe7pYZBk9wU9GE/brOeDKy4hlSCcr/RjlsbAWtC177bS81Ih9abHI
INny0iSiNYrLGK3j8bUFjmfNMctQNI2XlvWJplaSbvVDplW+NTWHI9ggQeOI
XhFxUA+IuSb68WAwPNQ0lsraBfMYJVWEd2hNmW9v4zdxT++/fXZxcybDS1iq
ySKoLB/TY52Lsw9dvnNvsmKVTuZkwLOKXKG3uFFAJslTksmCB0/Is1oVsfO7
VG4KDq0Wc2qZplIKh8mgSWriaExSJFTxcmZJE81Knv9XNYkekwyNDa0SQJdF
ZKFciIpcxNNpQuqSXMCcSDLhtuyfL9+QEIyJosXP6ofgD6nT+ZooLchOR2lc
LOT3gtkbfdKaR6RhmeHI3sVEJZrZypQqj5bxlH6O0wkNGrJWZk9RPi3aapXn
RguxpPF8jhes8LwOVpt1cGfylE67m1Vx5+rmprumQJ3ybOpJXrHmXEkeKmqV
WOtXKFDCTsx+PWqH5ETLwuNyVOtTVevTTbqe3iXFSBLhOoD9igtiEVgM8xlq
j6REBcur2YSAm4nDsnKDrWKiEmdCleF2rchZuRK3E5EnVV5GccIz/ZZEicAU
mWOoARLguGQBh26q0gpaCtyurGgTRSNignJMgxIOp1GTvinjSZVw40uWGdK9
U5BjTqpUjUmknuJpOe+T4Ef8CJhSd169/th1hpmkzAzuBz1NslaLWtEV/cr8
wMtMo7zPWbw2MYhVehtESBXVGEkfchUJBunTLAUZmUdMQKyWJaqJLYoctPi2
0DU1vBSGliroHtokWMGeahMLokg8OfGq1wYqEgAt3RknGbRYV4+zksAo9fFA
iMVUBrJONtAbmjaPMfNZGXsyzvLVWqk2VmpBbkqZsfLZaI+8bQF/p5rkjKdl
LY1tMlNPlh28xfFGDg1bTR82HxVBD9Mqd3JPEvQIjYKeaKkumBLTeGZBfUEa
sHwyJHbt8dGo1Lq9c4PnFZTB0KqRXZU506ADspFkKqdsvwYbmQKbxBrKv0qm
LPxiwGDAdVblouqgun477hhoZ05oOg36Lol8k5iUnExJyNkAcltg7eclTYUa
I3hHXLSISBdXpO/NPSOmArqgc3l93VVgUNa89SLyI52T0z90SQVODNGbVBdN
crH0yqlEtnQRky6D6popIqdrvBBLTes6QQw+UP9CWWtrYGakY/BDgCndaro1
Kqp8GRWF2WZqAuixUtzqNKOHycmQjg040vEP2QNyJSI7Gis07cVWstjaLvZ1
G7FB1eagUZsZ7XtjUmxP8cRsRHJYDpa1+0zwbhtvWU0RKVKuhshE84WIhijM
MovHbRYzelnyPKQ2jHYlpMciEVyemBAZxmz5U+BD6xdAOyviKbOEVklL+Auz
ECh0Ak8CvNR0JLpusEpwqYx0QRCiymtpXtm2uMcCfBAlIBJrwzksqIP65ApO
8njsmMHODNpcGDGEZl68eso9sDfQJ8yVmlnLCln7eUgh8Rkxe0V8sjYGIMP8
ngDU30TbzbKEGAhBACOYbKQ5mD3FKFmNZ0l2v1KgOAGXmNQygxXQ6ZFMl2Z7
XM45iQl3qgy7+yff7J5qzn592NCdwAD1O/t+KOqnisQGbMw3sFT1m2T7IdpF
/eKBbtJatVxSEpeyCp4/DB4vDC0MsAcRsaC+c0Fn/6Tcw885BFB4CcwNOwtp
ps9P3p+0X/N9HKlJwn6eCEhDX9FjoK979EW9BLlxFoZWUt3UC8IvvKYF4W4a
sPmHdQz9YFZgGtKpO5efrm92evKvfv+Bf746+5dP51dnr/Hz9buTiwv/gzyh
6JcPny7sffxUv3n64fLy7P1refny5F93xJHZ+fDx5vzD+5OLHaxs0+VlC52R
pqFbxGNkW0tnemUVGKddvTnVSJv29CvCBcN99eWLTaQS2kUX1mKSmjF/rUhw
uW3iSpMUzCEAA+Tf0MXT7ORjiwdAz/O0ya2iH8H1egf6bgfSwvxNw4GDREtG
YluU2QIqhowBqVt2/Mgzy9KVFAftZKSryx1q/zuyQsff0W2uF6phBvrC7TEC
ad8Jxrm/z809JtMpM4K7XaiDTcBn5TQxtE2kyGOGKWcYKtYTDW/zUqizE0FZ
yJCLIz125jmJFzYGpHS0YNfbKUuZAXQrDOAAwCBKV/qeBpRy3z37iEThLWcp
flpaEKanCwQUobbTirPIwOLOxWZjhmSg6EG+VZSqSYV2Aw7ykFgwRrAvY7Z8
z0KAXAXUgeWxZK+DB6EBgsHaYiQB5zwYBDpo3kfzG51A21/7HiuyGtjgLw7f
qTbwdbrbQRp0dPPu6uz6XTATjQADvTZGBOppHk9cbpEmT0ziNJMs8Rp6FIl0
QHMrluRQAZSRbbqujNuohLQoIOptYpZlAwhu9kA3wA4HaSwicrirjnRucq78
TNgewl3LNhqegSY1IBcD/CarXY/DAh9FkBYFFgWB8mS28UnLOQ5tjeOSEUss
oG5FTldUBq4ru5KkQ7b2LD1CZS4y8WxS7lz9is7DCNgKfgStMIcG/BqrTUFP
Wt0PNN8JdUPunSA465BxoKV2kFg5THLEARbIegDrA/rAuW2E66w/D34vsoUP
V/3RaSD3cCxEiMYFSyKB82Bp+5rBZoqnuJUmXNNhCJlHQUsuYq08HNQGOmsN
pzeWZ3MEQ4BUOBsxMJOojnE2ydPEzLyQwoXwejcsmsye+o8k9IhAh6ULJraI
HmgpSlUYs6AZPwhEZ3OxnRHYx0TkAKarjsOq+tU1Jge676E3zCaGWgr7Y56i
RomLN0oekzYuLUUlIsCBXIMMyYZIrhDT+wVIpDwULSZTa+BaAltFErM/Zq2c
wCZciERaiJ3BXeRREEM6TECdFlkK34g9CO6Qp0p4gl6vqAenkb3RBeswV1MX
85iEGjAcy0VggSN3C0k9V16FOatnObo5UgUCOpM/FWMONECiScYFdoA9Zdj2
np7Fn7FmYN6lISaakuCQTlUuvgSCo3mHCqih/njVp396cE28gXVDMOxsto0L
u8z0gkuqj8nhsYKA0L4r2kmyaKo77Hs5C5ClxGZk0+7vkdi14kO9UxNk7Qgp
dWszLVQKAFuhpLGW2AhvShj+AYZDLCWmVrC5ZnIwfCSjRz5eUZqIU7I+JGDX
sAtbVRupD0hmPJonBKVbf+gxiWQ+xuZpmztG+AwSmlcI2KZB2CoH6UGKLhbX
Ani40wmjDjIyCedehv1RT4Km7EtFLjPFgE9wVpaSWopR3lSPwK1257YL0SKf
pxlrsY0JwtAB+sCNu7wsu4zLVRhwIIxFWJb+7eAHbneSGGiIgVjtRUSriOjg
VmowHWI3t73+cFcUQJQq4qcGYtGITxu9JxGOcZY9PBizJFYDOUhcHCTw4ZDW
6BrTdfiM5+i4C8RDrxYkrpQFiR2HGu/oAviBB7LfTFrZZ2mibV0aN7tsrEfP
pu0wRI70cihhU+jEB93DoasOyWAXL8K1IBBbFfrWUepAKMXaI1o0BLHHWZeZ
BEjVWlc2cOqDlrT8ZBzjgekNZBy+N/Lr+W5jBPaaG46l12EryRcEbGzs82vR
Jcd7fkytB1q5brIQyD0JoBUFUXFgWBB7iBvXnR0E463yag8DQFhtyO+YjQkc
txLPm9Eq+LL17GV0YvEY45uE63fX+mbFsZCJ9RWtxqAXvNZ+OoXNppnlNWH6
uh3LUuImlJWFANZxAxSSTIh1kW3Eae7CuB4LcmC5Fs4jhxFkmlv8ow4u3+FC
12Y3nCko5/TqPCOs3hHvRLSOJFl5ou6+B6MuQsrskbbTBfA0nKNx8fbD1fnN
u0v94Y9nV388P7tV6j/oj1K+ioE1J8dQjtXwWOtb/YPeGxzo77TTglo/e1Y7
RcwtsCdqRE9Dhv/8I73y5Wd+7IR3vWC0AazzSlMp6hTaJsphUKZNLdODBHWP
FdeTUFuflhwibTcyUHvUMas/c4drrOt6uqGwfCO2fsbLGCdygsREkKwfqH1q
GA/e0cVHmpQVXv7V9gKJ7+tb/qGrDugFtPbLL6C4vfS/YqL1EOdm8oDlZqcH
i1yHssmqHFIf4Bs078fW1yNaId+1ek4PeQ6jJ/mfZ7rTeKqrjugx6qhmRv3y
B225jkGResHbmJiP7sBXd8xXna4a7h5rw2xpOYitHcibGBq2RwsbQIIAhRuL
i/jx3wAROPk3z55Sjw+kxdw4S1u35hGJRYZw3NjDZ5hhuFlnpJQfVP2+9KD1
q4qzwVnOIYCMNNHUWIA3hV4mNYI0QW8zRPAbExB+dabMGlxOZBE0S820pxys
XXeFGm1I/CoMXwm2HahLAh0l/e9MAeNijtKRgnqMEY2axDmnK2VjmpTykHYz
cBx4Zg9GIUYvlBQxRh4lRZBaoLmzkXbxAttaEGZi3YyOA8dRxkfc715dS004
SAC55FHXSYi1l1svbbDZTVNEsIUgZDSdxjUyFP/NYupZlpVIuNmI/HjVIN4i
SqN70rGgH+pKink8Kxl7TQ0XRbTQl1syNsAEN4kH6BKgHdhjpe+NS0jn98ay
L9kNgilc3Ul8dnry8Vp3HOZ93mUojxAUEt6FXTP0eP7+/Ob85OIO4ZVOJlBS
D7s6G4MLqFeMGQ/O4pxAVjuE5tMxsRc1VdsBOzQX6eSRnTdxtx3ji/5wJIME
ts64UguGRRl2IuNizm5SE6Vv6kP/23ekGP/tO515yL/HLDF67my945xiRW7L
wkZvLW1FHAHFEX2ZthsPLYNEOMvSTZ1E8c5ao05Xz6pU0gkdVhdK6Lonc/TE
ZdvJLxErYXLpWtjRibtywdT1CSPeGs74YJ/HdnDQnnEN1pQPyF5YHjliylsh
4FwTwl81U7VENkxAB+6wZIdvz9+//nB7d33+v8/YrwEKEB8+dJYkmX+zofzL
qifbJrz1GjNOLeYnXwfeGETMsjN5PU5CqfXhgQ5+Y0nsnP3p5urk7tX5++uu
vSKOrYgy0X90oDrvP13KIwyvoqSO3SBw4WPcW5C2RWTbg9Q+zoPSm5iWU0gA
j31aSd5Kdaj/u9efrk6QxOm6VQxJzLGSWtEE7hNNyy7JOhx0visNcnewd2DR
obReLZeIXrADa6vXlkh4FUUMLtvicHxlntYvVNso1anhbbcRNV8HoeINf8Zm
JfFJfJihc3nyJ6zW3R9PLj4RsyFSNyYHBmFJDruwiiTFBcXUSl945ofyIQOH
lenbyEY7NmB3l9eaTPzslr7jYhensBjXv1q5BKkYBCavi8zoDq3WnUEBW5mp
XQRUYlcpAGfFRGkR6F5fYSVahi3LMokmNf6Q56hRjiHTRIO8kNTr+UAfh40I
dLiZNLVOwQGpoosd7z6GYMsoZeXJCHITTi1I10DkjSFyESMrVuP5igOQMs6A
FNbIWWXqtZujkA0AM8wgOEHMKvjO6lWMreeqSRsNczkaPBypmMU95N+wRWgi
ES5xAOpIA2OizPkFECjS576rfQknNe9aKzZ63t8/6vYkYi9MF1iqwuIGjjxY
M9WV5NDYuN6LamLr/DSHEMeCGzngPuHqyY4rSyR9Bz1SLBEcZj3W7M/XWDPk
KjNOCNLo6kwGVBH1ojyxFozV0DcEXOjmvFMyoD4EgXLWBZKQrEXxhgrfAPcJ
uUZHvCrNLjFqq6pqTxSaRvw4Bo5q51IuvKKndlAXUNcecEFwEslWxm5PYrCB
baqtluVf6DzgmL/wj3cizJ3uX6zubV8OjDevqzo47B+OUNHU95rB2jKwE8IC
n3WHXSr+WYakC+IkEgwSsixXHf7tTn6rQ7J4H5Ih0ULP7Fo7Ah68cGydG+WJ
RbaRFLtp+dKwh46uQs6e7+QrtoVn3wOg7G0O82G9LIcf7nIs6XCIQN4HjOop
RtB9bY3Rpx+uE0BwDHPvTvEQkwhPdxQPNpRCj0xZgqB7ONribkO58aqhsE4a
WW/DYdYky5ZBfHTY39vzgdB9+3TRMFJr6zn93Ip9Nk2taLu2ABDou48gveVq
KcVfEoBxsj4UBuAF3jtoDCQ1n9ua0RuJLeOwfbLD1JFfWC81ucwxgG4yQBAb
3zvs7z/vhZkC58uwqR1zJVkqaeppZRCKkgLdSFXDw65NYdemt93QzOuodh2B
tKMiXe2NulLaRg1MuTYiLmxiuBGmxmAYCvS8Zt47ZAK22yayi21iAfSIKRRO
CdNLHZrAI7WLYZzP6kenFnlQcwwpgrIJVyEpD7jREamUgK8GROk5ACaGUMAJ
kQ/jsqXpTqOJ7tl70d8ficeoRYl0rYVEb8wc/GPXJuRRYQ7QpLVbWLW/198H
2EuSppPriejZeCpGXUKDIb08oG0STtRrv0naAHZLQJSUH4Z/J7/VbCmwGy9j
WVsaMrDKmIXaPwReiwpOr7s13z/qtREFiobsq5bKgSJRbqRu5hKYHzRaIRBD
j2zgU9VMZfQsiZ7x7GT+4UQdCPORgEBF9ZxzetAfPreohnSojZF4qypR4lkM
X5S3sFWuWoKVICtvTuYVgfq91Z3hrvOMgB+ipMiUbRowgHmJC/bHK1e/jVp/
G+D0jhc3Uys6skDAPtYY8WzC8TaG5+d3JM73rm891LZhCHWTp9RwAwPrZsHg
xucDTykuXK8e3DnLrhrxVQj7G2Ln7WPp+ZhNTTMFtJRwuMl6RIHe5mLbwm0+
8OEtjEnK7rJE7NmK0fGMA4DwNQgPxCCwRrVQr56AB6BH3m/Zf9E/GIaE3U4R
YQbrH5CYcnkB97zDjt9O8Kqjt3hjNOBdtu9+iLhidRQ73FYl73DVxHpD4mXO
4pT1a27KKrfRRXij1cKJiZtpb1uCa2shf2ekP6s6Nu31y1bP00e/u7qRZlEd
Aa1D30a6tn1uk1ftwO6QjYaSssagoq1pM+S13pqf29OO4kqsn9eoHo+uBdNt
MGjtev1KXASBoVH/4AB7EOYmbWxysTuCXPGNz1R5d1GkLVrV1ZiIEsXSBSQi
gZZV5jPxCNDOUyZF2H53AtcGWU51T3kvgjBPHtlqs9r9IN6qyb5169fYrDJe
Kzh6rlTI1iCyfpxWE0dJRJJYNffcnjnnnBeFrKuL3/Drwg0HB12nbDeUarn8
2N5gWOfIbGrso/dDOCEWRMX0D2HgVX/mCJlGHgxJs+Eu/bx3rOtwFS4eIKnk
glN04VZ/Hz6hkUIKoR0eCXp8Ri9opICE/eguQkBI9zTwCa5/fkN/OKE0POyP
4xLJnsvz6+uz1/zcxfnl+Q09FyXLeURj74RTeabX4GUYS+l0j5EYInX0ZzcV
yflxVshBbrrSH2o1HB47/x/DUkOiTwgS+KIK466bkoDt3FgNlz3GHqghkRvp
LHjl3+mXPuwgOoCGgoRe0+lXdrd62HY7x2FttRoivSfpM5men2lfdxBDbpNt
iFwdj8i/9FLfslpSw+eSWatdFGrFPdbVvwu5wg7fb6ynwV55Iy24g0Z3JA1u
TVgG/dz2/NhplDbHB9NA7/BMFtm0OZfW3NRoV17amu30M+be3G897qWrRkN5
PcxRwgAE7fV1oOCfte5SCyNp4evpy9GepfKGDOZo3+Y2JYupRry88htIfLaF
DdTo8Dh8DG4VsS/dqJPUzQDVAHfeiS8k4R/ZXb7ubHt/0cVgkGpnrC6RbsYv
XfQc2iLyXaRHMn8D1eDvYzUiRgv8SRBa5KNfy0dzcUklDX022gZwkKjysaIe
B6qWS6l3lzx1v//Sxmhscc/oSIQx7Pvlugb6938nBX9Hjd1xY0i7uLVjvhSo
oZvBHbVXZ5/dQAH9sEdXsp42qsDb1pYR7woA89Q+w0DtEQ9iXeNAkr8fwnbU
ovJ9SDrqlpkOei9mEQm1H666935Ue3syQHSg9vYDrfj9D2Gbau+gVo/NW8Tv
DZFzE93MD0Emce9QmhTf6Idmvuvly4b2VXvPZZnqF17qVjieV2OP1UvoGbHi
3uNFIsiTmK+1ofatvmg0QPMdqn2rCoKXX/L1kRNHbp38X/zuFmwX6+TIr/b3
fRt/jn/kBsKO1L4XbXqfnFCeSmiDvm+/8Lzmr/2j48biblp5GTlrAFdhshHF
i/TUvoPU2dZ+w4yjNGgGjGqDRAYbOTt+yzuA+6Dp+tCohtTs9POo59T4Lon+
Pi2O1c0dJg09QBzeHH9f21vD9q0ucSBaUwe7tp3vg4a2NrPeSGfYF7V/QGtt
BZrLVDBR3iYboOhxnWzxW1AcsBuoNTV+rA6IUQAs140yTMZ2WKMOiKP8RvA1
a2lbDC3lAeQYY+r/UL+oDoi5PPL8gR/giV0F2jCIZg9UU5fRBA5boEkdPN+A
kQ6OQiDFOlwdvDiu0ZDTsbcisYcsck28CtvucOohC94vg80Ri4Kr8rHzqVHx
+pYVpW4F3F+v5ZG3VAP5gqBWWZndMsqigwWcJRUK9aTEhKvXg0QJol+cKqhS
rh8Ut6N2Objiu5F/XVRwpG0ET/vYiiJlGS2Lik8KQP6OeHFWJVJ3709O6fFO
Bym+CWuCONfsi/kyWK4lfJuU1ltioAGzyzaSornLhLfTcHvY6lAfBYC6AqTQ
lxhBYyZ8FkCEY0tQZghK+WEG1TfQnW/PPvT0Bf6CXO2/1Rc3Z3brhzuVO9hj
7hyka2OCo3HwoOwzLQYblw209Vuh29TFNEtXWJSNpfbKFvfEE50VkzhJ6iXG
UzIhhDhr0uiydUqCCt60hUZMFj58W7+JaKnfZDQ1epWP+kYdle68eXPTtWxC
dCqVL4Wp+6xrtZiK04xLuq1HO8ttobS9LjEo1TztomcjtjHveVyayO7+IOft
QL/7W88xmY3J4Z5iqvW0p8tkNXG7DLMJaQsc8IG0IO9EIE1XGJoCtjW8jW1y
V7kNfSw5HLbHsAKJQa0KN3K4u6sXhRyrFGSsuU+1obu9wd6eCw3czCucC9RY
fN+wrxnhKFU4IMsfIuJadj2bDecTSWoa5Q2rJY1lxsxKbHfLkMNxhyOT2yCF
68TlfqcNKiijIjzFJAJ38aje2udklYghiOuR4pnztlRa1jjFBlheNqI++fVY
siLDoTDcrfLT3R0M64W4RQ6MBvFt0Zh4TRtHc1/ahoVP0LClnSfy34PGnEtE
6TDBcjnWxLL8RYNe0B9uB5g/d4HDPxFOqeaT7LDpr14gkuFyG3EPmbZ2p6ul
ipuoIuo+b5G3PWNbmxAOynE4iK0CBt9CzdHgKKhyCtuOC5UaM0Uu/cRpPAfK
6PVmeVT4Ig79MdPCpsGKTG1eF14PRBoby6HtcoBhn0if8B72tejlxq04N41A
Z3B2md+6t6UeSGJ4m3bC+Vxka39HsB21UU1NNLsnG1cG6p9PsOGMXPuUPCKr
rWX1g8Y2AVPEuWyxti+HGxcSPv1GGPMv1I+zod+600HGQt2gjmqj1QfXohnZ
giXVCeGxedKf8qdAIblQGdnzERe+8MOaD66+oZV63Tal245rkeruoj4PBXYu
npooQWHS1B4YAerbIjlff8d4lHhkaLW3O6xM9vZZzw8yvXErhT26gkXR7pBY
8u6KlEB7T5M7sd/TRz09POypwWDQHWifDGtujA2PRdyUw3ATU5MoBa3dOWI4
r2CJw9d4HrLrhAgHZ958jlCI3as3XXuRdUdU7X8WTrISbK0BMRKfunaAyppi
24kttimA/jxGTCacrPVoGznTtVdpADWNBF1uSVZgO9vebs/HzO1+mU2SFDdL
8lyJpzUBDmix/ghzRpt3mZDO+JvJszCHyXTGIZqFPUVzYQjGErxNmiu6eRf5
EsYjquSkLXs+iviobrFs9dY27pAaXRfXB6U3cYvdffTkIGSbFYeH28hdL83+
90ffDw/pP/Jq9vc3rWgjQVi/OPpeXsXGl92Bfke3ey0aqw2Kc/S5sXCbGm+l
tFRQGsu2p3O429/f7z4jY4XA/ui552QJFdbs7Nmj7oPP7tqSK7OEhLUBNQ8R
4Qv+Uj/ow30/us2s5NeiMxwdkW99uI+wIb2GkR6wH1AVNZ18SYKvnZGDjFih
7uqOzdw0taFind2VytYD3YG9q09QXNsn3RVlaHty67DL5+zgfW/m1jZYr23j
h5WAWqp3UvmkHQ3Bl1nfZPrepNhADY1j9a11Vubx0pYGzg1NjTeCyIa7ZZym
9Tn+ZNLG7isTthLnrxUOsJvFkuFCdOg+r6tk8L0iaUiSWmvGg1b90Z2DwQZx
2mfnhpR/je/cXuTtlbxBuN2xwvZUuurUsfi2dIRsY2foE+Bh9RMXPspmW7/h
z5ryncCU78gzhPhYgq0KLIzhnSoKuGZSbnjLHuhWEOJCfT4Si7YMWliK1172
5/cU2XrGBYK/H7N42j5B1xeWFmxrxOzbibBPwhoJ6bgAv0hAc4LTClK3FTUW
Q24pI8MnhmNeHsnGfGrfj85HBQj4vfflYq84/Our3L8WV3kd2w3965rWa70U
ZV+yeR6ZVrtjlndbfVsoW//F+9aRJg63JyE7wq/L9hi7wcIeBFfvKVf+iABG
AnJ24kASsv4AvQLnC0EOCmmXE+gcIk2n4s36ks3a7yZi2FnYCjwysym9yTvw
ZQrKzGbkeuBx0ufuoDlWqTxpu9Ncrsxi0EgOzpRtoa3NwX5fPYKTvLGgDvbw
+RJTM4mLYBeUi9XCNvK+IX+4XIAMu9I7HzwqqNUWBfF15Xco2ZL5WSKggM/T
K3CWAoYcuZNrARorLrOQKp94wbISY9drPBPVRsTGaRIWN7UqIl3RoNsoYrcB
BIeKtqE4A044QKgnj0gd8q6eT4WEuFu+FjlLYi6DbSRC0EB46Dne4KCexDky
000jZYtygBHtc1mriyk15pjagBz54sE50hJYdCGxMCJGY03B7oWtKaJ1Zg/C
uOOxI59w4+JNd9ZYKkexCp1hAMLeosKFBfOKLYLYL8+HDqMMd3XN7NKg1CxI
IgS2g2UCDnOwH5m6QnUcCaHHxw33yFY4Qo8EVdm6007JfUWZWI0Cimwuja9r
TDk+bnHN8NnIVaiB27Ar3MIFbqUulPMH4PCOyGAPgg7wQpgnVXIyJK2SF+tG
nX3PHaUQbDMuIISo+hpbS6C+koeNU7eLXXYuOBQ0NnJGDmk2zuYsYvKaaBHW
Dxbt+ZobBO7nGRexEuaoEt47CIEm7YbrxcZaf6kB5YJrOyXRzQwInrL02xI7
CQELZrHfGTqzoNzVWjnnLpttsAKBd2Y3hoivPueSp8kDn2HmWpCDOcZ85DXv
SxYvOEAl9tRJWi8cEC3xOq2vs547xY7n4X0ZHzRqKZTgSNANhsvaHccQhWd5
VlzR2vnscuqn25YqYbDmzGwVmTsxAKd48Dm/qmgcelVvHqp3JXRoIO3tB13Z
N2QDRD0VzpaJ0Ci2FzlxBVdet/GRVXZLhRwuoKgTsYBrYttrnnwDksqmH/zG
AiUQEZBWrW0BFcmzEBQj4rogm37qN9wWajVbkIGf+mJIu6FD3sEOPBd3iQuH
c8oqlYWxMTRSQmGG+Bd1zisHHPnIXWfneKMJMhOno4NmZgKFvfawLbBCnE4y
/tqH9RbYWlV7IxccllHhW5t8FEWwpRknOXxtJyCY38fH1gpO0fd3Dt1+58+W
wMIi0uUPkWcXCYMonKqRKOXMPJGCkp76XGIOhQEprY7sYV1jU1fme/3rNEkR
TXIc+olCUWfLEc+PAIWgWLDCIhAehtWb5PvI6pZ9XzVLoj0lUIxdWlxizsrV
UrSxnRkV2QXW3AXunEtQKpM+xnmWCkAEr035YFKLT5tlbG6vsy3ie97FESeY
CslkYx+FhUdMQClIFqy/2hCMsPsiBRqC2v5gAV9Bz5U6srkOKxDaOKnFzhn6
RwonLPZ9y9wPLAu+bySGFzZCKMIC3Weec0soNTzKhkzsNw8qxKJsdY9LQNnM
nOPOpftYk0ybU3xz4GyX6YBQFqSY+YSbAM/yMhPyrr8qgTOtx2TewoPTQ4Jk
XHpDMjcxfV6NXPY8T0ke4CdgthVOTObArZvjkZ8iX8dhLS4whLHb1QqGrYhL
BTD5KIQzpEEMCXNzu+W5+rXBnHUd/bSxIaAp+v4wN7SD/OqMfTtLHIhOv07D
MZA4/fgpGKrd4MfV94TJTDJTcpBqcN1LYq02+nZnpN/5xDv57WHRHvbw68E0
AnMVTpOPcWANZvdGKbv3B7tM/G5DexyFBK9kPnU0hpkbzciIob9LxWiMyM7H
fS2X+kIqsnTnL+0Srb/8Mkh0+27C474dIzPzAl3YDtyek6WcBVh/l6R0cZi1
qEewYbB5rjVvzwoO/+aCGj7ZZS2v7euaO+x6pOER/30B1eKeIzbl98p36y6A
IK2CQ643iDhtOSZoHuzEPLKNF040HFUCMvQdhR7jSK2vgkc9wKCpLbTGoDQ5
x7kXeXtcLapEb/3Rgr3a+DCm4HLwoEpFqddmmWSrhdvjEX6J8Uy+w/L1c5Nb
RSH1O1DB8wpfU5sWAsGst4VfvJXiIzHb9QoqTO1J3UJY24+ZNj7vgbfcxeBL
RXxyTFEfg8CcHyVP0crVh0uMaPvBnyRkyjol4ac88BwnzHECnNvc4zMygaXg
g4LHBsbMNWk/WWW9QA5CyZmKPnwhx7M73zzBoKVzrFeTvpEv+m+e2y0fe8iW
0M2s1uUbuEk8zuFPdfAbTteRbTupNotKamkaJQ2uFiaJ602PzY4I7ScJf96Q
tda8DpM4rm/JiXzlofVloQ0UlnKEgQ6nKwc5MyrNcRT9psE2Vhy4yUV9Is0f
mkuV/fCUO6NE0iN7LuOsO8P9/9ld20kCGMLgZLxSvKq+cM0lMXj/yYZMiBwH
T66hePPuS1iKZ7nmViGbKMjWgb4ZR06jMqjMQZNfvvAXj3/+GSJ83lz8az60
fbPE2lPu3R5tgHz3eR856x00wfkC6aav7nBwyJ+X5E4ecfs1/DevRLVLtJb9
DgRPMoF/LjouX7g1Zf91TkLoj7eov61lv3rC564Gh53/2X4C+kc52lPuLZ08
tMfsfNGiPvQhVKIRwcdCjmc9P7t54/bLuNAehoAd/uJJ0C/3Ofb7IyCKQXOw
jYZDbPox4TQnzrvX/oMTSeynjIUPTk1tDlOx4fYeMm6uEC7ICKkxm1rriCEO
9Jsqh6WHV4mDxfAJjoxUXX1M3NLIGdU438wFAYPzpGrcb799RqN9ivCJnaX3
DJkY+DYCkb0iSFNYJWfRmSdhZL8VxkF1tuP25KK8clYKQTTiiCjJhBCPxNxs
TdfYixMfca5mhuPx1OcVYTGOL8GPmj7GUqIeUBmfQMvXWiK0Ch1TYM/PyQQM
zn5HVvNOT+/Um7wlugsMBy/M5t/J8OAlku5qWSjLKvcpS2zjwwXs9thj8YMt
5qI1TIrvDiB85GKBOLPIbR4DqpYgJo7cgpaSk5wZwjKNENrJ45pReHceeT/1
F5wkoOYOKAs/t0bsWmaTLLHbTSXJgaocFRfBpxUDrmxO2vk1EsYIGEjCLiuc
rgxYjfP7T/zXq524P+WxnJolQSKQmK3cuk6xGwmCoywQqZnw/kOWqukxb6KU
zycqdS32jA9/+nR1QTd/575neU9qqRrjI5bPPubZTyTzfVQEmvxZOVneFYWN
2wzouZeuoWN9+/FcXYI6+Kyl+74VqH1BsDot6Im3Hy/+l0IqnKD2sXaf5/19
/c1e3uzs9gvjU6or+zle2Nm1IRe/bswACsnqWZkb84zzkfgGN+o4YDNfbmyB
vzgvX661r/+K5xC8fqn+K/R4df2aPJ1VYn4bURS+ECKfDjltfANkG8i0Rssb
BORfOIqHD9zd+5OcJH2arCQlZHsAX6IQdJlxYY+TCT7h2jsbrOqypD4pi5SP
y0DO7SGfcras2vLVEysVmvUOD6CMEFuebugmMKHQSAeHR8Mf2Yzjqyi/TJH2
h2rk7Ej5porsMCiknoHLhVEpXfjvIC3nOaKypOzvMSjR9jyI0ejwx54PeLej
totsClvC9TqlsWkiHCqvRS84G+cwuyM0LFQuzZAejKYokH7S7mhWIF3FGsV+
+VWSPjXx4/QxSx75IC6O0sh6u+UOK7aCo5e/tq6CmT1D2AC7HPhcG2Dp1XNX
3DgBX1SaO+FNNknVM/csRgv6nu1Uxt9nOZviowDHTTRi0xO5WWSPgnpE93k9
G/HHXdhRbx36tMYYSl0ieVDToLQAV3Y4A6/U5+4WtppxGheTqpAsJnwnRkKn
Nf1OLf2wyYEP1XoL06A7p6dXb7tAeNAVv/vF75hPJvn9Sy52q49l9GaMSR+M
g3fHIBtmv+YUuov+wBn7DWrSBWysENaw3772OIhW0ZpR0O/Kfx5ItenGX93E
UJR6x2d4cru8eF++YUeg/LlNbnrrd/+DXtMXGT18Cwx97OIMxzriz0vXn5YO
Pv3hYiOw5OySUe8vN7XF1/8TyyOmN3OLAAA=

-->

</rfc>

