<div dir="ltr">Dylan,<div> Thanks for all your hard work! Will need to test the latest and greatest! Looking forward to RFC soon, after a few more reviews,</div><div>Allen. </div></div><br><div class="gmail_quote"><div dir="ltr">On Sun, Jan 13, 2019 at 11:17 PM Dylan McKay <<a href="mailto:me@dylanmckay.io">me@dylanmckay.io</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-8420659335184423560markdown-here-wrapper"><p style="margin:0px 0px 1.2em">Hello all,</p>
<p style="margin:0px 0px 1.2em">It is a near year and a new LLVM release; 7.0. It has been a while since the last AVR update email, the backend has become much better at handling complex programs.</p>
<p style="margin:0px 0px 1.2em">To that end, this is the first LLVM release than can successfully compile all of upstream Rust’s main compiler support library <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">libcore</code> without error. This was the main blocker in merging the <a href="https://github.com/avr-rust/rust" target="_blank">avr-rust</a> fork upstream.</p>
<p style="margin:0px 0px 1.2em">There have a few been more backend contributors this year, mostly coming from the avr-rust project.</p>
<p style="margin:0px 0px 1.2em">The vast majority of the changes this last year have been related to compilation bugfixes. We have been focusing on improving Rust support, which exposed a number of compilation bugs and C-only assumptions that have now been fixed. The amount of IR correctly accepted by the AVR backend has noticeably increased, including implementation of atomics and things not seen in C such as structs with zero size.</p>
<h1 id="gmail-m_-8420659335184423560frontends-supporting-avr" style="margin:1.3em 0px 1em;padding:0px;font-weight:bold;font-size:1.6em;border-bottom:1px solid rgb(221,221,221)">Frontends supporting AVR</h1>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">clang</li>
<li style="margin:0.5em 0px">Rust</li><ul><li style="margin:0.5em 0px"><a href="https://github.com/avr-rust/" target="_blank">https://github.com/avr-rust/ </a></li><li style="margin:0.5em 0px">The fork has been updated to Rust master, supporting edition 2018</li></ul>
<li style="margin:0.5em 0px">Swift<br><ul><li> <a href="http://swiftforarduino.com/" target="_blank">http://swiftforarduino.com/</a></li></ul></li>
<li style="margin:0.5em 0px">Go<br><ul><li> <a href="https://github.com/aykevl/tinygo" target="_blank">https://github.com/aykevl/tinygo</a></li></ul></li>
</ul>
<h1 id="gmail-m_-8420659335184423560changes" style="margin:1.3em 0px 1em;padding:0px;font-weight:bold;font-size:1.6em;border-bottom:1px solid rgb(221,221,221)">Changes</h1>
<p style="margin:0px 0px 1.2em">Support for functions in nonzero address spaces has landed upstream</p>
<p style="margin:0px 0px 1.2em">Address space 0 is always RAM, address space 1 is always program/flash memory<br>In the past, functions could only be in address space 0, and thus the entire LLVM middlend acted on the unfound assumption that every functon pointer is in RAM… but it still mostly worked<br>Although a function pointer memory address would inherently load from address space 0 - RAM, but with a memory offset into flash memory!</p>
<p style="margin:0px 0px 1.2em">Now functions can be tagged with address spaces even at the textual IR level</p>
<p style="margin:0px 0px 1.2em">A bunch of uninteresting compilation assertion error fixes. Almost all of the changes fall into this category</p>
<p style="margin:0px 0px 1.2em">A few test suite fixes - thanks to several driveby contributors, it’s appreciated!</p>
<p style="margin:0px 0px 1.2em">i128 divisions are now supported via libgcc calls</p>
<h1 id="gmail-m_-8420659335184423560test-suite-stability" style="margin:1.3em 0px 1em;padding:0px;font-weight:bold;font-size:1.6em;border-bottom:1px solid rgb(221,221,221)">Test suite stability</h1>
<p style="margin:0px 0px 1.2em">The AVR backend and it’s test suite status has been decidedly more stable over the last year. In most backend-breaking LLVM changes, the AVR backend is updated at the same time as all the non-experimental backends.</p>
<p style="margin:0px 0px 1.2em">The backend is still marked as experimental, which means that no emails are sent out upon test failure. The AVR buildbot can be found on the staging buildmaster at <a href="http://lab.llvm.org:8014/builders/llvm-avr-linux" target="_blank">http://lab.llvm.org:8014/builders/llvm-avr-linux.
</a></p>
<p style="margin:0px 0px 1.2em">My main priority is integration testing, which needs some work. I’ve got a project that integration tests the backend <a href="https://github.com/dylanmckay/avr-compiler-integration-tests" target="_blank">here</a>, but it cannot actually test LLVM trunk yet until <a href="https://reviews.llvm.org/D54334" target="_blank">D54334</a> ([AVR] Automatically link CRT and libgcc from the system avr-gcc) lands in clang, currently pending code review. The <a href="https://fabricesalvaire.github.io/simavr/doxygen/index.html" target="_blank">simavr</a> emulator has been very helpful here.</p>
<h1 id="gmail-m_-8420659335184423560backend-implementation-maintenance-pain-points" style="margin:1.3em 0px 1em;padding:0px;font-weight:bold;font-size:1.6em;border-bottom:1px solid rgb(221,221,221)">Backend implementation/maintenance pain points</h1>
<p style="margin:0px 0px 1.2em">The major pain points of an embedded processor backend with relatively exotic properties are mostly the same as they were a few years ago. This includes the greedy register allocator, which can sometimes struggle with the extremely constrains sometimes imposed by AVR.</p>
<p style="margin:0px 0px 1.2em">Another pain point is the DAG type legalizer, which currently assumes that arithmetic and logic operations only need to be split down into the smallest legal integer type. The implicit assumption is that hardware instructions are defined for every operation on the smallest legal integer type. The smallest legal integer type on AVR is 16-bit, which may be placed into 8-bit GPR pairs or 16-bit pointer registers. Only a small portion of the instruction set is 16-bit, with ADD, MUL, DIV, AND, OR, COM, etc only being defined on 8-bit general purpose registers. After DAG type legalization, >=32bit operation nodes are turned into multiple 16-bit operations, but instruction selection cannot ever match them because on AVR, most operations need to be split down once more to several 8-bit operations. The AVR workaround is to create a new pseudo instruction with a pattern for every 8-bit operation that operates on 16-bits. The <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">AVRExpandPseudoInsts</code> pass has a couple thousand lines manually expanding high-level 16-bit operations into hardware 8-bit instructions. A lot of complex AVR backend code could be deleted if LLVM had a way to split these operations down to the 8-bit level required.</p>
<h1 id="gmail-m_-8420659335184423560next-year" style="margin:1.3em 0px 1em;padding:0px;font-weight:bold;font-size:1.6em;border-bottom:1px solid rgb(221,221,221)">Next year</h1>
<p style="margin:0px 0px 1.2em">As mentioned above, integration testing is a big priority and will help improve stability of the backend, whilst also increasing confidence in committing future changes. The end goal is to have a constantly-running integration tester that tests every change in LLVM against simulated AVR hardware.</p>
<p style="margin:0px 0px 1.2em">I intend to write an RFC to LLVM-dev about the promotion of the backend from experimental to official in the coming weeks.</p>
<p style="margin:0px 0px 1.2em">Special thanks to all of the helpful contributors that wrote patches, reviewed code, fixed tests, raised issues, discussed problems, and updated the AVR backend at the same time alongside their LLVM API breaking commits ;)</p>
<p style="margin:0px 0px 1.2em">Happy 2019 everybody,<br>Dylan</p>
<div title="MDH:PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0
ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9
Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdiBk
aXI9Imx0ciI+PGRpdj5IZWxsbyBhbGwsPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JdCBpcyBh
IG5lYXIgeWVhciBhbmQgYSBuZXcgTExWTSByZWxlYXNlOyA3LjAuIEl0IGhhcyBiZWVuIGEgd2hp
bGUgc2luY2UgdGhlIGxhc3QgQVZSIHVwZGF0ZSBlbWFpbCwgdGhlIGJhY2tlbmQgaGFzIGJlY29t
ZSBtdWNoIGJldHRlciBhdCBoYW5kbGluZyBjb21wbGV4IHByb2dyYW1zLjwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+VG8gdGhhdCBlbmQsIHRoaXMgaXMgdGhlIGZpcnN0IExMVk0gcmVsZWFzZSB0
aGFuIGNhbiBzdWNjZXNzZnVsbHkgY29tcGlsZSBhbGwgb2YgdXBzdHJlYW0gUnVzdCdzIG1haW4g
Y29tcGlsZXIgc3VwcG9ydCBsaWJyYXJ5IGBsaWJjb3JlYCB3aXRob3V0IGVycm9yLiBUaGlzIHdh
cyB0aGUgbWFpbiBibG9ja2VyIGluIG1lcmdpbmcgdGhlIFthdnItcnVzdF0oPGEgaHJlZj0iaHR0
cHM6Ly9naXRodWIuY29tL2F2ci1ydXN0L3J1c3QiIHRhcmdldD0iX2JsYW5rIiBkYXRhLXNhZmVy
ZWRpcmVjdHVybD0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS91cmw/cT1odHRwczovL2dpdGh1Yi5j
b20vYXZyLXJ1c3QvcnVzdCZhbXA7c291cmNlPWdtYWlsJmFtcDt1c3Q9MTU0NzUzNjQ2NTE2NjAw
MCZhbXA7dXNnPUFGUWpDTkhQNEpidzJHUHU2enZlaEMyRXpFX25hVHVRN2ciPmh0dHBzOi8vZ2l0
aHViLmNvbS88d2JyPmF2ci1ydXN0L3J1c3Q8L2E+KSBmb3JrIHVwc3RyZWFtLjwvZGl2PjxkaXY+
PGJyPjwvZGl2PjxkaXY+VGhlcmUgaGF2ZSBhIGZldyBiZWVuIG1vcmUgYmFja2VuZCBjb250cmli
dXRvcnMgdGhpcyB5ZWFyLCBtb3N0bHkgY29taW5nIGZyb20gdGhlIGF2ci1ydXN0IHByb2plY3Qu
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgY2hhbmdl
cyB0aGlzIGxhc3QgeWVhciBoYXZlIGJlZW4gcmVsYXRlZCB0byBjb21waWxhdGlvbiBidWdmaXhl
cy4gV2UgaGF2ZSBiZWVuIGZvY3VzaW5nIG9uIGltcHJvdmluZyBSdXN0IHN1cHBvcnQsIHdoaWNo
IGV4cG9zZWQgYSBudW1iZXIgb2YgY29tcGlsYXRpb24gYnVncyBhbmQgQy1vbmx5IGFzc3VtcHRp
b25zIHRoYXQgaGF2ZSBub3cgYmVlbiBmaXhlZC4gVGhlIGFtb3VudCBvZiBJUiBjb3JyZWN0bHkg
YWNjZXB0ZWQgYnkgdGhlIEFWUiBiYWNrZW5kIGhhcyBub3RpY2VhYmx5IGluY3JlYXNlZCwgaW5j
bHVkaW5nIGltcGxlbWVudGF0aW9uIG9mIGF0b21pY3MgYW5kIHRoaW5ncyBub3Qgc2VlbiBpbiBD
IHN1Y2ggYXMgc3RydWN0cyB3aXRoIHplcm8gc2l6ZS48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdj4jIEZyb250ZW5kcyBzdXBwb3J0aW5nIEFWUjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
KiBjbGFuZzwvZGl2PjxkaXY+KiBSdXN0PC9kaXY+PGRpdj4mbmJzcDsmbmJzcDsmbmJzcDsgPGEg
aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2F2ci1ydXN0LyIgdGFyZ2V0PSJfYmxhbmsiIGRhdGEt
c2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL3VybD9xPWh0dHBzOi8vZ2l0
aHViLmNvbS9hdnItcnVzdC8mYW1wO3NvdXJjZT1nbWFpbCZhbXA7dXN0PTE1NDc1MzY0NjUxNjYw
MDAmYW1wO3VzZz1BRlFqQ05FNnhpYm9yNDNkYVR1S2d0QmFXWEZhX21DX1h3Ij5odHRwczovL2dp
dGh1Yi5jb20vYXZyLXJ1c3QvPGJyPjwvYT48L2Rpdj48ZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyAq
KiBUaGUgZm9yayBoYXMgYmVlbiB1cGRhdGVkIHRvIFJ1c3QgbWFzdGVyLCBzdXBwb3J0aW5nIGVk
aXRpb24gMjAxODxicj48L2Rpdj48ZGl2PiogU3dpZnQ8L2Rpdj48ZGl2PiZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyAqKjxhIGhyZWY9Imh0dHA6Ly9zd2lmdGZvcmFyZHVpbm8uY29tLyIgdGFyZ2V0
PSJfYmxhbmsiIGRhdGEtc2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL3Vy
bD9xPWh0dHA6Ly9zd2lmdGZvcmFyZHVpbm8uY29tLyZhbXA7c291cmNlPWdtYWlsJmFtcDt1c3Q9
MTU0NzUzNjQ2NTE2NjAwMCZhbXA7dXNnPUFGUWpDTkdqQ3RhcEpyVURnWTFZQ0MtWFdHa0JxWHJ3
bXciPiBodHRwOi8vc3dpZnRmb3JhcmR1aW5vLmNvbS88L2E+PGJyPiogR288L2Rpdj48ZGl2PiZu
YnNwOyAmbmJzcDsmbmJzcDsgKio8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXlrZXZsL3Rp
bnlnbyIgdGFyZ2V0PSJfYmxhbmsiIGRhdGEtc2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5n
b29nbGUuY29tL3VybD9xPWh0dHBzOi8vZ2l0aHViLmNvbS9heWtldmwvdGlueWdvJmFtcDtzb3Vy
Y2U9Z21haWwmYW1wO3VzdD0xNTQ3NTM2NDY1MTY2MDAwJmFtcDt1c2c9QUZRakNORTFhLWRnM2oz
ZC1sRkpJdDlOT2ZHLVp1dkZKUSI+IGh0dHBzOi8vZ2l0aHViLmNvbS9heWtldmwvPHdicj50aW55
Z288L2E+PC9kaXY+PGRpdj48YnI+PC9kaXY+IyBDaGFuZ2VzPGRpdj48dWw+PGxpPlN1cHBvcnQg
Zm9yIGZ1bmN0aW9ucyBpbiBub256ZXJvIGFkZHJlc3Mgc3BhY2VzIGhhcyBsYW5kZWQgdXBzdHJl
YW08L2xpPjx1bD48bGk+QWRkcmVzcyBzcGFjZSAwIGlzIGFsd2F5cyBSQU0sIGFkZHJlc3Mgc3Bh
Y2UgMSBpcyBhbHdheXMgcHJvZ3JhbS9mbGFzaCBtZW1vcnk8L2xpPjxsaT5JbiB0aGUgcGFzdCwg
ZnVuY3Rpb25zIGNvdWxkIG9ubHkgYmUgaW4gYWRkcmVzcyBzcGFjZSAwLCBhbmQgdGh1cyB0aGUg
ZW50aXJlIExMVk0gbWlkZGxlbmQgYWN0ZWQgb24gdGhlIHVuZm91bmQgYXNzdW1wdGlvbiB0aGF0
IGV2ZXJ5IGZ1bmN0b24gcG9pbnRlciBpcyBpbiBSQU0uLi4gYnV0IGl0IHN0aWxsIG1vc3RseSB3
b3JrZWQ8L2xpPjxsaT5BbHRob3VnaCBhIGZ1bmN0aW9uIHBvaW50ZXIgbWVtb3J5IGFkZHJlc3Mg
d291bGQgaW5oZXJlbnRseSBsb2FkIGZyb20gYWRkcmVzcyBzcGFjZSAwIC0gUkFNLCBidXQgd2l0
aCBhIG1lbW9yeSBvZmZzZXQgaW50byBmbGFzaCBtZW1vcnkhPGJyPjwvbGk+PGxpPk5vdyBmdW5j
dGlvbnMgY2FuIGJlIHRhZ2dlZCB3aXRoIGFkZHJlc3Mgc3BhY2VzIGV2ZW4gYXQgdGhlIHRleHR1
YWwgSVIgbGV2ZWw8L2xpPjwvdWw+PGxpPkEgYnVuY2ggb2YgdW5pbnRlcmVzdGluZyBjb21waWxh
dGlvbiBhc3NlcnRpb24gZXJyb3IgZml4ZXMuIEFsbW9zdCBhbGwgb2YgdGhlIGNoYW5nZXMgZmFs
bCBpbnRvIHRoaXMgY2F0ZWdvcnk8YnI+PC9saT48bGk+QSBmZXcgdGVzdCBzdWl0ZSBmaXhlcyAt
IHRoYW5rcyB0byBzZXZlcmFsIGRyaXZlYnkgY29udHJpYnV0b3JzLCBpdCdzIGFwcHJlY2lhdGVk
ITxicj48L2xpPjxsaT5pMTI4IGRpdmlzaW9ucyBhcmUgbm93IHN1cHBvcnRlZCB2aWEgbGliZ2Nj
IGNhbGxzPC9saT48L3VsPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+IyBUZXN0IHN1aXRlIHN0
YWJpbGl0eTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhlIEFWUiBiYWNrZW5kIGFuZCBpdCdz
IHRlc3Qgc3VpdGUgc3RhdHVzIGhhcyBiZWVuIGRlY2lkZWRseSBtb3JlIHN0YWJsZSBvdmVyIHRo
ZSBsYXN0IHllYXIuIEluIG1vc3QgYmFja2VuZC1icmVha2luZyBMTFZNIGNoYW5nZXMsIHRoZSBB
VlIgYmFja2VuZCBpcyB1cGRhdGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgYWxsIHRoZSBub24tZXhw
ZXJpbWVudGFsIGJhY2tlbmRzLjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj5UaGUgYmFja2VuZCBp
cyBzdGlsbCBtYXJrZWQgYXMgZXhwZXJpbWVudGFsLCB3aGljaCBtZWFucyB0aGF0IG5vIGVtYWls
cyBhcmUgc2VudCBvdXQgdXBvbiB0ZXN0IGZhaWx1cmUuIFRoZSBBVlIgYnVpbGRib3QgY2FuIGJl
IGZvdW5kIG9uIHRoZSBzdGFnaW5nIGJ1aWxkbWFzdGVyIGF0IDxhIGhyZWY9Imh0dHA6Ly9sYWIu
bGx2bS5vcmc6ODAxNC9idWlsZGVycy9sbHZtLWF2ci1saW51eCIgdGFyZ2V0PSJfYmxhbmsiIGRh
dGEtc2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL3VybD9xPWh0dHA6Ly9s
YWIubGx2bS5vcmc6ODAxNC9idWlsZGVycy9sbHZtLWF2ci1saW51eCZhbXA7c291cmNlPWdtYWls
JmFtcDt1c3Q9MTU0NzUzNjQ2NTE2NjAwMCZhbXA7dXNnPUFGUWpDTkdRZ2RUU0N6MmpfUGJpWjZX
RFM2NFVnSDc5V0EiPmh0dHA6Ly9sYWIubGx2bS5vcmc6ODAxNC88d2JyPmJ1aWxkZXJzL2xsdm0t
YXZyLWxpbnV4LiA8YnI+PC9hPjwvZGl2PjxkaXYgZGlyPSJsdHIiPjxicj48L2Rpdj48ZGl2Pk15
IG1haW4gcHJpb3JpdHkgaXMgaW50ZWdyYXRpb24gdGVzdGluZywgd2hpY2ggbmVlZHMgc29tZSB3
b3JrLiBJJ3ZlIGdvdCBhIHByb2plY3QgdGhhdCBpbnRlZ3JhdGlvbiB0ZXN0cyB0aGUgYmFja2Vu
ZCBbaGVyZV0oPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2R5bGFubWNrYXkvYXZyLWNvbXBp
bGVyLWludGVncmF0aW9uLXRlc3RzIiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1zYWZlcmVkaXJlY3R1
cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP3E9aHR0cHM6Ly9naXRodWIuY29tL2R5bGFu
bWNrYXkvYXZyLWNvbXBpbGVyLWludGVncmF0aW9uLXRlc3RzJmFtcDtzb3VyY2U9Z21haWwmYW1w
O3VzdD0xNTQ3NTM2NDY1MTY2MDAwJmFtcDt1c2c9QUZRakNOSGo2SFNnTnpaS0Rmd3hXSE41OUR6
UzhISFNYdyI+aHR0cHM6Ly9naXRodWIuY29tLzx3YnI+ZHlsYW5tY2theS9hdnItY29tcGlsZXIt
PHdicj5pbnRlZ3JhdGlvbi10ZXN0czwvYT4pLCBidXQgaXQgY2Fubm90IGFjdHVhbGx5IHRlc3Qg
TExWTSB0cnVuayB5ZXQgdW50aWwgW0Q1NDMzNF0oPGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXdzLmxs
dm0ub3JnL0Q1NDMzNCIgdGFyZ2V0PSJfYmxhbmsiIGRhdGEtc2FmZXJlZGlyZWN0dXJsPSJodHRw
czovL3d3dy5nb29nbGUuY29tL3VybD9xPWh0dHBzOi8vcmV2aWV3cy5sbHZtLm9yZy9ENTQzMzQm
YW1wO3NvdXJjZT1nbWFpbCZhbXA7dXN0PTE1NDc1MzY0NjUxNjYwMDAmYW1wO3VzZz1BRlFqQ05I
RFNHRkVyRHhWSlhsalNMRW5ibUkyVWF2RDVRIj5odHRwczovL3Jldmlld3MubGx2bS48d2JyPm9y
Zy9ENTQzMzQ8L2E+KSAoW0FWUl0gQXV0b21hdGljYWxseSBsaW5rIENSVCBhbmQgbGliZ2NjIGZy
b20gdGhlIHN5c3RlbSBhdnItZ2NjKSBsYW5kcyBpbiBjbGFuZywgY3VycmVudGx5IHBlbmRpbmcg
Y29kZSByZXZpZXcuIFRoZSBbc2ltYXZyXSg8YSBocmVmPSJodHRwczovL2ZhYnJpY2VzYWx2YWly
ZS5naXRodWIuaW8vc2ltYXZyL2RveHlnZW4vaW5kZXguaHRtbCIgdGFyZ2V0PSJfYmxhbmsiIGRh
dGEtc2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUuY29tL3VybD9xPWh0dHBzOi8v
ZmFicmljZXNhbHZhaXJlLmdpdGh1Yi5pby9zaW1hdnIvZG94eWdlbi9pbmRleC5odG1sJmFtcDtz
b3VyY2U9Z21haWwmYW1wO3VzdD0xNTQ3NTM2NDY1MTY2MDAwJmFtcDt1c2c9QUZRakNORkIwdHF1
T1FSUHZ5VGFsOWk4Y0xKc2tFLXhkQSI+aHR0cHM6Ly88d2JyPmZhYnJpY2VzYWx2YWlyZS5naXRo
dWIuaW8vPHdicj5zaW1hdnIvZG94eWdlbi9pbmRleC5odG1sPC9hPikgZW11bGF0b3IgaGFzIGJl
ZW4gdmVyeSBoZWxwZnVsIGhlcmUuPGJyPjwvZGl2PjxkaXYgZGlyPSJsdHIiPjxkaXY+PGJyPjwv
ZGl2PjxkaXY+IyBCYWNrZW5kIGltcGxlbWVudGF0aW9uL21haW50ZW5hbmNlIHBhaW4gcG9pbnRz
PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhlIG1ham9yIHBhaW4gcG9pbnRzIG9mIGFu
IGVtYmVkZGVkIHByb2Nlc3NvciBiYWNrZW5kIHdpdGggcmVsYXRpdmVseSBleG90aWMgcHJvcGVy
dGllcyBhcmUgbW9zdGx5IHRoZSBzYW1lIGFzIHRoZXkgd2VyZSBhIGZldyB5ZWFycyBhZ28uIFRo
aXMgaW5jbHVkZXMgdGhlIGdyZWVkeSByZWdpc3RlciBhbGxvY2F0b3IsIHdoaWNoIGNhbiBzb21l
dGltZXMgc3RydWdnbGUgd2l0aCB0aGUgZXh0cmVtZWx5IGNvbnN0cmFpbnMgc29tZXRpbWVzIGlt
cG9zZWQgYnkgQVZSLjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkFub3RoZXIgcGFpbiBw
b2ludCBpcyB0aGUgREFHIHR5cGUgbGVnYWxpemVyLCB3aGljaCBjdXJyZW50bHkgYXNzdW1lcyB0
aGF0IGFyaXRobWV0aWMgYW5kIGxvZ2ljIG9wZXJhdGlvbnMgb25seSBuZWVkIHRvIGJlIHNwbGl0
IGRvd24gaW50byB0aGUgc21hbGxlc3QgbGVnYWwgaW50ZWdlciB0eXBlLiBUaGUgaW1wbGljaXQg
YXNzdW1wdGlvbiBpcyB0aGF0IGhhcmR3YXJlIGluc3RydWN0aW9ucyBhcmUgZGVmaW5lZCBmb3Ig
ZXZlcnkgb3BlcmF0aW9uIG9uIHRoZSBzbWFsbGVzdCBsZWdhbCBpbnRlZ2VyIHR5cGUuIFRoZSBz
bWFsbGVzdCBsZWdhbCBpbnRlZ2VyIHR5cGUgb24gQVZSIGlzIDE2LWJpdCwgd2hpY2ggbWF5IGJl
IHBsYWNlZCBpbnRvIDgtYml0IEdQUiBwYWlycyBvciAxNi1iaXQgcG9pbnRlciByZWdpc3RlcnMu
IE9ubHkgYSBzbWFsbCBwb3J0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQgaXMgMTYtYml0LCB3
aXRoIEFERCwgTVVMLCBESVYsIEFORCwgT1IsIENPTSwgZXRjIG9ubHkgYmVpbmcgZGVmaW5lZCBv
biA4LWJpdCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLiBBZnRlciBEQUcgdHlwZSBsZWdhbGl6
YXRpb24sICZndDs9MzJiaXQgb3BlcmF0aW9uIG5vZGVzIGFyZSB0dXJuZWQgaW50byBtdWx0aXBs
ZSAxNi1iaXQgb3BlcmF0aW9ucywgYnV0IGluc3RydWN0aW9uIHNlbGVjdGlvbiBjYW5ub3QgZXZl
ciBtYXRjaCB0aGVtIGJlY2F1c2Ugb24gQVZSLCBtb3N0IG9wZXJhdGlvbnMgbmVlZCB0byBiZSBz
cGxpdCBkb3duIG9uY2UgbW9yZSB0byBzZXZlcmFsIDgtYml0IG9wZXJhdGlvbnMuIFRoZSBBVlIg
d29ya2Fyb3VuZCBpcyB0byBjcmVhdGUgYSBuZXcgcHNldWRvIGluc3RydWN0aW9uIHdpdGggYSBw
YXR0ZXJuIGZvciBldmVyeSA4LWJpdCBvcGVyYXRpb24gdGhhdCBvcGVyYXRlcyBvbiAxNi1iaXRz
LiBUaGUgYEFWUkV4cGFuZFBzZXVkb0luc3RzYCBwYXNzIGhhcyBhIGNvdXBsZSB0aG91c2FuZCBs
aW5lcyBtYW51YWxseSBleHBhbmRpbmcgaGlnaC1sZXZlbCAxNi1iaXQgb3BlcmF0aW9ucyBpbnRv
IGhhcmR3YXJlIDgtYml0IGluc3RydWN0aW9ucy4gQSBsb3Qgb2YgY29tcGxleCBBVlIgYmFja2Vu
ZCBjb2RlIGNvdWxkIGJlIGRlbGV0ZWQgaWYgTExWTSBoYWQgYSB3YXkgdG8gc3BsaXQgdGhlc2Ug
b3BlcmF0aW9ucyBkb3duIHRvIHRoZSA4LWJpdCBsZXZlbCByZXF1aXJlZC48L2Rpdj48ZGl2Pjxi
cj48L2Rpdj4jIE5leHQgeWVhcjwvZGl2PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+QXMgbWVu
dGlvbmVkIGFib3ZlLCBpbnRlZ3JhdGlvbiB0ZXN0aW5nIGlzIGEgYmlnIHByaW9yaXR5IGFuZCB3
aWxsIGhlbHAgaW1wcm92ZSBzdGFiaWxpdHkgb2YgdGhlIGJhY2tlbmQsIHdoaWxzdCBhbHNvIGlu
Y3JlYXNpbmcgY29uZmlkZW5jZSBpbiBjb21taXR0aW5nIGZ1dHVyZSBjaGFuZ2VzLiBUaGUgZW5k
IGdvYWwgaXMgdG8gaGF2ZSBhIGNvbnN0YW50bHktcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0ZXIg
dGhhdCB0ZXN0cyBldmVyeSBjaGFuZ2UgaW4gTExWTSBhZ2FpbnN0IHNpbXVsYXRlZCBBVlIgaGFy
ZHdhcmUuPGJyPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgZGlyPSJsdHIiPjxicj48L2Rp
dj48ZGl2PkkgaW50ZW5kIHRvIHdyaXRlIGFuIFJGQyB0byBMTFZNLWRldiBhYm91dCB0aGUgcHJv
bW90aW9uIG9mIHRoZSBiYWNrZW5kIGZyb20gZXhwZXJpbWVudGFsIHRvIG9mZmljaWFsIGluIHRo
ZSBjb21pbmcgd2Vla3MuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5TcGVjaWFsIHRoYW5rcyB0
byBhbGwgb2YgdGhlIGhlbHBmdWwgY29udHJpYnV0b3JzIHRoYXQgd3JvdGUgcGF0Y2hlcywgcmV2
aWV3ZWQgY29kZSwgZml4ZWQgdGVzdHMsIHJhaXNlZCBpc3N1ZXMsIGRpc2N1c3NlZCBwcm9ibGVt
cywgYW5kIHVwZGF0ZWQgdGhlIEFWUiBiYWNrZW5kIGF0IHRoZSBzYW1lIHRpbWUgYWxvbmdzaWRl
IHRoZWlyIExMVk0gQVBJIGJyZWFraW5nIGNvbW1pdHMgOyk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48
ZGl2IGRpcj0ibHRyIj48ZGl2IGRpcj0ibHRyIj48ZGl2IGRpcj0ibHRyIj48ZGl2IGRpcj0ibHRy
Ij48ZGl2IGRpcj0ibHRyIj48ZGl2PkhhcHB5IDIwMTkgZXZlcnlib2R5LDwvZGl2PjxkaXY+RHls
YW48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+
PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+" style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0em;padding:0px;margin:0px"></div></div></div>
</blockquote></div>