<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:CANSoFxseSPsmsbv4gec5-LhLrp49f7TG3gfto39TWsqze-AAVw@mail.gmail.com">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
</div>
<div>Here's a better one. Attr.java line 617 <a href="https://urldefense.com/v3/__https://github.com/openjdk/jdk/blob/master/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java*L617__;Iw!!ACWV5N9M2RV99hQ!Nrp50rInAZLa1ZhfKP2Fy85X9kCKR3tS3qLArQ6AFctCiIvw6Psd7E-IbS4aduRMHcEspgdkvdkxQsk5A-swI5l1UVvDCQ$" moz-do-not-send="true">refers to the instance field
Attr.chk</a> from anonymous inner class <span style="font-family:monospace">RecoveryInfo.Check.NestedCheckContext$1</span>
which is declared in a <span style="font-family:monospace">super()</span> parameter
in the <span style="font-family:monospace">RecoveryInfo()</span>
constructor.</div>
<div><br>
</div>
<div>
<div>If that anonymous inner class had no outer
instances, then wouldn't it be unable to access <span style="font-family:monospace">Attr.this.chk</span> ?
<br>
</div>
</div>
</div>
</div>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">I know that example.
In fact that’s the only example I could find that was similar to
the cases we discussed. The JDK has other 8 class declarations
in a pre-construction context, but they have <em>no available </em>
enclosing instance, because are something like:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" 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); -moz-text-size-adjust: none;"><span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Toplevel</span> </span>{
Toplevel() {
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">this</span>(<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span> Object() { ... });
}
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">So, back to Attr -
turns out that this code (of which I’m not very proud of :-) ),
can be rewritted w/o accessing chk.basicHandler inside the anon
class. In fact, we are passing chk.basicHandler to the anon
constructor, and that value is made available through the
inherited “encl” field. So, if we replace <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;">chk.basicHandler</code>
with <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;">encl</code>,
this class becomes “well-behaved” again. Which suggests a
possible tactic for dealing with issues such as this: the class
that creates the local anon class has access to the outer this,
and can pass them as constructor arguments.</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:CANSoFxseSPsmsbv4gec5-LhLrp49f7TG3gfto39TWsqze-AAVw@mail.gmail.com">
<div dir="ltr">
<div class="gmail_quote">
<div>I want to make sure I'm not misunderstanding your
proposal. When you say "treat all class declarations in
pre-construction context as having no enclosing
instance" I still read the phrase "enclosing instance"
as potentially ambiguous (does that include "2nd
enclosing instance"? Etc.).</div>
<div><br>
</div>
<div>But previously you said: "Wouldn't it be easier to
say that every class declared in a pre-construction
context is static, period, and cannot reference anything
from enclosing contexts?" so I'll assume that's what you
mean.<br>
</div>
</div>
</div>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">Yes, I meant that <em>no
enclosing instance</em> is available from a class declaration
occurring in a pre-construction context. So your #2 below.</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:CANSoFxseSPsmsbv4gec5-LhLrp49f7TG3gfto39TWsqze-AAVw@mail.gmail.com">
<div dir="ltr">
<div class="gmail_quote"><br>
<div>So the two proposals we're talking about for when an
outer class instance expression "Foo.this" is invalid
are:<br>
</div>
<ol>
<li>"Foo.this" is invalid when the expression is
contained in a Foo early construction context (with
any level of nesting) (this is what the JEP proposes)</li>
<li>"Foo.this" is invalid when the expression is
contained in <i>any</i> early construction context
(your proposal?)<br>
</li>
<li>Is there some other hybrid proposal?<br>
</li>
</ol>
</div>
<div>I'm not going to argue that #1 is the best in all
possible worlds, but I think #1 is better than #2, if only
because #2 will cause real-world code out there to start
failing to compile - including javac itself.<br>
</div>
<div><br>
</div>
<br>
</div>
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">I’m not worried much
about the “code out there” which doesn’t really seem to have
taken up on such idioms.</p>
<p style="margin: 0px 0px 1.2em !important;">Thinking more, I
think I can perhaps find an argument in defense of the strategy
of the approach outlined in the current JEP: migrating lambdas
to classes.</p>
<p style="margin: 0px 0px 1.2em !important;">So, back to your
example:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" 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); -moz-text-size-adjust: none;"><span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Outer</span>
<span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">int</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">x</span></span>;
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Inner</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">extends</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Foo</span> </span>{
Inner() {
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span>(<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span> Bar() {
{ Outer.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">this</span>.x++; } <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// allowed???</span>
});
}
}
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Let’s say we write
this using lambdas:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" 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); -moz-text-size-adjust: none;"> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Outer</span>
<span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">int</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">x</span></span>;
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Inner</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">extends</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Foo</span> </span>{
Inner() {
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span>(() -> { ... Outer.<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">this</span>.x++ ... });
});
}
}
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">This is now ok, as
the lambda has access to any enclosing instances that were
available at the time the lambda was created (e.g. Outer.this).
</p>
<p style="margin: 0px 0px 1.2em !important;">So, the best
supporting argument I can find is that, by making the enclosing
instance rules more precise, we can actually support a fuller
migration between lambdas and local/anon classes. Now, such a
migration is still not perfect, as lambdas and local classes
have different meaning of <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;">this</code>
and <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;">return</code>,
so you still just can’t copy and paste code blindly and assume
it will work. But, at least we wouldn’t be adding yet another
asymmetry to the list.</p>
<p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
<div title="MDH:PGJyPjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiIGNpdGU9Im1pZDpDQU5Tb0Z4c2VTUHNtc2J2NGdl
YzUtTGhMcnA0OWY3VEczZ2Z0bzM5VFdzcXplLUFBVndAbWFpbC5nbWFpbC5jb20iPjxkaXYgZGly
PSJsdHIiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2Pjxicj48L2Rpdj48ZGl2PkhlcmUn
cyBhIGJldHRlciBvbmUuIEF0dHIuamF2YSBsaW5lIDYxNyA8YSBocmVmPSJodHRwczovL3VybGRl
ZmVuc2UuY29tL3YzL19faHR0cHM6Ly9naXRodWIuY29tL29wZW5qZGsvamRrL2Jsb2IvbWFzdGVy
L3NyYy9qZGsuY29tcGlsZXIvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAv
QXR0ci5qYXZhKkw2MTdfXztJdyEhQUNXVjVOOU0yUlY5OWhRIU5ycDUwckluQVpMYTFaaGZLUDJG
eTg1WDlrQ0tSM3RTM3FMQXJRNkFGY3RDaUl2dzZQc2Q3RS1JYlM0YWR1Uk1IY0VzcGdka3Zka3hR
c2s1QS1zd0k1bDFVVnZEQ1EkIiBtb3otZG8tbm90LXNlbmQ9InRydWUiPnJlZmVycyB0byB0aGUg
aW5zdGFuY2UgZmllbGQgQXR0ci5jaGs8L2E+IGZyb20gYW5vbnltb3VzIGlubmVyIGNsYXNzIDxz
cGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPlJlY292ZXJ5SW5mby5DaGVjay5OZXN0
ZWRDaGVja0NvbnRleHQkMTwvc3Bhbj4gd2hpY2ggaXMgZGVjbGFyZWQgaW4gYSA8c3BhbiBzdHls
ZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlIj5zdXBlcigpPC9zcGFuPiBwYXJhbWV0ZXIgaW4gdGhl
IDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UiPlJlY292ZXJ5SW5mbygpPC9zcGFu
PiBjb25zdHJ1Y3Rvci48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxkaXY+SWYgdGhhdCBhbm9u
eW1vdXMgaW5uZXIgY2xhc3MgaGFkIG5vIG91dGVyIGluc3RhbmNlcywgdGhlbiB3b3VsZG4ndCBp
dCBiZSB1bmFibGUgdG8gYWNjZXNzIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2Ui
PkF0dHIudGhpcy5jaGs8L3NwYW4+ID8gPGJyPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvYmxv
Y2txdW90ZT48cD5JIGtub3cgdGhhdCBleGFtcGxlLiBJbiBmYWN0IHRoYXQncyB0aGUgb25seSBl
eGFtcGxlIEkgY291bGQgZmluZCB0aGF0IHdhcyBzaW1pbGFyIHRvIHRoZSBjYXNlcyB3ZSBkaXNj
dXNzZWQuIFRoZSBKREsgaGFzIG90aGVyIDggY2xhc3MgZGVjbGFyYXRpb25zIGluIGEgcHJlLWNv
bnN0cnVjdGlvbiBjb250ZXh0LCBidXQgdGhleSBoYXZlIF9ubyBhdmFpbGFibGUgXyBlbmNsb3Np
bmcgaW5zdGFuY2UsIGJlY2F1c2UgYXJlIHNvbWV0aGluZyBsaWtlOjwvcD48cD5gYGBqYXZhPGJy
PmNsYXNzIFRvcGxldmVsIHs8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IFRvcGxldmVsKCkg
ezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsgdGhpcyhuZXcgT2JqZWN0KCkgeyAuLi4gfSk7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyB9PGJyPn08YnI+YGBgPC9wPjxwPlNvLCBiYWNrIHRvIEF0dHIgLSB0dXJucyBvdXQgdGhhdCB0
aGlzIGNvZGUgKG9mIHdoaWNoIEknbSBub3QgdmVyeSBwcm91ZCBvZiA6LSkgKSwgY2FuIGJlIHJl
d3JpdHRlZCB3L28gYWNjZXNzaW5nIGNoay5iYXNpY0hhbmRsZXIgaW5zaWRlIHRoZSBhbm9uIGNs
YXNzLiBJbiBmYWN0LCB3ZSBhcmUgcGFzc2luZyBjaGsuYmFzaWNIYW5kbGVyIHRvIHRoZSBhbm9u
IGNvbnN0cnVjdG9yLCBhbmQgdGhhdCB2YWx1ZSBpcyBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRo
ZSBpbmhlcml0ZWQgImVuY2wiIGZpZWxkLiBTbywgaWYgd2UgcmVwbGFjZSBgY2hrLmJhc2ljSGFu
ZGxlcmAgd2l0aCBgZW5jbGAsIHRoaXMgY2xhc3MgYmVjb21lcyAid2VsbC1iZWhhdmVkIiBhZ2Fp
bi4gV2hpY2ggc3VnZ2VzdHMgYSBwb3NzaWJsZSB0YWN0aWMgZm9yIGRlYWxpbmcgd2l0aCBpc3N1
ZXMgc3VjaCBhcyB0aGlzOiB0aGUgY2xhc3MgdGhhdCBjcmVhdGVzIHRoZSBsb2NhbCBhbm9uIGNs
YXNzIGhhcyBhY2Nlc3MgdG8gdGhlIG91dGVyIHRoaXMsIGFuZCBjYW4gcGFzcyB0aGVtIGFzIGNv
bnN0cnVjdG9yIGFyZ3VtZW50cy48YnI+PC9wPjxicj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBj
aXRlPSJtaWQ6Q0FOU29GeHNlU1BzbXNidjRnZWM1LUxoTHJwNDlmN1RHM2dmdG8zOVRXc3F6ZS1B
QVZ3QG1haWwuZ21haWwuY29tIj48ZGl2IGRpcj0ibHRyIj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90
ZSI+PGRpdj5JIHdhbnQgdG8gbWFrZSBzdXJlIEknbSBub3QgbWlzdW5kZXJzdGFuZGluZyB5b3Vy
IHByb3Bvc2FsLiZuYnNwOyBXaGVuIHlvdSBzYXkgInRyZWF0IGFsbCBjbGFzcyBkZWNsYXJhdGlv
bnMgaW4gcHJlLWNvbnN0cnVjdGlvbiAKY29udGV4dCBhcyBoYXZpbmcgbm8gZW5jbG9zaW5nIGlu
c3RhbmNlIiBJIHN0aWxsIHJlYWQgdGhlIHBocmFzZSAKImVuY2xvc2luZyBpbnN0YW5jZSIgYXMg
cG90ZW50aWFsbHkgYW1iaWd1b3VzIChkb2VzIHRoYXQgaW5jbHVkZSAiMm5kIAplbmNsb3Npbmcg
aW5zdGFuY2UiPyBFdGMuKS48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkJ1dCBwcmV2aW91c2x5
IHlvdSBzYWlkOiAiV291bGRuJ3QgaXQgYmUgZWFzaWVyIHRvIHNheSB0aGF0IGV2ZXJ5IGNsYXNz
IGRlY2xhcmVkIGluIGEKICAgICAgcHJlLWNvbnN0cnVjdGlvbiBjb250ZXh0IGlzIHN0YXRpYywg
cGVyaW9kLCBhbmQgY2Fubm90IHJlZmVyZW5jZQogICAgICBhbnl0aGluZyBmcm9tIGVuY2xvc2lu
ZyBjb250ZXh0cz8iIHNvIEknbGwgYXNzdW1lIHRoYXQncyB3aGF0IHlvdSBtZWFuLjxicj48L2Rp
dj48L2Rpdj48L2Rpdj48L2Jsb2NrcXVvdGU+WWVzLCBJIG1lYW50IHRoYXQgX25vIGVuY2xvc2lu
ZyBpbnN0YW5jZV8gaXMgYXZhaWxhYmxlIGZyb20gYSBjbGFzcyBkZWNsYXJhdGlvbiBvY2N1cnJp
bmcgaW4gYSBwcmUtY29uc3RydWN0aW9uIGNvbnRleHQuIFNvIHlvdXIgIzIgYmVsb3cuPGJyPjxi
bG9ja3F1b3RlIHR5cGU9ImNpdGUiIGNpdGU9Im1pZDpDQU5Tb0Z4c2VTUHNtc2J2NGdlYzUtTGhM
cnA0OWY3VEczZ2Z0bzM5VFdzcXplLUFBVndAbWFpbC5nbWFpbC5jb20iPjxkaXYgZGlyPSJsdHIi
PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48YnI+PGRpdj5TbyB0aGUgdHdvIHByb3Bvc2FscyB3
ZSdyZSB0YWxraW5nIGFib3V0IGZvciB3aGVuIGFuIG91dGVyIGNsYXNzIGluc3RhbmNlIGV4cHJl
c3Npb24gIkZvby50aGlzIiBpcyBpbnZhbGlkIGFyZTo8YnI+PC9kaXY+PG9sPjxsaT4iRm9vLnRo
aXMiIGlzIGludmFsaWQgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBjb250YWluZWQgaW4gYSBGb28g
ZWFybHkgY29uc3RydWN0aW9uIGNvbnRleHQgKHdpdGggYW55IGxldmVsIG9mIG5lc3RpbmcpICh0
aGlzIGlzIHdoYXQgdGhlIEpFUCBwcm9wb3Nlcyk8L2xpPjxsaT4iRm9vLnRoaXMiIGlzIGludmFs
aWQgd2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBjb250YWluZWQgaW4gPGk+YW55PC9pPiBlYXJseSBj
b25zdHJ1Y3Rpb24gY29udGV4dCAoeW91ciBwcm9wb3NhbD8pPGJyPjwvbGk+PGxpPklzIHRoZXJl
IHNvbWUgb3RoZXIgaHlicmlkIHByb3Bvc2FsPzxicj48L2xpPjwvb2w+PC9kaXY+PGRpdj5JJ20g
bm90IGdvaW5nIHRvIGFyZ3VlIHRoYXQgIzEgaXMgdGhlIGJlc3QgaW4gYWxsIHBvc3NpYmxlIHdv
cmxkcywgYnV0IEkgdGhpbmsgIzEgaXMgYmV0dGVyIHRoYW4gIzIsIGlmIG9ubHkgYmVjYXVzZSAj
MiB3aWxsIGNhdXNlIHJlYWwtd29ybGQgY29kZSBvdXQgdGhlcmUgdG8gc3RhcnQgZmFpbGluZyB0
byBjb21waWxlIC0gaW5jbHVkaW5nIGphdmFjIGl0c2VsZi48YnI+PC9kaXY+PGRpdj48YnI+PC9k
aXY+PGJyPjwvZGl2PjwvYmxvY2txdW90ZT48cD5JJ20gbm90IHdvcnJpZWQgbXVjaCBhYm91dCB0
aGUgImNvZGUgb3V0IHRoZXJlIiB3aGljaCBkb2Vzbid0IHJlYWxseSBzZWVtIHRvIGhhdmUgdGFr
ZW4gdXAgb24gc3VjaCBpZGlvbXMuPC9wPjxwPlRoaW5raW5nIG1vcmUsIEkgdGhpbmsgSSBjYW4g
cGVyaGFwcyBmaW5kIGFuIGFyZ3VtZW50IGluIGRlZmVuc2Ugb2YgdGhlIHN0cmF0ZWd5IG9mIHRo
ZSBhcHByb2FjaCBvdXRsaW5lZCBpbiB0aGUgY3VycmVudCBKRVA6IG1pZ3JhdGluZyBsYW1iZGFz
IHRvIGNsYXNzZXMuPC9wPjxwPlNvLCBiYWNrIHRvIHlvdXIgZXhhbXBsZTo8YnI+PC9wPjxwPmBg
YGphdmE8YnI+Y2xhc3MgT3V0ZXI8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IGludCB4Ozxicj4mbmJz
cDsmbmJzcDsmbmJzcDsgY2xhc3MgSW5uZXIgZXh0ZW5kcyBGb28gezxicj4mbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSW5uZXIoKSB7PGJyPiZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzdXBl
cihuZXcgQmFyKCkgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgeyBPdXRl
ci50aGlzLngrKzsgfSZuYnNwOyZuYnNwOyAvLyBhbGxvd2VkPz8/PGJyPiZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9KTs8
YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+Jm5ic3A7
Jm5ic3A7Jm5ic3A7IH08YnI+fTxicj5gYGA8L3A+PHA+TGV0J3Mgc2F5IHdlIHdyaXRlIHRoaXMg
dXNpbmcgbGFtYmRhczo8L3A+PHA+YGBgamF2YTxicj4KY2xhc3MgT3V0ZXI8YnI+CiZuYnNwOyZu
YnNwOyZuYnNwOyBpbnQgeDs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBjbGFzcyBJbm5lciBleHRl
bmRzIEZvbyB7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg
SW5uZXIoKSB7PGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3VwZXIoKCkgLSZndDsgeyAuLi4gT3V0ZXIudGhpcy54
KysgLi4uIH0pOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0pOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPgp9PGJyPgpg
YGA8L3A+CjxwPlRoaXMgaXMgbm93IG9rLCBhcyB0aGUgbGFtYmRhIGhhcyBhY2Nlc3MgdG8gYW55
IGVuY2xvc2luZyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUg
bGFtYmRhIHdhcyBjcmVhdGVkIChlLmcuIE91dGVyLnRoaXMpLiA8YnI+PC9wPjxwPjwvcD48cD5T
bywgdGhlIGJlc3Qgc3VwcG9ydGluZyBhcmd1bWVudCBJIGNhbiBmaW5kIGlzIHRoYXQsIGJ5IG1h
a2luZyB0aGUgZW5jbG9zaW5nIGluc3RhbmNlIHJ1bGVzIG1vcmUgcHJlY2lzZSwgd2UgY2FuIGFj
dHVhbGx5IHN1cHBvcnQgYSBmdWxsZXIgbWlncmF0aW9uIGJldHdlZW4gbGFtYmRhcyBhbmQgbG9j
YWwvYW5vbiBjbGFzc2VzLiBOb3csIHN1Y2ggYSBtaWdyYXRpb24gaXMgc3RpbGwgbm90IHBlcmZl
Y3QsIGFzIGxhbWJkYXMgYW5kIGxvY2FsIGNsYXNzZXMgaGF2ZSBkaWZmZXJlbnQgbWVhbmluZyBv
ZiBgdGhpc2AgYW5kIGByZXR1cm5gLCBzbyB5b3Ugc3RpbGwganVzdCBjYW4ndCBjb3B5IGFuZCBw
YXN0ZSBjb2RlIGJsaW5kbHkgYW5kIGFzc3VtZSBpdCB3aWxsIHdvcmsuIEJ1dCwgYXQgbGVhc3Qg
d2Ugd291bGRuJ3QgYmUgYWRkaW5nIHlldCBhbm90aGVyIGFzeW1tZXRyeSB0byB0aGUgbGlzdC48
L3A+PHA+TWF1cml6aW88YnI+PC9wPjxwPjxicj48L3A+PHA+PGJyPjwvcD4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>