<div dir="ltr"><div style="" class="markdown-here-wrapper"><p style="margin:0px 0px 1.2em!important">Hi All,</p>
<p style="margin:0px 0px 1.2em!important">This email is to introduce a naming style I used in previous project, which I think is elegant and makes the code more friendly to read.<br>I just want to share this style for discussion and if you think it’s better, we may use this style in OpenBMC projects.</p>
<p style="margin:0px 0px 1.2em!important">In recent reviews I see some comments about the problems and debate on C++ class’s members and function parameters.</p>
<p style="margin:0px 0px 1.2em!important">E.g.</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">In generated sdbusplus code, we may happen to use C++’s keywords as class members, such as <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">server::Delete::delete</code>. This is address by <a href="https://gerrit.openbmc-project.xyz/#/c/1481/">https://gerrit.openbmc-project.xyz/#/c/1481/</a></li>
<li style="margin:0.5em 0px">Sometimes we use the same name for a class’s member and function parameter, such as:<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%" class="hljs language-c++"><span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">class</span> Host {
sdbusplus::bus::bus& bus;
Host(sdbusplus::bus::bus& bus, ...)
: bus(bus)
{...}
};
</code></pre>
This is OK, but some reviewers/readers may feel a bit strange on the code.<br>Some one prefer underscores like <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">_bus</code> to resolve this issue, some other may feel <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">bus</code> is just good.</li>
<li style="margin:0.5em 0px">We may want to define a object with the same name as class’s name, such as:<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%" class="hljs language-c++"><span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">class</span> foo {
...
};
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">//foo foo; // This does not compile</span>
foo myFoo; <span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// We'll have to use a different name</span>
</code></pre>
</li>
<li style="margin:0.5em 0px">During reading the code, sometimes it’s hard to find if a variable is a local varialbe, or the class’s member, or a constant, such as:<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%" class="hljs language-c++"><span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">class</span> Host {
std::<span style="color:rgb(0,134,179)" class="hljs-built_in">string</span> somePath;
};
...
<span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">const</span> <span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">char</span>* constPath = <span style="color:rgb(221,17,68)" class="hljs-string">"xxx"</span>;
Host::xxx(<span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">const</span> <span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">char</span>* anotherPath) {
std::<span style="color:rgb(0,134,179)" class="hljs-built_in">string</span> theThirdPath;
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// In this function, how do we tell if xxxPath is a local variable or class's member?</span>
}
</code></pre>
</li>
</ol>
<p style="margin:0px 0px 1.2em!important">The naming style I introduce will address all these “problems”.</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">All classes, structs, enums start with “T”, e.g. <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">TUpperCamelCase</code></li>
<li style="margin:0.5em 0px">All interfaces (with pure virtual functions) starts with “I”, e.g. <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">IUpperCamelCase</code></li>
<li style="margin:0.5em 0px">All members and functions of a class use <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">UpperCamelCase</code></li>
<li style="margin:0.5em 0px">All function parameters and local variables uses <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">lowerCamelCase</code></li>
<li style="margin:0.5em 0px">All const or constexpr uses <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ALL_UPPER_CASE</code>, the same for enum’s values.</li>
</ol>
<p style="margin:0px 0px 1.2em!important"><strong>Note:</strong> All these styles apply to application code, if the code is to provide a library like STL, keep STL style.</p>
<p style="margin:0px 0px 1.2em!important">With the above styles, we can see all the above “problems” are resolved:</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">Because class members are in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">UpperCamelCase</code>, so it will not use C++’s reserved keywords at all;</li>
<li style="margin:0.5em 0px">Because classes are in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">TUpperCamelCase</code>, and parameters are in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">lowerCamelCase</code>, we won’t have same names for class members and function parameters<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%" class="hljs language-c++"><span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">class</span> THost {
sdbusplus::bus::bus& Bus;
THost(sdbusplus::bus::bus& bus, ...)
: Bus(bus)
{...}
};
</code></pre>
</li>
<li style="margin:0.5em 0px">Because classes are in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">TUpperCamelCase</code>, we can always define a variable/member with the name we like:<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%" class="hljs language-c++"><span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">class</span> TFoo {
...
};
TFoo Foo; <span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// OK for class member</span>
TFoo foo; <span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// OK for local variables</span>
</code></pre>
</li>
<li style="margin:0.5em 0px">We can always tell if a variable is a class’s member, or a local variable, or constants, or a function call.<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%" class="hljs language-c++"><span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">class</span> THost {
std::<span style="color:rgb(0,134,179)" class="hljs-built_in">string</span> SomePath;
<span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">enum</span> <span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">class</span> TValue {
ONE,
TWO,
THREE
};
};
...
<span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">const</span> <span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">char</span>* CONST_PATH = <span style="color:rgb(221,17,68)" class="hljs-string">"xxx"</span>;
THost::xxx(<span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">const</span> <span style="color:rgb(51,51,51);font-weight:bold" class="hljs-keyword">char</span>* anotherPath, TFoo* foo) {
std::<span style="color:rgb(0,134,179)" class="hljs-built_in">string</span> theThirdPath;
foo->InvokeMethod();
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// By reading the code (even with header file), we know:</span>
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">//</span>
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// "SomePath" is class's member as THost::SomePath</span>
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// "CONST_PATH" and "ONE/TWO/THREE" are constants</span>
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// *anotherPath* and *theThirdPath* are local variables</span>
<span style="color:rgb(153,153,136);font-style:italic" class="hljs-comment">// "foo->InvokeMethod()" is to call TFoo::InvokeMethod() function</span>
}
</code></pre>
</li>
</ol>
<p style="margin:0px 0px 1.2em!important">I think this style is simple and effective, and it improves readability.<br>What do you think?</p>
<p style="margin:0px 0px 1.2em!important">—<br>BRs,<br>Lei YU</p>
<div title="MDH:PGRpdj48ZGl2PkhpIEFsbCw8YnI+PGJyPlRoaXMgZW1haWwgaXMgdG8gaW50cm9kdWNlIGEgbmFt
aW5nIHN0eWxlIEkgCnVzZWQgaW4gcHJldmlvdXMgcHJvamVjdCwgd2hpY2ggSSB0aGluayBpcyBl
bGVnYW50IGFuZCBtYWtlcyB0aGUgY29kZSAKbW9yZSBmcmllbmRseSB0byByZWFkLjxicj5JIGp1
c3Qgd2FudCB0byBzaGFyZSB0aGlzIHN0eWxlIGZvciBkaXNjdXNzaW9uIGFuZCBpZiB5b3UgdGhp
bmsgaXQncyBiZXR0ZXIsIHdlIG1heSB1c2UgdGhpcyBzdHlsZSBpbiBPcGVuQk1DIHByb2plY3Rz
Ljxicj48YnI+SW4gcmVjZW50IHJldmlld3MgSSBzZWUgc29tZSBjb21tZW50cyBhYm91dCB0aGUg
cHJvYmxlbXMgYW5kIGRlYmF0ZSBvbiBDKysgY2xhc3MncyBtZW1iZXJzIGFuZCBmdW5jdGlvbiBw
YXJhbWV0ZXJzLjxicj48YnI+RS5nLjxicj4xLgogSW4gZ2VuZXJhdGVkIHNkYnVzcGx1cyBjb2Rl
LCB3ZSBtYXkgaGFwcGVuIHRvIHVzZSBDKysncyBrZXl3b3JkcyBhcyAKY2xhc3MgbWVtYmVycywg
c3VjaCBhcyBgc2VydmVyOjpEZWxldGU6OmRlbGV0ZWAuIFRoaXMgaXMgYWRkcmVzcyBieSAKaHR0
cHM6Ly9nZXJyaXQub3BlbmJtYy1wcm9qZWN0Lnh5ei8jL2MvMTQ4MS88YnI+Mi4gU29tZXRpbWVz
IHdlIHVzZSB0aGUgc2FtZSBuYW1lIGZvciBhIGNsYXNzJ3MgbWVtYmVyIGFuZCBmdW5jdGlvbiBw
YXJhbWV0ZXIsIHN1Y2ggYXM6PGJyPiZuYnNwOyZuYnNwOyBgYGBjKys8YnI+Jm5ic3A7Jm5ic3A7
IGNsYXNzIEhvc3Qgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc2RidXNwbHVzOjpidXM6
OmJ1cyZhbXA7IGJ1czs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEhvc3Qoc2RidXNwbHVz
OjpidXM6OmJ1cyZhbXA7IGJ1cywgLi4uKTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsgOiBidXMoYnVzKTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgey4uLn08YnI+Jm5ic3A7
Jm5ic3A7IH07PGJyPiZuYnNwOyZuYnNwOyBgYGA8YnI+Jm5ic3A7Jm5ic3A7IFRoaXMgaXMgT0ss
IGJ1dCBzb21lIHJldmlld2Vycy9yZWFkZXJzIG1heSBmZWVsIGEgYml0IHN0cmFuZ2Ugb24gdGhl
IGNvZGUuPGJyPiZuYnNwOyZuYnNwOyBTb21lIG9uZSBwcmVmZXIgdW5kZXJzY29yZXMgbGlrZSBg
X2J1c2AgdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBzb21lIG90aGVyIG1heSBmZWVsIGBidXNgIGlz
IGp1c3QgZ29vZC48YnI+My4gV2UgbWF5IHdhbnQgdG8gZGVmaW5lIGEgb2JqZWN0IHdpdGggdGhl
IHNhbWUgbmFtZSBhcyBjbGFzcydzIG5hbWUsIHN1Y2ggYXM6PGJyPiZuYnNwOyZuYnNwOyBgYGBj
Kys8YnI+Jm5ic3A7Jm5ic3A7IGNsYXNzIGZvbyB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyAuLi48YnI+Jm5ic3A7Jm5ic3A7IH07PGJyPiZuYnNwOyZuYnNwOyAvL2ZvbyBmb287IC8vIFRo
aXMgZG9lcyBub3QgY29tcGlsZTxicj4mbmJzcDsmbmJzcDsgZm9vIG15Rm9vOyAvLyBXZSdsbCBo
YXZlIHRvIHVzZSBhIGRpZmZlcmVudCBuYW1lPGJyPiZuYnNwOyZuYnNwOyBgYGA8YnI+NC4KIER1
cmluZyByZWFkaW5nIHRoZSBjb2RlLCBzb21ldGltZXMgaXQncyBoYXJkIHRvIGZpbmQgaWYgYSB2
YXJpYWJsZSBpcyBhCiBsb2NhbCB2YXJpYWxiZSwgb3IgdGhlIGNsYXNzJ3MgbWVtYmVyLCBvciBh
IGNvbnN0YW50LCBzdWNoIGFzOjxicj4mbmJzcDsmbmJzcDsgYGBgYysrPGJyPiZuYnNwOyZuYnNw
OyBjbGFzcyBIb3N0IHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHN0ZDo6c3RyaW5nIHNv
bWVQYXRoOzxicj4mbmJzcDsmbmJzcDsgfTs8YnI+Jm5ic3A7Jm5ic3A7IC4uLjxicj4mbmJzcDsm
bmJzcDsgY29uc3QgY2hhciogY29uc3RQYXRoID0gInh4eCI7PGJyPiZuYnNwOyZuYnNwOyBIb3N0
Ojp4eHgoY29uc3QgY2hhciogYW5vdGhlclBhdGgpIHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
c3A7IHN0ZDo6c3RyaW5nIHRoZVRoaXJkUGF0aDs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
IC8vIEluIHRoaXMgZnVuY3Rpb24sIGhvdyBkbyB3ZSB0ZWxsIGlmIHh4eFBhdGggaXMgYSBsb2Nh
bCB2YXJpYWJsZSBvciBjbGFzcydzIG1lbWJlcj88YnI+Jm5ic3A7Jm5ic3A7IH08YnI+Jm5ic3A7
Jm5ic3A7IGBgYDxicj48YnI+VGhlIG5hbWluZyBzdHlsZSBJIGludHJvZHVjZSB3aWxsIGFkZHJl
c3MgYWxsIHRoZXNlICJwcm9ibGVtcyIuPGJyPjEuIEFsbCBjbGFzc2VzLCBzdHJ1Y3RzLCBlbnVt
cyBzdGFydCB3aXRoICJUIiwgZS5nLiBgVFVwcGVyQ2FtZWxDYXNlYDxicj4yLiBBbGwgaW50ZXJm
YWNlcyAod2l0aCBwdXJlIHZpcnR1YWwgZnVuY3Rpb25zKSBzdGFydHMgd2l0aCAiSSIsIGUuZy4g
YElVcHBlckNhbWVsQ2FzZWA8YnI+My4gQWxsIG1lbWJlcnMgYW5kIGZ1bmN0aW9ucyBvZiBhIGNs
YXNzIHVzZSBgVXBwZXJDYW1lbENhc2VgPGJyPjQuIEFsbCBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFu
ZCBsb2NhbCB2YXJpYWJsZXMgdXNlcyBgbG93ZXJDYW1lbENhc2VgPGJyPjUuIEFsbCBjb25zdCBv
ciBjb25zdGV4cHIgdXNlcyBgQUxMX1VQUEVSX0NBU0VgLCB0aGUgc2FtZSBmb3IgZW51bSdzIHZh
bHVlcy48YnI+PGJyPioqTm90ZToqKiBBbGwgdGhlc2Ugc3R5bGVzIGFwcGx5IHRvIGFwcGxpY2F0
aW9uIGNvZGUsIGlmIHRoZSBjb2RlIGlzIHRvIHByb3ZpZGUgYSBsaWJyYXJ5IGxpa2UgU1RMLCBr
ZWVwIFNUTCBzdHlsZS48YnI+PGJyPldpdGggdGhlIGFib3ZlIHN0eWxlcywgd2UgY2FuIHNlZSBh
bGwgdGhlIGFib3ZlICJwcm9ibGVtcyIgYXJlIHJlc29sdmVkOjxicj4xLiBCZWNhdXNlIGNsYXNz
IG1lbWJlcnMgYXJlIGluIGBVcHBlckNhbWVsQ2FzZWAsIHNvIGl0IHdpbGwgbm90IHVzZSBDKysn
cyByZXNlcnZlZCBrZXl3b3JkcyBhdCBhbGw7PGJyPjIuCiBCZWNhdXNlIGNsYXNzZXMgYXJlIGlu
IGBUVXBwZXJDYW1lbENhc2VgLCBhbmQgcGFyYW1ldGVycyBhcmUgaW4gCmBsb3dlckNhbWVsQ2Fz
ZWAsIHdlIHdvbid0IGhhdmUgc2FtZSBuYW1lcyBmb3IgY2xhc3MgbWVtYmVycyBhbmQgCmZ1bmN0
aW9uIHBhcmFtZXRlcnM8YnI+Jm5ic3A7Jm5ic3A7IGBgYGMrKzxicj4mbmJzcDsmbmJzcDsgY2xh
c3MgVEhvc3Qgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc2RidXNwbHVzOjpidXM6OmJ1
cyZhbXA7IEJ1czs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRIb3N0KHNkYnVzcGx1czo6
YnVzOjpidXMmYW1wOyBidXMsIC4uLik8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
IDogQnVzKGJ1cyk8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHsuLi59PGJyPiZuYnNwOyZu
YnNwOyB9Ozxicj4mbmJzcDsmbmJzcDsgYGBgPGJyPjMuIEJlY2F1c2UgY2xhc3NlcyBhcmUgaW4g
YFRVcHBlckNhbWVsQ2FzZWAsIHdlIGNhbiBhbHdheXMgZGVmaW5lIGEgdmFyaWFibGUvbWVtYmVy
IHdpdGggdGhlIG5hbWUgd2UgbGlrZTo8YnI+Jm5ic3A7Jm5ic3A7IGBgYGMrKzxicj4mbmJzcDsm
bmJzcDsgY2xhc3MgVEZvbyB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAuLi48YnI+Jm5i
c3A7Jm5ic3A7IH07PGJyPiZuYnNwOyZuYnNwOyBURm9vIEZvbzsgLy8gT0sgZm9yIGNsYXNzIG1l
bWJlcjxicj4mbmJzcDsmbmJzcDsgVEZvbyBmb287IC8vIE9LIGZvciBsb2NhbCB2YXJpYWJsZXM8
YnI+Jm5ic3A7Jm5ic3A7IGBgYDxicj40LiBXZSBjYW4gYWx3YXlzIHRlbGwgaWYgYSB2YXJpYWJs
ZSBpcyBhIGNsYXNzJ3MgbWVtYmVyLCBvciBhIGxvY2FsIHZhcmlhYmxlLCBvciBjb25zdGFudHMs
IG9yIGEgZnVuY3Rpb24gY2FsbC48YnI+Jm5ic3A7Jm5ic3A7IGBgYGMrKzxicj4mbmJzcDsmbmJz
cDsgY2xhc3MgVEhvc3Qgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3RkOjpzdHJpbmcg
U29tZVBhdGg7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBlbnVtIGNsYXNzIFRWYWx1ZSB7
PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBPTkUsPGJyPiZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBUV08sPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyBUSFJFRTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTs8YnI+
Jm5ic3A7Jm5ic3A7IH07PGJyPiZuYnNwOyZuYnNwOyAuLi48YnI+Jm5ic3A7Jm5ic3A7IGNvbnN0
IGNoYXIqIENPTlNUX1BBVEggPSAieHh4Ijs8YnI+Jm5ic3A7Jm5ic3A7IFRIb3N0Ojp4eHgoY29u
c3QgY2hhciogYW5vdGhlclBhdGgsIFRGb28qIGZvbykgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsgc3RkOjpzdHJpbmcgdGhlVGhpcmRQYXRoOzxicj4mbmJzcDsmbmJzcDsgJm5ic3A7IGZv
by0mZ3Q7SW52b2tlTWV0aG9kKCk7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBCeSBy
ZWFkaW5nIHRoZSBjb2RlIChldmVuIHdpdGggaGVhZGVyIGZpbGUpLCB3ZSBrbm93Ojxicj4mbmJz
cDsmbmJzcDsgJm5ic3A7IC8vPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyAiU29tZVBh
dGgiIGlzIGNsYXNzJ3MgbWVtYmVyIGFzIFRIb3N0OjpTb21lUGF0aDxicj4mbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsgLy8gIkNPTlNUX1BBVEgiIGFuZCAiT05FL1RXTy9USFJFRSIgYXJlIGNvbnN0
YW50czxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gKmFub3RoZXJQYXRoKiBhbmQgKnRo
ZVRoaXJkUGF0aCogYXJlIGxvY2FsIHZhcmlhYmxlczxicj4mbmJzcDsmbmJzcDsgJm5ic3A7IC8v
ICJmb28tJmd0O0ludm9rZU1ldGhvZCgpIiBpcyB0byBjYWxsIFRGb286Okludm9rZU1ldGhvZCgp
IGZ1bmN0aW9uPGJyPiZuYnNwOyZuYnNwOyB9PGJyPiZuYnNwOyZuYnNwOyBgYGA8YnI+PGJyPkkg
dGhpbmsgdGhpcyBzdHlsZSBpcyBzaW1wbGUgYW5kIGVmZmVjdGl2ZSwgYW5kIGl0IGltcHJvdmVz
IHJlYWRhYmlsaXR5Ljxicj5XaGF0IGRvIHlvdSB0aGluaz88YnI+PGJyPi0tPGJyPjwvZGl2PkJS
cyw8YnI+PC9kaXY+TGVpIFlVPGJyPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div></div>