Files
rippled/ValidatorList_8cpp_source.html
2021-09-14 16:34:03 +00:00

2278 lines
437 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>rippled: ValidatorList.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">rippled
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_df9c78dcf3f59a33b12284f95992a64b.html">ripple</a></li><li class="navelem"><a class="el" href="dir_9f69212e4c6e2ca9ec5ab59cd7b6275c.html">app</a></li><li class="navelem"><a class="el" href="dir_29f79f6f29a0be0eebc6c46bea51c866.html">misc</a></li><li class="navelem"><a class="el" href="dir_976a01832cc3a05d986422b2c1d44232.html">impl</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ValidatorList.cpp</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> This file is part of rippled: https://github.com/ripple/rippled</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2015 Ripple Labs Inc.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> Permission to use, copy, modify, and/or distribute this software for any</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> purpose with or without fee is hereby granted, provided that the above</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> copyright notice and this permission notice appear in all copies.</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> THE SOFTWARE IS PROVIDED &quot;AS IS&quot; AND THE AUTHOR DISCLAIMS ALL WARRANTIES</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">//==============================================================================</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#include &lt;ripple/app/misc/HashRouter.h&gt;</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#include &lt;ripple/app/misc/NetworkOPs.h&gt;</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="preprocessor">#include &lt;ripple/app/misc/ValidatorList.h&gt;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/FileUtilities.h&gt;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/Slice.h&gt;</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/StringUtilities.h&gt;</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &lt;ripple/basics/base64.h&gt;</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;ripple/json/json_reader.h&gt;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="preprocessor">#include &lt;ripple/overlay/Overlay.h&gt;</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &lt;ripple/protocol/STValidation.h&gt;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &lt;ripple/protocol/digest.h&gt;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &lt;ripple/protocol/jss.h&gt;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &lt;ripple/protocol/messages.h&gt;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &lt;boost/regex.hpp&gt;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; </div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/cmath.html">cmath</a>&gt;</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/mutex.html">mutex</a>&gt;</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/numeric.html">numeric</a>&gt;</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor">#include &lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/header/shared_mutex.html">shared_mutex</a>&gt;</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; </div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceripple.html">ripple</a> {</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div>
<div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="namespaceripple.html#a96888695e8d79474e080c334f149e30a"> 43</a></span>&#160;<a class="code" href="namespaceripple.html#af9776f187d3686a7fba4c2d2fbeebdf4">to_string</a>(<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a> disposition)</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;{</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keywordflow">switch</span> (disposition)</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; {</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>:</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;accepted&quot;</span>;</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ListDisposition::expired</a>:</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;expired&quot;</span>;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a>:</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;same_sequence&quot;</span>;</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ListDisposition::pending</a>:</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;pending&quot;</span>;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>:</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;known_sequence&quot;</span>;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ListDisposition::unsupported_version</a>:</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;unsupported_version&quot;</span>;</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>:</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;untrusted&quot;</span>;</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ListDisposition::stale</a>:</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;stale&quot;</span>;</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">case</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>:</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;invalid&quot;</span>;</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; }</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;}</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
<div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aaa6c17138870cb5a2bd680c29cc4ebab"> 69</a></span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a3377c0090810a38667f445596bb1aaf7">ValidatorList::PublisherListStats::PublisherListStats</a>(<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a> d)</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;{</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; ++<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">dispositions</a>[d];</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;}</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; </div>
<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a34d5705410e27523336af23aa9d90ec6"> 74</a></span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a3377c0090810a38667f445596bb1aaf7">ValidatorList::PublisherListStats::PublisherListStats</a>(</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a> d,</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> key,</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4">PublisherStatus</a> stat,</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> seq)</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; : publisherKey(key), status(stat), sequence(seq)</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;{</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; ++<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">dispositions</a>[d];</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;}</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; </div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a></div>
<div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc"> 85</a></span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">ValidatorList::PublisherListStats::bestDisposition</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keywordflow">return</span> dispositions.empty() ? <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; : dispositions.begin()-&gt;first;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;}</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; </div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a></div>
<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a47be311fd3dc2b5a9aa0623ee493215d"> 92</a></span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a47be311fd3dc2b5a9aa0623ee493215d">ValidatorList::PublisherListStats::worstDisposition</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">return</span> dispositions.empty() ? <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; : dispositions.rbegin()-&gt;first;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;}</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; </div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02"> 99</a></span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02">ValidatorList::PublisherListStats::mergeDispositions</a>(</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a> <span class="keyword">const</span>&amp; src)</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;{</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [disp, <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>] : src.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">dispositions</a>)</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; {</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; dispositions[disp] += <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>;</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; }</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;}</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
<div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a371d1aa21ff85729e2e5544f3bd63fbe"> 108</a></span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a17b716a96c5adf8f12cee236370a3aa5">ValidatorList::MessageWithHash::MessageWithHash</a>(</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;Message&gt;</a> <span class="keyword">const</span>&amp; message_,</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> hash_,</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> num_)</div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; : message(message_), hash(hash_), numVLs(num_)</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;{</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;}</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="keyword">const</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <a class="code" href="classripple_1_1ValidatorList.html#af3c12788fe36cb6f48201d3c5a688d06">ValidatorList::filePrefix_</a> = <span class="stringliteral">&quot;cache.&quot;</span>;</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
<div class="line"><a name="l00118"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aa4effc5014393e8a6eae30d95053df28"> 118</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#aa4effc5014393e8a6eae30d95053df28">ValidatorList::ValidatorList</a>(</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="classripple_1_1ManifestCache.html">ManifestCache</a>&amp; validatorManifests,</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <a class="code" href="classripple_1_1ManifestCache.html">ManifestCache</a>&amp; publisherManifests,</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <a class="code" href="classripple_1_1TimeKeeper.html">TimeKeeper</a>&amp; timeKeeper,</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; databasePath,</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j,</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::size_t&gt;</a> minimumQuorum)</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; : <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>(validatorManifests)</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; , <a class="code" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>(publisherManifests)</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; , <a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>(timeKeeper)</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; , <a class="code" href="classripple_1_1ValidatorList.html#a53a444cf253f5a11a1b800c23e691e31">dataPath_</a>(databasePath)</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; , <a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>(j)</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; , <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>(minimumQuorum.value_or(1)) <span class="comment">// Genesis ledger quorum</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; , <a class="code" href="classripple_1_1ValidatorList.html#ac3b9186600dcd1c5326c80af17165741">minimumQuorum_</a>(minimumQuorum)</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;{</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;}</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; </div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#ac26b319f046fcd0af996c60511cd1547"> 136</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#ac26b319f046fcd0af996c60511cd1547">ValidatorList::load</a>(</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; localSigningKey,</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; configKeys,</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; publisherKeys)</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;{</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keyword">static</span> boost::regex <span class="keyword">const</span> re(</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="stringliteral">&quot;[[:space:]]*&quot;</span> <span class="comment">// skip leading whitespace</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="stringliteral">&quot;([[:alnum:]]+)&quot;</span> <span class="comment">// node identity</span></div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="stringliteral">&quot;(?:&quot;</span> <span class="comment">// begin optional comment block</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="stringliteral">&quot;[[:space:]]+&quot;</span> <span class="comment">// (skip all leading whitespace)</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="stringliteral">&quot;(?:&quot;</span> <span class="comment">// begin optional comment</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <span class="stringliteral">&quot;(.*[^[:space:]]+)&quot;</span> <span class="comment">// the comment</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="stringliteral">&quot;[[:space:]]*&quot;</span> <span class="comment">// (skip all trailing whitespace)</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="stringliteral">&quot;)?&quot;</span> <span class="comment">// end optional comment</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="stringliteral">&quot;)?&quot;</span> <span class="comment">// end optional comment block</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; );</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; </div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Loading configured trusted validator list publisher keys&quot;</span>;</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; </div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> = 0;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> key : publisherKeys)</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; {</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; <span class="stringliteral">&quot;Processing &#39;&quot;</span> &lt;&lt; key &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; </div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> ret = <a class="code" href="namespaceripple.html#a3eae95a694e72bfb1b7b5c0e43114975">strUnHex</a>(key);</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; </div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">if</span> (!ret || !<a class="code" href="namespaceripple.html#adc1f8a2c9b47d7c08e671ad3473e9d3a">publicKeyType</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*ret)))</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; {</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Invalid validator list publisher key: &quot;</span> &lt;&lt; key;</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; }</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; </div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keyword">auto</span> <span class="keywordtype">id</span> = <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*ret));</div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keyword">auto</span> status = <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">PublisherStatus::unavailable</a>;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(<span class="keywordtype">id</span>))</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; {</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>())</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Configured validator list publisher key is revoked: &quot;</span></div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; &lt;&lt; key;</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; status = <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">PublisherStatus::revoked</a>;</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; }</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; </div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(<span class="keywordtype">id</span>))</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; {</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>())</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Duplicate validator list publisher key: &quot;</span> &lt;&lt; key;</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; }</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; </div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[id].status = status;</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; ++<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>;</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; }</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; </div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Loaded &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> &lt;&lt; <span class="stringliteral">&quot; keys&quot;</span>;</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; </div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a> = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(localSigningKey);</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="comment">// Treat local validator key as though it was listed in the config</span></div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a>.<a class="code" href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">size</a>())</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.insert({<a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a>, 1});</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; </div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Loading configured validator keys&quot;</span>;</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; </div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> = 0;</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; n : configKeys)</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; {</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>()) &lt;&lt; <span class="stringliteral">&quot;Processing &#39;&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; </div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; boost::smatch match;</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; </div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">if</span> (!boost::regex_match(n, match, re))</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; {</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Malformed entry: &#39;&quot;</span> &lt;&lt; n &lt;&lt; <span class="stringliteral">&quot;&#39;&quot;</span>;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; }</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; </div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> <span class="keywordtype">id</span> = parseBase58&lt;PublicKey&gt;(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, match[1]);</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; </div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">if</span> (!<span class="keywordtype">id</span>)</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; {</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Invalid node identity: &quot;</span> &lt;&lt; match[1];</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; }</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; </div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="comment">// Skip local key which was already added</span></div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">if</span> (*<span class="keywordtype">id</span> == <a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a> || *<span class="keywordtype">id</span> == localSigningKey)</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; </div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keyword">auto</span> ret = <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.insert({*id, 1});</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">if</span> (!ret.second)</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; {</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Duplicate node identity: &quot;</span> &lt;&lt; match[1];</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; }</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keyword">auto</span> [it, inserted] = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.emplace();</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="comment">// Config listed keys never expire</span></div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keyword">auto</span>&amp; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = it-&gt;second.current;</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">if</span> (inserted)</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil = TimeKeeper::time_point::max();</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.list.emplace_back(*<span class="keywordtype">id</span>);</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; it-&gt;second.status = <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>;</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; ++<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>;</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; }</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; </div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Loaded &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a> &lt;&lt; <span class="stringliteral">&quot; entries&quot;</span>;</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; </div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;}</div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; </div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;boost::filesystem::path</div>
<div class="line"><a name="l00250"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033"> 250</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">ValidatorList::getCacheFileName</a>(</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey)<span class="keyword"> const</span></div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a53a444cf253f5a11a1b800c23e691e31">dataPath_</a> / (<a class="code" href="classripple_1_1ValidatorList.html#af3c12788fe36cb6f48201d3c5a688d06">filePrefix_</a> + <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey));</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;}</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; </div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;<a class="code" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="line"><a name="l00259"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a"> 259</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">ValidatorList::buildFileData</a>(</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; pubCollection,</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;{</div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">buildFileData</a>(pubKey, pubCollection, {}, j);</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160;}</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; </div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160;<a class="code" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="line"><a name="l00269"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a789233c78ed4fddac45196e4efe9f0dd"> 269</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">ValidatorList::buildFileData</a>(</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; pubCollection,</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::uint32_t&gt;</a> forceVersion,</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;{</div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> value(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; </div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; assert(pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">rawVersion</a> == 2 || pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>.empty());</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> effectiveVersion =</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; forceVersion ? *forceVersion : pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">rawVersion</a>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; </div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; value[jss::manifest] = pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>;</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; value[jss::version] = effectiveVersion;</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; value[jss::public_key] = pubKey;</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; </div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">switch</span> (effectiveVersion)</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; {</div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="keywordflow">case</span> 1: {</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>;</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; value[jss::blob] = <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawBlob;</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; value[jss::signature] = <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawSignature;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; <span class="comment">// This is only possible if &quot;downgrading&quot; a v2 UNL to v1, for</span></div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="comment">// example for the /vl/ endpoint.</span></div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest &amp;&amp;</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; *<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest != pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>)</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; value[jss::manifest] = *<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest;</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; }</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordflow">case</span> 2: {</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> blobs(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; </div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keyword">auto</span> add = [&amp;blobs, &amp;outerManifest = pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>](</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html">PublisherList</a> <span class="keyword">const</span>&amp; pubList) {</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keyword">auto</span>&amp; blob = blobs.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; blob[jss::blob] = pubList.rawBlob;</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; blob[jss::signature] = pubList.rawSignature;</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">if</span> (pubList.rawManifest &amp;&amp;</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; *pubList.rawManifest != outerManifest)</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; blob[jss::manifest] = *pubList.rawManifest;</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; };</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; </div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; add(pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>);</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [_, <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">pending</a>] : pubCollection.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>)</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; {</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; (void)_;</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; add(<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">pending</a>);</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; }</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; </div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; value[jss::blobs_v2] = std::move(blobs);</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; }</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; JLOG(j.<a class="code" href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">trace</a>())</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Invalid VL version provided: &quot;</span> &lt;&lt; effectiveVersion;</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; value = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4ea7d9899633b4409bd3fc107e6737f8391">Json::nullValue</a>;</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; }</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; </div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordflow">return</span> value;</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160;}</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; </div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb"> 331</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb">ValidatorList::cacheValidatorFile</a>(</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp; lock,</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey)<span class="keyword"> const</span></div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a53a444cf253f5a11a1b800c23e691e31">dataPath_</a>.empty())</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; </div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; boost::filesystem::path <span class="keyword">const</span> filename = <a class="code" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">getCacheFileName</a>(lock, pubKey);</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; </div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; boost::system::error_code ec;</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; </div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> value =</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">buildFileData</a>(<a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey), <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.at(pubKey), <a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>);</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="comment">// rippled should be the only process writing to this file, so</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="comment">// if it ever needs to be read, it is not expected to change externally, so</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="comment">// delay the refresh as long as possible: 24 hours. (See also</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="comment">// `ValidatorSite::missingSite()`)</span></div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; value[jss::refresh_interval] = 24 * 60;</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; </div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <a class="code" href="namespaceripple.html#ae18870f8d8eaa17b582f609cc486aa04">writeFileContents</a>(ec, filename, value.<a class="code" href="classJson_1_1Value.html#a3696d34c1a1833742b4bf8e5b247f125">toStyledString</a>());</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; </div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; {</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="comment">// Log and ignore any file I/O exceptions</span></div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>()) &lt;&lt; <span class="stringliteral">&quot;Problem writing &quot;</span> &lt;&lt; filename &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; ec.value()</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; ec.message();</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; }</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;}</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; </div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a></div>
<div class="line"><a name="l00362"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691"> 362</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ValidatorList::parseBlobs</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version, <a class="code" href="classJson_1_1Value.html">Json::Value</a> <span class="keyword">const</span>&amp; body)</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;{</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> result;</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">switch</span> (version)</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; {</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keywordflow">case</span> 1: {</div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span> (!body.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::blob) || !body[jss::blob].<a class="code" href="classJson_1_1Value.html#a71e1f82cf1c3eaf969d400dcffb163a6">isString</a>() ||</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; !body.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::signature) ||</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; !body[jss::signature].<a class="code" href="classJson_1_1Value.html#a71e1f82cf1c3eaf969d400dcffb163a6">isString</a>() ||</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="comment">// If the v2 field is present, the VL is malformed</span></div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; body.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::blobs_v2))</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <a class="code" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a>&amp; info = result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a> = body[jss::blob].<a class="code" href="classJson_1_1Value.html#ab0d86bf425efefd03513e8dbfaca317b">asString</a>();</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a> = body[jss::signature].<a class="code" href="classJson_1_1Value.html#ab0d86bf425efefd03513e8dbfaca317b">asString</a>();</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; assert(result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>() == 1);</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; }</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="comment">// Treat unknown versions as if they&#39;re the latest version. This</span></div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="comment">// will likely break a bunch of unit tests each time we introduce a</span></div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">// new version, so don&#39;t do it casually. Note that the version is</span></div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="comment">// validated elsewhere.</span></div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="keywordflow">case</span> 2:</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">default</span>: {</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keywordflow">if</span> (!body.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::blobs_v2) ||</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; !body[jss::blobs_v2].<a class="code" href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">isArray</a>() ||</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; body[jss::blobs_v2].<a class="code" href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">size</a>() &gt; <a class="code" href="classripple_1_1ValidatorList.html#aa0c6d081fe5e626dc63a9cd949de2d85">maxSupportedBlobs</a> ||</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="comment">// If any of the v1 fields are present, the VL is malformed</span></div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; body.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::blob) || body.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::signature))</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; blobs = body[jss::blobs_v2];</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(blobs.size());</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; blobInfo : blobs)</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; {</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">if</span> (!blobInfo.isObject() ||</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; !blobInfo.isMember(jss::signature) ||</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; !blobInfo[jss::signature].isString() ||</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; !blobInfo.isMember(jss::blob) ||</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; !blobInfo[jss::blob].isString())</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <a class="code" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a>&amp; info = result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a> = blobInfo[jss::blob].asString();</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a> = blobInfo[jss::signature].asString();</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">if</span> (blobInfo.isMember(jss::manifest))</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; {</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">if</span> (!blobInfo[jss::manifest].isString())</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> = blobInfo[jss::manifest].asString();</div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; }</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; }</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; assert(result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>() == blobs.size());</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; }</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; }</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;}</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; </div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a></div>
<div class="line"><a name="l00420"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a00f7133196028a7df7331c972abf9169"> 420</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ValidatorList::parseBlobs</a>(protocol::TMValidatorList <span class="keyword">const</span>&amp; body)</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160;{</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordflow">return</span> {{body.blob(), body.signature(), {}}};</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160;}</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; </div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a></div>
<div class="line"><a name="l00427"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a4abcd1b16fada4897130485669234083"> 427</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ValidatorList::parseBlobs</a>(protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; body)</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160;{</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="keywordflow">if</span> (body.blobs_size() &gt; <a class="code" href="classripple_1_1ValidatorList.html#aa0c6d081fe5e626dc63a9cd949de2d85">maxSupportedBlobs</a>)</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> result;</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(body.blobs_size());</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; blob : body.blobs())</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; {</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <a class="code" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a>&amp; info = result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a> = blob.blob();</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a> = blob.signature();</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">if</span> (blob.has_manifest())</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; {</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; info.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> = blob.manifest();</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; }</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; }</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; assert(result.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/size.html">size</a>() == body.blobs_size());</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160;}</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; </div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;<a class="code" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; largeMsg,</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize,</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> begin,</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> end);</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; </div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l00456"></a><span class="lineno"><a class="line" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076"> 456</a></span>&#160;<a class="code" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">splitMessage</a>(</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; largeMsg,</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize,</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> begin = 0,</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> end = 0)</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160;{</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordflow">if</span> (begin == 0 &amp;&amp; end == 0)</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; end = largeMsg.blobs_size();</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; assert(begin &lt; end);</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keywordflow">if</span> (end &lt;= begin)</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; </div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keyword">auto</span> mid = (begin + end) / 2;</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// The parts function will do range checking</span></div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="comment">// Use two separate calls to ensure deterministic order</span></div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keyword">auto</span> result = <a class="code" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(messages, largeMsg, maxSize, begin, mid);</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">return</span> result + <a class="code" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(messages, largeMsg, maxSize, mid, end);</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160;}</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; </div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l00477"></a><span class="lineno"><a class="line" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0"> 477</a></span>&#160;<a class="code" href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">splitMessageParts</a>(</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; protocol::TMValidatorListCollection <span class="keyword">const</span>&amp; largeMsg,</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize,</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> begin,</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> end)</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160;{</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keywordflow">if</span> (end &lt;= begin)</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keywordflow">if</span> (end - begin == 1)</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; {</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; protocol::TMValidatorList smallMsg;</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; smallMsg.set_version(1);</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; smallMsg.set_manifest(largeMsg.manifest());</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; </div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; blob = largeMsg.blobs(begin);</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; smallMsg.set_blob(blob.blob());</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; smallMsg.set_signature(blob.signature());</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <span class="comment">// This is only possible if &quot;downgrading&quot; a v2 UNL to v1.</span></div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <span class="keywordflow">if</span> (blob.has_manifest())</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; smallMsg.set_manifest(blob.manifest());</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; </div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; assert(<a class="code" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(smallMsg) &lt;= <a class="code" href="namespaceripple.html#ac6313681c41516db0a8f8829e1d7b753">maximiumMessageSize</a>);</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; </div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; std::make_shared&lt;Message&gt;(smallMsg, protocol::mtVALIDATORLIST),</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <a class="code" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(smallMsg),</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; 1);</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="keywordflow">return</span> messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/back.html">back</a>().<a class="code" href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a94fb76dabc20085db29771b4a2d5d952">numVLs</a>;</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; }</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; {</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;protocol::TMValidatorListCollection&gt;</a> smallMsg;</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; smallMsg.<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">emplace</a>();</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; smallMsg-&gt;set_version(largeMsg.version());</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; smallMsg-&gt;set_manifest(largeMsg.manifest());</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; </div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="keywordflow">for</span> (<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> i = begin; i &lt; end; ++i)</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; {</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; *smallMsg-&gt;add_blobs() = largeMsg.blobs(i);</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; }</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; </div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(*smallMsg) &gt; maxSize)</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; {</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="comment">// free up the message space</span></div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; smallMsg.<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional/reset.html">reset</a>();</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">splitMessage</a>(messages, largeMsg, maxSize, begin, end);</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; }</div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; {</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; std::make_shared&lt;Message&gt;(</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; *smallMsg, protocol::mtVALIDATORLISTCOLLECTION),</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <a class="code" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(*smallMsg),</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; smallMsg-&gt;blobs_size());</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="keywordflow">return</span> messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/back.html">back</a>().<a class="code" href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a94fb76dabc20085db29771b4a2d5d952">numVLs</a>;</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; }</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; }</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;}</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; </div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160;<span class="comment">// Build a v1 protocol message using only the current VL</span></div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l00540"></a><span class="lineno"><a class="line" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0"> 540</a></span>&#160;<a class="code" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <a class="code" href="structripple_1_1ValidatorBlobInfo.html">ValidatorBlobInfo</a> <span class="keyword">const</span>&amp; currentBlob,</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize)</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;{</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; assert(messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>());</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; protocol::TMValidatorList msg;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a> =</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; currentBlob.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> ? *currentBlob.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">manifest</a> : rawManifest;</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> version = 1;</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; msg.set_manifest(<a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>);</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; msg.set_blob(currentBlob.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">blob</a>);</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; msg.set_signature(currentBlob.<a class="code" href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">signature</a>);</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// Override the version</span></div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; msg.set_version(version);</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; </div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; assert(<a class="code" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(msg) &lt;= <a class="code" href="namespaceripple.html#ac6313681c41516db0a8f8829e1d7b753">maximiumMessageSize</a>);</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; std::make_shared&lt;Message&gt;(msg, protocol::mtVALIDATORLIST),</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <a class="code" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(msg),</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; 1);</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;}</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; </div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160;<span class="comment">// Build a v2 protocol message using all the VLs with sequence larger than the</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;<span class="comment">// peer&#39;s</span></div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l00569"></a><span class="lineno"><a class="line" href="namespaceripple.html#a7e0985fab0c0a13e1bb91f6d8ed4830f"> 569</a></span>&#160;<a class="code" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize)</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160;{</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; assert(messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>());</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; protocol::TMValidatorListCollection msg;</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> version = rawVersion &lt; 2 ? 2 : rawVersion;</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; msg.set_version(version);</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; msg.set_manifest(rawManifest);</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; </div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, blobInfo] : blobInfos)</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; {</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordflow">if</span> (sequence &lt;= peerSequence)</div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; protocol::ValidatorBlobInfo&amp; blob = *msg.add_blobs();</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; blob.set_blob(blobInfo.blob);</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; blob.set_signature(blobInfo.signature);</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="keywordflow">if</span> (blobInfo.manifest)</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; blob.set_manifest(*blobInfo.manifest);</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; }</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; assert(msg.blobs_size() &gt; 0);</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">Message::totalSize</a>(msg) &gt; maxSize)</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; {</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="comment">// split into smaller messages</span></div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">splitMessage</a>(messages, msg, maxSize);</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; }</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; {</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; std::make_shared&lt;Message&gt;(msg, protocol::mtVALIDATORLISTCOLLECTION),</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <a class="code" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(msg),</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; msg.blobs_size());</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; <span class="keywordflow">return</span> messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/back.html">back</a>().<a class="code" href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a94fb76dabc20085db29771b4a2d5d952">numVLs</a>;</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; }</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160;}</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; </div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160;[[nodiscard]]</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair&lt;std::size_t, std::size_t&gt;</a></div>
<div class="line"><a name="l00612"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e"> 612</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e">ValidatorList::buildValidatorListMessages</a>(</div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> messageVersion,</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSize <span class="comment">/*= maximiumMessageSize*/</span>)</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;{</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; assert(!blobInfos.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map/empty.html">empty</a>());</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; [currentSeq, currentBlob] = *blobInfos.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map/begin.html">begin</a>();</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="keyword">auto</span> numVLs = <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/accumulate.html">std::accumulate</a>(</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>(),</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>(),</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; 0,</div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; [](<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> total, <a class="code" href="structripple_1_1ValidatorList_1_1MessageWithHash.html">MessageWithHash</a> <span class="keyword">const</span>&amp; m) {</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; return total + m.numVLs;</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; });</div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="keywordflow">if</span> (messageVersion == 2 &amp;&amp; peerSequence &lt; maxSequence)</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; {</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <span class="comment">// Version 2</span></div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keywordflow">if</span> (messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; {</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; numVLs = <a class="code" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; messages,</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; peerSequence,</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; rawVersion,</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; rawManifest,</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; blobInfos,</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; maxSize);</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="keywordflow">if</span> (messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <span class="comment">// No message was generated. Create an empty placeholder so we</span></div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; <span class="comment">// dont&#39; repeat the work later.</span></div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; }</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; </div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="comment">// Don&#39;t send it next time.</span></div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keywordflow">return</span> {maxSequence, numVLs};</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; }</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (messageVersion == 1 &amp;&amp; peerSequence &lt; currentSeq)</div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; {</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <span class="comment">// Version 1</span></div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <span class="keywordflow">if</span> (messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; {</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; numVLs = <a class="code" href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">buildValidatorListMessage</a>(</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; messages,</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; rawVersion,</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; currentBlob.manifest ? *currentBlob.manifest : rawManifest,</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; currentBlob,</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; maxSize);</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <span class="keywordflow">if</span> (messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="comment">// No message was generated. Create an empty placeholder so we</span></div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <span class="comment">// dont&#39; repeat the work later.</span></div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>();</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; }</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; </div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="comment">// Don&#39;t send it next time.</span></div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="keywordflow">return</span> {currentSeq, numVLs};</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; }</div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; <span class="keywordflow">return</span> {0, 0};</div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160;}</div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; </div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00677"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a19844edbd01319f6f0ddca1c94def75f"> 677</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">ValidatorList::sendValidatorList</a>(</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <a class="code" href="classripple_1_1Peer.html">Peer</a>&amp; peer,</div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&amp; messages,</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <a class="code" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160;{</div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> <span class="keyword">const</span> messageVersion =</div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; peer.<a class="code" href="classripple_1_1Peer.html#a1781d176803366238413407a0815124a">supportsFeature</a>(<a class="code" href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1">ProtocolFeature::ValidatorList2Propagation</a>)</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; ? 2</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; : peer.<a class="code" href="classripple_1_1Peer.html#a1781d176803366238413407a0815124a">supportsFeature</a>(<a class="code" href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b">ProtocolFeature::ValidatorListPropagation</a>) ? 1</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; : 0;</div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keywordflow">if</span> (!messageVersion)</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> [newPeerSequence, numVLs] = <a class="code" href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e">buildValidatorListMessages</a>(</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; messageVersion,</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; peerSequence,</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; maxSequence,</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; rawVersion,</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; rawManifest,</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; blobInfos,</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; messages);</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">if</span> (newPeerSequence)</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; {</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; assert(!messages.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>());</div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <span class="comment">// Don&#39;t send it next time.</span></div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; peer.<a class="code" href="classripple_1_1Peer.html#adc1069de1a8a5ff1364003caf00bb139">setPublisherListSequence</a>(publisherKey, newPeerSequence);</div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; </div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keywordtype">bool</span> sent = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; message : messages)</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; {</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keywordflow">if</span> (message.message)</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; {</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; peer.<a class="code" href="classripple_1_1Peer.html#a3c89dbf867ba814f0bf2417757d5a0f4">send</a>(message.message);</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; hashRouter.<a class="code" href="classripple_1_1HashRouter.html#a86c862f1b0722d061b3724ff34a53572">addSuppressionPeer</a>(message.hash, peer.<a class="code" href="classripple_1_1Peer.html#aee121254a095838be2d8040bfdfacc79">id</a>());</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; sent = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; }</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; }</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="comment">// The only way sent wil be false is if the messages was too big, and</span></div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="comment">// thus there will only be one entry without a message</span></div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; assert(sent || messages.size() == 1);</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordflow">if</span> (sent)</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; {</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <span class="keywordflow">if</span> (messageVersion &gt; 1)</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; JLOG(j.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Sent &quot;</span> &lt;&lt; messages.size()</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; &lt;&lt; <span class="stringliteral">&quot; validator list collection(s) containing &quot;</span> &lt;&lt; numVLs</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; &lt;&lt; <span class="stringliteral">&quot; validator list(s) for &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey)</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; &lt;&lt; <span class="stringliteral">&quot; with sequence range &quot;</span> &lt;&lt; peerSequence &lt;&lt; <span class="stringliteral">&quot;, &quot;</span></div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; &lt;&lt; newPeerSequence &lt;&lt; <span class="stringliteral">&quot; to &quot;</span></div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; &lt;&lt; peer.<a class="code" href="classripple_1_1Peer.html#a35b25d5a662db9a534ac4a972a8ba6b3">getRemoteAddress</a>().<a class="code" href="classbeast_1_1IP_1_1Endpoint.html#adcbd20a3d8d1d3f7c6a3ae541f519fb4">to_string</a>() &lt;&lt; <span class="stringliteral">&quot; [&quot;</span> &lt;&lt; peer.<a class="code" href="classripple_1_1Peer.html#aee121254a095838be2d8040bfdfacc79">id</a>()</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; {</div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; assert(numVLs == 1);</div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; JLOG(j.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Sent validator list for &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey)</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; &lt;&lt; <span class="stringliteral">&quot; with sequence &quot;</span> &lt;&lt; newPeerSequence &lt;&lt; <span class="stringliteral">&quot; to &quot;</span></div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; &lt;&lt; peer.<a class="code" href="classripple_1_1Peer.html#a35b25d5a662db9a534ac4a972a8ba6b3">getRemoteAddress</a>().<a class="code" href="classbeast_1_1IP_1_1Endpoint.html#adcbd20a3d8d1d3f7c6a3ae541f519fb4">to_string</a>() &lt;&lt; <span class="stringliteral">&quot; [&quot;</span> &lt;&lt; peer.<a class="code" href="classripple_1_1Peer.html#aee121254a095838be2d8040bfdfacc79">id</a>()</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; }</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; }</div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; }</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160;}</div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; </div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00749"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917"> 749</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">ValidatorList::sendValidatorList</a>(</div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <a class="code" href="classripple_1_1Peer.html">Peer</a>&amp; peer,</div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint64_t</a> peerSequence,</div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> rawVersion,</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; rawManifest,</div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; <a class="code" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160;{</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a> messages;</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">sendValidatorList</a>(</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; peer,</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; peerSequence,</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; publisherKey,</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; maxSequence,</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; rawVersion,</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; rawManifest,</div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; blobInfos,</div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; messages,</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; hashRouter,</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; j);</div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160;}</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; </div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00776"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5"> 776</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">ValidatorList::buildBlobInfos</a>(</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a>&amp; blobInfos,</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; lists)</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160;{</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = lists.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>;</div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; remaining = lists.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>;</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; blobInfos[<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.sequence] = {</div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawBlob, <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawSignature, <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.rawManifest};</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, vl] : remaining)</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; {</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; blobInfos[sequence] = {vl.rawBlob, vl.rawSignature, vl.rawManifest};</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; }</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160;}</div>
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; </div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a></div>
<div class="line"><a name="l00792"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a17b4fae898c2fe1c40471536133753d3"> 792</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">ValidatorList::buildBlobInfos</a>(</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; lists)</div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160;{</div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> result;</div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">buildBlobInfos</a>(result, lists);</div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160;}</div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; </div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160;<span class="comment">// static</span></div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00802"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139"> 802</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139">ValidatorList::broadcastBlobs</a>(</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ValidatorList::PublisherListCollection</a> <span class="keyword">const</span>&amp; lists,</div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; <a class="code" href="classripple_1_1Overlay.html">Overlay</a>&amp; overlay,</div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; <a class="code" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <a class="code" href="classbeast_1_1Journal.html">beast::Journal</a> j)</div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160;{</div>
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> toSkip = hashRouter.<a class="code" href="classripple_1_1HashRouter.html#a29980c0f77dcc002ef322c23080f3266">shouldRelay</a>(hash);</div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; </div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <span class="keywordflow">if</span> (toSkip)</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; {</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; <span class="comment">// We don&#39;t know what messages or message versions we&#39;re sending</span></div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160; <span class="comment">// until we examine our peer&#39;s properties. Build the message(s) on</span></div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="comment">// demand, but reuse them when possible.</span></div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; </div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="comment">// This will hold a v1 message with only the current VL if we have</span></div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="comment">// any peers that don&#39;t support v2</span></div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorList::MessageWithHash&gt;</a> messages1;</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="comment">// This will hold v2 messages indexed by the peer&#39;s</span></div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <span class="comment">// `publisherListSequence`. For each `publisherListSequence`, we&#39;ll</span></div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="comment">// only send the VLs with higher sequences.</span></div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, std::vector&lt;ValidatorList::MessageWithHash&gt;</a>&gt;</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; messages2;</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <span class="comment">// If any peers are found that are worth considering, this list will</span></div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="comment">// be built to hold info for all of the valid VLs.</span></div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> blobInfos;</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; </div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; assert(</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; lists.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">current</a>.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#aad9dd39b951a5b4a42bba0593ac16289">sequence</a> == maxSequence ||</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; lists.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">remaining</a>.count(maxSequence) == 1);</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="comment">// Can&#39;t use overlay.foreach here because we need to modify</span></div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; <span class="comment">// the peer, and foreach provides a const&amp;</span></div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; peer : overlay.<a class="code" href="classripple_1_1Overlay.html#a516f776bf7ff0dbf6a8be71b7355e5be">getActivePeers</a>())</div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; {</div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <span class="keywordflow">if</span> (toSkip-&gt;count(peer-&gt;id()) == 0)</div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; {</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> peerSequence =</div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; peer-&gt;publisherListSequence(publisherKey).value_or(0);</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keywordflow">if</span> (peerSequence &lt; maxSequence)</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; {</div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; <span class="keywordflow">if</span> (blobInfos.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map/empty.html">empty</a>())</div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">buildBlobInfos</a>(blobInfos, lists);</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> v2 = peer-&gt;supportsFeature(</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; <a class="code" href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1">ProtocolFeature::ValidatorList2Propagation</a>);</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">sendValidatorList</a>(</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; *peer,</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; peerSequence,</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; publisherKey,</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; maxSequence,</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; lists.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">rawVersion</a>,</div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; lists.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">rawManifest</a>,</div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; blobInfos,</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; v2 ? messages2[peerSequence] : messages1,</div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; hashRouter,</div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; j);</div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="comment">// Even if the peer doesn&#39;t support the messages,</span></div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="comment">// suppress it so it&#39;ll be ignored next time.</span></div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; hashRouter.<a class="code" href="classripple_1_1HashRouter.html#a86c862f1b0722d061b3724ff34a53572">addSuppressionPeer</a>(hash, peer-&gt;id());</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; }</div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; }</div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; }</div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; }</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160;}</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; </div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="line"><a name="l00869"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a7bdc06d223ec320799b7b09fe38fb16a"> 869</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a7bdc06d223ec320799b7b09fe38fb16a">ValidatorList::applyListsAndBroadcast</a>(</div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; manifest,</div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobs,</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <a class="code" href="classripple_1_1Overlay.html">Overlay</a>&amp; overlay,</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <a class="code" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter,</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; <a class="code" href="classripple_1_1NetworkOPs.html">NetworkOPs</a>&amp; networkOPs)</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160;{</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> result =</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110">applyLists</a>(<a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>, version, blobs, std::move(siteUri), hash);</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> disposition = result.bestDisposition();</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; </div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <span class="keywordflow">if</span> (disposition == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>)</div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; {</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; <span class="keywordtype">bool</span> good = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [pubKey, listCollection] : <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; {</div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; (void)pubKey;</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; <span class="keywordflow">if</span> (listCollection.status != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; {</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; good = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; }</div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160; }</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; <span class="keywordflow">if</span> (good)</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; {</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; networkOPs.<a class="code" href="classripple_1_1NetworkOPs.html#ace637a61664a15f70bc362f2ad1101e9">clearUNLBlocked</a>();</div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; }</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; }</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordtype">bool</span> broadcast = disposition &lt;= <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>;</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; </div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <span class="keywordflow">if</span> (broadcast)</div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; {</div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; pubCollection = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[*result.publisherKey];</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; assert(</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; result.status &lt;= <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e">PublisherStatus::expired</a> &amp;&amp; result.publisherKey &amp;&amp;</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; pubCollection.maxSequence);</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139">broadcastBlobs</a>(</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; *result.publisherKey,</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; pubCollection,</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; *pubCollection.maxSequence,</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; hash,</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; overlay,</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; hashRouter,</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>);</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; }</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; </div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160;}</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; </div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="line"><a name="l00922"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110"> 922</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110">ValidatorList::applyLists</a>(</div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; manifest,</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobs,</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;uint256&gt;</a> <span class="keyword">const</span>&amp; hash <span class="comment">/* = {} */</span>)</div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160;{</div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; <span class="keywordflow">if</span> (<a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/count.html">std::count</a>(</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/iterator/begin.html">std::begin</a>(<a class="code" href="classripple_1_1ValidatorList.html#afb78f6ff830cea855542f3ad78a587b1">supportedListVersions</a>),</div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/iterator/end.html">std::end</a>(<a class="code" href="classripple_1_1ValidatorList.html#afb78f6ff830cea855542f3ad78a587b1">supportedListVersions</a>),</div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; version) != 1)</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ListDisposition::unsupported_version</a>};</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; </div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; </div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a> result;</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; blobInfo : blobs)</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; {</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keyword">auto</span> stats = <a class="code" href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c">applyList</a>(</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>,</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; blobInfo.manifest,</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; blobInfo.blob,</div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; blobInfo.signature,</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; version,</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; siteUri,</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; hash,</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; lock);</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; </div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <span class="keywordflow">if</span> (stats.bestDisposition() &lt; result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">bestDisposition</a>() ||</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; (stats.bestDisposition() == result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">bestDisposition</a>() &amp;&amp;</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; stats.sequence &gt; result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aa37066f4c4bc231ad60e6f751e56bf05">sequence</a>))</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; {</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; stats.mergeDispositions(result);</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; result = std::move(stats);</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; }</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02">mergeDispositions</a>(stats);</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; }</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; </div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="comment">// Clean up the collection, because some of the processing may have made it</span></div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; <span class="comment">// inconsistent</span></div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; <span class="keywordflow">if</span> (result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a> &amp;&amp; <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(*result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a>))</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; {</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; <span class="keyword">auto</span>&amp; pubCollection = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[*result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a>];</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; <span class="keyword">auto</span>&amp; remaining = pubCollection.remaining;</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = pubCollection.current;</div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = remaining.begin(); iter != remaining.end();)</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; {</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <span class="keyword">auto</span> next = <a class="codeRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter);</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; assert(next == remaining.end() || next-&gt;first &gt; iter-&gt;first);</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keywordflow">if</span> (iter-&gt;first &lt;= <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.sequence ||</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; (next != remaining.end() &amp;&amp;</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; next-&gt;second.validFrom &lt;= iter-&gt;second.validFrom))</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; {</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; iter = remaining.erase(iter);</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; }</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; {</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; iter = next;</div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; }</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; }</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; </div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb">cacheValidatorFile</a>(lock, *result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">publisherKey</a>);</div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; </div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; pubCollection.fullHash = <a class="code" href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">sha512Half</a>(pubCollection);</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; </div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; result.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aa37066f4c4bc231ad60e6f751e56bf05">sequence</a> = *pubCollection.maxSequence;</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; }</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; </div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160;}</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; </div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l00996"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3"> 996</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3">ValidatorList::updatePublisherList</a>(</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html">PublisherList</a> <span class="keyword">const</span>&amp; current,</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; oldList,</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp;)</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;{</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; <span class="comment">// Update keyListings_ for added and removed keys</span></div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; publisherList = <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.list;</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; manifests = <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.manifests;</div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; <span class="keyword">auto</span> iNew = publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>();</div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; <span class="keyword">auto</span> iOld = oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>();</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <span class="keywordflow">while</span> (iNew != publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() || iOld != oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>())</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; {</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; <span class="keywordflow">if</span> (iOld == oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() ||</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; (iNew != publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() &amp;&amp; *iNew &lt; *iOld))</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; {</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; <span class="comment">// Increment list count for added keys</span></div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; ++<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iNew];</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; ++iNew;</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; }</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; iNew == publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() ||</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; (iOld != oldList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>() &amp;&amp; *iOld &lt; *iNew))</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; {</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; <span class="comment">// Decrement list count for removed keys</span></div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iOld] &lt;= 1)</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.erase(*iOld);</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; --<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>[*iOld];</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; ++iOld;</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; }</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; {</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; ++iNew;</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; ++iOld;</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; }</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; }</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; </div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; <span class="keywordflow">if</span> (publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/empty.html">empty</a>())</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; {</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;No validator keys included in valid list&quot;</span>;</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; }</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; </div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; valManifest : manifests)</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; {</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; <span class="keyword">auto</span> m = <a class="code" href="namespaceripple.html#a1e486c608fa3ad43cc19fc37bb1f425d">deserializeManifest</a>(<a class="code" href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">base64_decode</a>(valManifest));</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; </div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; <span class="keywordflow">if</span> (!m || !<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.count(m-&gt;masterKey))</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; {</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;List for &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey)</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; &lt;&lt; <span class="stringliteral">&quot; contained untrusted validator manifest&quot;</span>;</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; }</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; </div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> <span class="keyword">const</span> r = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">applyManifest</a>(std::move(*m));</div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; r == <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ManifestDisposition::invalid</a>)</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; {</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;List for &quot;</span> &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(pubKey)</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; &lt;&lt; <span class="stringliteral">&quot; contained invalid validator manifest&quot;</span>;</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; }</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; }</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;}</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; </div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;<a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ValidatorList::PublisherListStats</a></div>
<div class="line"><a name="l01060"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c"> 1060</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c">ValidatorList::applyList</a>(</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; globalManifest,</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::string&gt;</a> <span class="keyword">const</span>&amp; localManifest,</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; blob,</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; signature,</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> siteUri,</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;uint256&gt;</a> <span class="keyword">const</span>&amp; hash,</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp; lock)</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;{</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; <span class="keyword">using namespace </span>std::string_literals;</div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; </div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> list;</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> pubKey;</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a> = localManifest ? *localManifest : globalManifest;</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> result = <a class="code" href="classripple_1_1ValidatorList.html#a5f9f984bf774a8dc62ebcc96a9660a25">verify</a>(lock, list, pubKey, <a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>, blob, signature);</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; <span class="keywordflow">if</span> (result &gt; <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ListDisposition::pending</a>)</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; {</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(pubKey))</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; {</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; pubCollection = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[pubKey];</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; <span class="keywordflow">if</span> (pubCollection.maxSequence &amp;&amp;</div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; (result == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a> ||</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; result == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>))</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; {</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; <span class="comment">// We&#39;ve seen something valid list for this publisher</span></div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="comment">// already, so return what we know about it.</span></div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; result,</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; pubKey,</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; pubCollection.status,</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; *pubCollection.maxSequence};</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; }</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; }</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; <span class="keywordflow">return</span> <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a>{result};</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; }</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; </div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; <span class="comment">// Update publisher&#39;s list</span></div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="keyword">auto</span>&amp; pubCollection = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[pubKey];</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sequence = list[jss::sequence].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>();</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a> =</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; (result == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a> ||</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; result == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ListDisposition::expired</a>);</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; </div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a>)</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; pubCollection.status = result == <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a></div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; ? <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a></div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; : <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e">PublisherStatus::expired</a>;</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; pubCollection.rawManifest = globalManifest;</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; <span class="keywordflow">if</span> (!pubCollection.maxSequence || sequence &gt; *pubCollection.maxSequence)</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; pubCollection.maxSequence = sequence;</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; </div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> <span class="keyword">const</span>&amp; newList = list[jss::validators];</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a> oldList;</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a> &amp;&amp; pubCollection.remaining.count(sequence) != 0)</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; {</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; <span class="comment">// We&#39;ve seen this list before and stored it in &quot;remaining&quot;. The</span></div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; <span class="comment">// normal expected process is that the processed list would have</span></div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; <span class="comment">// already been moved in to &quot;current&quot; by &quot;updateTrusted()&quot;, but race</span></div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; <span class="comment">// conditions are possible, or the node may have lost sync, so do</span></div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; <span class="comment">// some of that work here.</span></div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; <span class="keyword">auto</span>&amp; publisher = pubCollection.current;</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <span class="comment">// Copy the old validator list</span></div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; oldList = std::move(pubCollection.current.list);</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; <span class="comment">// Move the publisher info from &quot;remaining&quot; to &quot;current&quot;</span></div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; publisher = std::move(pubCollection.remaining[sequence]);</div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; <span class="comment">// Remove the entry in &quot;remaining&quot;</span></div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; pubCollection.remaining.erase(sequence);</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; <span class="comment">// Done</span></div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; assert(publisher.sequence == sequence);</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; }</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; {</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; <span class="keyword">auto</span>&amp; publisher = <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a> ? pubCollection.current</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; : pubCollection.remaining[sequence];</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; publisher.sequence = sequence;</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; publisher.validFrom = <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{<a class="code" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::effective) ? list[jss::effective].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>() : 0}};</div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; publisher.validUntil = <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{</div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; <a class="code" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{list[jss::expiration].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>()}};</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; publisher.siteUri = std::move(siteUri);</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; publisher.rawBlob = blob;</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; publisher.rawSignature = signature;</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; publisher.rawManifest = localManifest;</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; <span class="keywordflow">if</span> (hash)</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; publisher.hash = *hash;</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; </div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;PublicKey&gt;</a>&amp; publisherList = publisher.list;</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a>&amp; manifests = publisher.manifests;</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; </div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; <span class="comment">// Copy the old validator list</span></div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; oldList = std::move(publisherList);</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; <span class="comment">// Build the new validator list from &quot;newList&quot;</span></div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/clear.html">clear</a>();</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(newList.<a class="code" href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">size</a>());</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : newList)</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; {</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; <span class="keywordflow">if</span> (val.isObject() &amp;&amp; val.isMember(jss::validation_public_key) &amp;&amp;</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; val[jss::validation_public_key].isString())</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; {</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;Blob&gt;</a> <span class="keyword">const</span> ret =</div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; <a class="code" href="namespaceripple.html#a3eae95a694e72bfb1b7b5c0e43114975">strUnHex</a>(val[jss::validation_public_key].asString());</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; </div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; <span class="keywordflow">if</span> (!ret || !<a class="code" href="namespaceripple.html#adc1f8a2c9b47d7c08e671ad3473e9d3a">publicKeyType</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*ret)))</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; {</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">error</a>())</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; &lt;&lt; <span class="stringliteral">&quot;Invalid node identity: &quot;</span></div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; &lt;&lt; val[jss::validation_public_key].asString();</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; }</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; {</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">push_back</a>(</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code" href="classripple_1_1Slice.html">Slice</a>{ret-&gt;data(), ret-&gt;size()}));</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; }</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; </div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; <span class="keywordflow">if</span> (val.isMember(jss::manifest) &amp;&amp;</div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; val[jss::manifest].isString())</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; manifests.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">push_back</a>(val[jss::manifest].asString());</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; }</div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; }</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; </div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; <span class="comment">// Standardize the list order by sorting</span></div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/sort.html">std::sort</a>(publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/begin.html">begin</a>(), publisherList.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/end.html">end</a>());</div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; }</div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; <span class="comment">// If this publisher has ever sent a more updated version than the one</span></div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; <span class="comment">// in this file, keep it. This scenario is unlikely, but legal.</span></div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160; pubCollection.rawVersion = <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(pubCollection.rawVersion, version);</div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; <span class="keywordflow">if</span> (!pubCollection.remaining.empty())</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160; {</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; <span class="comment">// If there are any pending VLs, then this collection must be at least</span></div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; <span class="comment">// version 2.</span></div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; pubCollection.rawVersion = <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(pubCollection.rawVersion, 2u);</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160; }</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; </div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160; <a class="code" href="structripple_1_1ValidatorList_1_1PublisherListStats.html">PublisherListStats</a> <span class="keyword">const</span> applyResult{</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; result, pubKey, pubCollection.status, *pubCollection.maxSequence};</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; </div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">accepted</a>)</div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; {</div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3">updatePublisherList</a>(pubKey, pubCollection.current, oldList, lock);</div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160; }</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; </div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160; <span class="keywordflow">return</span> applyResult;</div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;}</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; </div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a></div>
<div class="line"><a name="l01206"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a"> 1206</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a">ValidatorList::loadLists</a>()</div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;{</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160; <span class="keyword">using namespace </span>std::string_literals;</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160; <span class="keyword">using namespace </span>boost::filesystem;</div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160; <span class="keyword">using namespace </span>boost::system::errc;</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; </div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; </div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::string&gt;</a> sites;</div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160; sites.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">reserve</a>(<a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size());</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [pubKey, publisherCollection] : <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; {</div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160; boost::system::error_code ec;</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160; </div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160; <span class="keywordflow">if</span> (publisherCollection.status == <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160; </div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160; boost::filesystem::path <span class="keyword">const</span> filename = <a class="code" href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">getCacheFileName</a>(lock, pubKey);</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160; </div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> fullPath{canonical(filename, ec)};</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160; <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160; </div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160; <span class="keyword">auto</span> size = file_size(fullPath, ec);</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160; <span class="keywordflow">if</span> (!ec &amp;&amp; !size)</div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; {</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160; <span class="comment">// Treat an empty file as a missing file, because</span></div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; <span class="comment">// nobody else is going to write it.</span></div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160; ec = make_error_code(no_such_file_or_directory);</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160; }</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160; <span class="keywordflow">if</span> (ec)</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160; </div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span> prefix = [&amp;fullPath]() {</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;<span class="preprocessor">#if _MSC_VER // MSVC: Windows paths need a leading / added</span></div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160; {</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160; <span class="keywordflow">return</span> fullPath.root_path() == <span class="stringliteral">&quot;/&quot;</span>s ? <span class="stringliteral">&quot;file://&quot;</span> : <span class="stringliteral">&quot;file:///&quot;</span>;</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160; }</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;<span class="preprocessor">#else</span></div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160; {</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160; (void)fullPath;</div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;file://&quot;</span>;</div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160; }</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160; }();</div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160; sites.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">emplace_back</a>(prefix + fullPath.<a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string/basic_string.html">string</a>());</div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160; }</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160; </div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160; <span class="comment">// Then let the ValidatorSites do the rest of the work.</span></div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; <span class="keywordflow">return</span> sites;</div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;}</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160; </div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;<a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ListDisposition</a></div>
<div class="line"><a name="l01259"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a5f9f984bf774a8dc62ebcc96a9660a25"> 1259</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a5f9f984bf774a8dc62ebcc96a9660a25">ValidatorList::verify</a>(</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp; lock,</div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; list,</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>&amp; pubKey,</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; manifest,</div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; blob,</div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; signature)</div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;{</div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160; <span class="keyword">auto</span> m = <a class="code" href="namespaceripple.html#a1e486c608fa3ad43cc19fc37bb1f425d">deserializeManifest</a>(<a class="code" href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">base64_decode</a>(<a class="code" href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">manifest</a>));</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160; </div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160; <span class="keywordflow">if</span> (!m || !<a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(m-&gt;masterKey))</div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>;</div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160; </div>
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160; pubKey = m-&gt;masterKey;</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">revoked</a> = m-&gt;revoked();</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160; </div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> result = <a class="code" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">applyManifest</a>(std::move(*m));</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160; </div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">revoked</a> &amp;&amp; result == <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">ManifestDisposition::accepted</a>)</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160; {</div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268">removePublisherList</a>(lock, pubKey, <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">PublisherStatus::revoked</a>);</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160; <span class="comment">// If the manifest is revoked, no future list is valid either</span></div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[pubKey].remaining.clear();</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160; }</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160; </div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">revoked</a> || result == <a class="code" href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ManifestDisposition::invalid</a>)</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ListDisposition::untrusted</a>;</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160; </div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sig = <a class="code" href="namespaceripple.html#a3eae95a694e72bfb1b7b5c0e43114975">strUnHex</a>(signature);</div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> data = <a class="code" href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">base64_decode</a>(blob);</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160; <span class="keywordflow">if</span> (!sig ||</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160; !<a class="code" href="namespaceripple.html#ace4dd4a2d63cd976adb9fac9754ae785">ripple::verify</a>(</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">publisherManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a8409a7089c3e04f972f1513a54576133">getSigningKey</a>(pubKey),</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160; <a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(data),</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160; <a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*sig)))</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>;</div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160; </div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160; <a class="code" href="classJson_1_1Reader.html">Json::Reader</a> r;</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160; <span class="keywordflow">if</span> (!r.<a class="code" href="classJson_1_1Reader.html#a8ee4d40504e4f8b069745d762ab4d78c">parse</a>(data, list))</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>;</div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160; </div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160; <span class="keywordflow">if</span> (list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::sequence) &amp;&amp; list[jss::sequence].<a class="code" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>() &amp;&amp;</div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160; list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::expiration) &amp;&amp; list[jss::expiration].<a class="code" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>() &amp;&amp;</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160; (!list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::effective) || list[jss::effective].<a class="code" href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">isInt</a>()) &amp;&amp;</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160; list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::validators) &amp;&amp; list[jss::validators].<a class="code" href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">isArray</a>())</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160; {</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sequence = list[jss::sequence].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>();</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> validFrom = <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{<a class="code" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160; list.<a class="code" href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">isMember</a>(jss::effective) ? list[jss::effective].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>() : 0}};</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> validUntil = <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160; <a class="code" href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">TimeKeeper::duration</a>{list[jss::expiration].<a class="code" href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">asUInt</a>()}};</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> now = <a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code" href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">now</a>();</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; listCollection = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>[pubKey];</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160; <span class="keywordflow">if</span> (validUntil &lt;= validFrom)</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>;</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sequence &lt; listCollection.current.sequence)</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ListDisposition::stale</a>;</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sequence == listCollection.current.sequence)</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ListDisposition::same_sequence</a>;</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (validUntil &lt;= now)</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ListDisposition::expired</a>;</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (validFrom &gt; now)</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160; <span class="comment">// Not yet valid. Return pending if one of the following is true</span></div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160; <span class="comment">// * There&#39;s no maxSequence, indicating this is the first blob seen</span></div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160; <span class="comment">// for this publisher</span></div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160; <span class="comment">// * The sequence is larger than the maxSequence, indicating this</span></div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160; <span class="comment">// blob is new</span></div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160; <span class="comment">// * There&#39;s no entry for this sequence AND this blob is valid</span></div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160; <span class="comment">// before the last blob, indicating blobs may be processing out of</span></div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160; <span class="comment">// order. This may result in some duplicated processing, but</span></div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160; <span class="comment">// prevents the risk of missing valid data. Else return</span></div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160; <span class="comment">// known_sequence</span></div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160; <span class="keywordflow">return</span> !listCollection.maxSequence ||</div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160; sequence &gt; *listCollection.maxSequence ||</div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160; (listCollection.remaining.count(sequence) == 0 &amp;&amp;</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160; validFrom &lt; listCollection.remaining</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160; .at(*listCollection.maxSequence)</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160; .validFrom)</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160; ? <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ListDisposition::pending</a></div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160; : <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ListDisposition::known_sequence</a>;</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160; }</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160; {</div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ListDisposition::invalid</a>;</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160; }</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160; </div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ListDisposition::accepted</a>;</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;}</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160; </div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l01349"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b"> 1349</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b">ValidatorList::listed</a>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160; </div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end();</div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;}</div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160; </div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l01358"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a15193c461b148a76cf11872f6641b26b"> 1358</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ValidatorList::trusted</a>(</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.find(pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.end();</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;}</div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160; </div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l01367"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8"> 1367</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ValidatorList::trusted</a>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">trusted</a>(read_lock, identity);</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;}</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160; </div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l01374"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5"> 1374</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5">ValidatorList::getListedKey</a>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160; </div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end())</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160; <span class="keywordflow">return</span> pubKey;</div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160; <span class="keywordflow">return</span> std::nullopt;</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;}</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160; </div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l01385"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a15ca6b033b973fb438ca5d1b6a66b5b9"> 1385</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">ValidatorList::getTrustedKey</a>(</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> pubKey = <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">getMasterKey</a>(identity);</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.find(pubKey) != <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.end())</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160; <span class="keywordflow">return</span> pubKey;</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160; <span class="keywordflow">return</span> std::nullopt;</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;}</div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160; </div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l01396"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b"> 1396</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">ValidatorList::getTrustedKey</a>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160; </div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">getTrustedKey</a>(read_lock, identity);</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;}</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160; </div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l01404"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c"> 1404</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c">ValidatorList::trustedPublisher</a>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; identity)<span class="keyword"> const</span></div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160; <span class="keywordflow">return</span> identity.<a class="code" href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">size</a>() &amp;&amp; <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.count(identity) &amp;&amp;</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.at(identity).status &lt; <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">PublisherStatus::revoked</a>;</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;}</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160; </div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a></div>
<div class="line"><a name="l01412"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a4681f2660d566c13e7a3a7886512cbe4"> 1412</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a4681f2660d566c13e7a3a7886512cbe4">ValidatorList::localPublicKey</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">localPubKey_</a>;</div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;}</div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160; </div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;<span class="keywordtype">bool</span></div>
<div class="line"><a name="l01419"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268"> 1419</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268">ValidatorList::removePublisherList</a>(</div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">ValidatorList::lock_guard</a> <span class="keyword">const</span>&amp;,</div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; publisherKey,</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160; <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4">PublisherStatus</a> reason)</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;{</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160; assert(</div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160; reason != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a> &amp;&amp;</div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160; reason != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">PublisherStatus::unavailable</a>);</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> iList = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.find(publisherKey);</div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160; <span class="keywordflow">if</span> (iList == <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.end())</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160; </div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Removing validator list for publisher &quot;</span></div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160; &lt;&lt; <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publisherKey);</div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160; </div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : iList-&gt;second.current.list)</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160; {</div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; iVal = <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(val);</div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160; <span class="keywordflow">if</span> (iVal == <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end())</div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160; </div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160; <span class="keywordflow">if</span> (iVal-&gt;second &lt;= 1)</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.erase(iVal);</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160; --iVal-&gt;second;</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160; }</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160; </div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160; iList-&gt;second.current.list.clear();</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160; iList-&gt;second.status = reason;</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160; </div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;}</div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160; </div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l01453"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a42f61dfc9c05a17b695f6630452ca7f7"> 1453</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ValidatorList::count</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;)<span class="keyword"> const</span></div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size();</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;}</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160; </div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l01459"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd"> 1459</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ValidatorList::count</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>(read_lock);</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;}</div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160; </div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;TimeKeeper::time_point&gt;</a></div>
<div class="line"><a name="l01466"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#ae8b5192dbbf82c4a0150538f50d49184"> 1466</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741">ValidatorList::expires</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">ValidatorList::shared_lock</a> <span class="keyword">const</span>&amp;)<span class="keyword"> const</span></div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;TimeKeeper::time_point&gt;</a> res{};</div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [pubKey, collection] : <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160; {</div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160; (void)pubKey;</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160; <span class="comment">// Unfetched</span></div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = collection.current;</div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil == <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160; <span class="keywordflow">return</span> std::nullopt;</div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160; </div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160; <span class="comment">// Find the latest validUntil in a chain where the next validFrom</span></div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160; <span class="comment">// overlaps with the previous validUntil. applyLists has already cleaned</span></div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160; <span class="comment">// up the list so the validFrom dates are guaranteed increasing.</span></div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160; <span class="keyword">auto</span> chainedExpiration = <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil;</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, check] : collection.remaining)</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160; {</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160; (void)sequence;</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160; <span class="keywordflow">if</span> (check.validFrom &lt;= chainedExpiration)</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160; chainedExpiration = check.validUntil;</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160; }</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160; </div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160; <span class="comment">// Earliest</span></div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160; <span class="keywordflow">if</span> (!res || chainedExpiration &lt; *res)</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160; {</div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160; res = chainedExpiration;</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160; }</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160; }</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160; <span class="keywordflow">return</span> res;</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;}</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160; </div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;TimeKeeper::time_point&gt;</a></div>
<div class="line"><a name="l01500"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741"> 1500</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741">ValidatorList::expires</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741">expires</a>(read_lock);</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;}</div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160; </div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;<a class="code" href="classJson_1_1Value.html">Json::Value</a></div>
<div class="line"><a name="l01507"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a6f943a4488f3b50dcbb5177007d43271"> 1507</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a6f943a4488f3b50dcbb5177007d43271">ValidatorList::getJson</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> res(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160; </div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160; </div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160; res[jss::validation_quorum] = <span class="keyword">static_cast&lt;</span><a class="code" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(<a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>);</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160; </div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160; {</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160; <span class="keyword">auto</span>&amp; x = (res[jss::validator_list] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160; </div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160; x[jss::count] = <span class="keyword">static_cast&lt;</span><a class="code" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(<a class="code" href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">count</a>(read_lock));</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160; </div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> when = <a class="code" href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741">expires</a>(read_lock))</div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160; {</div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160; <span class="keywordflow">if</span> (*when == TimeKeeper::time_point::max())</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160; {</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160; x[jss::expiration] = <span class="stringliteral">&quot;never&quot;</span>;</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160; x[jss::status] = <span class="stringliteral">&quot;active&quot;</span>;</div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160; }</div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160; {</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160; x[jss::expiration] = <a class="code" href="namespaceripple.html#af9776f187d3686a7fba4c2d2fbeebdf4">to_string</a>(*when);</div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160; </div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160; <span class="keywordflow">if</span> (*when &gt; <a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code" href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">now</a>())</div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160; x[jss::status] = <span class="stringliteral">&quot;active&quot;</span>;</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160; x[jss::status] = <span class="stringliteral">&quot;expired&quot;</span>;</div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160; }</div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160; }</div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160; {</div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160; x[jss::status] = <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160; x[jss::expiration] = <span class="stringliteral">&quot;unknown&quot;</span>;</div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160; }</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160; }</div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160; </div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160; <span class="comment">// Local static keys</span></div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> local;</div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jLocalStaticKeys =</div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160; (res[jss::local_static_keys] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.find(local); it != <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.end())</div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160; {</div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; key : it-&gt;second.current.list)</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160; jLocalStaticKeys.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, key));</div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160; }</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160; </div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160; <span class="comment">// Publisher lists</span></div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jPublisherLists =</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160; (res[jss::publisher_lists] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [publicKey, pubCollection] : <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160; {</div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160; <span class="keywordflow">if</span> (local == publicKey)</div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; curr = jPublisherLists.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160; curr[jss::pubkey_publisher] = <a class="code" href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">strHex</a>(publicKey);</div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160; curr[jss::available] =</div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160; pubCollection.status == <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>;</div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160; </div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160; <span class="keyword">auto</span> appendList = [](<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html">PublisherList</a> <span class="keyword">const</span>&amp; publisherList,</div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; target) {</div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160; target[jss::uri] = publisherList.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#a4d5d54c46f6269d96903ac574975f261">siteUri</a>;</div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160; <span class="keywordflow">if</span> (publisherList.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#ab1eaafc17bdc547f85f4898d5535c6e5">validUntil</a> != <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160; {</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160; target[jss::seq] =</div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160; <span class="keyword">static_cast&lt;</span><a class="code" href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a><span class="keyword">&gt;</span>(publisherList.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#aad9dd39b951a5b4a42bba0593ac16289">sequence</a>);</div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160; target[jss::expiration] = <a class="code" href="namespaceripple.html#af9776f187d3686a7fba4c2d2fbeebdf4">to_string</a>(publisherList.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#ab1eaafc17bdc547f85f4898d5535c6e5">validUntil</a>);</div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160; }</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160; <span class="keywordflow">if</span> (publisherList.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#ade8078adfb156f2f5b2d976fc91b6b75">validFrom</a> != <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160; target[jss::effective] = <a class="code" href="namespaceripple.html#af9776f187d3686a7fba4c2d2fbeebdf4">to_string</a>(publisherList.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#ade8078adfb156f2f5b2d976fc91b6b75">validFrom</a>);</div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; keys = (target[jss::list] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; key : publisherList.<a class="code" href="structripple_1_1ValidatorList_1_1PublisherList.html#a1d97cceec8dbfaf845cceade47cfdbb4">list</a>)</div>
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160; {</div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160; keys.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, key));</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160; }</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160; };</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160; {</div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span>&amp; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = pubCollection.current;</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160; appendList(<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>, curr);</div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil != <a class="code" href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">TimeKeeper::time_point</a>{})</div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160; {</div>
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160; curr[jss::version] = pubCollection.rawVersion;</div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160; }</div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160; }</div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160; </div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> remaining(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [sequence, future] : pubCollection.remaining)</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160; {</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160; <span class="keyword">using namespace </span>std::chrono_literals;</div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160; </div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160; (void)sequence;</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; r = remaining.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160; appendList(future, r);</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160; <span class="comment">// Race conditions can happen, so make this check &quot;fuzzy&quot;</span></div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160; assert(future.validFrom &gt; <a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code" href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">now</a>() + 600s);</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160; }</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160; <span class="keywordflow">if</span> (remaining.<a class="code" href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">size</a>())</div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160; curr[jss::remaining] = std::move(remaining);</div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160; }</div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160; </div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160; <span class="comment">// Trusted validator keys</span></div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jValidatorKeys =</div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160; (res[jss::trusted_validator_keys] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>)</div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160; {</div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160; jValidatorKeys.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, k));</div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160; }</div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160; </div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160; <span class="comment">// signing keys</span></div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jSigningKeys = (res[jss::signing_keys] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a>);</div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a7f05c967613f99e5f05af017673c6765">for_each_manifest</a>([&amp;jSigningKeys,</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160; <span class="keyword">this</span>](Manifest <span class="keyword">const</span>&amp; manifest) {</div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160; <span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.find(manifest.masterKey);</div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160; <span class="keywordflow">if</span> (it != <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.end())</div>
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160; {</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160; jSigningKeys[<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, manifest.masterKey)] =</div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160; <a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, manifest.signingKey);</div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160; }</div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160; });</div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160; </div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160; <span class="comment">// Negative UNL</span></div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.empty())</div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160; {</div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a>&amp; jNegativeUNL = (res[jss::NegativeUNL] = <a class="code" href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a>);</div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>)</div>
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160; {</div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160; jNegativeUNL.<a class="code" href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">append</a>(<a class="code" href="namespaceripple.html#a08a13b62b18272366f788632359e8793">toBase58</a>(<a class="code" href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">TokenType::NodePublic</a>, k));</div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160; }</div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160; }</div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160; </div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160; <span class="keywordflow">return</span> res;</div>
<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;}</div>
<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160; </div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01641"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#abc82f50ad5da8d3d12240e8025369789"> 1641</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#abc82f50ad5da8d3d12240e8025369789">ValidatorList::for_each_listed</a>(</div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a>&lt;<span class="keywordtype">void</span>(<a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp;, <span class="keywordtype">bool</span>)&gt; func)<span class="keyword"> const</span></div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160; </div>
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; v : <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>)</div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160; func(v.first, <a class="code" href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">trusted</a>(read_lock, v.first));</div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;}</div>
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160; </div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01651"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a727b089f03d260cebfaca07ee4c83059"> 1651</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a727b089f03d260cebfaca07ee4c83059">ValidatorList::for_each_available</a>(</div>
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a>&lt;<span class="keywordtype">void</span>(</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> <span class="keyword">const</span>&amp; manifest,</div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a> version,</div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/map.html">std::map&lt;std::size_t, ValidatorBlobInfo&gt;</a> <span class="keyword">const</span>&amp; blobInfos,</div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160; <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a> <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> maxSequence,</div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160; <a class="code" href="classripple_1_1base__uint.html">uint256</a> <span class="keyword">const</span>&amp; hash)&gt; func)<span class="keyword"> const</span></div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160; </div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; [key, plCollection] : <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160; {</div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160; <span class="keywordflow">if</span> (plCollection.status != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a> || key.empty())</div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160; <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160; assert(plCollection.maxSequence);</div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160; func(</div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160; plCollection.rawManifest,</div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160; plCollection.rawVersion,</div>
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">buildBlobInfos</a>(plCollection),</div>
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160; key,</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160; plCollection.maxSequence.value_or(0),</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160; plCollection.fullHash);</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160; }</div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;}</div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160; </div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;Json::Value&gt;</a></div>
<div class="line"><a name="l01678"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a5aa008bd5f235894ff77e2d09f980aae"> 1678</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a5aa008bd5f235894ff77e2d09f980aae">ValidatorList::getAvailable</a>(</div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160; boost::beast::string_view <span class="keyword">const</span>&amp; pubKey,</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt;std::uint32_t&gt;</a> forceVersion <span class="comment">/* = {} */</span>)</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;{</div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160; </div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> keyBlob = <a class="code" href="namespaceripple.html#a7522005d5dcaff918e211e0c0357fbf7">strViewUnHex</a>(pubKey);</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160; </div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160; <span class="keywordflow">if</span> (!keyBlob || !<a class="code" href="namespaceripple.html#adc1f8a2c9b47d7c08e671ad3473e9d3a">publicKeyType</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*keyBlob)))</div>
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160; {</div>
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">info</a>()) &lt;&lt; <span class="stringliteral">&quot;Invalid requested validator list publisher key: &quot;</span></div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160; &lt;&lt; pubKey;</div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160; }</div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160; </div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160; <span class="keyword">auto</span> <span class="keywordtype">id</span> = <a class="code" href="classripple_1_1PublicKey.html">PublicKey</a>(<a class="code" href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">makeSlice</a>(*keyBlob));</div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160; </div>
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> iter = <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.find(<span class="keywordtype">id</span>);</div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160; </div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160; <span class="keywordflow">if</span> (iter == <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.end() ||</div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160; iter-&gt;second.status != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160; <span class="keywordflow">return</span> {};</div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160; </div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160; <a class="code" href="classJson_1_1Value.html">Json::Value</a> value =</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">buildFileData</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a>{pubKey}, iter-&gt;second, forceVersion, <a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>);</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160; </div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160; <span class="keywordflow">return</span> value;</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;}</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160; </div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div>
<div class="line"><a name="l01708"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b"> 1708</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">ValidatorList::calculateQuorum</a>(</div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> unlSize,</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> effectiveUnlSize,</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a> seenSize)</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;{</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160; <span class="comment">// Do not use achievable quorum until lists from all configured</span></div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160; <span class="comment">// publishers are available</span></div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; list : <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160; {</div>
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160; <span class="keywordflow">if</span> (list.second.status != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160; <span class="keywordflow">return</span> <a class="codeRef" href="http://en.cppreference.com/w/cpp/types/numeric_limits/max.html">std::numeric_limits&lt;std::size_t&gt;::max</a>();</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160; }</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160; </div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160; <span class="comment">// Use an 80% quorum to balance fork safety, liveness, and required UNL</span></div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160; <span class="comment">// overlap.</span></div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160; <span class="comment">// Theorem 8 of the Analysis of the XRP Ledger Consensus Protocol</span></div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160; <span class="comment">// (https://arxiv.org/abs/1802.07242) says:</span></div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160; <span class="comment">// XRP LCP guarantees fork safety if Oi,j &gt; nj/2 + ni qi + ti,j</span></div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160; <span class="comment">// for every pair of nodes Pi, Pj.</span></div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160; <span class="comment">// ni: size of Pi&#39;s UNL</span></div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160; <span class="comment">// nj: size of Pj&#39;s UNL</span></div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160; <span class="comment">// Oi,j: number of validators in both UNLs</span></div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160; <span class="comment">// qi: validation quorum for Pi&#39;s UNL</span></div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160; <span class="comment">// ti, tj: maximum number of allowed Byzantine faults in Pi and Pj&#39;s</span></div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160; <span class="comment">// UNLs ti,j: min{ti, tj, Oi,j}</span></div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160; <span class="comment">// Assume ni &lt; nj, meaning and ti,j = ti</span></div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160; <span class="comment">// For qi = .8*ni, we make ti &lt;= .2*ni</span></div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160; <span class="comment">// (We could make ti lower and tolerate less UNL overlap. However in</span></div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160; <span class="comment">// order to prioritize safety over liveness, we need ti &gt;= ni - qi)</span></div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160; <span class="comment">// An 80% quorum allows two UNLs to safely have &lt; .2*ni unique</span></div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160; <span class="comment">// validators between them:</span></div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160; <span class="comment">// pi = ni - Oi,j</span></div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160; <span class="comment">// pj = nj - Oi,j</span></div>
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160; <span class="comment">// Oi,j &gt; nj/2 + ni qi + ti,j</span></div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160; <span class="comment">// ni - pi &gt; (ni - pi + pj)/2 + ni .8*ni + .2*ni</span></div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160; <span class="comment">// pi + pj &lt; .2*ni</span></div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160; <span class="comment">// Note that the negative UNL protocol introduced the</span></div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160; <span class="comment">// AbsoluteMinimumQuorum which is 60% of the original UNL size. The</span></div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160; <span class="comment">// effective quorum should not be lower than it.</span></div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160; <span class="keyword">auto</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = <span class="keyword">static_cast&lt;</span><a class="codeRef" href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a><span class="keyword">&gt;</span>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a>(</div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(effectiveUnlSize * 0.8f), <a class="codeRef" href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a>(unlSize * 0.6f)));</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160; </div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160; <span class="comment">// Use lower quorum specified via command line if the normal quorum</span></div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160; <span class="comment">// appears unreachable based on the number of recently received</span></div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160; <span class="comment">// validations.</span></div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#ac3b9186600dcd1c5326c80af17165741">minimumQuorum_</a> &amp;&amp; *<a class="code" href="classripple_1_1ValidatorList.html#ac3b9186600dcd1c5326c80af17165741">minimumQuorum_</a> &lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> &amp;&amp; seenSize &lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>)</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160; {</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a> = *<a class="code" href="classripple_1_1ValidatorList.html#ac3b9186600dcd1c5326c80af17165741">minimumQuorum_</a>;</div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160; </div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;Using unsafe quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a></div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160; &lt;&lt; <span class="stringliteral">&quot; as specified in the command line&quot;</span>;</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160; }</div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160; </div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">quorum</a>;</div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;}</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160; </div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;<a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a></div>
<div class="line"><a name="l01773"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#aa4813b41483e2df542ce2731fb7b5f5d"> 1773</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#aa4813b41483e2df542ce2731fb7b5f5d">ValidatorList::updateTrusted</a>(</div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;NodeID&gt;</a> <span class="keyword">const</span>&amp; seenValidators,</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/chrono/time_point.html">NetClock::time_point</a> closeTime,</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160; <a class="code" href="classripple_1_1NetworkOPs.html">NetworkOPs</a>&amp; ops,</div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160; <a class="code" href="classripple_1_1Overlay.html">Overlay</a>&amp; overlay,</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160; <a class="code" href="classripple_1_1HashRouter.html">HashRouter</a>&amp; hashRouter)</div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;{</div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160; <span class="keyword">using namespace </span>std::chrono_literals;</div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code" href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">now</a>() &gt; closeTime + 30s)</div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160; closeTime = <a class="code" href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">timeKeeper_</a>.<a class="code" href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">now</a>();</div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160; </div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160; </div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160; <span class="comment">// Rotate pending and remove expired published lists</span></div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160; <span class="keywordtype">bool</span> good = <span class="keyword">true</span>;</div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; [pubKey, collection] : <a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>)</div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160; {</div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160; {</div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160; <span class="keyword">auto</span>&amp; remaining = collection.remaining;</div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> firstIter = remaining.begin();</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160; <span class="keyword">auto</span> iter = firstIter;</div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160; <span class="keywordflow">if</span> (iter != remaining.end() &amp;&amp; iter-&gt;second.validFrom &lt;= closeTime)</div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160; {</div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160; <span class="comment">// Find the LAST candidate that is ready to go live.</span></div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> next = <a class="codeRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter); next != remaining.end() &amp;&amp;</div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160; next-&gt;second.validFrom &lt;= closeTime;</div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160; ++iter, ++next)</div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160; {</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160; assert(<a class="codeRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter) == next);</div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160; }</div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160; assert(iter != remaining.end());</div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160; </div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160; <span class="comment">// Rotate the pending list in to current</span></div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160; <span class="keyword">auto</span> sequence = iter-&gt;first;</div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160; <span class="keyword">auto</span>&amp; candidate = iter-&gt;second;</div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160; <span class="keyword">auto</span>&amp; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = collection.current;</div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160; assert(candidate.validFrom &lt;= closeTime);</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160; </div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> oldList = <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.list;</div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a> = std::move(candidate);</div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160; <span class="keywordflow">if</span> (collection.status != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160; collection.status = <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>;</div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160; assert(<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.sequence == sequence);</div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160; <span class="comment">// If the list is expired, remove the validators so they don&#39;t</span></div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160; <span class="comment">// get processed in. The expiration check below will do the rest</span></div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160; <span class="comment">// of the work</span></div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.validUntil &lt;= closeTime)</div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.list.clear();</div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160; </div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3">updatePublisherList</a>(pubKey, <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>, oldList, lock);</div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160; </div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160; <span class="comment">// Only broadcast the current, which will consequently only</span></div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160; <span class="comment">// send to peers that don&#39;t understand v2, or which are</span></div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160; <span class="comment">// unknown (unlikely). Those that do understand v2 should</span></div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160; <span class="comment">// already have this list and are in the process of</span></div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160; <span class="comment">// switching themselves.</span></div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139">broadcastBlobs</a>(</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160; pubKey,</div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160; collection,</div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160; sequence,</div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160; <a class="code" href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">current</a>.hash,</div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160; overlay,</div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160; hashRouter,</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>);</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160; </div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160; <span class="comment">// Erase any candidates that we skipped over, plus this one</span></div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160; remaining.erase(firstIter, <a class="codeRef" href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a>(iter));</div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160; }</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160; }</div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160; <span class="comment">// Remove if expired</span></div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160; <span class="keywordflow">if</span> (collection.status == <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a> &amp;&amp;</div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160; collection.current.validUntil &lt;= closeTime)</div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160; {</div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268">removePublisherList</a>(lock, pubKey, <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e">PublisherStatus::expired</a>);</div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160; ops.<a class="code" href="classripple_1_1NetworkOPs.html#a3b837bd8b8633d45d7e5f26961fab856">setUNLBlocked</a>();</div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160; }</div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160; <span class="keywordflow">if</span> (collection.status != <a class="code" href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">PublisherStatus::available</a>)</div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160; good = <span class="keyword">false</span>;</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160; }</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160; <span class="keywordflow">if</span> (good)</div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160; ops.<a class="code" href="classripple_1_1NetworkOPs.html#ace637a61664a15f70bc362f2ad1101e9">clearUNLBlocked</a>();</div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160; </div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160; <a class="code" href="structripple_1_1TrustChanges.html">TrustChanges</a> trustChanges;</div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160; </div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160; <span class="keyword">auto</span> it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.cbegin();</div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160; <span class="keywordflow">while</span> (it != <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.cend())</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160; {</div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.count(*it) || <a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(*it))</div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160; {</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.insert(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(*it));</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160; it = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.erase(it);</div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160; }</div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160; {</div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160; ++it;</div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160; }</div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160; }</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160; </div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; val : <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>)</div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160; {</div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">revoked</a>(val.first) &amp;&amp;</div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.emplace(val.first).second)</div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.insert(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(val.first));</div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160; }</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160; </div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160; <span class="comment">// If there were any changes, we need to update the ephemeral signing</span></div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160; <span class="comment">// keys:</span></div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160; <span class="keywordflow">if</span> (!trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.empty() || !trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.empty())</div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160; {</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">trustedSigningKeys_</a>.clear();</div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160; </div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>)</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">trustedSigningKeys_</a>.insert(<a class="code" href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">validatorManifests_</a>.<a class="code" href="classripple_1_1ManifestCache.html#a8409a7089c3e04f972f1513a54576133">getSigningKey</a>(k));</div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160; }</div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160; </div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>())</div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160; &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size() &lt;&lt; <span class="stringliteral">&quot; of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">keyListings_</a>.size()</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160; &lt;&lt; <span class="stringliteral">&quot; listed validators eligible for inclusion in the trusted set&quot;</span>;</div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160; </div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> unlSize = <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>.size();</div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160; <span class="keyword">auto</span> effectiveUnlSize = unlSize;</div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160; <span class="keyword">auto</span> seenSize = seenValidators.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/size.html">size</a>();</div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.empty())</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160; {</div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>)</div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160; {</div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.count(k))</div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160; --effectiveUnlSize;</div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160; }</div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;NodeID&gt;</a> negUnlNodeIDs;</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; k : <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>)</div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160; {</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160; negUnlNodeIDs.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/emplace.html">emplace</a>(<a class="code" href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">calcNodeID</a>(k));</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160; }</div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; nid : seenValidators)</div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160; {</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160; <span class="keywordflow">if</span> (negUnlNodeIDs.<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set/count.html">count</a>(nid))</div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160; --seenSize;</div>
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160; }</div>
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160; }</div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> = <a class="code" href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">calculateQuorum</a>(unlSize, effectiveUnlSize, seenSize);</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160; </div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">debug</a>()) &lt;&lt; <span class="stringliteral">&quot;Using quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a> &lt;&lt; <span class="stringliteral">&quot; for new set of &quot;</span></div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160; &lt;&lt; unlSize &lt;&lt; <span class="stringliteral">&quot; trusted validators (&quot;</span></div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160; &lt;&lt; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">added</a>.size() &lt;&lt; <span class="stringliteral">&quot; added, &quot;</span></div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160; &lt;&lt; trustChanges.<a class="code" href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">removed</a>.size() &lt;&lt; <span class="stringliteral">&quot; removed)&quot;</span>;</div>
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160; </div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160; <span class="keywordflow">if</span> (unlSize &lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a>)</div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160; {</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160; JLOG(<a class="code" href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">j_</a>.<a class="code" href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">warn</a>()) &lt;&lt; <span class="stringliteral">&quot;New quorum of &quot;</span> &lt;&lt; <a class="code" href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">quorum_</a></div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160; &lt;&lt; <span class="stringliteral">&quot; exceeds the number of trusted validators (&quot;</span></div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160; &lt;&lt; unlSize &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160; }</div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160; </div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">publisherLists_</a>.size() &amp;&amp; unlSize == 0)</div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160; {</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160; <span class="comment">// No validators. Lock down.</span></div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160; ops.<a class="code" href="classripple_1_1NetworkOPs.html#a3b837bd8b8633d45d7e5f26961fab856">setUNLBlocked</a>();</div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160; }</div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160; </div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160; <span class="keywordflow">return</span> trustChanges;</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;}</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160; </div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l01937"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3"> 1937</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3">ValidatorList::getTrustedMasterKeys</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">trustedMasterKeys_</a>;</div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;}</div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160; </div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a></div>
<div class="line"><a name="l01944"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5"> 1944</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5">ValidatorList::getNegativeUNL</a>()<span class="keyword"> const</span></div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>;</div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;}</div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160; </div>
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;<span class="keywordtype">void</span></div>
<div class="line"><a name="l01951"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2"> 1951</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2">ValidatorList::setNegativeUNL</a>(<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/unordered_set.html">hash_set&lt;PublicKey&gt;</a> <span class="keyword">const</span>&amp; negUnl)</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;{</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a> lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160; <a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a> = negUnl;</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;}</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160; </div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;<a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt;std::shared_ptr&lt;STValidation&gt;</a>&gt;</div>
<div class="line"><a name="l01958"></a><span class="lineno"><a class="line" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32"> 1958</a></span>&#160;<a class="code" href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32">ValidatorList::negativeUNLFilter</a>(</div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector</a>&lt;<a class="codeRef" href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt;STValidation&gt;</a>&gt;&amp;&amp; validations)<span class="keyword"> const</span></div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;<span class="keyword"></span>{</div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160; <span class="comment">// Remove validations that are from validators on the negative UNL.</span></div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160; <span class="keyword">auto</span> ret = std::move(validations);</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160; </div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a> read_lock{<a class="code" href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">mutex_</a>};</div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">negativeUNL_</a>.empty())</div>
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160; {</div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160; ret.erase(</div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160; <a class="codeRef" href="http://en.cppreference.com/w/cpp/algorithm/remove.html">std::remove_if</a>(</div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160; ret.begin(),</div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160; ret.end(),</div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160; [&amp;](<span class="keyword">auto</span> <span class="keyword">const</span>&amp; v) -&gt; <span class="keywordtype">bool</span> {</div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160; if (auto const masterKey =</div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160; getTrustedKey(read_lock, v-&gt;getSignerPublic());</div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160; masterKey)</div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160; {</div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160; return negativeUNL_.count(*masterKey);</div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160; }</div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160; {</div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160; return false;</div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160; }</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160; }),</div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160; ret.end());</div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160; }</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160; </div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160; <span class="keywordflow">return</span> ret;</div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;}</div>
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160; </div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;} <span class="comment">// namespace ripple</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="aclassJson_1_1Value_html_aff51d8b52979ca06cf9d909accd5f695"><div class="ttname"><a href="classJson_1_1Value.html#aff51d8b52979ca06cf9d909accd5f695">Json::Value::isInt</a></div><div class="ttdeci">bool isInt() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00979">json_value.cpp:979</a></div></div>
<div class="ttc" id="aclassripple_1_1NetworkOPs_html"><div class="ttname"><a href="classripple_1_1NetworkOPs.html">ripple::NetworkOPs</a></div><div class="ttdoc">Provides server functionality for clients.</div><div class="ttdef"><b>Definition:</b> <a href="NetworkOPs_8h_source.html#l00086">NetworkOPs.h:86</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1MessageWithHash_html_a17b716a96c5adf8f12cee236370a3aa5"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a17b716a96c5adf8f12cee236370a3aa5">ripple::ValidatorList::MessageWithHash::MessageWithHash</a></div><div class="ttdeci">MessageWithHash()=default</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_aad9dd39b951a5b4a42bba0593ac16289"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#aad9dd39b951a5b4a42bba0593ac16289">ripple::ValidatorList::PublisherList::sequence</a></div><div class="ttdeci">std::size_t sequence</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00180">ValidatorList.h:180</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a19f4cc404400551b2a39c7c5a137e01f"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a19f4cc404400551b2a39c7c5a137e01f">ripple::ValidatorList::validatorManifests_</a></div><div class="ttdeci">ManifestCache &amp; validatorManifests_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00224">ValidatorList.h:224</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a7c6c2e5d48ab37a007cbf70d3ea25fa4">ripple::ListDisposition::pending</a></div><div class="ttdeci">@ pending</div><div class="ttdoc">List will be valid in the future.</div></div>
<div class="ttc" id="anamespaceripple_html_aabe37451093c21757855542d68fba3ce"><div class="ttname"><a href="namespaceripple.html#aabe37451093c21757855542d68fba3ce">ripple::makeSlice</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_same&lt; T, char &gt;::value||std::is_same&lt; T, unsigned char &gt;::value, Slice &gt; makeSlice(std::array&lt; T, N &gt; const &amp;a)</div><div class="ttdef"><b>Definition:</b> <a href="Slice_8h_source.html#l00240">Slice.h:240</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_abc82f50ad5da8d3d12240e8025369789"><div class="ttname"><a href="classripple_1_1ValidatorList.html#abc82f50ad5da8d3d12240e8025369789">ripple::ValidatorList::for_each_listed</a></div><div class="ttdeci">void for_each_listed(std::function&lt; void(PublicKey const &amp;, bool)&gt; func) const</div><div class="ttdoc">Invokes the callback once for every listed validation public key.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01641">ValidatorList.cpp:1641</a></div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html_a86c862f1b0722d061b3724ff34a53572"><div class="ttname"><a href="classripple_1_1HashRouter.html#a86c862f1b0722d061b3724ff34a53572">ripple::HashRouter::addSuppressionPeer</a></div><div class="ttdeci">bool addSuppressionPeer(uint256 const &amp;key, PeerShortID peer)</div><div class="ttdef"><b>Definition:</b> <a href="HashRouter_8cpp_source.html#l00051">HashRouter.cpp:51</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a4681f2660d566c13e7a3a7886512cbe4"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a4681f2660d566c13e7a3a7886512cbe4">ripple::ValidatorList::localPublicKey</a></div><div class="ttdeci">PublicKey localPublicKey() const</div><div class="ttdoc">Returns local validator public key.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01412">ValidatorList.cpp:1412</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html_ab85c1d3f43dae20290c0271a1cfd4270"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html#ab85c1d3f43dae20290c0271a1cfd4270">ripple::ValidatorBlobInfo::signature</a></div><div class="ttdeci">std::string signature</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00121">ValidatorList.h:121</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a3377c0090810a38667f445596bb1aaf7"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a3377c0090810a38667f445596bb1aaf7">ripple::ValidatorList::PublisherListStats::PublisherListStats</a></div><div class="ttdeci">PublisherListStats()=default</div></div>
<div class="ttc" id="abasic_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="ashared_ptr_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr.html">std::shared_ptr&lt; Message &gt;</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3">ripple::ListDisposition</a></div><div class="ttdeci">ListDisposition</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00055">ValidatorList.h:55</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_adbe8167cfd5ac328a9bf8b85c319ddc1"><div class="ttname"><a href="classripple_1_1ManifestCache.html#adbe8167cfd5ac328a9bf8b85c319ddc1">ripple::ManifestCache::getMasterKey</a></div><div class="ttdeci">PublicKey getMasterKey(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns ephemeral signing key's master public key.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00296">app/misc/impl/Manifest.cpp:296</a></div></div>
<div class="ttc" id="anamespaceripple_html_ac6313681c41516db0a8f8829e1d7b753"><div class="ttname"><a href="namespaceripple.html#ac6313681c41516db0a8f8829e1d7b753">ripple::maximiumMessageSize</a></div><div class="ttdeci">constexpr std::size_t maximiumMessageSize</div><div class="ttdef"><b>Definition:</b> <a href="overlay_2Message_8h_source.html#l00038">overlay/Message.h:38</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a71e1f82cf1c3eaf969d400dcffb163a6"><div class="ttname"><a href="classJson_1_1Value.html#a71e1f82cf1c3eaf969d400dcffb163a6">Json::Value::isString</a></div><div class="ttdeci">bool isString() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l01009">json_value.cpp:1009</a></div></div>
<div class="ttc" id="anamespaceripple_html_a984ddd646f1e1a5032a9a17f96c6fc55"><div class="ttname"><a href="namespaceripple.html#a984ddd646f1e1a5032a9a17f96c6fc55">ripple::calcNodeID</a></div><div class="ttdeci">NodeID calcNodeID(PublicKey const &amp;pk)</div><div class="ttdoc">Calculate the 160-bit node ID from a node public key.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8cpp_source.html#l00299">PublicKey.cpp:299</a></div></div>
<div class="ttc" id="aclassripple_1_1Message_html_a7a4b11ee88a462956cab12969e833fbe"><div class="ttname"><a href="classripple_1_1Message.html#a7a4b11ee88a462956cab12969e833fbe">ripple::Message::totalSize</a></div><div class="ttdeci">static std::size_t totalSize(::google::protobuf::Message const &amp;message)</div><div class="ttdef"><b>Definition:</b> <a href="Message_8cpp_source.html#l00062">Message.cpp:62</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_abbe082bd27ca0f1d1365af2824e4f85b"><div class="ttname"><a href="classbeast_1_1Journal.html#abbe082bd27ca0f1d1365af2824e4f85b">beast::Journal::trace</a></div><div class="ttdeci">Stream trace() const</div><div class="ttdoc">Severity stream access functions.</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00309">Journal.h:309</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html"><div class="ttname"><a href="structripple_1_1TrustChanges.html">ripple::TrustChanges</a></div><div class="ttdoc">Changes in trusted nodes after updating validator list.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00107">ValidatorList.h:107</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a36f34fd8319cf30f8e132ef294c616af">ripple::ListDisposition::stale</a></div><div class="ttdeci">@ stale</div><div class="ttdoc">Trusted publisher key, but seq is too old.</div></div>
<div class="ttc" id="aclassripple_1_1Slice_html"><div class="ttname"><a href="classripple_1_1Slice.html">ripple::Slice</a></div><div class="ttdoc">An immutable linear range of bytes.</div><div class="ttdef"><b>Definition:</b> <a href="Slice_8h_source.html#l00044">Slice.h:44</a></div></div>
<div class="ttc" id="aunordered_set_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/unordered_set.html">std::unordered_set</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eadc8f264f36b55b063c78126b335415f4">Json::arrayValue</a></div><div class="ttdeci">@ arrayValue</div><div class="ttdoc">array value (ordered list)</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00042">json_value.h:42</a></div></div>
<div class="ttc" id="aclassbeast_1_1IP_1_1Endpoint_html_adcbd20a3d8d1d3f7c6a3ae541f519fb4"><div class="ttname"><a href="classbeast_1_1IP_1_1Endpoint.html#adcbd20a3d8d1d3f7c6a3ae541f519fb4">beast::IP::Endpoint::to_string</a></div><div class="ttdeci">std::string to_string() const</div><div class="ttdoc">Returns a string representing the endpoint.</div><div class="ttdef"><b>Definition:</b> <a href="IPEndpoint_8cpp_source.html#l00054">IPEndpoint.cpp:54</a></div></div>
<div class="ttc" id="apair_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/pair.html">std::pair</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_afb78f6ff830cea855542f3ad78a587b1"><div class="ttname"><a href="classripple_1_1ValidatorList.html#afb78f6ff830cea855542f3ad78a587b1">ripple::ValidatorList::supportedListVersions</a></div><div class="ttdeci">static constexpr std::uint32_t supportedListVersions[]</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00256">ValidatorList.h:256</a></div></div>
<div class="ttc" id="areserve_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/reserve.html">std::vector::reserve</a></div><div class="ttdeci">T reserve(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45"><div class="ttname"><a href="namespaceripple.html#ad5143ceada01141772ae4aab984f94bda7f5cb74af5d7f4b82200738fdbdc5a45">ripple::HashPrefix::manifest</a></div><div class="ttdeci">@ manifest</div><div class="ttdoc">Manifest.</div></div>
<div class="ttc" id="anamespaceJson_html_ab1488c31a37eea2d37f36a0961372572"><div class="ttname"><a href="namespaceJson.html#ab1488c31a37eea2d37f36a0961372572">Json::UInt</a></div><div class="ttdeci">unsigned int UInt</div><div class="ttdef"><b>Definition:</b> <a href="json__forwards_8h_source.html#l00027">json_forwards.h:27</a></div></div>
<div class="ttc" id="anamespaceripple_html_ace4dd4a2d63cd976adb9fac9754ae785"><div class="ttname"><a href="namespaceripple.html#ace4dd4a2d63cd976adb9fac9754ae785">ripple::verify</a></div><div class="ttdeci">bool verify(PublicKey const &amp;publicKey, Slice const &amp;m, Slice const &amp;sig, bool mustBeFullyCanonical) noexcept</div><div class="ttdoc">Verify a signature on a message.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8cpp_source.html#l00268">PublicKey.cpp:268</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a437c1823bf6bb8498cc153896b3abfa5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a437c1823bf6bb8498cc153896b3abfa5">ripple::ValidatorList::buildBlobInfos</a></div><div class="ttdeci">static void buildBlobInfos(std::map&lt; std::size_t, ValidatorBlobInfo &gt; &amp;blobInfos, PublisherListCollection const &amp;lists)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00776">ValidatorList.cpp:776</a></div></div>
<div class="ttc" id="avector_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector.html">std::vector&lt; std::string &gt;</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a7bdc06d223ec320799b7b09fe38fb16a"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a7bdc06d223ec320799b7b09fe38fb16a">ripple::ValidatorList::applyListsAndBroadcast</a></div><div class="ttdeci">PublisherListStats applyListsAndBroadcast(std::string const &amp;manifest, std::uint32_t version, std::vector&lt; ValidatorBlobInfo &gt; const &amp;blobs, std::string siteUri, uint256 const &amp;hash, Overlay &amp;overlay, HashRouter &amp;hashRouter, NetworkOPs &amp;networkOPs)</div><div class="ttdoc">Apply multiple published lists of public keys, then broadcast it to all peers that have not seen it o...</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00869">ValidatorList.cpp:869</a></div></div>
<div class="ttc" id="asize_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/size.html">std::vector::size</a></div><div class="ttdeci">T size(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a90d8cf623e6011f148956964d0e09b9c"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a90d8cf623e6011f148956964d0e09b9c">ripple::ValidatorList::trustedPublisher</a></div><div class="ttdeci">bool trustedPublisher(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns true if public key is a trusted publisher.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01404">ValidatorList.cpp:1404</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a3749eaabef35e6178bc74fc8dfe6f4a2"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a3749eaabef35e6178bc74fc8dfe6f4a2">ripple::ValidatorList::setNegativeUNL</a></div><div class="ttdeci">void setNegativeUNL(hash_set&lt; PublicKey &gt; const &amp;negUnl)</div><div class="ttdoc">set the Negative UNL with validators' master public keys</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01951">ValidatorList.cpp:1951</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html">ripple::ValidatorList::PublisherListStats</a></div><div class="ttdoc">Describes the result of processing a Validator List (UNL), including some of the information from the...</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00278">ValidatorList.h:278</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a6aed606d8af8e7d638308232efd15f11"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a6aed606d8af8e7d638308232efd15f11">ripple::ValidatorList::negativeUNL_</a></div><div class="ttdeci">hash_set&lt; PublicKey &gt; negativeUNL_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00253">ValidatorList.h:253</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af3c12788fe36cb6f48201d3c5a688d06"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af3c12788fe36cb6f48201d3c5a688d06">ripple::ValidatorList::filePrefix_</a></div><div class="ttdeci">static const std::string filePrefix_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00261">ValidatorList.h:261</a></div></div>
<div class="ttc" id="anamespaceripple_html_a08a13b62b18272366f788632359e8793"><div class="ttname"><a href="namespaceripple.html#a08a13b62b18272366f788632359e8793">ripple::toBase58</a></div><div class="ttdeci">std::string toBase58(AccountID const &amp;v)</div><div class="ttdoc">Convert AccountID to base58 checked string.</div><div class="ttdef"><b>Definition:</b> <a href="AccountID_8cpp_source.html#l00029">AccountID.cpp:29</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_acedaeedad936d4e850ade479e3de91cf"><div class="ttname"><a href="classripple_1_1ValidatorList.html#acedaeedad936d4e850ade479e3de91cf">ripple::ValidatorList::j_</a></div><div class="ttdeci">const beast::Journal j_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00228">ValidatorList.h:228</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_ab1eaafc17bdc547f85f4898d5535c6e5"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#ab1eaafc17bdc547f85f4898d5535c6e5">ripple::ValidatorList::PublisherList::validUntil</a></div><div class="ttdeci">TimeKeeper::time_point validUntil</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00182">ValidatorList.h:182</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a22bb356f3dff23879344acd8121abbe3"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a22bb356f3dff23879344acd8121abbe3">ripple::ValidatorList::getTrustedMasterKeys</a></div><div class="ttdeci">hash_set&lt; PublicKey &gt; getTrustedMasterKeys() const</div><div class="ttdoc">get the trusted master public keys</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01937">ValidatorList.cpp:1937</a></div></div>
<div class="ttc" id="aemplace_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional/emplace.html">std::optional::emplace</a></div><div class="ttdeci">T emplace(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af2dde165e04bd3a99a397fe3541f341e"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af2dde165e04bd3a99a397fe3541f341e">ripple::ValidatorList::buildValidatorListMessages</a></div><div class="ttdeci">static std::pair&lt; std::size_t, std::size_t &gt; buildValidatorListMessages(std::size_t messageVersion, std::uint64_t peerSequence, std::size_t maxSequence, std::uint32_t rawVersion, std::string const &amp;rawManifest, std::map&lt; std::size_t, ValidatorBlobInfo &gt; const &amp;blobInfos, std::vector&lt; MessageWithHash &gt; &amp;messages, std::size_t maxSize=maximiumMessageSize)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00612">ValidatorList.cpp:612</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_ad8fefe3e8ad583e1ed1bf02094ac3d8f"><div class="ttname"><a href="classbeast_1_1Journal.html#ad8fefe3e8ad583e1ed1bf02094ac3d8f">beast::Journal::warn</a></div><div class="ttdeci">Stream warn() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00327">Journal.h:327</a></div></div>
<div class="ttc" id="alock_guard_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/lock_guard.html">std::lock_guard</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_a3c89dbf867ba814f0bf2417757d5a0f4"><div class="ttname"><a href="classripple_1_1Peer.html#a3c89dbf867ba814f0bf2417757d5a0f4">ripple::Peer::send</a></div><div class="ttdeci">virtual void send(std::shared_ptr&lt; Message &gt; const &amp;m)=0</div></div>
<div class="ttc" id="anamespaceripple_html_a7522005d5dcaff918e211e0c0357fbf7"><div class="ttname"><a href="namespaceripple.html#a7522005d5dcaff918e211e0c0357fbf7">ripple::strViewUnHex</a></div><div class="ttdeci">std::optional&lt; Blob &gt; strViewUnHex(boost::string_view const &amp;strSrc)</div><div class="ttdef"><b>Definition:</b> <a href="StringUtilities_8h_source.html#l00095">StringUtilities.h:95</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aa0c6d081fe5e626dc63a9cd949de2d85"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aa0c6d081fe5e626dc63a9cd949de2d85">ripple::ValidatorList::maxSupportedBlobs</a></div><div class="ttdeci">static constexpr std::size_t maxSupportedBlobs</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00259">ValidatorList.h:259</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html_a14a9062d631a59e17893186560310288"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html#a14a9062d631a59e17893186560310288">ripple::ValidatorBlobInfo::blob</a></div><div class="ttdeci">std::string blob</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00119">ValidatorList.h:119</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a1c1a5dcd8079d94a6affd3602b9d4fbc"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a1c1a5dcd8079d94a6affd3602b9d4fbc">ripple::ValidatorList::PublisherListStats::bestDisposition</a></div><div class="ttdeci">ListDisposition bestDisposition() const</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00085">ValidatorList.cpp:85</a></div></div>
<div class="ttc" id="aback_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/back.html">std::vector::back</a></div><div class="ttdeci">T back(T... args)</div></div>
<div class="ttc" id="afunction_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/functional/function.html">std::function</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a3696d34c1a1833742b4bf8e5b247f125"><div class="ttname"><a href="classJson_1_1Value.html#a3696d34c1a1833742b4bf8e5b247f125">Json::Value::toStyledString</a></div><div class="ttdeci">std::string toStyledString() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l01039">json_value.cpp:1039</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_acf339d3f8e4939b5cd5075374ecc9691"><div class="ttname"><a href="classripple_1_1ValidatorList.html#acf339d3f8e4939b5cd5075374ecc9691">ripple::ValidatorList::parseBlobs</a></div><div class="ttdeci">static std::vector&lt; ValidatorBlobInfo &gt; parseBlobs(std::uint32_t version, Json::Value const &amp;body)</div><div class="ttdoc">Pull the blob/signature/manifest information out of the appropriate Json body fields depending on the...</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00362">ValidatorList.cpp:362</a></div></div>
<div class="ttc" id="aclassJson_1_1Reader_html"><div class="ttname"><a href="classJson_1_1Reader.html">Json::Reader</a></div><div class="ttdoc">Unserialize a JSON document into a Value.</div><div class="ttdef"><b>Definition:</b> <a href="json__reader_8h_source.html#l00036">json_reader.h:36</a></div></div>
<div class="ttc" id="acmath_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/cmath.html">cmath</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ripple::ListDisposition::expired</a></div><div class="ttdeci">@ expired</div><div class="ttdoc">List is expired, but has the largest non-pending sequence seen so far.</div></div>
<div class="ttc" id="asort_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/sort.html">std::sort</a></div><div class="ttdeci">T sort(T... args)</div></div>
<div class="ttc" id="areset_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional/reset.html">std::optional::reset</a></div><div class="ttdeci">T reset(T... args)</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html">ripple::ValidatorList::PublisherListCollection</a></div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00194">ValidatorList.h:194</a></div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html"><div class="ttname"><a href="classripple_1_1HashRouter.html">ripple::HashRouter</a></div><div class="ttdoc">Routing table for objects identified by hash.</div><div class="ttdef"><b>Definition:</b> <a href="HashRouter_8h_source.html#l00053">HashRouter.h:53</a></div></div>
<div class="ttc" id="aclear_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/clear.html">std::vector::clear</a></div><div class="ttdeci">T clear(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a0056ded6793baf9fda1c2f1fcffc535b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a0056ded6793baf9fda1c2f1fcffc535b">ripple::ValidatorList::getTrustedKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; getTrustedKey(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns master public key if public key is trusted.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01396">ValidatorList.cpp:1396</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a023f425a3145224e0101f0ef9db7c917"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a023f425a3145224e0101f0ef9db7c917">ripple::ValidatorList::sendValidatorList</a></div><div class="ttdeci">static void sendValidatorList(Peer &amp;peer, std::uint64_t peerSequence, PublicKey const &amp;publisherKey, std::size_t maxSequence, std::uint32_t rawVersion, std::string const &amp;rawManifest, std::map&lt; std::size_t, ValidatorBlobInfo &gt; const &amp;blobInfos, HashRouter &amp;hashRouter, beast::Journal j)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00749">ValidatorList.cpp:749</a></div></div>
<div class="ttc" id="apush_back_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/push_back.html">std::vector::push_back</a></div><div class="ttdeci">T push_back(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_adc1f8a2c9b47d7c08e671ad3473e9d3a"><div class="ttname"><a href="namespaceripple.html#adc1f8a2c9b47d7c08e671ad3473e9d3a">ripple::publicKeyType</a></div><div class="ttdeci">std::optional&lt; KeyType &gt; publicKeyType(Slice const &amp;slice)</div><div class="ttdoc">Returns the type of public key.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8cpp_source.html#l00203">PublicKey.cpp:203</a></div></div>
<div class="ttc" id="aclassripple_1_1base__uint_html"><div class="ttname"><a href="classripple_1_1base__uint.html">ripple::base_uint&lt; 256 &gt;</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a9d3a6dfa4f7ffe2717513369298e7268"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a9d3a6dfa4f7ffe2717513369298e7268">ripple::ValidatorList::removePublisherList</a></div><div class="ttdeci">bool removePublisherList(lock_guard const &amp;, PublicKey const &amp;publisherKey, PublisherStatus reason)</div><div class="ttdoc">Stop trusting publisher's list of keys.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01419">ValidatorList.cpp:1419</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1MessageWithHash_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1MessageWithHash.html">ripple::ValidatorList::MessageWithHash</a></div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00303">ValidatorList.h:303</a></div></div>
<div class="ttc" id="aclassripple_1_1NetworkOPs_html_ace637a61664a15f70bc362f2ad1101e9"><div class="ttname"><a href="classripple_1_1NetworkOPs.html#ace637a61664a15f70bc362f2ad1101e9">ripple::NetworkOPs::clearUNLBlocked</a></div><div class="ttdeci">virtual void clearUNLBlocked()=0</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a61c0b817fc56c96d5a6c40a0e7dadbeb"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a61c0b817fc56c96d5a6c40a0e7dadbeb">ripple::ValidatorList::cacheValidatorFile</a></div><div class="ttdeci">void cacheValidatorFile(lock_guard const &amp;lock, PublicKey const &amp;pubKey) const</div><div class="ttdoc">Write a JSON UNL to a cache file.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00331">ValidatorList.cpp:331</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a7e49ac977e4bcf59745a09d426669f75"><div class="ttname"><a href="classJson_1_1Value.html#a7e49ac977e4bcf59745a09d426669f75">Json::Value::append</a></div><div class="ttdeci">Value &amp; append(const Value &amp;value)</div><div class="ttdoc">Append value to array at the end.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00882">json_value.cpp:882</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aa4effc5014393e8a6eae30d95053df28"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aa4effc5014393e8a6eae30d95053df28">ripple::ValidatorList::ValidatorList</a></div><div class="ttdeci">ValidatorList(ManifestCache &amp;validatorManifests, ManifestCache &amp;publisherManifests, TimeKeeper &amp;timeKeeper, std::string const &amp;databasePath, beast::Journal j, std::optional&lt; std::size_t &gt; minimumQuorum=std::nullopt)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00118">ValidatorList.cpp:118</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a53a444cf253f5a11a1b800c23e691e31"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a53a444cf253f5a11a1b800c23e691e31">ripple::ValidatorList::dataPath_</a></div><div class="ttdeci">const boost::filesystem::path dataPath_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00227">ValidatorList.h:227</a></div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4eae8386dcfc36d1ae897745f7b4f77a1f6">Json::objectValue</a></div><div class="ttdeci">@ objectValue</div><div class="ttdoc">object value (collection of name/value pairs).</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00043">json_value.h:43</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a11929bd666b5a688054d623832118033"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a11929bd666b5a688054d623832118033">ripple::ValidatorList::getCacheFileName</a></div><div class="ttdeci">boost::filesystem::path getCacheFileName(lock_guard const &amp;, PublicKey const &amp;pubKey) const</div><div class="ttdoc">Get the filename used for caching UNLs.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00250">ValidatorList.cpp:250</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a5f9f984bf774a8dc62ebcc96a9660a25"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a5f9f984bf774a8dc62ebcc96a9660a25">ripple::ValidatorList::verify</a></div><div class="ttdeci">ListDisposition verify(lock_guard const &amp;, Json::Value &amp;list, PublicKey &amp;pubKey, std::string const &amp;manifest, std::string const &amp;blob, std::string const &amp;signature)</div><div class="ttdoc">Check response for trusted valid published list.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01259">ValidatorList.cpp:1259</a></div></div>
<div class="ttc" id="aclassripple_1_1PublicKey_html"><div class="ttname"><a href="classripple_1_1PublicKey.html">ripple::PublicKey</a></div><div class="ttdoc">A public key.</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8h_source.html#l00059">PublicKey.h:59</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a0152f32b497bbaa62e9a85e0be90bb02"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a0152f32b497bbaa62e9a85e0be90bb02">ripple::ValidatorList::PublisherListStats::mergeDispositions</a></div><div class="ttdeci">void mergeDispositions(PublisherListStats const &amp;src)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00099">ValidatorList.cpp:99</a></div></div>
<div class="ttc" id="aclassripple_1_1PublicKey_html_a663437215503b159ed33b1664e4213a3"><div class="ttname"><a href="classripple_1_1PublicKey.html#a663437215503b159ed33b1664e4213a3">ripple::PublicKey::size</a></div><div class="ttdeci">std::size_t size() const noexcept</div><div class="ttdef"><b>Definition:</b> <a href="PublicKey_8h_source.html#l00087">PublicKey.h:87</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_a1d97cceec8dbfaf845cceade47cfdbb4"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#a1d97cceec8dbfaf845cceade47cfdbb4">ripple::ValidatorList::PublisherList::list</a></div><div class="ttdeci">std::vector&lt; PublicKey &gt; list</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00178">ValidatorList.h:178</a></div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_adc1069de1a8a5ff1364003caf00bb139"><div class="ttname"><a href="classripple_1_1Peer.html#adc1069de1a8a5ff1364003caf00bb139">ripple::Peer::setPublisherListSequence</a></div><div class="ttdeci">virtual void setPublisherListSequence(PublicKey const &amp;, std::size_t const)=0</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a923f3aa3898a824b4b6947abd88502c5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a923f3aa3898a824b4b6947abd88502c5">ripple::ValidatorList::getListedKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; getListedKey(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns listed master public if public key is included on any lists.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01374">ValidatorList.cpp:1374</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html">ripple::ValidatorBlobInfo</a></div><div class="ttdoc">Used to represent the information stored in the blobs_v2 Json array.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00116">ValidatorList.h:116</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html_a968f2c3bdc3420ca645ad54a5be5c6d9"><div class="ttname"><a href="structripple_1_1TrustChanges.html#a968f2c3bdc3420ca645ad54a5be5c6d9">ripple::TrustChanges::removed</a></div><div class="ttdeci">hash_set&lt; NodeID &gt; removed</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00112">ValidatorList.h:112</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aa4813b41483e2df542ce2731fb7b5f5d"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aa4813b41483e2df542ce2731fb7b5f5d">ripple::ValidatorList::updateTrusted</a></div><div class="ttdeci">TrustChanges updateTrusted(hash_set&lt; NodeID &gt; const &amp;seenValidators, NetClock::time_point closeTime, NetworkOPs &amp;ops, Overlay &amp;overlay, HashRouter &amp;hashRouter)</div><div class="ttdoc">Update trusted nodes.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01773">ValidatorList.cpp:1773</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a4efb18d223a1910d123c99e09c1a524c"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a4efb18d223a1910d123c99e09c1a524c">ripple::ValidatorList::PublisherListCollection::remaining</a></div><div class="ttdeci">std::map&lt; std::size_t, PublisherList &gt; remaining</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00216">ValidatorList.h:216</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_af8fe24acb044cf9b928d14a1e84b63ac"><div class="ttname"><a href="classripple_1_1ValidatorList.html#af8fe24acb044cf9b928d14a1e84b63ac">ripple::ValidatorList::publisherManifests_</a></div><div class="ttdeci">ManifestCache &amp; publisherManifests_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00225">ValidatorList.h:225</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a0db3ac667949c8002894beb011f7f139"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a0db3ac667949c8002894beb011f7f139">ripple::ValidatorList::broadcastBlobs</a></div><div class="ttdeci">static void broadcastBlobs(PublicKey const &amp;publisherKey, PublisherListCollection const &amp;lists, std::size_t maxSequence, uint256 const &amp;hash, Overlay &amp;overlay, HashRouter &amp;hashRouter, beast::Journal j)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00802">ValidatorList.cpp:802</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a6494e744b90cbecd735b460fcd7be82f"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a6494e744b90cbecd735b460fcd7be82f">ripple::ManifestCache::revoked</a></div><div class="ttdeci">bool revoked(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns true if master key has been revoked in a manifest.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00344">app/misc/impl/Manifest.cpp:344</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a390041ee5976df2e6b170a3c6eed5de5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a390041ee5976df2e6b170a3c6eed5de5">ripple::ValidatorList::timeKeeper_</a></div><div class="ttdeci">TimeKeeper &amp; timeKeeper_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00226">ValidatorList.h:226</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a5b0d33cb960903cc89ba236178e0247b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a5b0d33cb960903cc89ba236178e0247b">ripple::ValidatorList::listed</a></div><div class="ttdeci">bool listed(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns true if public key is included on any lists.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01349">ValidatorList.cpp:1349</a></div></div>
<div class="ttc" id="anamespaceripple_html_ae18870f8d8eaa17b582f609cc486aa04"><div class="ttname"><a href="namespaceripple.html#ae18870f8d8eaa17b582f609cc486aa04">ripple::writeFileContents</a></div><div class="ttdeci">void writeFileContents(boost::system::error_code &amp;ec, boost::filesystem::path const &amp;destPath, std::string const &amp;contents)</div><div class="ttdef"><b>Definition:</b> <a href="FileUtilities_8cpp_source.html#l00066">FileUtilities.cpp:66</a></div></div>
<div class="ttc" id="anamespaceripple_html_a551be32de1cc0f8a8ff1f14ee84d892b"><div class="ttname"><a href="namespaceripple.html#a551be32de1cc0f8a8ff1f14ee84d892b">ripple::base64_decode</a></div><div class="ttdeci">std::string base64_decode(std::string const &amp;data)</div><div class="ttdef"><b>Definition:</b> <a href="base64_8cpp_source.html#l00245">base64.cpp:245</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a49b0713e65bb8e2c51b76fbf16252afe"><div class="ttname"><a href="classbeast_1_1Journal.html#a49b0713e65bb8e2c51b76fbf16252afe">beast::Journal::error</a></div><div class="ttdeci">Stream error() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00333">Journal.h:333</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a87d6bd59020d94110027dcab3d9e3357"><div class="ttname"><a href="classbeast_1_1Journal.html#a87d6bd59020d94110027dcab3d9e3357">beast::Journal::info</a></div><div class="ttdeci">Stream info() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00321">Journal.h:321</a></div></div>
<div class="ttc" id="atime_point_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/chrono/time_point.html">std::chrono::time_point</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a23c7027ca674f989f90564d63ef36c74"><div class="ttname"><a href="classJson_1_1Value.html#a23c7027ca674f989f90564d63ef36c74">Json::Value::size</a></div><div class="ttdeci">UInt size() const</div><div class="ttdoc">Number of values in array or object.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00706">json_value.cpp:706</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a5aa008bd5f235894ff77e2d09f980aae"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a5aa008bd5f235894ff77e2d09f980aae">ripple::ValidatorList::getAvailable</a></div><div class="ttdeci">std::optional&lt; Json::Value &gt; getAvailable(boost::beast::string_view const &amp;pubKey, std::optional&lt; std::uint32_t &gt; forceVersion={})</div><div class="ttdoc">Returns the current valid list for the given publisher key, if available, as a Json object.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01678">ValidatorList.cpp:1678</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_a4d5d54c46f6269d96903ac574975f261"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#a4d5d54c46f6269d96903ac574975f261">ripple::ValidatorList::PublisherList::siteUri</a></div><div class="ttdeci">std::string siteUri</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00183">ValidatorList.h:183</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a7f05c967613f99e5f05af017673c6765"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a7f05c967613f99e5f05af017673c6765">ripple::ManifestCache::for_each_manifest</a></div><div class="ttdeci">void for_each_manifest(Function &amp;&amp;f) const</div><div class="ttdoc">Invokes the callback once for every populated manifest.</div><div class="ttdef"><b>Definition:</b> <a href="Manifest_8h_source.html#l00392">Manifest.h:392</a></div></div>
<div class="ttc" id="aclassripple_1_1Overlay_html_a516f776bf7ff0dbf6a8be71b7355e5be"><div class="ttname"><a href="classripple_1_1Overlay.html#a516f776bf7ff0dbf6a8be71b7355e5be">ripple::Overlay::getActivePeers</a></div><div class="ttdeci">virtual PeerSequence getActivePeers() const =0</div><div class="ttdoc">Returns a sequence representing the current list of peers.</div></div>
<div class="ttc" id="anamespaceripple_html_a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000"><div class="ttname"><a href="namespaceripple.html#a6434c1a0fd22b77e2e4a228c0eca79eba43b5c9175984c071f30b873fdce0a000">ripple::ValStatus::current</a></div><div class="ttdeci">@ current</div><div class="ttdoc">This was a new validation and was added.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a63d2a671ff6ffd00111188031808aa78">ripple::ListDisposition::untrusted</a></div><div class="ttdeci">@ untrusted</div><div class="ttdoc">List signed by untrusted publisher key.</div></div>
<div class="ttc" id="aaccumulate_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/accumulate.html">std::accumulate</a></div><div class="ttdeci">T accumulate(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a8409a7089c3e04f972f1513a54576133"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a8409a7089c3e04f972f1513a54576133">ripple::ManifestCache::getSigningKey</a></div><div class="ttdeci">PublicKey getSigningKey(PublicKey const &amp;pk) const</div><div class="ttdoc">Returns master key's current signing key.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00284">app/misc/impl/Manifest.cpp:284</a></div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_a1781d176803366238413407a0815124a"><div class="ttname"><a href="classripple_1_1Peer.html#a1781d176803366238413407a0815124a">ripple::Peer::supportsFeature</a></div><div class="ttdeci">virtual bool supportsFeature(ProtocolFeature f) const =0</div></div>
<div class="ttc" id="aclassJson_1_1Value_html_ad6d4df2227321bab05e86667609a7fad"><div class="ttname"><a href="classJson_1_1Value.html#ad6d4df2227321bab05e86667609a7fad">Json::Value::isMember</a></div><div class="ttdeci">bool isMember(const char *key) const</div><div class="ttdoc">Return true if the object has a member named key.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00932">json_value.cpp:932</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html"><div class="ttname"><a href="classbeast_1_1Journal.html">beast::Journal</a></div><div class="ttdoc">A generic endpoint for log messages.</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00058">Journal.h:58</a></div></div>
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_aa37066f4c4bc231ad60e6f751e56bf05"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#aa37066f4c4bc231ad60e6f751e56bf05">ripple::ValidatorList::PublisherListStats::sequence</a></div><div class="ttdeci">std::size_t sequence</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00300">ValidatorList.h:300</a></div></div>
<div class="ttc" id="aclassripple_1_1NetworkOPs_html_a3b837bd8b8633d45d7e5f26961fab856"><div class="ttname"><a href="classripple_1_1NetworkOPs.html#a3b837bd8b8633d45d7e5f26961fab856">ripple::NetworkOPs::setUNLBlocked</a></div><div class="ttdeci">virtual void setUNLBlocked()=0</div></div>
<div class="ttc" id="aclassripple_1_1HashRouter_html_a29980c0f77dcc002ef322c23080f3266"><div class="ttname"><a href="classripple_1_1HashRouter.html#a29980c0f77dcc002ef322c23080f3266">ripple::HashRouter::shouldRelay</a></div><div class="ttdeci">std::optional&lt; std::set&lt; PeerShortID &gt; &gt; shouldRelay(uint256 const &amp;key)</div><div class="ttdoc">Determines whether the hashed item should be relayed.</div><div class="ttdef"><b>Definition:</b> <a href="HashRouter_8cpp_source.html#l00118">HashRouter.cpp:118</a></div></div>
<div class="ttc" id="aremove_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/remove.html">std::remove_if</a></div><div class="ttdeci">T remove_if(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1TimeKeeper_html"><div class="ttname"><a href="classripple_1_1TimeKeeper.html">ripple::TimeKeeper</a></div><div class="ttdoc">Manages various times used by the server.</div><div class="ttdef"><b>Definition:</b> <a href="TimeKeeper_8h_source.html#l00032">TimeKeeper.h:32</a></div></div>
<div class="ttc" id="amap_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/map.html">std::map</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a2af01f2c39c66a1641045dd660e839b5">ripple::ListDisposition::unsupported_version</a></div><div class="ttdeci">@ unsupported_version</div><div class="ttdoc">List version is not supported.</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a3cb3357e6108a7e96d03e4da7feb7d5a"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a3cb3357e6108a7e96d03e4da7feb7d5a">ripple::ValidatorList::buildFileData</a></div><div class="ttdeci">static Json::Value buildFileData(std::string const &amp;pubKey, PublisherListCollection const &amp;pubCollection, beast::Journal j)</div><div class="ttdoc">Build a Json representation of the collection, suitable for writing to a cache file,...</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00259">ValidatorList.cpp:259</a></div></div>
<div class="ttc" id="aceil_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/numeric/math/ceil.html">std::ceil</a></div><div class="ttdeci">T ceil(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3"><div class="ttname"><a href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6afedb2d84cafe20862cb4399751a8a7e3">ripple::ManifestDisposition::invalid</a></div><div class="ttdeci">@ invalid</div><div class="ttdoc">Timely, but invalid signature.</div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_a35b25d5a662db9a534ac4a972a8ba6b3"><div class="ttname"><a href="classripple_1_1Peer.html#a35b25d5a662db9a534ac4a972a8ba6b3">ripple::Peer::getRemoteAddress</a></div><div class="ttdeci">virtual beast::IP::Endpoint getRemoteAddress() const =0</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a0937f06a5eddf696521deaef47192a32"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a0937f06a5eddf696521deaef47192a32">ripple::ValidatorList::negativeUNLFilter</a></div><div class="ttdeci">std::vector&lt; std::shared_ptr&lt; STValidation &gt; &gt; negativeUNLFilter(std::vector&lt; std::shared_ptr&lt; STValidation &gt;&gt; &amp;&amp;validations) const</div><div class="ttdoc">Remove validations that are from validators on the negative UNL.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01958">ValidatorList.cpp:1958</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a74578a60966c12996799fd9784d66741"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a74578a60966c12996799fd9784d66741">ripple::ValidatorList::expires</a></div><div class="ttdeci">std::optional&lt; TimeKeeper::time_point &gt; expires() const</div><div class="ttdoc">Return the time when the validator list will expire.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01500">ValidatorList.cpp:1500</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a1627eb9d6568d6d0252fa8bb711c0a59"><div class="ttname"><a href="classJson_1_1Value.html#a1627eb9d6568d6d0252fa8bb711c0a59">Json::Value::isArray</a></div><div class="ttdeci">bool isArray() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l01015">json_value.cpp:1015</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a79545d89d7c7c5bfef7f15ce0510577b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a79545d89d7c7c5bfef7f15ce0510577b">ripple::ValidatorList::calculateQuorum</a></div><div class="ttdeci">std::size_t calculateQuorum(std::size_t unlSize, std::size_t effectiveUnlSize, std::size_t seenSize)</div><div class="ttdoc">Return quorum for trusted validator set.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01708">ValidatorList.cpp:1708</a></div></div>
<div class="ttc" id="anamespaceripple_html_a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470"><div class="ttname"><a href="namespaceripple.html#a8a16d6f665a032453ec4cbfca01929b6a3e4d891a5df3d6d0d7dd9432a1bc6470">ripple::ManifestDisposition::accepted</a></div><div class="ttdeci">@ accepted</div><div class="ttdoc">Manifest is valid.</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3abf5d96cdfec398ce2c7ac8cbd73f68f4">ripple::ListDisposition::known_sequence</a></div><div class="ttdeci">@ known_sequence</div><div class="ttdoc">Future sequence already seen.</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ae572133b799990fc68d8071e6b835b39"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ae572133b799990fc68d8071e6b835b39">ripple::ValidatorList::localPubKey_</a></div><div class="ttdeci">PublicKey localPubKey_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00250">ValidatorList.h:250</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a647d2962692b44371893c84549fe918c"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a647d2962692b44371893c84549fe918c">ripple::ValidatorList::applyList</a></div><div class="ttdeci">PublisherListStats applyList(std::string const &amp;globalManifest, std::optional&lt; std::string &gt; const &amp;localManifest, std::string const &amp;blob, std::string const &amp;signature, std::uint32_t version, std::string siteUri, std::optional&lt; uint256 &gt; const &amp;hash, lock_guard const &amp;)</div><div class="ttdoc">Apply published list of public keys.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01060">ValidatorList.cpp:1060</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html"><div class="ttname"><a href="classripple_1_1ManifestCache.html">ripple::ManifestCache</a></div><div class="ttdoc">Remembers manifests with the highest sequence number.</div><div class="ttdef"><b>Definition:</b> <a href="Manifest_8h_source.html#l00223">Manifest.h:223</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a12f49b76ef58d9c64310aa4a7ce0115a"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a12f49b76ef58d9c64310aa4a7ce0115a">ripple::ValidatorList::loadLists</a></div><div class="ttdeci">std::vector&lt; std::string &gt; loadLists()</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01206">ValidatorList.cpp:1206</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a6b97cdf21f82f10b613a058c355670f7"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a6b97cdf21f82f10b613a058c355670f7">ripple::ValidatorList::PublisherListCollection::rawVersion</a></div><div class="ttdeci">std::uint32_t rawVersion</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00221">ValidatorList.h:221</a></div></div>
<div class="ttc" id="aemplace_back_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/emplace_back.html">std::vector::emplace_back</a></div><div class="ttdeci">T emplace_back(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html"><div class="ttname"><a href="namespaceripple.html">ripple</a></div><div class="ttdoc">Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.</div><div class="ttdef"><b>Definition:</b> <a href="RCLCensorshipDetector_8h_source.html#l00029">RCLCensorshipDetector.h:29</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ae06a469121f9f99ed9f3049e46d0206c"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ae06a469121f9f99ed9f3049e46d0206c">ripple::ValidatorList::trustedSigningKeys_</a></div><div class="ttdeci">hash_set&lt; PublicKey &gt; trustedSigningKeys_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00248">ValidatorList.h:248</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ac26b319f046fcd0af996c60511cd1547"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ac26b319f046fcd0af996c60511cd1547">ripple::ValidatorList::load</a></div><div class="ttdeci">bool load(PublicKey const &amp;localSigningKey, std::vector&lt; std::string &gt; const &amp;configKeys, std::vector&lt; std::string &gt; const &amp;publisherKeys)</div><div class="ttdoc">Load configured trusted keys.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00136">ValidatorList.cpp:136</a></div></div>
<div class="ttc" id="anamespaceripple_html_a4ff3645a512aba91799410ca0da8ebf0"><div class="ttname"><a href="namespaceripple.html#a4ff3645a512aba91799410ca0da8ebf0">ripple::splitMessageParts</a></div><div class="ttdeci">std::size_t splitMessageParts(std::vector&lt; ValidatorList::MessageWithHash &gt; &amp;messages, protocol::TMValidatorListCollection const &amp;largeMsg, std::size_t maxSize, std::size_t begin, std::size_t end)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00477">ValidatorList.cpp:477</a></div></div>
<div class="ttc" id="anamespaceripple_html_a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1"><div class="ttname"><a href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150abbd68b30711cfd4adc8abd9b5519abe1">ripple::ProtocolFeature::ValidatorList2Propagation</a></div><div class="ttdeci">@ ValidatorList2Propagation</div></div>
<div class="ttc" id="aclassripple_1_1Overlay_html"><div class="ttname"><a href="classripple_1_1Overlay.html">ripple::Overlay</a></div><div class="ttdoc">Manages the set of connected peers.</div><div class="ttdef"><b>Definition:</b> <a href="Overlay_8h_source.html#l00051">Overlay.h:51</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a48d42d3793975088316dd65e63e78c24"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a48d42d3793975088316dd65e63e78c24">ripple::ValidatorList::PublisherListCollection::current</a></div><div class="ttdeci">PublisherList current</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00207">ValidatorList.h:207</a></div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a7060e0481896e00b3f7d20f1e8e2749a">ripple::PublisherStatus::unavailable</a></div><div class="ttdeci">@ unavailable</div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a774ecc994c99a32a052f6d67e9b085cc">ripple::ListDisposition::same_sequence</a></div><div class="ttdeci">@ same_sequence</div><div class="ttdoc">Same sequence as current list.</div></div>
<div class="ttc" id="abegin_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/map/begin.html">std::map::begin</a></div><div class="ttdeci">T begin(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_ae3f5bc352766a1a8dbf5270eb7dbc2e7"><div class="ttname"><a href="namespaceripple.html#ae3f5bc352766a1a8dbf5270eb7dbc2e7">ripple::sha512Half</a></div><div class="ttdeci">sha512_half_hasher::result_type sha512Half(Args const &amp;... args)</div><div class="ttdoc">Returns the SHA512-Half of a series of objects.</div><div class="ttdef"><b>Definition:</b> <a href="digest_8h_source.html#l00216">digest.h:216</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html_a74b305583ec3aacf4f9dd06e799dc265"><div class="ttname"><a href="classJson_1_1Value.html#a74b305583ec3aacf4f9dd06e799dc265">Json::Value::asUInt</a></div><div class="ttdeci">UInt asUInt() const</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00545">json_value.cpp:545</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3afedb2d84cafe20862cb4399751a8a7e3">ripple::ListDisposition::invalid</a></div><div class="ttdeci">@ invalid</div><div class="ttdoc">Invalid format or signature.</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html_ade8078adfb156f2f5b2d976fc91b6b75"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html#ade8078adfb156f2f5b2d976fc91b6b75">ripple::ValidatorList::PublisherList::validFrom</a></div><div class="ttdeci">TimeKeeper::time_point validFrom</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00181">ValidatorList.h:181</a></div></div>
<div class="ttc" id="aclassJson_1_1Reader_html_a8ee4d40504e4f8b069745d762ab4d78c"><div class="ttname"><a href="classJson_1_1Reader.html#a8ee4d40504e4f8b069745d762ab4d78c">Json::Reader::parse</a></div><div class="ttdeci">bool parse(std::string const &amp;document, Value &amp;root)</div><div class="ttdoc">Read a Value from a JSON document.</div><div class="ttdef"><b>Definition:</b> <a href="json__reader_8cpp_source.html#l00074">json_reader.cpp:74</a></div></div>
<div class="ttc" id="anamespaceJson_html_a7d654b75c16a57007925868e38212b4ea7d9899633b4409bd3fc107e6737f8391"><div class="ttname"><a href="namespaceJson.html#a7d654b75c16a57007925868e38212b4ea7d9899633b4409bd3fc107e6737f8391">Json::nullValue</a></div><div class="ttdeci">@ nullValue</div><div class="ttdoc">'null' value</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00036">json_value.h:36</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a94f8763278cc8e85a241cfccaed69183"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a94f8763278cc8e85a241cfccaed69183">ripple::ValidatorList::mutex_</a></div><div class="ttdeci">boost::shared_mutex mutex_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00229">ValidatorList.h:229</a></div></div>
<div class="ttc" id="aclassripple_1_1TimeKeeper_html_af1b5d38f3ba1bcacfbb7a89979af70e4"><div class="ttname"><a href="classripple_1_1TimeKeeper.html#af1b5d38f3ba1bcacfbb7a89979af70e4">ripple::TimeKeeper::now</a></div><div class="ttdeci">virtual time_point now() const override=0</div><div class="ttdoc">Returns the estimate of wall time, in network time.</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a47be311fd3dc2b5a9aa0623ee493215d"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a47be311fd3dc2b5a9aa0623ee493215d">ripple::ValidatorList::PublisherListStats::worstDisposition</a></div><div class="ttdeci">ListDisposition worstDisposition() const</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00092">ValidatorList.cpp:92</a></div></div>
<div class="ttc" id="acount_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/count.html">std::count</a></div><div class="ttdeci">T count(T... args)</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a6863af689efe13c3d2c5193bd1a6b580"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a6863af689efe13c3d2c5193bd1a6b580">ripple::ValidatorList::PublisherListStats::publisherKey</a></div><div class="ttdeci">std::optional&lt; PublicKey &gt; publisherKey</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00298">ValidatorList.h:298</a></div></div>
<div class="ttc" id="astructripple_1_1TrustChanges_html_a0c0a50258cfb5466d79bcff91a8d5c00"><div class="ttname"><a href="structripple_1_1TrustChanges.html#a0c0a50258cfb5466d79bcff91a8d5c00">ripple::TrustChanges::added</a></div><div class="ttdeci">hash_set&lt; NodeID &gt; added</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00111">ValidatorList.h:111</a></div></div>
<div class="ttc" id="aempty_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/empty.html">std::vector::empty</a></div><div class="ttdeci">T empty(T... args)</div></div>
<div class="ttc" id="anamespaceripple_html_a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6"><div class="ttname"><a href="namespaceripple.html#a1bf8df553d36589191c8057c136cce03ac3fe5edb1f8a81a8e585f6a27c120be6">ripple::TokenType::NodePublic</a></div><div class="ttdeci">@ NodePublic</div></div>
<div class="ttc" id="aoptional_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/optional.html">std::optional&lt; std::size_t &gt;</a></div></div>
<div class="ttc" id="amutex_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/mutex.html">mutex</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a6f943a4488f3b50dcbb5177007d43271"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a6f943a4488f3b50dcbb5177007d43271">ripple::ValidatorList::getJson</a></div><div class="ttdeci">Json::Value getJson() const</div><div class="ttdoc">Return a JSON representation of the state of the validator list.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01507">ValidatorList.cpp:1507</a></div></div>
<div class="ttc" id="aclassbeast_1_1Journal_html_a556228cb60bcf405c225d3f64b7b01ae"><div class="ttname"><a href="classbeast_1_1Journal.html#a556228cb60bcf405c225d3f64b7b01ae">beast::Journal::debug</a></div><div class="ttdeci">Stream debug() const</div><div class="ttdef"><b>Definition:</b> <a href="Journal_8h_source.html#l00315">Journal.h:315</a></div></div>
<div class="ttc" id="asize_t_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div></div>
<div class="ttc" id="anamespaceripple_html_af9776f187d3686a7fba4c2d2fbeebdf4"><div class="ttname"><a href="namespaceripple.html#af9776f187d3686a7fba4c2d2fbeebdf4">ripple::to_string</a></div><div class="ttdeci">std::string to_string(Manifest const &amp;m)</div><div class="ttdoc">Format the specified manifest to a string for debugging purposes.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00038">app/misc/impl/Manifest.cpp:38</a></div></div>
<div class="ttc" id="aclassripple_1_1Peer_html_aee121254a095838be2d8040bfdfacc79"><div class="ttname"><a href="classripple_1_1Peer.html#aee121254a095838be2d8040bfdfacc79">ripple::Peer::id</a></div><div class="ttdeci">virtual id_t id() const =0</div></div>
<div class="ttc" id="anamespaceripple_html_a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b"><div class="ttname"><a href="namespaceripple.html#a3b423ad1ba6341f945c08c13fe141150a9a32e2a438c197a712d352ca4e69b65b">ripple::ProtocolFeature::ValidatorListPropagation</a></div><div class="ttdeci">@ ValidatorListPropagation</div></div>
<div class="ttc" id="anamespaceripple_html_a86e358ce3f06ff049af13c2342791cf8"><div class="ttname"><a href="namespaceripple.html#a86e358ce3f06ff049af13c2342791cf8">ripple::strHex</a></div><div class="ttdeci">std::string strHex(FwdIt begin, FwdIt end)</div><div class="ttdef"><b>Definition:</b> <a href="strHex_8h_source.html#l00045">strHex.h:45</a></div></div>
<div class="ttc" id="aend_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/container/vector/end.html">std::vector::end</a></div><div class="ttdeci">T end(T... args)</div></div>
<div class="ttc" id="astructripple_1_1ValidatorBlobInfo_html_aff27a4056fcd7873c6d78a02047a79ad"><div class="ttname"><a href="structripple_1_1ValidatorBlobInfo.html#aff27a4056fcd7873c6d78a02047a79ad">ripple::ValidatorBlobInfo::manifest</a></div><div class="ttdeci">std::optional&lt; std::string &gt; manifest</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00124">ValidatorList.h:124</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListStats_html_a517f509ad4f2032f1553def3e810a5a5"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListStats.html#a517f509ad4f2032f1553def3e810a5a5">ripple::ValidatorList::PublisherListStats::dispositions</a></div><div class="ttdeci">std::map&lt; ListDisposition, std::size_t &gt; dispositions</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00297">ValidatorList.h:297</a></div></div>
<div class="ttc" id="anumeric_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/numeric.html">numeric</a></div></div>
<div class="ttc" id="amax_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/algorithm/max.html">std::max</a></div><div class="ttdeci">T max(T... args)</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a9de7a870beb3104dc8320d6367b7f7e8"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a9de7a870beb3104dc8320d6367b7f7e8">ripple::ValidatorList::trusted</a></div><div class="ttdeci">bool trusted(PublicKey const &amp;identity) const</div><div class="ttdoc">Returns true if public key is trusted.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01367">ValidatorList.cpp:1367</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a623a1124f621b9ee5745bd22094b4acb"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a623a1124f621b9ee5745bd22094b4acb">ripple::ValidatorList::trustedMasterKeys_</a></div><div class="ttdeci">hash_set&lt; PublicKey &gt; trustedMasterKeys_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00243">ValidatorList.h:243</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_afef3dd7af8c40b51da43a945f632b4c5"><div class="ttname"><a href="classripple_1_1ValidatorList.html#afef3dd7af8c40b51da43a945f632b4c5">ripple::ValidatorList::getNegativeUNL</a></div><div class="ttdeci">hash_set&lt; PublicKey &gt; getNegativeUNL() const</div><div class="ttdoc">get the master public keys of Negative UNL validators</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01944">ValidatorList.cpp:1944</a></div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4">ripple::PublisherStatus</a></div><div class="ttdeci">PublisherStatus</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00087">ValidatorList.h:87</a></div></div>
<div class="ttc" id="anamespaceripple_html_a4c908de9e211941a49282147bdc6f076"><div class="ttname"><a href="namespaceripple.html#a4c908de9e211941a49282147bdc6f076">ripple::splitMessage</a></div><div class="ttdeci">std::size_t splitMessage(std::vector&lt; ValidatorList::MessageWithHash &gt; &amp;messages, protocol::TMValidatorListCollection const &amp;largeMsg, std::size_t maxSize, std::size_t begin=0, std::size_t end=0)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00456">ValidatorList.cpp:456</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aed9fb899a5dbc48018f3bdeedb55a110"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aed9fb899a5dbc48018f3bdeedb55a110">ripple::ValidatorList::applyLists</a></div><div class="ttdeci">PublisherListStats applyLists(std::string const &amp;manifest, std::uint32_t version, std::vector&lt; ValidatorBlobInfo &gt; const &amp;blobs, std::string siteUri, std::optional&lt; uint256 &gt; const &amp;hash={})</div><div class="ttdoc">Apply multiple published lists of public keys.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00922">ValidatorList.cpp:922</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherListCollection_html_a1ca30d925811c0634bbaedc04da3881c"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherListCollection.html#a1ca30d925811c0634bbaedc04da3881c">ripple::ValidatorList::PublisherListCollection::rawManifest</a></div><div class="ttdeci">std::string rawManifest</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00220">ValidatorList.h:220</a></div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4a80b785d265b6419ab99251d8f4340a1d">ripple::PublisherStatus::revoked</a></div><div class="ttdeci">@ revoked</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a002fda13878b813249f3fd49e64577fd"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a002fda13878b813249f3fd49e64577fd">ripple::ValidatorList::count</a></div><div class="ttdeci">std::size_t count() const</div><div class="ttdoc">Return the number of configured validator list sites.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01459">ValidatorList.cpp:1459</a></div></div>
<div class="ttc" id="aclassripple_1_1ManifestCache_html_a882c588d2f26d7d61ae3ffe4212cbae0"><div class="ttname"><a href="classripple_1_1ManifestCache.html#a882c588d2f26d7d61ae3ffe4212cbae0">ripple::ManifestCache::applyManifest</a></div><div class="ttdeci">ManifestDisposition applyManifest(Manifest m)</div><div class="ttdoc">Add manifest to cache.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00356">app/misc/impl/Manifest.cpp:356</a></div></div>
<div class="ttc" id="anamespaceripple_html_a3eae95a694e72bfb1b7b5c0e43114975"><div class="ttname"><a href="namespaceripple.html#a3eae95a694e72bfb1b7b5c0e43114975">ripple::strUnHex</a></div><div class="ttdeci">std::optional&lt; Blob &gt; strUnHex(std::size_t strSize, Iterator begin, Iterator end)</div><div class="ttdef"><b>Definition:</b> <a href="StringUtilities_8h_source.html#l00049">StringUtilities.h:49</a></div></div>
<div class="ttc" id="ashared_mutex_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/header/shared_mutex.html">shared_mutex</a></div></div>
<div class="ttc" id="anamespaceripple_html_a1e486c608fa3ad43cc19fc37bb1f425d"><div class="ttname"><a href="namespaceripple.html#a1e486c608fa3ad43cc19fc37bb1f425d">ripple::deserializeManifest</a></div><div class="ttdeci">std::optional&lt; Manifest &gt; deserializeManifest(Slice s)</div><div class="ttdoc">Constructs Manifest from serialized string.</div><div class="ttdef"><b>Definition:</b> <a href="app_2misc_2impl_2Manifest_8cpp_source.html#l00050">app/misc/impl/Manifest.cpp:50</a></div></div>
<div class="ttc" id="aclassbeast_1_1abstract__clock_html_a4e16832b0bdf9392c5138bbbde024d8e"><div class="ttname"><a href="classbeast_1_1abstract__clock.html#a4e16832b0bdf9392c5138bbbde024d8e">beast::abstract_clock&lt; NetClock &gt;::time_point</a></div><div class="ttdeci">typename NetClock ::time_point time_point</div><div class="ttdef"><b>Definition:</b> <a href="abstract__clock_8h_source.html#l00063">abstract_clock.h:63</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_aebd0354cf915b7c82161dca56c5c378b"><div class="ttname"><a href="classripple_1_1ValidatorList.html#aebd0354cf915b7c82161dca56c5c378b">ripple::ValidatorList::publisherLists_</a></div><div class="ttdeci">hash_map&lt; PublicKey, PublisherListCollection &gt; publisherLists_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00237">ValidatorList.h:237</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a727b089f03d260cebfaca07ee4c83059"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a727b089f03d260cebfaca07ee4c83059">ripple::ValidatorList::for_each_available</a></div><div class="ttdeci">void for_each_available(std::function&lt; void(std::string const &amp;manifest, std::uint32_t version, std::map&lt; std::size_t, ValidatorBlobInfo &gt; const &amp;blobInfos, PublicKey const &amp;pubKey, std::size_t maxSequence, uint256 const &amp;hash)&gt; func) const</div><div class="ttdoc">Invokes the callback once for every available publisher list's raw data members.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l01651">ValidatorList.cpp:1651</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a4489b055e951d0923286cffecd9dee46"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a4489b055e951d0923286cffecd9dee46">ripple::ValidatorList::keyListings_</a></div><div class="ttdeci">hash_map&lt; PublicKey, std::size_t &gt; keyListings_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00240">ValidatorList.h:240</a></div></div>
<div class="ttc" id="anamespaceripple_html_a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470"><div class="ttname"><a href="namespaceripple.html#a6eaff79c38106bc3b27326d878c902d3a3e4d891a5df3d6d0d7dd9432a1bc6470">ripple::ListDisposition::accepted</a></div><div class="ttdeci">@ accepted</div><div class="ttdoc">List is valid.</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a2c598bf8d6f6358e1f08eb47df0b49d2"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a2c598bf8d6f6358e1f08eb47df0b49d2">ripple::ValidatorList::quorum_</a></div><div class="ttdeci">std::atomic&lt; std::size_t &gt; quorum_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00233">ValidatorList.h:233</a></div></div>
<div class="ttc" id="aclassbeast_1_1abstract__clock_html_ad024b15fa67696e8d1eba3744e800d32"><div class="ttname"><a href="classbeast_1_1abstract__clock.html#ad024b15fa67696e8d1eba3744e800d32">beast::abstract_clock&lt; NetClock &gt;::duration</a></div><div class="ttdeci">typename NetClock ::duration duration</div><div class="ttdef"><b>Definition:</b> <a href="abstract__clock_8h_source.html#l00062">abstract_clock.h:62</a></div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ae4894ca167b08880bfc35862f18575eb">ripple::PublisherStatus::available</a></div><div class="ttdeci">@ available</div></div>
<div class="ttc" id="anamespaceripple_html_aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e"><div class="ttname"><a href="namespaceripple.html#aaf9d6587e02c610e84a029ad5b5e17b4ac4bfb2a0bab0e91bc7dcfbe3bbec246e">ripple::PublisherStatus::expired</a></div><div class="ttdeci">@ expired</div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_a3728d8811726a5ffb23bcd5c21d235a3"><div class="ttname"><a href="classripple_1_1ValidatorList.html#a3728d8811726a5ffb23bcd5c21d235a3">ripple::ValidatorList::updatePublisherList</a></div><div class="ttdeci">void updatePublisherList(PublicKey const &amp;pubKey, PublisherList const &amp;current, std::vector&lt; PublicKey &gt; const &amp;oldList, lock_guard const &amp;)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00996">ValidatorList.cpp:996</a></div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1MessageWithHash_html_a94fb76dabc20085db29771b4a2d5d952"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1MessageWithHash.html#a94fb76dabc20085db29771b4a2d5d952">ripple::ValidatorList::MessageWithHash::numVLs</a></div><div class="ttdeci">std::size_t numVLs</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00312">ValidatorList.h:312</a></div></div>
<div class="ttc" id="ashared_lock_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/thread/shared_lock.html">std::shared_lock</a></div><div class="ttdoc">STL class.</div></div>
<div class="ttc" id="astructripple_1_1ValidatorList_1_1PublisherList_html"><div class="ttname"><a href="structripple_1_1ValidatorList_1_1PublisherList.html">ripple::ValidatorList::PublisherList</a></div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00174">ValidatorList.h:174</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ad28f57783826e0b090713c89265c81e4"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ad28f57783826e0b090713c89265c81e4">ripple::ValidatorList::quorum</a></div><div class="ttdeci">std::size_t quorum() const</div><div class="ttdoc">Get quorum value for current trusted key set.</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00492">ValidatorList.h:492</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html"><div class="ttname"><a href="classJson_1_1Value.html">Json::Value</a></div><div class="ttdoc">Represents a JSON value.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00145">json_value.h:145</a></div></div>
<div class="ttc" id="anamespaceripple_html_afa0aa10894e600bbb27be9b3be16a4a0"><div class="ttname"><a href="namespaceripple.html#afa0aa10894e600bbb27be9b3be16a4a0">ripple::buildValidatorListMessage</a></div><div class="ttdeci">std::size_t buildValidatorListMessage(std::vector&lt; ValidatorList::MessageWithHash &gt; &amp;messages, std::uint32_t rawVersion, std::string const &amp;rawManifest, ValidatorBlobInfo const &amp;currentBlob, std::size_t maxSize)</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8cpp_source.html#l00540">ValidatorList.cpp:540</a></div></div>
<div class="ttc" id="aclassripple_1_1ValidatorList_html_ac3b9186600dcd1c5326c80af17165741"><div class="ttname"><a href="classripple_1_1ValidatorList.html#ac3b9186600dcd1c5326c80af17165741">ripple::ValidatorList::minimumQuorum_</a></div><div class="ttdeci">std::optional&lt; std::size_t &gt; minimumQuorum_</div><div class="ttdef"><b>Definition:</b> <a href="ValidatorList_8h_source.html#l00234">ValidatorList.h:234</a></div></div>
<div class="ttc" id="aclassripple_1_1Peer_html"><div class="ttname"><a href="classripple_1_1Peer.html">ripple::Peer</a></div><div class="ttdoc">Represents a peer connection in the overlay.</div><div class="ttdef"><b>Definition:</b> <a href="ripple_2overlay_2Peer_8h_source.html#l00045">ripple/overlay/Peer.h:45</a></div></div>
<div class="ttc" id="anext_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/iterator/next.html">std::next</a></div><div class="ttdeci">T next(T... args)</div></div>
<div class="ttc" id="aclassJson_1_1Value_html_ab0d86bf425efefd03513e8dbfaca317b"><div class="ttname"><a href="classJson_1_1Value.html#ab0d86bf425efefd03513e8dbfaca317b">Json::Value::asString</a></div><div class="ttdeci">std::string asString() const</div><div class="ttdoc">Returns the unquoted string value.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8cpp_source.html#l00469">json_value.cpp:469</a></div></div>
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
</body>
</html>