[tor-commits] [sbws/master] fix: tests: Stop converting boolean key to int

juga at torproject.org juga at torproject.org
Tue Aug 11 13:52:52 UTC 2020


commit f075a645ab78fbce155c4940cf1327efb9f9b944
Author: juga0 <juga at riseup.net>
Date:   Sat Aug 1 13:35:15 2020 +0000

    fix: tests: Stop converting boolean key to int
    
    Conversion only happens when parsing a bandwidth file in the
    integration tests.
    
    Closes: #40009
---
 docs/source/classes_original.puml       |   4 +-
 docs/source/images/classes_original.svg | 234 +++++++++++++++++++++++++++++++-
 sbws/lib/v3bwfile.py                    |   2 +
 3 files changed, 237 insertions(+), 3 deletions(-)

diff --git a/docs/source/classes_original.puml b/docs/source/classes_original.puml
index 4318db3..1284b9f 100644
--- a/docs/source/classes_original.puml
+++ b/docs/source/classes_original.puml
@@ -30,7 +30,7 @@ class Relay {
   int @p average_bandwidth
   int @p burst_bandwidth
   int @p consensus_bandwidth
-  int @p consensus_bandwidth_is_unmeasured
+  bool @p consensus_bandwidth_is_unmeasured
   obj _from_ns(attr)
   obj _from_desc(attr)
   bool can_exit_to_port(int port)
@@ -217,4 +217,4 @@ class State {
   get()
 }
 
- at enduml
\ No newline at end of file
+ at enduml
diff --git a/docs/source/images/classes_original.svg b/docs/source/images/classes_original.svg
index d894dd6..473659e 100644
--- a/docs/source/images/classes_original.svg
+++ b/docs/source/images/classes_original.svg
@@ -1 +1,233 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1573px" preserveAspectRatio="none" style="width:1542px;height:1573px;" version="1.1" viewBox="0 0 1542 1573" width="1542px" zoomAndPan="magnify"><defs><filter height="300%" id="f17ckm9" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--class RelayList--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="227.2656" style="stroke: #A80036; stroke-width: 1.5;" width="258" x="1023" y="877.5"/><ellipse cx="1120.75" cy="893.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;
 "/><path d="M1123.7188,899.1406 Q1123.1406,899.4375 1122.5,899.5859 Q1121.8594,899.7344 1121.1563,899.7344 Q1118.6563,899.7344 1117.3359,898.0859 Q1116.0156,896.4375 1116.0156,893.3125 Q1116.0156,890.1875 1117.3359,888.5313 Q1118.6563,886.875 1121.1563,886.875 Q1121.8594,886.875 1122.5078,887.0313 Q1123.1563,887.1875 1123.7188,887.4844 L1123.7188,890.2031 Q1123.0938,889.625 1122.5,889.3516 Q1121.9063,889.0781 1121.2813,889.0781 Q1119.9375,889.0781 1119.25,890.1484 Q1118.5625,891.2188 1118.5625,893.3125 Q1118.5625,895.4063 1119.25,896.4766 Q1119.9375,897.5469 1121.2813,897.5469 Q1121.9063,897.5469 1122.5,897.2734 Q1123.0938,897 1123.7188,896.4219 L1123.7188,899.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="54" x="1141.25" y="897.6543">RelayList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1024" x2="1280" y1="909.5" y2="909.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="
 spacingAndGlyphs" textLength="153" x="1029" y="923.7104">stem.Controller _controller</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1029" y="936.5151">Lock _refresh_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1029" y="949.3198">int _last_refresh</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1029" y="962.1245">list @p relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1029" y="974.9292">list @p bad_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="71" x="1029" y="987.7339">list @p exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1029" y="1000.5386">list
  @p non_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1029" y="1013.3433">list @p authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1024" x2="1280" y1="1019.9375" y2="1019.9375"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="1029" y="1034.1479">bool _need_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="1029" y="1046.9526">_init_relays()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1029" y="1059.7573">_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="165" x="1029" y="1072.562">list _relays_with_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAn
 dGlyphs" textLength="183" x="1029" y="1085.3667">list _relays_without_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="246" x="1029" y="1098.1714">list exits_not_bad_can_exit_to_port(int port)</text><!--class Relay--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="265.6797" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="980.5" y="1190"/><ellipse cx="1096.25" cy="1206" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1099.2188,1211.6406 Q1098.6406,1211.9375 1098,1212.0859 Q1097.3594,1212.2344 1096.6563,1212.2344 Q1094.1563,1212.2344 1092.8359,1210.5859 Q1091.5156,1208.9375 1091.5156,1205.8125 Q1091.5156,1202.6875 1092.8359,1201.0313 Q1094.1563,1199.375 1096.6563,1199.375 Q1097.3594,1199.375 1098.0078,1199.5313 Q1098.6563,1199.6875 1099.2188,1199.9844 L1099.2188,1202.7031 Q1098.5938,1202.125 1098,1201.8516 Q1097.4063,1201.5781 1096.7813,1201.5781 Q1095.4375
 ,1201.5781 1094.75,1202.6484 Q1094.0625,1203.7188 1094.0625,1205.8125 Q1094.0625,1207.9063 1094.75,1208.9766 Q1095.4375,1210.0469 1096.7813,1210.0469 Q1097.4063,1210.0469 1098,1209.7734 Q1098.5938,1209.5 1099.2188,1208.9219 L1099.2188,1211.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="33" x="1116.75" y="1210.1543">Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1252.5" y1="1222" y2="1222"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="986.5" y="1236.2104">stem.RouterStatusEntryV3 _from_ns</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="986.5" y="1249.0151">stem.RelayDescriptor _from_desc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="986.5" y="1261.8198">str @p nickname</text><text
  fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1274.6245">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="986.5" y="1287.4292">list @p flags</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="137" x="986.5" y="1300.2339">ExitPolicy @p exit_policy</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="986.5" y="1313.0386">str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="986.5" y="1325.8433">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="158" x="986.5" y="1338.6479">int @p observed_bandwidth</text><text fill="#000000" font-family="sans
 -serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="151" x="986.5" y="1351.4526">int @p average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="986.5" y="1364.2573">int @p burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="986.5" y="1377.062">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="986.5" y="1389.8667">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1252.5" y1="1396.4609" y2="1396.4609"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1410.6714">obj _from_ns(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" text
 Length="115" x="986.5" y="1423.4761">obj _from_desc(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="986.5" y="1436.2808">bool can_exit_to_port(int port)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="986.5" y="1449.0854">bool is_exit_not_bad_allowing_port(int port)</text><!--class RelayPrioritizer--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="112.0234" style="stroke: #A80036; stroke-width: 1.5;" width="158" x="996" y="117"/><ellipse cx="1026.75" cy="133" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1029.7188,138.6406 Q1029.1406,138.9375 1028.5,139.0859 Q1027.8594,139.2344 1027.1563,139.2344 Q1024.6563,139.2344 1023.3359,137.5859 Q1022.0156,135.9375 1022.0156,132.8125 Q1022.0156,129.6875 1023.3359,128.0313 Q1024.6563,126.375 1027.1563,126.375 Q1027.8594,126.375 1028.5078,126.5313 Q1029.156
 3,126.6875 1029.7188,126.9844 L1029.7188,129.7031 Q1029.0938,129.125 1028.5,128.8516 Q1027.9063,128.5781 1027.2813,128.5781 Q1025.9375,128.5781 1025.25,129.6484 Q1024.5625,130.7188 1024.5625,132.8125 Q1024.5625,134.9063 1025.25,135.9766 Q1025.9375,137.0469 1027.2813,137.0469 Q1027.9063,137.0469 1028.5,136.7734 Q1029.0938,136.5 1029.7188,135.9219 L1029.7188,138.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="1044.25" y="137.1543">RelayPrioritizer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="997" x2="1153" y1="149" y2="149"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="1002" y="163.2104">int fresh_seconds</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="143" x="1002" y="176.0151">ResultDump result_dump</text><text fill="#000000" font-family="sans-serif" font-size="11" l
 engthAdjust="spacingAndGlyphs" textLength="105" x="1002" y="188.8198">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="146" x="1002" y="201.6245">bool measure_authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="997" x2="1153" y1="208.2188" y2="208.2188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="139" x="1002" y="222.4292">generator best_priority()</text><!--class ResultDump--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="176.0469" style="stroke: #A80036; stroke-width: 1.5;" width="199" x="899.5" y="507"/><ellipse cx="957.25" cy="523" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M960.2188,528.6406 Q959.6406,528.9375 959,529.0859 Q958.3594,529.2344 957.6563,529.2344 Q955.1563,529.2344 953.8359,527.5859 Q952.5156,525.9375 952.5156,522.8125 Q952.5156,519.6875 953.8359,518.0313 Q
 955.1563,516.375 957.6563,516.375 Q958.3594,516.375 959.0078,516.5313 Q959.6563,516.6875 960.2188,516.9844 L960.2188,519.7031 Q959.5938,519.125 959,518.8516 Q958.4063,518.5781 957.7813,518.5781 Q956.4375,518.5781 955.75,519.6484 Q955.0625,520.7188 955.0625,522.8125 Q955.0625,524.9063 955.75,525.9766 Q956.4375,527.0469 957.7813,527.0469 Q958.4063,527.0469 959,526.7734 Q959.5938,526.5 960.2188,525.9219 L960.2188,528.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="977.75" y="527.1543">ResultDump</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="900.5" x2="1097.5" y1="539" y2="539"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="49" x="905.5" y="553.2104">dict data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="905.5" y="566.0151">int fresh_days</text><text fill="#000000" font-
 family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="905.5" y="578.8198">str datadir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="905.5" y="591.6245">Lock data_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="905.5" y="604.4292">Thread thread</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="905.5" y="617.2339">Queue queue</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="900.5" x2="1097.5" y1="623.8281" y2="623.8281"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="905.5" y="638.0386">store_result(Result result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="157" x="905.5" y="650.8433">handle_result(Re
 sult result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="905.5" y="663.6479">enter()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="187" x="905.5" y="676.4526">list results_for_relay(Relay relay)</text><!--class Result--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="278.4844" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="564.5" y="852"/><ellipse cx="677.25" cy="868" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M680.2188,873.6406 Q679.6406,873.9375 679,874.0859 Q678.3594,874.2344 677.6563,874.2344 Q675.1563,874.2344 673.8359,872.5859 Q672.5156,870.9375 672.5156,867.8125 Q672.5156,864.6875 673.8359,863.0313 Q675.1563,861.375 677.6563,861.375 Q678.3594,861.375 679.0078,861.5313 Q679.6563,861.6875 680.2188,861.9844 L680.2188,864.7031 Q679.5938,864.125 679,863.8516 Q678.4063,863.5781 677.7813,8
 63.5781 Q676.4375,863.5781 675.75,864.6484 Q675.0625,865.7188 675.0625,867.8125 Q675.0625,869.9063 675.75,870.9766 Q676.4375,872.0469 677.7813,872.0469 Q678.4063,872.0469 679,871.7734 Q679.5938,871.5 680.2188,870.9219 L680.2188,873.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="39" x="697.75" y="872.1543">Result</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="565.5" x2="836.5" y1="884" y2="884"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="570.5" y="898.2104">Result.Relay _relay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="570.5" y="911.0151">list @p circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="570.5" y="923.8198">str @p dest_url</text><text fill="#000000" font-family="sans-serif" font-siz
 e="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="570.5" y="936.6245">str @p scanner</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="570.5" y="949.4292">int @p time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="570.5" y="962.2339">str @p type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="570.5" y="975.0386">int @p version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="570.5" y="987.8433">str @p nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="570.5" y="1000.6479">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="570.5" y="1013.4526"
 >str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="570.5" y="1026.2573">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="570.5" y="1039.062">int @p relay_observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="570.5" y="1051.8667">int @p relay_average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="570.5" y="1064.6714">int @p relay_burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="570.5" y="1077.4761">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="570.5" y="1090.280
 8">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="565.5" x2="836.5" y1="1096.875" y2="1096.875"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="570.5" y="1111.0854">dict to_dict()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="570.5" y="1123.8901">Result from_dict(dict d)</text><!--class ResultError--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="668" y="1292.5"/><ellipse cx="683" cy="1308.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M685.9688,1314.1406 Q685.3906,1314.4375 684.75,1314.5859 Q684.1094,1314.7344 683.4063,1314.7344 Q680.9063,1314.7344 679.5859,1313.0859 Q678.2656,1311.4375 678.2656,1308.3125 Q678.2656,1305.1875 679.5859,1303.5313 Q680.9063,1301.875 683.4063,1301.875 Q
 684.1094,1301.875 684.7578,1302.0313 Q685.4063,1302.1875 685.9688,1302.4844 L685.9688,1305.2031 Q685.3438,1304.625 684.75,1304.3516 Q684.1563,1304.0781 683.5313,1304.0781 Q682.1875,1304.0781 681.5,1305.1484 Q680.8125,1306.2188 680.8125,1308.3125 Q680.8125,1310.4063 681.5,1311.4766 Q682.1875,1312.5469 683.5313,1312.5469 Q684.1563,1312.5469 684.75,1312.2734 Q685.3438,1312 685.9688,1311.4219 L685.9688,1314.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="70" x="697" y="1312.6543">ResultError</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1324.5" y2="1324.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="674" y="1338.7104">str @p msg</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1345.3047" y2="1345.3047"/><!--class ResultSuccess--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="73.6094" styl
 e="stroke: #A80036; stroke-width: 1.5;" width="123" x="805.5" y="1286"/><ellipse cx="820.5" cy="1302" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M823.4688,1307.6406 Q822.8906,1307.9375 822.25,1308.0859 Q821.6094,1308.2344 820.9063,1308.2344 Q818.4063,1308.2344 817.0859,1306.5859 Q815.7656,1304.9375 815.7656,1301.8125 Q815.7656,1298.6875 817.0859,1297.0313 Q818.4063,1295.375 820.9063,1295.375 Q821.6094,1295.375 822.2578,1295.5313 Q822.9063,1295.6875 823.4688,1295.9844 L823.4688,1298.7031 Q822.8438,1298.125 822.25,1297.8516 Q821.6563,1297.5781 821.0313,1297.5781 Q819.6875,1297.5781 819,1298.6484 Q818.3125,1299.7188 818.3125,1301.8125 Q818.3125,1303.9063 819,1304.9766 Q819.6875,1306.0469 821.0313,1306.0469 Q821.6563,1306.0469 822.25,1305.7734 Q822.8438,1305.5 823.4688,1304.9219 L823.4688,1307.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="834.5" y="1306.1543">ResultSucce
 ss</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1318" y2="1318"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="811.5" y="1332.2104">list @p rtts</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="811.5" y="1345.0151">list @p downloads</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1351.6094" y2="1351.6094"/><!--class Destination--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="124.8281" style="stroke: #A80036; stroke-width: 1.5;" width="342" x="6" y="1260.5"/><ellipse cx="136.75" cy="1276.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M139.7188,1282.1406 Q139.1406,1282.4375 138.5,1282.5859 Q137.8594,1282.7344 137.1563,1282.7344 Q134.6563,1282.7344 133.3359,1281.0859 Q132.0156,1279.4375 132.0156,1276.3125 Q132.0156,1273.1875 133.3359,12
 71.5313 Q134.6563,1269.875 137.1563,1269.875 Q137.8594,1269.875 138.5078,1270.0313 Q139.1563,1270.1875 139.7188,1270.4844 L139.7188,1273.2031 Q139.0938,1272.625 138.5,1272.3516 Q137.9063,1272.0781 137.2813,1272.0781 Q135.9375,1272.0781 135.25,1273.1484 Q134.5625,1274.2188 134.5625,1276.3125 Q134.5625,1278.4063 135.25,1279.4766 Q135.9375,1280.5469 137.2813,1280.5469 Q137.9063,1280.5469 138.5,1280.2734 Q139.0938,1280 139.7188,1279.4219 L139.7188,1282.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="72" x="157.25" y="1280.6543">Destination</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1292.5" y2="1292.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="12" y="1306.7104">str @p hostname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="12" y="1319.5151">int @p p
 ort</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="12" y="1332.3198">str @p url</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="12" y="1345.1245">bool @p verify</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1351.7188" y2="1351.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="12" y="1365.9292">bool is_usable()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="330" x="12" y="1378.7339">Destination @sm from_config(str conf_section,int max_dl)</text><!--class Result.Relay--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="163.2422" style="stroke: #A80036; stroke-width: 1.5;" width="250" x="383" y="1241.5"/><ellipse cx="465.75" cy="1257.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A8
 0036; stroke-width: 1.0;"/><path d="M468.7188,1263.1406 Q468.1406,1263.4375 467.5,1263.5859 Q466.8594,1263.7344 466.1563,1263.7344 Q463.6563,1263.7344 462.3359,1262.0859 Q461.0156,1260.4375 461.0156,1257.3125 Q461.0156,1254.1875 462.3359,1252.5313 Q463.6563,1250.875 466.1563,1250.875 Q466.8594,1250.875 467.5078,1251.0313 Q468.1563,1251.1875 468.7188,1251.4844 L468.7188,1254.2031 Q468.0938,1253.625 467.5,1253.3516 Q466.9063,1253.0781 466.2813,1253.0781 Q464.9375,1253.0781 464.25,1254.1484 Q463.5625,1255.2188 463.5625,1257.3125 Q463.5625,1259.4063 464.25,1260.4766 Q464.9375,1261.5469 466.2813,1261.5469 Q466.9063,1261.5469 467.5,1261.2734 Q468.0938,1261 468.7188,1260.4219 L468.7188,1263.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="76" x="486.25" y="1261.6543">Result.Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1273.5" y2="1273.5"/><text fill="#000000" font-family="sans-serif" fo
 nt-size="11" lengthAdjust="spacingAndGlyphs" textLength="74" x="389" y="1287.7104">str nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="389" y="1300.5151">str fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="389" y="1313.3198">str address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="389" y="1326.1245">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="389" y="1338.9292">int observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="389" y="1351.7339">int average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x
 ="389" y="1364.5386">int burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="144" x="389" y="1377.3433">int consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="238" x="389" y="1390.1479">int consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1396.7422" y2="1396.7422"/><!--class ResultErrorCircuit--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="141" x="559.5" y="1516"/><ellipse cx="574.5" cy="1532" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M577.4688,1537.6406 Q576.8906,1537.9375 576.25,1538.0859 Q575.6094,1538.2344 574.9063,1538.2344 Q572.4063,1538.2344 571.0859,1536.5859 Q569.7656,1534.9375 569.7656,1531.8125 Q569.7656,1528.6875 571.0859,1527.0313 Q572.4063,1525.375 574
 .9063,1525.375 Q575.6094,1525.375 576.2578,1525.5313 Q576.9063,1525.6875 577.4688,1525.9844 L577.4688,1528.7031 Q576.8438,1528.125 576.25,1527.8516 Q575.6563,1527.5781 575.0313,1527.5781 Q573.6875,1527.5781 573,1528.6484 Q572.3125,1529.7188 572.3125,1531.8125 Q572.3125,1533.9063 573,1534.9766 Q573.6875,1536.0469 575.0313,1536.0469 Q575.6563,1536.0469 576.25,1535.7734 Q576.8438,1535.5 577.4688,1534.9219 L577.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="109" x="588.5" y="1536.1543">ResultErrorCircuit</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="560.5" x2="699.5" y1="1548" y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="560.5" x2="699.5" y1="1556" y2="1556"/><!--class ResultErrorStream--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="147" x="735.5" y="1516"/><ellipse cx="750.5" cy="1532" fill="#ADD1B2" rx="11" ry="11
 " style="stroke: #A80036; stroke-width: 1.0;"/><path d="M753.4688,1537.6406 Q752.8906,1537.9375 752.25,1538.0859 Q751.6094,1538.2344 750.9063,1538.2344 Q748.4063,1538.2344 747.0859,1536.5859 Q745.7656,1534.9375 745.7656,1531.8125 Q745.7656,1528.6875 747.0859,1527.0313 Q748.4063,1525.375 750.9063,1525.375 Q751.6094,1525.375 752.2578,1525.5313 Q752.9063,1525.6875 753.4688,1525.9844 L753.4688,1528.7031 Q752.8438,1528.125 752.25,1527.8516 Q751.6563,1527.5781 751.0313,1527.5781 Q749.6875,1527.5781 749,1528.6484 Q748.3125,1529.7188 748.3125,1531.8125 Q748.3125,1533.9063 749,1534.9766 Q749.6875,1536.0469 751.0313,1536.0469 Q751.6563,1536.0469 752.25,1535.7734 Q752.8438,1535.5 753.4688,1534.9219 L753.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="115" x="764.5" y="1536.1543">ResultErrorStream</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="736.5" x2="881.5" y1="1548" y2="1548"/><line style="stroke: #A8
 0036; stroke-width: 1.5;" x1="736.5" x2="881.5" y1="1556" y2="1556"/><!--class DestinationList--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="66.5" y="948"/><ellipse cx="126.25" cy="964" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M129.2188,969.6406 Q128.6406,969.9375 128,970.0859 Q127.3594,970.2344 126.6563,970.2344 Q124.1563,970.2344 122.8359,968.5859 Q121.5156,966.9375 121.5156,963.8125 Q121.5156,960.6875 122.8359,959.0313 Q124.1563,957.375 126.6563,957.375 Q127.3594,957.375 128.0078,957.5313 Q128.6563,957.6875 129.2188,957.9844 L129.2188,960.7031 Q128.5938,960.125 128,959.8516 Q127.4063,959.5781 126.7813,959.5781 Q125.4375,959.5781 124.75,960.6484 Q124.0625,961.7188 124.0625,963.8125 Q124.0625,965.9063 124.75,966.9766 Q125.4375,968.0469 126.7813,968.0469 Q127.4063,968.0469 128,967.7734 Q128.5938,967.5 129.2188,966.9219 L129.2188,969.6406 Z "/><text fill="#000000" f
 ont-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="93" x="146.75" y="968.1543">DestinationList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="980" y2="980"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="72.5" y="994.2104">list _rl</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="1000.8047" y2="1000.8047"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="72.5" y="1015.0151">Destination next()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="72.5" y="1027.8198">DestinationList @sm from_config(...)</text><!--class V3BWHeader--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="291.2891" style="stroke: #A80036; stroke-width: 1.5;" width="322" x="181" y="449.5"/><ellipse cx="297.25" cy="465.5" 
 fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M300.2188,471.1406 Q299.6406,471.4375 299,471.5859 Q298.3594,471.7344 297.6563,471.7344 Q295.1563,471.7344 293.8359,470.0859 Q292.5156,468.4375 292.5156,465.3125 Q292.5156,462.1875 293.8359,460.5313 Q295.1563,458.875 297.6563,458.875 Q298.3594,458.875 299.0078,459.0313 Q299.6563,459.1875 300.2188,459.4844 L300.2188,462.2031 Q299.5938,461.625 299,461.3516 Q298.4063,461.0781 297.7813,461.0781 Q296.4375,461.0781 295.75,462.1484 Q295.0625,463.2188 295.0625,465.3125 Q295.0625,467.4063 295.75,468.4766 Q296.4375,469.5469 297.7813,469.5469 Q298.4063,469.5469 299,469.2734 Q299.5938,469 300.2188,468.4219 L300.2188,471.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="81" x="317.75" y="469.6543">V3BWHeader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="182" x2="502" y1="481.5" y2="481.5"/><text fill="#000000" font-family="sans-serif"
  font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="187" y="495.7104">int timestamp</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="187" y="508.5151">str version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="187" y="521.3198">str file_created</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="116" x="187" y="534.1245">str latest_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="187" y="546.9292">int num_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="187" y="559.7339">str software</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="187" y="572.5386">str
  software_version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="123" x="187" y="585.3433">str generator_started</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="187" y="598.1479">int number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="208" x="187" y="610.9526">int minimum_number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="171" x="187" y="623.7573">int number_consensus_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="148" x="187" y="636.562">int percent_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="187" y="649.3667">int minimum_percen
 t_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="187" y="662.1714">int @p num_lines</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="182" x2="502" y1="668.7656" y2="668.7656"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="187" y="682.9761">V3BWHeader @cm from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="117" x="187" y="695.7808">add_stats(**kwargs)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="310" x="187" y="708.5854">int @sm earliest_bandwidth_from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="285" x="187" y="721.3901">str @sm generator_started_from_file(dict results)</text><text fil
 l="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="299" x="187" y="734.1948">int @sm latest_bandwidth_from_results(dict results)</text><!--class V3BWLine--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="393.7266" style="stroke: #A80036; stroke-width: 1.5;" width="326" x="538" y="398"/><ellipse cx="666.75" cy="414" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M669.7188,419.6406 Q669.1406,419.9375 668.5,420.0859 Q667.8594,420.2344 667.1563,420.2344 Q664.6563,420.2344 663.3359,418.5859 Q662.0156,416.9375 662.0156,413.8125 Q662.0156,410.6875 663.3359,409.0313 Q664.6563,407.375 667.1563,407.375 Q667.8594,407.375 668.5078,407.5313 Q669.1563,407.6875 669.7188,407.9844 L669.7188,410.7031 Q669.0938,410.125 668.5,409.8516 Q667.9063,409.5781 667.2813,409.5781 Q665.9375,409.5781 665.25,410.6484 Q664.5625,411.7188 664.5625,413.8125 Q664.5625,415.9063 665.25,416.9766 Q665.9375,418.0469 667.2813,418.0469 Q667
 .9063,418.0469 668.5,417.7734 Q669.0938,417.5 669.7188,416.9219 L669.7188,419.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="60" x="687.25" y="418.1543">V3BWLine</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="863" y1="430" y2="430"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="544" y="444.2104">int bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="544" y="457.0151">str node_id</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="544" y="469.8198">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="544" y="482.6245">str nick</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spa
 cingAndGlyphs" textLength="31" x="544" y="495.4292">int rtt</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="544" y="508.2339">str time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="65" x="544" y="521.0386">int success</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="94" x="544" y="533.8433">int error_stream</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="544" y="546.6479">int error_circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="80" x="544" y="559.4526">int error_misc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="544" y="572.2573">int bw_median</text><text fill="#000000" font-family=
 "sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="544" y="585.062">int bw_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="544" y="597.8667">int desc_bw_avg</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="544" y="610.6714">int desc_bw_bur</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="121" x="544" y="623.4761">int desc_bw_obs_last</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="132" x="544" y="636.2808">int desc_bw_obs_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="544" y="649.0854">consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="2
 20" x="544" y="661.8901">consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="863" y1="668.4844" y2="668.4844"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="544" y="682.6948">int @sm bw_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="264" x="544" y="695.4995">int @sm bw_median_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="303" x="544" y="708.3042">int @sm desc_bw_obs_last_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="314" x="544" y="721.1089">int @sm desc_bw_obs_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" te
 xtLength="233" x="544" y="733.9136">V3BWLine @cm from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="544" y="746.7183">str @sm last_time_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="276" x="544" y="759.5229">dict @sm result_types_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="268" x="544" y="772.3276">list @sm results_away_each_other(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="237" x="544" y="785.1323">list @sm results_recent_than(list results)</text><!--class V3BWFile--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="329.7031" style="stroke: #A80036; stroke-width: 1.5;" width="370" x="157" y="8"/><ellipse cx="309.75" cy="24" 
 fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M312.7188,29.6406 Q312.1406,29.9375 311.5,30.0859 Q310.8594,30.2344 310.1563,30.2344 Q307.6563,30.2344 306.3359,28.5859 Q305.0156,26.9375 305.0156,23.8125 Q305.0156,20.6875 306.3359,19.0313 Q307.6563,17.375 310.1563,17.375 Q310.8594,17.375 311.5078,17.5313 Q312.1563,17.6875 312.7188,17.9844 L312.7188,20.7031 Q312.0938,20.125 311.5,19.8516 Q310.9063,19.5781 310.2813,19.5781 Q308.9375,19.5781 308.25,20.6484 Q307.5625,21.7188 307.5625,23.8125 Q307.5625,25.9063 308.25,26.9766 Q308.9375,28.0469 310.2813,28.0469 Q310.9063,28.0469 311.5,27.7734 Q312.0938,27.5 312.7188,26.9219 L312.7188,29.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="56" x="330.25" y="28.1543">V3BWFile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="158" x2="526" y1="40" y2="40"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacin
 gAndGlyphs" textLength="116" x="163" y="54.2104">V3BWHeader header</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="163" y="67.0151">list bw_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="163" y="79.8198">@p info_stats</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="119" x="163" y="92.6245">bool @p is_min_perc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="163" y="105.4292">int @p max_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="95" x="163" y="118.2339">int @p mean_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="163" y="131.0386">int @p median_bw</text><text fill="#00
 0000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="84" x="163" y="143.8433">int @p min_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="163" y="156.6479">int @p num</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="88" x="163" y="169.4526">int @p sum_bw</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="158" x2="526" y1="176.0469" y2="176.0469"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="252" x="163" y="190.2573">V3BWFile @cm from_results(dict results, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="147" x="163" y="203.062">list @sm bw_kb(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="200" x="163" y="215.
 8667">list @sm bw_sbws_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="163" y="228.6714">list @sm bw_torflow_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="288" x="163" y="241.4761">bool @sm is_max_bw_diff_perc_reached(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="306" x="163" y="254.2808">(dict, bool) @sm measured_progress_stats(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="358" x="163" y="267.0854">int @sm read_number_consensus_relays(str consensus_path)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="163" y="279.8901">(list, list, list) to_plt()</text><text fill="#000000" font-family="sans-serif" fo
 nt-size="11" lengthAdjust="spacingAndGlyphs" textLength="195" x="163" y="292.6948">list update_progress(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="163" y="305.4995">warn_if_not_accurate_enough(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="163" y="318.3042">tuple to_plt(...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="163" y="331.1089">write(str output)</text><!--class CircuitBuilder--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="124.8281" style="stroke: #A80036; stroke-width: 1.5;" width="126" x="1271" y="532.5"/><ellipse cx="1291.4" cy="548.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1294.3688,554.1406 Q1293.7906,554.4375 1293.15,554.5859 Q1292.5094,554.7344 1291.8063,554.7344 Q1289.
 3063,554.7344 1287.9859,553.0859 Q1286.6656,551.4375 1286.6656,548.3125 Q1286.6656,545.1875 1287.9859,543.5313 Q1289.3063,541.875 1291.8063,541.875 Q1292.5094,541.875 1293.1578,542.0313 Q1293.8063,542.1875 1294.3688,542.4844 L1294.3688,545.2031 Q1293.7438,544.625 1293.15,544.3516 Q1292.5563,544.0781 1291.9313,544.0781 Q1290.5875,544.0781 1289.9,545.1484 Q1289.2125,546.2188 1289.2125,548.3125 Q1289.2125,550.4063 1289.9,551.4766 Q1290.5875,552.5469 1291.9313,552.5469 Q1292.5563,552.5469 1293.15,552.2734 Q1293.7438,552 1294.3688,551.4219 L1294.3688,554.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="82" x="1306.6" y="552.6543">CircuitBuilder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1272" x2="1396" y1="564.5" y2="564.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1277" y="578.7104">set built_circuits</text><text fill="#000000" font-fa
 mily="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1277" y="591.5151">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1277" y="604.3198">list relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="1277" y="617.1245">Controller controller</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1272" x2="1396" y1="623.7188" y2="623.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1277" y="637.9292">int build_circuit()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1277" y="650.7339">void close_circuit()</text><!--class GapsCircuitBuilder--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="146"
  x="1387" y="967"/><ellipse cx="1402" cy="983" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1404.9688,988.6406 Q1404.3906,988.9375 1403.75,989.0859 Q1403.1094,989.2344 1402.4063,989.2344 Q1399.9063,989.2344 1398.5859,987.5859 Q1397.2656,985.9375 1397.2656,982.8125 Q1397.2656,979.6875 1398.5859,978.0313 Q1399.9063,976.375 1402.4063,976.375 Q1403.1094,976.375 1403.7578,976.5313 Q1404.4063,976.6875 1404.9688,976.9844 L1404.9688,979.7031 Q1404.3438,979.125 1403.75,978.8516 Q1403.1563,978.5781 1402.5313,978.5781 Q1401.1875,978.5781 1400.5,979.6484 Q1399.8125,980.7188 1399.8125,982.8125 Q1399.8125,984.9063 1400.5,985.9766 Q1401.1875,987.0469 1402.5313,987.0469 Q1403.1563,987.0469 1403.75,986.7734 Q1404.3438,986.5 1404.9688,985.9219 L1404.9688,988.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="114" x="1416" y="987.1543">GapsCircuitBuilder</text><line style="stroke: #A80036; stroke-w
 idth: 1.5;" x1="1388" x2="1532" y1="999" y2="999"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1388" x2="1532" y1="1007" y2="1007"/><!--class State--><rect fill="#FEFECE" filter="url(#f17ckm9)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="66" x="1189" y="142.5"/><ellipse cx="1204" cy="158.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1206.9688,164.1406 Q1206.3906,164.4375 1205.75,164.5859 Q1205.1094,164.7344 1204.4063,164.7344 Q1201.9063,164.7344 1200.5859,163.0859 Q1199.2656,161.4375 1199.2656,158.3125 Q1199.2656,155.1875 1200.5859,153.5313 Q1201.9063,151.875 1204.4063,151.875 Q1205.1094,151.875 1205.7578,152.0313 Q1206.4063,152.1875 1206.9688,152.4844 L1206.9688,155.2031 Q1206.3438,154.625 1205.75,154.3516 Q1205.1563,154.0781 1204.5313,154.0781 Q1203.1875,154.0781 1202.5,155.1484 Q1201.8125,156.2188 1201.8125,158.3125 Q1201.8125,160.4063 1202.5,161.4766 Q1203.1875,162.5469 1204.5313,162.5469 Q1205.1563,162
 .5469 1205.75,162.2734 Q1206.3438,162 1206.9688,161.4219 L1206.9688,164.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="34" x="1218" y="162.6543">State</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1190" x2="1254" y1="174.5" y2="174.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1190" x2="1254" y1="182.5" y2="182.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="26" x="1195" y="196.7104">get()</text><path d="M1138.67,1117.655 C1136.16,1141.31 1133.53,1166.111 1131,1189.954 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1140.05,1104.644,1135.4394,1110.1886,1138.7842,1116.5771,1143.3948,1111.0325,1140.05,1104.644" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1089.72,242.34 C1098.68,286.54 1109.61,345.43 1116,398 C1136.18,564.101 1145.24,757.865 1149.18,877.246 " fill="none" style="st
 roke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1087.06,229.41,1084.3489,236.0921,1089.4743,241.1646,1092.1853,234.4826,1087.06,229.41" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1062.64,242.29 C1049.6,314.37 1029,428.19 1014.79,506.73 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1064.99,229.34,1059.9863,234.5326,1062.855,241.1485,1067.8587,235.9559,1064.99,229.34" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M709.634,1150.29 C712.587,1204.42 715.592,1259.514 717.376,1292.219 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="702.629,1150.389,708.529,1130.038,716.608,1149.627,702.629,1150.389" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M779.546,1148.146 C805.413,1199.569 831.859,1252.142 848.795,1285.809 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="773.171,1151.05,770.437,1130.038,785.678,1144.759,773.171,11
 51.05" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M564.219,1069.298 C502.644,1104.936 429.46,1148.471 365,1190 C330.636,1212.139 293.652,1237.711 261.654,1260.417 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M837.502,1100.283 C883.339,1136.644 934.451,1177.19 980.304,1213.563 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M613.472,1141.659 C593.355,1176.056 572.714,1211.349 555.086,1241.491 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="620.269,1130.038,613.7871,1133.1979,614.2108,1140.3965,620.6927,1137.2366,620.269,1130.038" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M698.878,1372.61 C680.34,1417.393 653.638,1481.8967 639.546,1515.9402 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="692.508,1369.697,706.625,1353.895,705.443,1375.051,692.508,1369.697" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M739.348,1372.61 C758.095,1417
 .393 785.096,1481.8967 799.347,1515.9402 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="732.78,1375.047,731.514,1353.895,745.694,1369.641,732.78,1375.047" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M944.599,694.845 C925.726,726.719 903.6,761.637 881,792 C866.16,811.937 849.661,832.189 832.845,851.753 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="951.4,683.254,944.9137,686.4049,945.3276,693.6042,951.8138,690.4532,951.4,683.254" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M986.523,683.449 C974.243,790.808 962.827,977.411 1005,1130 C1010.58,1150.179 1018.82,1170.427 1028.35,1189.81 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M177,1047.245 C177,1106.165 177,1199.251 177,1260.472 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="177,1034.13,173,1040.13,177,1046.13,181,1040.13,177,1034.13" style="stroke: #A80036; stroke
 -width: 1.0;"/><path d="M473.178,740.55 C488.947,757.895 504.83,775.351 520,792 C537.644,811.365 556.273,831.779 574.602,851.847 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M701,792.134 C701,812.297 701,832.472 701,851.814 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M342,351.6 C342,384.21 342,417.88 342,449.38 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="342,338.19,338,344.19,342,350.19,346,344.19,342,338.19" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M490.906,348.21 C506.387,366.32 522.181,384.8 537.808,403.08 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="482.341,338.19,483.2029,345.3494,490.1431,347.3074,489.2812,340.148,482.341,338.19" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M191.752,338.22 C180.173,357.38 170.203,377.45 163,398 C105.082,563.26 62.8173,648.378 163,792 C169.086,800.724 407.087,886.138 564.464,941.895 " 
 fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1299.98,669.643 C1273,728.048 1234.84,810.657 1204.03,877.359 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1305.56,657.562,1299.4124,661.3313,1300.5273,668.4557,1306.6749,664.6864,1305.56,657.562" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1342.81,657.587 C1354.75,760.354 1367.33,971.181 1298,1130 C1287.05,1155.085 1271.35,1178.92 1253.72,1200.721 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1359.82,676.751 C1389,767.97 1434.72,910.962 1452.54,966.679 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1353.11,678.744,1353.69,657.562,1366.45,674.48,1353.11,678.744" style="stroke: #A80036; stroke-width: 1.0;"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1575px" preserveAspectRatio="none" style="width:1546px;height:1575px;" version="1.1" viewBox="0 0 1546 1575" width="1546px" zoomAndPan="magnify"><defs><filter height="300%" id="fuwj1fyyylsf1" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--class RelayList--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="227.2656" id="RelayList" style="stroke: #A80036; stroke-width: 1.5;" width="258" x="1025" y="877.5"/><ellipse cx="1122.75" cy="893.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: 
 #A80036; stroke-width: 1.0;"/><path d="M1125.7188,899.1406 Q1125.1406,899.4375 1124.5,899.5781 Q1123.8594,899.7344 1123.1563,899.7344 Q1120.6563,899.7344 1119.3281,898.0938 Q1118.0156,896.4375 1118.0156,893.3125 Q1118.0156,890.1875 1119.3281,888.5313 Q1120.6563,886.875 1123.1563,886.875 Q1123.8594,886.875 1124.5,887.0313 Q1125.1563,887.1875 1125.7188,887.4844 L1125.7188,890.2031 Q1125.0938,889.625 1124.5,889.3594 Q1123.9063,889.0781 1123.2813,889.0781 Q1121.9375,889.0781 1121.25,890.1563 Q1120.5625,891.2188 1120.5625,893.3125 Q1120.5625,895.4063 1121.25,896.4844 Q1121.9375,897.5469 1123.2813,897.5469 Q1123.9063,897.5469 1124.5,897.2813 Q1125.0938,897 1125.7188,896.4219 L1125.7188,899.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="54" x="1143.25" y="897.6543">RelayList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1026" x2="1282" y1="909.5" y2="909.5"/><text fill="#000000" font-family="sans-serif" font-
 size="11" lengthAdjust="spacingAndGlyphs" textLength="153" x="1031" y="923.7104">stem.Controller _controller</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1031" y="936.5151">Lock _refresh_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1031" y="949.3198">int _last_refresh</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1031" y="962.1245">list @p relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="1031" y="974.9292">list @p bad_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="71" x="1031" y="987.7339">list @p exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="98" x="
 1031" y="1000.5386">list @p non_exits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1031" y="1013.3433">list @p authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1026" x2="1282" y1="1019.9375" y2="1019.9375"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="1031" y="1034.1479">bool _need_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="1031" y="1046.9526">_init_relays()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1031" y="1059.7573">_refresh()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="165" x="1031" y="1072.562">list _relays_with_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11"
  lengthAdjust="spacingAndGlyphs" textLength="183" x="1031" y="1085.3667">list _relays_without_flag(int flag)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="246" x="1031" y="1098.1714">list exits_not_bad_can_exit_to_port(int port)</text><!--class Relay--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="265.6797" id="Relay" style="stroke: #A80036; stroke-width: 1.5;" width="283" x="980.5" y="1190"/><ellipse cx="1101.25" cy="1206" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1104.2188,1211.6406 Q1103.6406,1211.9375 1103,1212.0781 Q1102.3594,1212.2344 1101.6563,1212.2344 Q1099.1563,1212.2344 1097.8281,1210.5938 Q1096.5156,1208.9375 1096.5156,1205.8125 Q1096.5156,1202.6875 1097.8281,1201.0313 Q1099.1563,1199.375 1101.6563,1199.375 Q1102.3594,1199.375 1103,1199.5313 Q1103.6563,1199.6875 1104.2188,1199.9844 L1104.2188,1202.7031 Q1103.5938,1202.125 1103,1201.8594 Q1102.4063,1201
 .5781 1101.7813,1201.5781 Q1100.4375,1201.5781 1099.75,1202.6563 Q1099.0625,1203.7188 1099.0625,1205.8125 Q1099.0625,1207.9063 1099.75,1208.9844 Q1100.4375,1210.0469 1101.7813,1210.0469 Q1102.4063,1210.0469 1103,1209.7813 Q1103.5938,1209.5 1104.2188,1208.9219 L1104.2188,1211.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="33" x="1121.75" y="1210.1543">Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1262.5" y1="1222" y2="1222"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="986.5" y="1236.2104">stem.RouterStatusEntryV3 _from_ns</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="986.5" y="1249.0151">stem.RelayDescriptor _from_desc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="986.5" y="12
 61.8198">str @p nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1274.6245">str @p fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="986.5" y="1287.4292">list @p flags</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="137" x="986.5" y="1300.2339">ExitPolicy @p exit_policy</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="986.5" y="1313.0386">str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="986.5" y="1325.8433">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="158" x="986.5" y="1338.6479">int @p observed_bandwidth</text><t
 ext fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="151" x="986.5" y="1351.4526">int @p average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="986.5" y="1364.2573">int @p burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="986.5" y="1377.062">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="271" x="986.5" y="1389.8667">bool @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="981.5" x2="1262.5" y1="1396.4609" y2="1396.4609"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="986.5" y="1410.6714">obj _from_ns(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11"
  lengthAdjust="spacingAndGlyphs" textLength="115" x="986.5" y="1423.4761">obj _from_desc(attr)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="986.5" y="1436.2808">bool can_exit_to_port(int port)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="986.5" y="1449.0854">bool is_exit_not_bad_allowing_port(int port)</text><!--class RelayPrioritizer--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="112.0234" id="RelayPrioritizer" style="stroke: #A80036; stroke-width: 1.5;" width="158" x="998" y="117"/><ellipse cx="1028.75" cy="133" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1031.7188,138.6406 Q1031.1406,138.9375 1030.5,139.0781 Q1029.8594,139.2344 1029.1563,139.2344 Q1026.6563,139.2344 1025.3281,137.5938 Q1024.0156,135.9375 1024.0156,132.8125 Q1024.0156,129.6875 1025.3281,128.0313 Q1026.6563,126.375 
 1029.1563,126.375 Q1029.8594,126.375 1030.5,126.5313 Q1031.1563,126.6875 1031.7188,126.9844 L1031.7188,129.7031 Q1031.0938,129.125 1030.5,128.8594 Q1029.9063,128.5781 1029.2813,128.5781 Q1027.9375,128.5781 1027.25,129.6563 Q1026.5625,130.7188 1026.5625,132.8125 Q1026.5625,134.9063 1027.25,135.9844 Q1027.9375,137.0469 1029.2813,137.0469 Q1029.9063,137.0469 1030.5,136.7813 Q1031.0938,136.5 1031.7188,135.9219 L1031.7188,138.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="1046.25" y="137.1543">RelayPrioritizer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="999" x2="1155" y1="149" y2="149"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="1004" y="163.2104">int fresh_seconds</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="143" x="1004" y="176.0151">ResultDump result_dump</text>
 <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1004" y="188.8198">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="146" x="1004" y="201.6245">bool measure_authorities</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="999" x2="1155" y1="208.2188" y2="208.2188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="139" x="1004" y="222.4292">generator best_priority()</text><!--class ResultDump--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="176.0469" id="ResultDump" style="stroke: #A80036; stroke-width: 1.5;" width="199" x="901.5" y="507"/><ellipse cx="959.25" cy="523" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M962.2188,528.6406 Q961.6406,528.9375 961,529.0781 Q960.3594,529.2344 959.6563,529.2344 Q957.1563,529.2344 955.8281,
 527.5938 Q954.5156,525.9375 954.5156,522.8125 Q954.5156,519.6875 955.8281,518.0313 Q957.1563,516.375 959.6563,516.375 Q960.3594,516.375 961,516.5313 Q961.6563,516.6875 962.2188,516.9844 L962.2188,519.7031 Q961.5938,519.125 961,518.8594 Q960.4063,518.5781 959.7813,518.5781 Q958.4375,518.5781 957.75,519.6563 Q957.0625,520.7188 957.0625,522.8125 Q957.0625,524.9063 957.75,525.9844 Q958.4375,527.0469 959.7813,527.0469 Q960.4063,527.0469 961,526.7813 Q961.5938,526.5 962.2188,525.9219 L962.2188,528.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="979.75" y="527.1543">ResultDump</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="902.5" x2="1099.5" y1="539" y2="539"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="49" x="907.5" y="553.2104">dict data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLen
 gth="81" x="907.5" y="566.0151">int fresh_days</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="907.5" y="578.8198">str datadir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="907.5" y="591.6245">Lock data_lock</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="907.5" y="604.4292">Thread thread</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="907.5" y="617.2339">Queue queue</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="902.5" x2="1099.5" y1="623.8281" y2="623.8281"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="907.5" y="638.0386">store_result(Result result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdj
 ust="spacingAndGlyphs" textLength="157" x="907.5" y="650.8433">handle_result(Result result)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="907.5" y="663.6479">enter()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="187" x="907.5" y="676.4526">list results_for_relay(Relay relay)</text><!--class Result--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="278.4844" id="Result" style="stroke: #A80036; stroke-width: 1.5;" width="273" x="566.5" y="852"/><ellipse cx="679.25" cy="868" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M682.2188,873.6406 Q681.6406,873.9375 681,874.0781 Q680.3594,874.2344 679.6563,874.2344 Q677.1563,874.2344 675.8281,872.5938 Q674.5156,870.9375 674.5156,867.8125 Q674.5156,864.6875 675.8281,863.0313 Q677.1563,861.375 679.6563,861.375 Q680.3594,861.375 681,861.5313 Q681.6563,861.6875 682.2
 188,861.9844 L682.2188,864.7031 Q681.5938,864.125 681,863.8594 Q680.4063,863.5781 679.7813,863.5781 Q678.4375,863.5781 677.75,864.6563 Q677.0625,865.7188 677.0625,867.8125 Q677.0625,869.9063 677.75,870.9844 Q678.4375,872.0469 679.7813,872.0469 Q680.4063,872.0469 681,871.7813 Q681.5938,871.5 682.2188,870.9219 L682.2188,873.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="39" x="699.75" y="872.1543">Result</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="567.5" x2="838.5" y1="884" y2="884"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="572.5" y="898.2104">Result.Relay _relay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="572.5" y="911.0151">list @p circ</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="572.
 5" y="923.8198">str @p dest_url</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="572.5" y="936.6245">str @p scanner</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="572.5" y="949.4292">int @p time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="572.5" y="962.2339">str @p type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="572.5" y="975.0386">int @p version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="572.5" y="987.8433">str @p nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="102" x="572.5" y="1000.6479">str @p fingerprint</text><text fill="#000000" font-family="sans-s
 erif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="572.5" y="1013.4526">str @p address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="164" x="572.5" y="1026.2573">str @p master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="572.5" y="1039.062">int @p relay_observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="572.5" y="1051.8667">int @p relay_average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="169" x="572.5" y="1064.6714">int @p relay_burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="572.5" y="1077.4761">int @p consensus_bandwidth</text><text fill="#000000" font-family="sans-
 serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="261" x="572.5" y="1090.2808">int @p consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="567.5" x2="838.5" y1="1096.875" y2="1096.875"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="572.5" y="1111.0854">dict to_dict()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="572.5" y="1123.8901">Result from_dict(dict d)</text><!--class ResultError--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="60.8047" id="ResultError" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="668" y="1292.5"/><ellipse cx="683" cy="1308.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M685.9688,1314.1406 Q685.3906,1314.4375 684.75,1314.5781 Q684.1094,1314.7344 683.4063,1314.7344 Q680.9063,1314.7344 679.5781,1313.0938 Q
 678.2656,1311.4375 678.2656,1308.3125 Q678.2656,1305.1875 679.5781,1303.5313 Q680.9063,1301.875 683.4063,1301.875 Q684.1094,1301.875 684.75,1302.0313 Q685.4063,1302.1875 685.9688,1302.4844 L685.9688,1305.2031 Q685.3438,1304.625 684.75,1304.3594 Q684.1563,1304.0781 683.5313,1304.0781 Q682.1875,1304.0781 681.5,1305.1563 Q680.8125,1306.2188 680.8125,1308.3125 Q680.8125,1310.4063 681.5,1311.4844 Q682.1875,1312.5469 683.5313,1312.5469 Q684.1563,1312.5469 684.75,1312.2813 Q685.3438,1312 685.9688,1311.4219 L685.9688,1314.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="70" x="697" y="1312.6543">ResultError</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1324.5" y2="1324.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="674" y="1338.7104">str @p msg</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="669" x2="769" y1="1345.
 3047" y2="1345.3047"/><!--class ResultSuccess--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="73.6094" id="ResultSuccess" style="stroke: #A80036; stroke-width: 1.5;" width="123" x="805.5" y="1286"/><ellipse cx="820.5" cy="1302" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M823.4688,1307.6406 Q822.8906,1307.9375 822.25,1308.0781 Q821.6094,1308.2344 820.9063,1308.2344 Q818.4063,1308.2344 817.0781,1306.5938 Q815.7656,1304.9375 815.7656,1301.8125 Q815.7656,1298.6875 817.0781,1297.0313 Q818.4063,1295.375 820.9063,1295.375 Q821.6094,1295.375 822.25,1295.5313 Q822.9063,1295.6875 823.4688,1295.9844 L823.4688,1298.7031 Q822.8438,1298.125 822.25,1297.8594 Q821.6563,1297.5781 821.0313,1297.5781 Q819.6875,1297.5781 819,1298.6563 Q818.3125,1299.7188 818.3125,1301.8125 Q818.3125,1303.9063 819,1304.9844 Q819.6875,1306.0469 821.0313,1306.0469 Q821.6563,1306.0469 822.25,1305.7813 Q822.8438,1305.5 823.4688,1304.9219 L823.4688,1307.6406 Z "/><text fi
 ll="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="834.5" y="1306.1543">ResultSuccess</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1318" y2="1318"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="811.5" y="1332.2104">list @p rtts</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="811.5" y="1345.0151">list @p downloads</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="806.5" x2="927.5" y1="1351.6094" y2="1351.6094"/><!--class Destination--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="124.8281" id="Destination" style="stroke: #A80036; stroke-width: 1.5;" width="342" x="6" y="1260.5"/><ellipse cx="136.75" cy="1276.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M139.7188,1282.1406 Q139.1406,1282.4375 138.5
 ,1282.5781 Q137.8594,1282.7344 137.1563,1282.7344 Q134.6563,1282.7344 133.3281,1281.0938 Q132.0156,1279.4375 132.0156,1276.3125 Q132.0156,1273.1875 133.3281,1271.5313 Q134.6563,1269.875 137.1563,1269.875 Q137.8594,1269.875 138.5,1270.0313 Q139.1563,1270.1875 139.7188,1270.4844 L139.7188,1273.2031 Q139.0938,1272.625 138.5,1272.3594 Q137.9063,1272.0781 137.2813,1272.0781 Q135.9375,1272.0781 135.25,1273.1563 Q134.5625,1274.2188 134.5625,1276.3125 Q134.5625,1278.4063 135.25,1279.4844 Q135.9375,1280.5469 137.2813,1280.5469 Q137.9063,1280.5469 138.5,1280.2813 Q139.0938,1280 139.7188,1279.4219 L139.7188,1282.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="72" x="157.25" y="1280.6543">Destination</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1292.5" y2="1292.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="12" y="1306.7104">str 
 @p hostname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="12" y="1319.5151">int @p port</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="58" x="12" y="1332.3198">str @p url</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="12" y="1345.1245">bool @p verify</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="347" y1="1351.7188" y2="1351.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="90" x="12" y="1365.9292">bool is_usable()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="330" x="12" y="1378.7339">Destination @sm from_config(str conf_section,int max_dl)</text><!--class Result.Relay--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="163.24
 22" id="Result.Relay" style="stroke: #A80036; stroke-width: 1.5;" width="250" x="383" y="1241.5"/><ellipse cx="465.75" cy="1257.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M468.7188,1263.1406 Q468.1406,1263.4375 467.5,1263.5781 Q466.8594,1263.7344 466.1563,1263.7344 Q463.6563,1263.7344 462.3281,1262.0938 Q461.0156,1260.4375 461.0156,1257.3125 Q461.0156,1254.1875 462.3281,1252.5313 Q463.6563,1250.875 466.1563,1250.875 Q466.8594,1250.875 467.5,1251.0313 Q468.1563,1251.1875 468.7188,1251.4844 L468.7188,1254.2031 Q468.0938,1253.625 467.5,1253.3594 Q466.9063,1253.0781 466.2813,1253.0781 Q464.9375,1253.0781 464.25,1254.1563 Q463.5625,1255.2188 463.5625,1257.3125 Q463.5625,1259.4063 464.25,1260.4844 Q464.9375,1261.5469 466.2813,1261.5469 Q466.9063,1261.5469 467.5,1261.2813 Q468.0938,1261 468.7188,1260.4219 L468.7188,1263.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="76" x="486.2
 5" y="1261.6543">Result.Relay</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1273.5" y2="1273.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="74" x="389" y="1287.7104">str nickname</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="389" y="1300.5151">str fingerprint</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="389" y="1313.3198">str address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="389" y="1326.1245">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="389" y="1338.9292">int observed_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" t
 extLength="128" x="389" y="1351.7339">int average_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="389" y="1364.5386">int burst_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="144" x="389" y="1377.3433">int consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="238" x="389" y="1390.1479">int consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="384" x2="632" y1="1396.7422" y2="1396.7422"/><!--class ResultErrorCircuit--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48" id="ResultErrorCircuit" style="stroke: #A80036; stroke-width: 1.5;" width="141" x="558.5" y="1516"/><ellipse cx="573.5" cy="1532" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M576.4688,1537.6406 Q575.890
 6,1537.9375 575.25,1538.0781 Q574.6094,1538.2344 573.9063,1538.2344 Q571.4063,1538.2344 570.0781,1536.5938 Q568.7656,1534.9375 568.7656,1531.8125 Q568.7656,1528.6875 570.0781,1527.0313 Q571.4063,1525.375 573.9063,1525.375 Q574.6094,1525.375 575.25,1525.5313 Q575.9063,1525.6875 576.4688,1525.9844 L576.4688,1528.7031 Q575.8438,1528.125 575.25,1527.8594 Q574.6563,1527.5781 574.0313,1527.5781 Q572.6875,1527.5781 572,1528.6563 Q571.3125,1529.7188 571.3125,1531.8125 Q571.3125,1533.9063 572,1534.9844 Q572.6875,1536.0469 574.0313,1536.0469 Q574.6563,1536.0469 575.25,1535.7813 Q575.8438,1535.5 576.4688,1534.9219 L576.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="109" x="587.5" y="1536.1543">ResultErrorCircuit</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="559.5" x2="698.5" y1="1548" y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="559.5" x2="698.5" y1="1556" y2="1556"/><!--class Result
 ErrorStream--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48" id="ResultErrorStream" style="stroke: #A80036; stroke-width: 1.5;" width="147" x="734.5" y="1516"/><ellipse cx="749.5" cy="1532" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M752.4688,1537.6406 Q751.8906,1537.9375 751.25,1538.0781 Q750.6094,1538.2344 749.9063,1538.2344 Q747.4063,1538.2344 746.0781,1536.5938 Q744.7656,1534.9375 744.7656,1531.8125 Q744.7656,1528.6875 746.0781,1527.0313 Q747.4063,1525.375 749.9063,1525.375 Q750.6094,1525.375 751.25,1525.5313 Q751.9063,1525.6875 752.4688,1525.9844 L752.4688,1528.7031 Q751.8438,1528.125 751.25,1527.8594 Q750.6563,1527.5781 750.0313,1527.5781 Q748.6875,1527.5781 748,1528.6563 Q747.3125,1529.7188 747.3125,1531.8125 Q747.3125,1533.9063 748,1534.9844 Q748.6875,1536.0469 750.0313,1536.0469 Q750.6563,1536.0469 751.25,1535.7813 Q751.8438,1535.5 752.4688,1534.9219 L752.4688,1537.6406 Z "/><text fill="#000000" font-family="sans-seri
 f" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="115" x="763.5" y="1536.1543">ResultErrorStream</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="735.5" x2="880.5" y1="1548" y2="1548"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="735.5" x2="880.5" y1="1556" y2="1556"/><!--class DestinationList--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="86.4141" id="DestinationList" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="66.5" y="948"/><ellipse cx="126.25" cy="964" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M129.2188,969.6406 Q128.6406,969.9375 128,970.0781 Q127.3594,970.2344 126.6563,970.2344 Q124.1563,970.2344 122.8281,968.5938 Q121.5156,966.9375 121.5156,963.8125 Q121.5156,960.6875 122.8281,959.0313 Q124.1563,957.375 126.6563,957.375 Q127.3594,957.375 128,957.5313 Q128.6563,957.6875 129.2188,957.9844 L129.2188,960.7031 Q128.5938,960.125 128,959.8594 Q127.4063,959.5781 126.7813,959.5781 Q1
 25.4375,959.5781 124.75,960.6563 Q124.0625,961.7188 124.0625,963.8125 Q124.0625,965.9063 124.75,966.9844 Q125.4375,968.0469 126.7813,968.0469 Q127.4063,968.0469 128,967.7813 Q128.5938,967.5 129.2188,966.9219 L129.2188,969.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="93" x="146.75" y="968.1543">DestinationList</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="980" y2="980"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="72.5" y="994.2104">list _rl</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="67.5" x2="286.5" y1="1000.8047" y2="1000.8047"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="72.5" y="1015.0151">Destination next()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="7
 2.5" y="1027.8198">DestinationList @sm from_config(...)</text><!--class V3BWHeader--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="291.2891" id="V3BWHeader" style="stroke: #A80036; stroke-width: 1.5;" width="322" x="183" y="449.5"/><ellipse cx="299.25" cy="465.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M302.2188,471.1406 Q301.6406,471.4375 301,471.5781 Q300.3594,471.7344 299.6563,471.7344 Q297.1563,471.7344 295.8281,470.0938 Q294.5156,468.4375 294.5156,465.3125 Q294.5156,462.1875 295.8281,460.5313 Q297.1563,458.875 299.6563,458.875 Q300.3594,458.875 301,459.0313 Q301.6563,459.1875 302.2188,459.4844 L302.2188,462.2031 Q301.5938,461.625 301,461.3594 Q300.4063,461.0781 299.7813,461.0781 Q298.4375,461.0781 297.75,462.1563 Q297.0625,463.2188 297.0625,465.3125 Q297.0625,467.4063 297.75,468.4844 Q298.4375,469.5469 299.7813,469.5469 Q300.4063,469.5469 301,469.2813 Q301.5938,469 302.2188,468.4219 L302.2188,471.1406 Z "/><text fill="#00
 0000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="81" x="319.75" y="469.6543">V3BWHeader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="184" x2="504" y1="481.5" y2="481.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="189" y="495.7104">int timestamp</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="189" y="508.5151">str version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="189" y="521.3198">str file_created</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="116" x="189" y="534.1245">str latest_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="189" y="546.9292">int num_lines</text><text fill="
 #000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="189" y="559.7339">str software</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="189" y="572.5386">str software_version</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="123" x="189" y="585.3433">str generator_started</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="189" y="598.1479">int number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="208" x="189" y="610.9526">int minimum_number_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="171" x="189" y="623.7573">int number_consensus_relays</text><text fill="#000000" font-family="sans-ser
 if" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="148" x="189" y="636.562">int percent_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="207" x="189" y="649.3667">int minimum_percent_eligible_relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="189" y="662.1714">int @p num_lines</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="184" x2="504" y1="668.7656" y2="668.7656"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="189" y="682.9761">V3BWHeader @cm from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="117" x="189" y="695.7808">add_stats(**kwargs)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="310" x="189
 " y="708.5854">int @sm earliest_bandwidth_from_results(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="285" x="189" y="721.3901">str @sm generator_started_from_file(dict results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="299" x="189" y="734.1948">int @sm latest_bandwidth_from_results(dict results)</text><!--class V3BWLine--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="393.7266" id="V3BWLine" style="stroke: #A80036; stroke-width: 1.5;" width="326" x="540" y="398"/><ellipse cx="668.75" cy="414" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M671.7188,419.6406 Q671.1406,419.9375 670.5,420.0781 Q669.8594,420.2344 669.1563,420.2344 Q666.6563,420.2344 665.3281,418.5938 Q664.0156,416.9375 664.0156,413.8125 Q664.0156,410.6875 665.3281,409.0313 Q666.6563,407.375 669.1563,407.375 Q669.8594,407.375 6
 70.5,407.5313 Q671.1563,407.6875 671.7188,407.9844 L671.7188,410.7031 Q671.0938,410.125 670.5,409.8594 Q669.9063,409.5781 669.2813,409.5781 Q667.9375,409.5781 667.25,410.6563 Q666.5625,411.7188 666.5625,413.8125 Q666.5625,415.9063 667.25,416.9844 Q667.9375,418.0469 669.2813,418.0469 Q669.9063,418.0469 670.5,417.7813 Q671.0938,417.5 671.7188,416.9219 L671.7188,419.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="60" x="689.25" y="418.1543">V3BWLine</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="541" x2="865" y1="430" y2="430"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="546" y="444.2104">int bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="546" y="457.0151">str node_id</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" te
 xtLength="141" x="546" y="469.8198">str master_key_ed25519</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="546" y="482.6245">str nick</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="31" x="546" y="495.4292">int rtt</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="45" x="546" y="508.2339">str time</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="65" x="546" y="521.0386">int success</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="94" x="546" y="533.8433">int error_stream</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="546" y="546.6479">int error_circ</text><text fill="#000000" font-family="sans-serif" 
 font-size="11" lengthAdjust="spacingAndGlyphs" textLength="80" x="546" y="559.4526">int error_misc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="82" x="546" y="572.2573">int bw_median</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="546" y="585.062">int bw_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="546" y="597.8667">int desc_bw_avg</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="546" y="610.6714">int desc_bw_bur</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="121" x="546" y="623.4761">int desc_bw_obs_last</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="132" x="546" y="636.2808">in
 t desc_bw_obs_mean</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="546" y="649.0854">consensus_bandwidth</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="220" x="546" y="661.8901">consensus_bandwidth_is_unmeasured</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="541" x2="865" y1="668.4844" y2="668.4844"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="546" y="682.6948">int @sm bw_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="264" x="546" y="695.4995">int @sm bw_median_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="303" x="546" y="708.3042">int @sm desc_bw_obs_last_from_results(list results)</t
 ext><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="314" x="546" y="721.1089">int @sm desc_bw_obs_mean_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="233" x="546" y="733.9136">V3BWLine @cm from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="254" x="546" y="746.7183">str @sm last_time_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="276" x="546" y="759.5229">dict @sm result_types_from_results(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="268" x="546" y="772.3276">list @sm results_away_each_other(list results)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="
 spacingAndGlyphs" textLength="237" x="546" y="785.1323">list @sm results_recent_than(list results)</text><!--class V3BWFile--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="329.7031" id="V3BWFile" style="stroke: #A80036; stroke-width: 1.5;" width="370" x="159" y="8"/><ellipse cx="311.75" cy="24" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M314.7188,29.6406 Q314.1406,29.9375 313.5,30.0781 Q312.8594,30.2344 312.1563,30.2344 Q309.6563,30.2344 308.3281,28.5938 Q307.0156,26.9375 307.0156,23.8125 Q307.0156,20.6875 308.3281,19.0313 Q309.6563,17.375 312.1563,17.375 Q312.8594,17.375 313.5,17.5313 Q314.1563,17.6875 314.7188,17.9844 L314.7188,20.7031 Q314.0938,20.125 313.5,19.8594 Q312.9063,19.5781 312.2813,19.5781 Q310.9375,19.5781 310.25,20.6563 Q309.5625,21.7188 309.5625,23.8125 Q309.5625,25.9063 310.25,26.9844 Q310.9375,28.0469 312.2813,28.0469 Q312.9063,28.0469 313.5,27.7813 Q314.0938,27.5 314.7188,26.9219 L314.7188,29.6406 Z "/><text fi
 ll="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="56" x="332.25" y="28.1543">V3BWFile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="160" x2="528" y1="40" y2="40"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="116" x="165" y="54.2104">V3BWHeader header</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="165" y="67.0151">list bw_lines</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="165" y="79.8198">@p info_stats</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="119" x="165" y="92.6245">bool @p is_min_perc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="165" y="105.4292">int @p max_bw</text><text fill="#00
 0000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="95" x="165" y="118.2339">int @p mean_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="165" y="131.0386">int @p median_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="84" x="165" y="143.8433">int @p min_bw</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="165" y="156.6479">int @p num</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="88" x="165" y="169.4526">int @p sum_bw</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="160" x2="528" y1="176.0469" y2="176.0469"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="252" x="165" y="190.2573">V3BWFile @cm from_results(dict r
 esults, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="147" x="165" y="203.062">list @sm bw_kb(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="200" x="165" y="215.8667">list @sm bw_sbws_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="209" x="165" y="228.6714">list @sm bw_torflow_scale(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="288" x="165" y="241.4761">bool @sm is_max_bw_diff_perc_reached(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="306" x="165" y="254.2808">(dict, bool) @sm measured_progress_stats(bw_lines)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLengt
 h="358" x="165" y="267.0854">int @sm read_number_consensus_relays(str consensus_path)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="118" x="165" y="279.8901">(list, list, list) to_plt()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="195" x="165" y="292.6948">list update_progress(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="245" x="165" y="305.4995">warn_if_not_accurate_enough(bw_lines, ...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="165" y="318.3042">tuple to_plt(...)</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="92" x="165" y="331.1089">write(str output)</text><!--class CircuitBuilder--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" he
 ight="124.8281" id="CircuitBuilder" style="stroke: #A80036; stroke-width: 1.5;" width="126" x="1273" y="532.5"/><ellipse cx="1293.4" cy="548.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1296.3688,554.1406 Q1295.7906,554.4375 1295.15,554.5781 Q1294.5094,554.7344 1293.8063,554.7344 Q1291.3063,554.7344 1289.9781,553.0938 Q1288.6656,551.4375 1288.6656,548.3125 Q1288.6656,545.1875 1289.9781,543.5313 Q1291.3063,541.875 1293.8063,541.875 Q1294.5094,541.875 1295.15,542.0313 Q1295.8063,542.1875 1296.3688,542.4844 L1296.3688,545.2031 Q1295.7438,544.625 1295.15,544.3594 Q1294.5563,544.0781 1293.9313,544.0781 Q1292.5875,544.0781 1291.9,545.1563 Q1291.2125,546.2188 1291.2125,548.3125 Q1291.2125,550.4063 1291.9,551.4844 Q1292.5875,552.5469 1293.9313,552.5469 Q1294.5563,552.5469 1295.15,552.2813 Q1295.7438,552 1296.3688,551.4219 L1296.3688,554.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLengt
 h="82" x="1308.6" y="552.6543">CircuitBuilder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1274" x2="1398" y1="564.5" y2="564.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1279" y="578.7104">set built_circuits</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1279" y="591.5151">RelayList relay_list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1279" y="604.3198">list relays</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="1279" y="617.1245">Controller controller</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1274" x2="1398" y1="623.7188" y2="623.7188"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1279" y="637.9292
 ">int build_circuit()</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="105" x="1279" y="650.7339">void close_circuit()</text><!--class GapsCircuitBuilder--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="48" id="GapsCircuitBuilder" style="stroke: #A80036; stroke-width: 1.5;" width="146" x="1389" y="967"/><ellipse cx="1404" cy="983" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1406.9688,988.6406 Q1406.3906,988.9375 1405.75,989.0781 Q1405.1094,989.2344 1404.4063,989.2344 Q1401.9063,989.2344 1400.5781,987.5938 Q1399.2656,985.9375 1399.2656,982.8125 Q1399.2656,979.6875 1400.5781,978.0313 Q1401.9063,976.375 1404.4063,976.375 Q1405.1094,976.375 1405.75,976.5313 Q1406.4063,976.6875 1406.9688,976.9844 L1406.9688,979.7031 Q1406.3438,979.125 1405.75,978.8594 Q1405.1563,978.5781 1404.5313,978.5781 Q1403.1875,978.5781 1402.5,979.6563 Q1401.8125,980.7188 1401.8125,982.8125 Q1401.8125,
 984.9063 1402.5,985.9844 Q1403.1875,987.0469 1404.5313,987.0469 Q1405.1563,987.0469 1405.75,986.7813 Q1406.3438,986.5 1406.9688,985.9219 L1406.9688,988.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="114" x="1418" y="987.1543">GapsCircuitBuilder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1390" x2="1534" y1="999" y2="999"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1390" x2="1534" y1="1007" y2="1007"/><!--class State--><rect fill="#FEFECE" filter="url(#fuwj1fyyylsf1)" height="60.8047" id="State" style="stroke: #A80036; stroke-width: 1.5;" width="66" x="1191" y="142.5"/><ellipse cx="1206" cy="158.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1208.9688,164.1406 Q1208.3906,164.4375 1207.75,164.5781 Q1207.1094,164.7344 1206.4063,164.7344 Q1203.9063,164.7344 1202.5781,163.0938 Q1201.2656,161.4375 1201.2656,158.3125 Q1201.2656,155.1875 1202.5781,153.5313
  Q1203.9063,151.875 1206.4063,151.875 Q1207.1094,151.875 1207.75,152.0313 Q1208.4063,152.1875 1208.9688,152.4844 L1208.9688,155.2031 Q1208.3438,154.625 1207.75,154.3594 Q1207.1563,154.0781 1206.5313,154.0781 Q1205.1875,154.0781 1204.5,155.1563 Q1203.8125,156.2188 1203.8125,158.3125 Q1203.8125,160.4063 1204.5,161.4844 Q1205.1875,162.5469 1206.5313,162.5469 Q1207.1563,162.5469 1207.75,162.2813 Q1208.3438,162 1208.9688,161.4219 L1208.9688,164.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="34" x="1220" y="162.6543">State</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1192" x2="1256" y1="174.5" y2="174.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1192" x2="1256" y1="182.5" y2="182.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="26" x="1197" y="196.7104">get()</text><!--link RelayList to Relay--><path d="M1141.7803,1117.7792 C1139.5047,
 1141.3892 1137.1208,1166.1221 1134.8275,1189.9151 " fill="none" id="RelayList-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1143.0322,1104.7911,1138.4749,1110.3796,1141.8807,1116.7357,1146.438,1111.1472,1143.0322,1104.7911" style="stroke: #A80036; stroke-width: 1.0;"/><!--link RelayPrioritizer to RelayList--><path d="M1091.8035,242.0991 C1100.7542,286.445 1111.631,345.3745 1118,398 C1138.0909,564.0059 1147.1731,757.5829 1151.1325,877.2294 " fill="none" id="RelayPrioritizer-RelayList" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1089.1551,229.1209,1086.4355,235.7995,1091.5545,240.8786,1094.274,234.2,1089.1551,229.1209" style="stroke: #A80036; stroke-width: 1.0;"/><!--link RelayPrioritizer to ResultDump--><path d="M1064.568,242.0302 C1051.5551,314.2861 1031.0806,427.9735 1016.8997,506.7147 " fill="none" id="RelayPrioritizer-ResultDump" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1066
 .9078,229.0383,1061.9076,234.2343,1064.7808,240.8483,1069.7809,235.6523,1066.9078,229.0383" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to ResultError--><path d="M710.6906,1150.5792 C713.2952,1204.6264 715.9437,1259.5825 717.5294,1292.4845 " fill="none" id="Result-ResultError" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="703.6868,1150.6686,709.7159,1130.3548,717.6706,1149.9947,703.6868,1150.6686" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to ResultSuccess--><path d="M780.7396,1148.3754 C806.0146,1199.5418 831.8309,1251.8039 848.5484,1285.6468 " fill="none" id="Result-ResultSuccess" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="774.4197,1151.3866,771.8379,1130.3548,786.9718,1145.1862,774.4197,1151.3866" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to Destination--><path d="M566.1487,1068.0931 C504.0233,1103.9749 430.0487,1147.9462 365,1190 C330.9212,1212.0319 294.3122,1237.5008
  262.5366,1260.2178 " fill="none" id="Result-Destination" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to Relay--><path d="M839.6165,1099.2498 C884.6328,1134.9191 934.7779,1174.6522 980.1737,1210.6221 " fill="none" id="Result-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><!--link Result to Result.Relay--><path d="M614.3565,1141.9212 C594.2523,1176.1499 573.6418,1211.2406 555.9819,1241.3077 " fill="none" id="Result-Result.Relay" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="621.15,1130.3548,614.6622,1133.5026,615.0726,1140.702,621.5604,1137.5542,621.15,1130.3548" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultError to ResultErrorCircuit--><path d="M698.5156,1372.3901 C679.927,1417.2093 653.3054,1481.3969 639.0015,1515.8853 " fill="none" id="ResultError-ResultErrorCircuit" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="692.168,1369.4229,706.2961,1353.6306,705.0999,1374.7864,692.168,1369.4229" 
 style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultError to ResultErrorStream--><path d="M739.2568,1372.3901 C757.6388,1417.2093 783.9646,1481.3969 798.1096,1515.8853 " fill="none" id="ResultError-ResultErrorStream" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="732.6756,1374.791,731.5628,1353.6306,745.6285,1369.4784,732.6756,1374.791" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultDump to Result--><path d="M946.3484,694.784 C927.5344,726.6984 905.5067,761.6122 883,792 C868.2356,811.9343 851.8253,832.1859 835.0927,851.7601 " fill="none" id="ResultDump-Result" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="953.1293,683.1758,946.649,686.3391,947.0766,693.5375,953.5568,690.3742,953.1293,683.1758" style="stroke: #A80036; stroke-width: 1.0;"/><!--link ResultDump to Relay--><path d="M988.2056,683.1519 C975.6842,790.8524 964.1023,977.5467 1007,1130 C1012.6786,1150.181 1021.0422,1170.3958 1030.7131,1189.7404 " fi
 ll="none" id="ResultDump-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><!--link DestinationList to Destination--><path d="M177,1047.2321 C177,1106.3398 177,1199.0983 177,1260.4715 " fill="none" id="DestinationList-Destination" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="177,1034.0628,173,1040.0628,177,1046.0628,181,1040.0628,177,1034.0628" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWHeader to Result--><path d="M475.4186,740.5549 C491.1082,757.9 506.9075,775.3516 522,792 C539.5654,811.3761 558.107,831.7977 576.3573,851.8801 " fill="none" id="V3BWHeader-Result" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWLine to Result--><path d="M703,792.1299 C703,812.298 703,832.4782 703,851.8333 " fill="none" id="V3BWLine-Result" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to V3BWHeader--><path d="M344,351.6517 C344,384.1873 344,417.7741 344,449.2179 " fill="none" id="V3BWFile-V3BWHeader" style="stroke: #A80036; s
 troke-width: 1.0;"/><polygon fill="#A80036" points="344,338.2718,340,344.2718,344,350.2718,348,344.2718,344,338.2718" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to V3BWLine--><path d="M493.1122,348.2795 C508.499,366.3665 524.1926,384.8142 539.723,403.0699 " fill="none" id="V3BWFile-V3BWLine" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="484.5985,338.2718,485.4396,345.4337,492.3741,347.4118,491.533,340.25,484.5985,338.2718" style="stroke: #A80036; stroke-width: 1.0;"/><!--link V3BWFile to Result--><path d="M193.7462,338.0148 C182.1681,357.2413 172.2006,377.383 165,398 C107.2614,563.3184 64.9348,648.2959 165,792 C171.0821,800.7345 409.0849,886.5905 566.4632,942.6413 " fill="none" id="V3BWFile-Result" style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to RelayList--><path d="M1301.5908,669.8683 C1274.675,728.4323 1236.8065,810.8276 1206.1672,877.4933 " fill="none" id="CircuitBuilder-RelayList" style="stroke: #A80036; 
 stroke-width: 1.0;"/><polygon fill="#A80036" points="1307.1616,657.7474,1301.0215,661.5287,1302.1503,668.6509,1308.2905,664.8696,1307.1616,657.7474" style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to Relay--><path d="M1344.9855,657.8754 C1356.9509,761.1798 1369.3716,971.196 1301,1130 C1291.5123,1152.0367 1278.3878,1173.1519 1263.5173,1192.7967 " fill="none" id="CircuitBuilder-Relay" style="stroke: #A80036; stroke-width: 1.0;"/><!--link CircuitBuilder to GapsCircuitBuilder--><path d="M1362.0812,676.9694 C1391.1312,768.2694 1436.3637,910.4289 1454.2986,966.7956 " fill="none" id="CircuitBuilder-GapsCircuitBuilder" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1355.3587,678.9283,1355.9651,657.7474,1368.6997,674.6834,1355.3587,678.9283" style="stroke: #A80036; stroke-width: 1.0;"/><!--
+ at startuml
+
+class RelayList {
+  stem.Controller _controller
+  Lock _refresh_lock
+  int _last_refresh
+  list @p relays
+  list @p bad_exits
+  list @p exits
+  list @p non_exits
+  list @p authorities
+  bool _need_refresh()
+  _init_relays()
+  _refresh()
+  list _relays_with_flag(int flag)
+  list _relays_without_flag(int flag)
+  list exits_not_bad_can_exit_to_port(int port)
+}
+RelayList *- - Relay
+class Relay {
+  stem.RouterStatusEntryV3 _from_ns
+  stem.RelayDescriptor _from_desc
+  str @p nickname
+  str @p fingerprint
+  list @p flags
+  ExitPolicy @p exit_policy
+  str @p address
+  str @p master_key_ed25519
+  int @p observed_bandwidth
+  int @p average_bandwidth
+  int @p burst_bandwidth
+  int @p consensus_bandwidth
+  bool @p consensus_bandwidth_is_unmeasured
+  obj _from_ns(attr)
+  obj _from_desc(attr)
+  bool can_exit_to_port(int port)
+  bool is_exit_not_bad_allowing_port(int port)
+}
+class RelayPrioritizer {
+  int fresh_seconds
+  ResultDump result_dump
+  RelayList relay_list
+  bool measure_authorities
+  generator best_priority()
+}
+RelayPrioritizer *- - RelayList
+RelayPrioritizer *- - ResultDump
+Result ^- - ResultError
+Result ^- - ResultSuccess
+Result - - Destination
+class Result {
+  Result.Relay _relay
+  list @p circ
+  str @p dest_url
+  str @p scanner
+  int @p time
+  str @p type
+  int @p version
+  str @p nickname
+  str @p fingerprint
+  str @p address
+  str @p master_key_ed25519
+  int @p relay_observed_bandwidth
+  int @p relay_average_bandwidth
+  int @p relay_burst_bandwidth
+  int @p consensus_bandwidth
+  int @p consensus_bandwidth_is_unmeasured
+  dict to_dict()
+  Result from_dict(dict d)
+}
+Result - - Relay
+Result *- - Result.Relay
+class Result.Relay {
+  str nickname
+  str fingerprint
+  str address
+  str master_key_ed25519
+  int observed_bandwidth
+  int average_bandwidth
+  int burst_bandwidth
+  int consensus_bandwidth
+  int consensus_bandwidth_is_unmeasured
+}
+class ResultError {
+  str @p msg
+}
+ResultError ^- - ResultErrorCircuit
+class ResultErrorCircuit {
+}
+ResultError ^- - ResultErrorStream
+class ResultSuccess {
+  list @p rtts
+  list @p downloads
+}
+ResultDump *- - Result
+ResultDump - - Relay
+class ResultDump {
+  dict data
+  int fresh_days
+  str datadir
+  Lock data_lock
+  Thread thread
+  Queue queue
+  store_result(Result result)
+  handle_result(Result result)
+  enter()
+  list results_for_relay(Relay relay)
+}
+class DestinationList {
+  list _rl
+  Destination next()
+  DestinationList @sm from_config(...)
+}
+DestinationList *- - Destination
+class Destination {
+  str @p hostname
+  int @p port
+  str @p url
+  bool @p verify
+  bool is_usable()
+  Destination @sm from_config(str conf_section,int max_dl)
+}
+V3BWHeader - - Result
+class V3BWHeader {
+  int timestamp
+  str version
+  str file_created
+  str latest_bandwidth
+  int num_lines
+  str software
+  str software_version
+  str generator_started
+  int number_eligible_relays
+  int minimum_number_eligible_relays
+  int number_consensus_relays
+  int percent_eligible_relays
+  int minimum_percent_eligible_relays
+  int @p num_lines
+
+  V3BWHeader @cm from_results(dict results)
+  add_stats(**kwargs)
+  int @sm earliest_bandwidth_from_results(dict results)
+  str @sm generator_started_from_file(dict results)
+  int @sm latest_bandwidth_from_results(dict results)
+}
+V3BWLine - - Result
+class V3BWLine {
+  int bw
+  str node_id
+  str master_key_ed25519
+  str nick
+  int rtt
+  str time
+  int success
+  int error_stream
+  int error_circ
+  int error_misc
+  int bw_median
+  int bw_mean
+  int desc_bw_avg
+  int desc_bw_bur
+  int desc_bw_obs_last
+  int desc_bw_obs_mean
+  consensus_bandwidth
+  consensus_bandwidth_is_unmeasured
+
+  int @sm bw_mean_from_results(list results)
+  int @sm bw_median_from_results(list results)
+  int @sm desc_bw_obs_last_from_results(list results)
+  int @sm desc_bw_obs_mean_from_results(list results)
+  V3BWLine @cm from_results(list results)
+  str @sm last_time_from_results(list results)
+  dict @sm result_types_from_results(list results)
+  list @sm results_away_each_other(list results)
+  list @sm results_recent_than(list results)
+}
+V3BWFile *- - V3BWHeader
+V3BWFile *- - V3BWLine
+V3BWFile - - Result
+class V3BWFile {
+  V3BWHeader header
+  list bw_lines
+  @p info_stats
+  bool @p is_min_perc
+  int @p max_bw
+  int @p mean_bw
+  int @p median_bw
+  int @p min_bw
+  int @p num
+  int @p sum_bw
+  V3BWFile @cm from_results(dict results, ...)
+  list @sm bw_kb(bw_lines)
+  list @sm bw_sbws_scale(bw_lines)
+  list @sm bw_torflow_scale(bw_lines)
+  bool @sm is_max_bw_diff_perc_reached(bw_lines)
+  (dict, bool) @sm measured_progress_stats(bw_lines)
+  int @sm read_number_consensus_relays(str consensus_path)
+  (list, list, list) to_plt()
+  list update_progress(bw_lines, ...)
+  warn_if_not_accurate_enough(bw_lines, ...)
+  tuple to_plt(...)
+  write(str output)
+}
+CircuitBuilder *- - RelayList
+CircuitBuilder - - Relay
+class CircuitBuilder {
+  set built_circuits
+  RelayList relay_list
+  list relays
+  Controller controller
+  int build_circuit()
+  void close_circuit()
+}
+CircuitBuilder ^- - GapsCircuitBuilder
+
+class State {
+  get()
+}
+
+ at enduml
+
+PlantUML version 1.2018.13(Mon Nov 26 17:11:51 GMT 2018)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.8+10-post-Debian-1deb10u1
+Operating System: Linux
+OS Version: 4.19.0-10-amd64
+Default Encoding: UTF-8
+Language: en
+Country: US
+--></g></svg>
\ No newline at end of file
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 0c1f9b6..8f63eb2 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -260,6 +260,8 @@ BWLINE_INT_KEYS = (
     + BWLINE_KEYS_V1_2
     + BWLINE_KEYS_V1_4
 )
+# This is boolean, not int.
+BWLINE_INT_KEYS.remove('consensus_bandwidth_is_unmeasured')
 
 
 def round_sig_dig(n, digits=PROP276_ROUND_DIG):





More information about the tor-commits mailing list