<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="" markdown-here-wrapper-content-modified="true">
<p style="margin: 0px 0px 1.2em !important;">This mail summarizes
some discussions we’ve been having about eliminating Q
descriptors from the VM design. Over time, we’ve been giving Q
fewer and fewer jobs to do, to the point where (perhaps
surprisingly) we can replace the remaining jobs with less
intrusive mechanisms. Additionally, as the language model has
simplified, the gap between the language and VM has increased,
and the proposal herein offers a path to narrowing that gap. <br>
</p>
<p style="margin: 0px 0px 1.2em !important;">I’ll be on vacation
for a while, but Dan and John will be able to carry forward this
discussion. </p>
<p style="margin: 0px 0px 1.2em !important;">Please bear in mind
that this is a very rough draft of direction; we don’t need to
bikeshed anything right now, as much as agree that there is a
better, simpler, more aligned direction than we had previously.
</p>
<h1 id="we-don-t-need-no-stinkin-q-types" style="margin: 1.3em 0px
1em; padding: 0px; font-weight: bold;font-size: 1.6em;
border-bottom: 1px solid rgb(221, 221, 221);">We don’t need no
stinkin’ Q types</h1>
<p style="margin: 0px 0px 1.2em !important;">In the last six
months, we made a significant breakthrough at the language/user<br>
level — to decompose B3 with its value and reference companions,
into two<br>
simpler concepts: implicit constructibility (a declaration-site
property) and<br>
null restriction (a use-site property.) The .ref/.val
distinction, and all its<br>
excess complexity, stemmed from the mistaken desire to model the
int/Integer<br>
divide directly. By breaking B3-ness down into more “primitive”
properties<br>
(some of which are shared with non-B3 classes), we arrived at a
simpler model;<br>
no more ref/val projections, and more uniform treatment of X!
(including for B1<br>
and B2 classes). </p>
<p style="margin: 0px 0px 1.2em !important;">As we worked through
the language and translation details, we continued to seek<br>
a lower energy state. We concluded that we can erase <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;">X!</code>
to <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;">LX;</code>
in a number<br>
of places (locals, method descriptors, verifier type system)
while still meeting<br>
our performance objectives. Doing so eliminates a number of
issues with method<br>
resolution and distinguishing overloads from overrides. In fact,
we found<br>
ourselves using Q for fewer and fewer things, at which point we
started to ask<br>
ourselves: do we need Q descriptors at all? </p>
<p style="margin: 0px 0px 1.2em !important;">In our VM, there is a
(mostly) 1-1-1 correspondence between runtime types,<br>
descriptors, and class mirrors. In a world where QFoo and LFoo
are separate<br>
runtime types, it makes sense for them to have their own
descriptors and<br>
mirrors. But 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;">Foo!</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;">Foo?</code>
have come together in the language, mapping<br>
to a VM which seems them as separate runtime types starts to
show gaps. </p>
<p style="margin: 0px 0px 1.2em !important;">The role of Q has
historically been one of “other”, rather than something on its<br>
own; any class which had a Q type, also had an L type, and Q was
the “other<br>
flavor.” The “two flavors” orientation made sense when we were
modeling the<br>
int/Integer split; we needed two flavors for that in both
language and VM. The<br>
language since discovered that we can break down the int/Integer
divide into two<br>
more primitive notions — implicit constructibility (an int can
be used without<br>
calling a constructor, an Integer cannot) and non-nullity
(non-identity plus<br>
default constructibility plus non-nullity unlocks flattening.) </p>
<p style="margin: 0px 0px 1.2em !important;">If Q is a valid
descriptor and there is always a Q mirror, we are in a stable<br>
place with respect to runtime types. But if we intend to allow <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;">m(Foo!)</code>
to<br>
override <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;">m(Foo?)</code>,
to be tolerant of bang-mismatches in method resolution, and<br>
give Q fewer jobs, then we are moving to an unstable place.
We’ve explored a<br>
number of “only use Q for certain things” positions, and have
found many of them<br>
to be unstable in various ways. The other stable point is that
there are no Q<br>
types, and no Q mirrors — but then we need some new channel to
encode the<br>
request to exclude null, and so give the VM the flattening hint
that is needed.</p>
<p style="margin: 0px 0px 1.2em !important;">As it turns out,
there are surprisingly few places that truly need such a new<br>
channel. We basically need the VM to take “Q-ness” into account
in three<br>
places:</p>
<ul style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;">Field layout — a field of type <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;">Foo!</code>
(where Foo is implicitly<br>
constructible) needs a hint that this field is
null-restricted, so we can lay<br>
it out flat. </li>
<li style="margin: 0.5em 0px;">Array layout — at the point 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;">anewarray</code>
and friends, we need a hint when<br>
the component type is an implicitly-constructible,
null-restricted type.</li>
<li style="margin: 0.5em 0px;">Casting — casts need to be able
to express a value-set check for the<br>
restricted value set 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;">Foo!</code>
as well as the unrestricted value set of<br>
<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;">Foo</code>.
</li>
</ul>
<p style="margin: 0px 0px 1.2em !important;">We are convinced that
these three are all that is truly required to get the<br>
flattening we want. So rather than invent new runtime types /
mirrors /<br>
descriptors that are going to flow everywhere (into reflection,
method handles,<br>
verification, etc), let’s invent the minimal additional
classfile surface and VM<br>
model to model that. At the same time, let’s make sure that the
new thing<br>
aligns with the new language model, where the star of the show
is<br>
null-restricted types. </p>
<h4 id="what-about-species-" style="margin: 1.3em 0px 1em;
padding: 0px; font-weight: bold;font-size: 1.2em;">What about
species?</h4>
<p style="margin: 0px 0px 1.2em !important;">In separate
investigations, we have a notion of “species” for a long time,
which<br>
we know we’re going to need when we get to specialization.
Species form a<br>
partition of a classes instances; every instance of a class
belongs to exactly<br>
one species, and different species may have different layouts
and value set<br>
restrictions. And we struggled with species for a long time over
the same<br>
runtime type affordances (mirrors and descriptors) — what does a
field<br>
descriptor for a field of type <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;">ArrayList<int></code>
look like? What does <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;">getClass</code><br>
return? </p>
<p style="margin: 0px 0px 1.2em !important;">In both cases, the
constraints of compatibility have been pushing us towards<br>
more erasure in descriptors and reflection, with side channels
to reconstruct<br>
information necessary for optimized heap layout, and with
separate API points<br>
for <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;">getClass</code>
vs <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;">getSpecies</code>.
While specialization is considerably more<br>
complicated, nearly all the same considerations (descriptors,
mirrors,<br>
reflection) are present for null-restriction types. We took an
earlier swing at<br>
unifying the two under the rubric of “type restrictions”, but I
think our model<br>
wasn’t quite clean enough at the time to admit this unification.
But I think we<br>
are now (almost) there, and the payoff is big. </p>
<p style="margin: 0px 0px 1.2em !important;">What we concluded
around species and specialization is that we would have to<br>
continue to erase descriptors (<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;">ArrayList<int></code>
as a method or field descriptor<br>
continues to erase to <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;">LArrayList;</code>),
that <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;">getClass</code>
returns the primary mirror<br>
(<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;">ArrayList</code>),
and that species information is pushed into a side channel.<br>
These are pretty much the exact same considerations as for
null-restriction<br>
types. </p>
<h4 id="species-and-bang-types-are-_refinement-types_" style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
bold;font-size: 1.2em;">Species and bang types are <em>refinement
types</em></h4>
<p style="margin: 0px 0px 1.2em !important;">A <em>refinement
type</em> is a type whose value set is that of another type,
plus a<br>
predicate restricting the value set. A “bang” type <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;">Point!</code>
is a refinement of<br>
Point, where we eliminate the value <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;">null</code>.
(Other well-known refinement types<br>
from PL history include C enums and Pascal ranges.) Refinement
types are often<br>
erased to their base type, but some refinements enable better
layout. Indeed,<br>
our interest in Q types is flattening, and for an implicitly
constructible<br>
class, a variable holding a null-excluding type can be
flattened. Similarly,<br>
for a sufficiently constrained generic type (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;">Point[int,int]</code>),
the layout<br>
of such a variable can be flattened as well. </p>
<p style="margin: 0px 0px 1.2em !important;">What we previously
called “type restrictions” in the <a href="https://github.com/openjdk/valhalla-docs/blob/main/site/design-notes/parametric-vm/parametric-vm.md#type-restricted-methods-and-fields-and-the-typerestriction-attribute">Parametric<br>
VM</a><br>
document is in fact a refinement type. We claim that we can
design the<br>
null-restriction channel in such a way that it can be extended,
in some<br>
reasonable way, to support more general specialization.</p>
<p style="margin: 0px 0px 1.2em !important;">Both specialization,
and null-restriction, are forms of refinement types. Given<br>
that we’ve already discovered that we need to erase these to
their primary (L)<br>
type in a lot of places, let’s stake out some general principles
for<br>
representing refinements in the VM:</p>
<ul style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;">Refinement types are erased to
their base type in method and field<br>
descriptors. </li>
<li style="margin: 0.5em 0px;">Refinement types do not have <em>class</em>
mirrors. </li>
<li style="margin: 0.5em 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;">Object::getClass</code>
returns a class mirror. </li>
<li style="margin: 0.5em 0px;">Reflection deals in class
mirrors, so refinements are erased from base<br>
reflection. </li>
<li style="margin: 0.5em 0px;">Method handles deal in class
mirrors, so refinements are erased from method<br>
handles. </li>
</ul>
<p style="margin: 0px 0px 1.2em !important;">That’s a lot of
erasure, so we have to bake refinement back in where it matters,<br>
but we want to be careful to limit the “blast radius” of the
refinement<br>
information to where it does actually matter. The new channel
that encodes a<br>
refinement type will appear only when needed to carry out the
tasks listed<br>
above: field declaration, array creation, and casting. </p>
<ul style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;">Fields are enhanced with some
sort of “refinement” attribute, which (a)<br>
guards against stores of bad values (the field equivalent of<br>
<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;">ArrayStoreException</code>)
and (b) enables flatter layouts when the refinement<br>
permits. </li>
<li style="margin: 0.5em 0px;">Array creation (<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;">anewarray</code>
/ `multianewarray’) is enhanced to support<br>
creating arrays with refined component types, enabling the
same benefits<br>
(storage safety / layout flattening.)</li>
<li style="margin: 0.5em 0px;">Casting is enhanced to support
refinements. This is needed mostly because of<br>
erasure — we are erasing away refinement information and
sometimes need to<br>
reassert it. </li>
<li style="margin: 0.5em 0px;">When we get to specialization, <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;">new</code>
is enhanced to support refinements, and<br>
possibly method declarations (to enable calling convention
optimization in<br>
the presence of highly specialized types 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;">Point[int,int]</code>.)</li>
</ul>
<p style="margin: 0px 0px 1.2em !important;">We had previously
been assuming that <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;">[QPoint</code>
is somehow more of a “real” type<br>
than (specialized) <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;">Point[int,int]</code>,
but I think we are better served seeing<br>
them both as refinements, where we continue to report a broad
type but<br>
sort-of-secretly use refinement information to optimize layout.</p>
<h2 id="a-strawman" style="margin: 1.3em 0px 1em; padding: 0px;
font-weight: bold;font-size: 1.4em; border-bottom: 1px solid
rgb(238, 238, 238);">A strawman</h2>
<p style="margin: 0px 0px 1.2em !important;">What follows is a
strawman that eliminates Qs completely, replacing the few jobs<br>
Q has (field layout, array layout, and casts) with a single
mechanism for<br>
refinement types which stays in the background until explicitly
summoned. We<br>
believe the model outlined here can extend cleanly to species,
as well 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;">B1!</code><br>
types 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;">String!</code>
as well. Call this No-Q world. This should not be taken<br>
as a concrete proposal, as much as a sketch of the concepts and
the players. </p>
<p style="margin: 0px 0px 1.2em !important;">We have come to
believe that adding Q descriptors to the JVM specification,<br>
while perhaps the right move in a from-scratch VM design, would
be overreach as<br>
an evolutionary step. For old APIs to adopt new descriptors will
require many<br>
bridge methods with complex properties. To avoid such bridges,
old APIs would<br>
be forbidden from mentioning the new types. For these reasons,
new descriptors,<br>
and the mirrors that would accompany them, are quite literally a
bridge too far.<br>
Accordingly, in No-Q world, descriptors reclaim their former
role: describing<br>
primitives and classes. Field and method descriptors will 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;">L</code>
descriptors,<br>
even when carrying a null-restricted value (or a species.)
Similarly, class<br>
mirrors return to their former role: describing classfiles and
non-refined<br>
VM-derived types (such as array types.) </p>
<p style="margin: 0px 0px 1.2em !important;">As a self-imposed
rule of this essay, we will not appeal to runtime support,<br>
condy or indy. Everything will be done with bytecodes,
descriptors, constant<br>
pool entries, and other classfile structures, and not via
specially-known<br>
methods. As this is a strawman, we may indulge in some
“wasteful” design, which<br>
can be transformed or lumped in later iterations. The new
elements of the<br>
design are:</p>
<ul style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;">A new reflective concept for <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;">RefinementType</code>,
which represents a refinement<br>
of an existing (class) type. </li>
<li style="margin: 0.5em 0px;">A new reflective concept for <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;">RepresentableType</code>,
which is the common<br>
supertype between <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;">Class</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;">RefinementType</code>.
</li>
<li style="margin: 0.5em 0px;">New constant pool forms
representing null-restriction of classes and of<br>
arrays. </li>
<li style="margin: 0.5em 0px;">A new field attribute called <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;">FieldRefinement</code>.
</li>
<li style="margin: 0.5em 0px;">Adjustments to various bytecodes
to interact with the new constant pool<br>
forms. </li>
<li style="margin: 0.5em 0px;">Additions to reflective APIs.</li>
</ul>
<h2 id="refined-types" style="margin: 1.3em 0px 1em; padding: 0px;
font-weight: bold;font-size: 1.4em; border-bottom: 1px solid
rgb(238, 238, 238);">Refined types</h2>
<p style="margin: 0px 0px 1.2em !important;">A refined type is a
combination of a type (called the base type) and a value set<br>
restriction for that type which excludes some values in the
value set of the<br>
base type. Null-restricted types, arrays of null-restricted
types, and<br>
eventually, species of generics are refined types. </p>
<p style="margin: 0px 0px 1.2em !important;">Refined types can be
represented by a reflective object</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 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;">sealed interface RefinementType<T> implements RepresentableType<T> {
RepresentableType<T> baseType();
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">The type parameter <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;">T</code>
represents the base type. </p>
<p style="margin: 0px 0px 1.2em !important;">There are initially
two implementations 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;">RefinementType</code>,
which may be private,<br>
and are known to the VM:</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 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;">private record NullRestrictedClass<T>(Class<T> baseType)
implements RefinementType<T> { }
private record NullRestrictedArray<T extends Object[]>(Class<T> baseType)
implements RefinementType<T> { }
</code></pre>
<h4 id="constant-pool-entries" style="margin: 1.3em 0px 1em;
padding: 0px; font-weight: bold;font-size: 1.2em;">Constant pool
entries</h4>
<p style="margin: 0px 0px 1.2em !important;">The two jobs for null
restriction must be representable in the constant pool: a<br>
null-restricted B3, and an array of a null-restricted B3. (These
correspond to<br>
<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;">Constant_Class_info</code>
with a descriptor 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;">QFoo;</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;">[QFoo;</code>
in the<br>
traditional design.) In addition to being referenced by
bytecodes and<br>
attributes, such constants should ideally be loadable,
evaluating to a<br>
<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;">RefinementType</code>
or <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;">RepresentableType</code>.
</p>
<p style="margin: 0px 0px 1.2em !important;">The exact form of the
constant pool entry (whether new bespoke constant pool<br>
entries, ad-hoc extensions to Constant_Class_info, or condy) can
be bikeshod at<br>
the appropriate time; there are clearly tradeoffs here. </p>
<p style="margin: 0px 0px 1.2em !important;">Initially,
null-restricted types must be implicitly constructible (B3),
which<br>
would be checked when the constant is resolved. Eventually, we
can relax<br>
null-restriction to support all class types. Similarly, we may
initially<br>
restrict to one-dimensional flat arrays, and leave <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;">multianewarray</code>
to its old<br>
job.</p>
<h4 id="representable-types" style="margin: 1.3em 0px 1em;
padding: 0px; font-weight: bold;font-size: 1.2em;">Representable
types</h4>
<p style="margin: 0px 0px 1.2em !important;">The new common
superinterface between <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;">Class</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;">RefinementType</code>
exists so that<br>
both classes and class refinements can be used as array
components, type<br>
parameters for specializations, etc. Some operations from <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;">Class</code>,
such as<br>
casting, may be pulled up into this interface.</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 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;">sealed interface RepresentableType<T> {
T cast(Object o) throws ClassCastException;
...
}
</code></pre>
<h4 id="refined-fields" style="margin: 1.3em 0px 1em; padding:
0px; font-weight: bold;font-size: 1.2em;">Refined fields</h4>
<p style="margin: 0px 0px 1.2em !important;">Any field whose type
is a null-restricted implicitly constructible class may be<br>
considered by the VM as a candidate for flattening. Rather than
using<br>
<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;">field_info.descriptor_index</code>
to encode a null-restricted type, we continue to<br>
erase to the traditional <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;">L</code>
descriptor, but add a <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;">FieldRefinement</code>
attribute<br>
on the field. Similarly, <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;">Constant_FieldRef_info</code>
continues to link fields<br>
using 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;">L</code>
descriptor. </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 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;">FieldRefinement {
u2 name_index; // "FieldRefinement"
u4 length;
u2 refinement_index; // symbolic reference to a RefinementType
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">The symbolic
reference must be to a null-restricted, implicitly constructible<br>
class type, not an array type. We may relax this restriction
later. </p>
<p style="margin: 0px 0px 1.2em !important;">Additionally, a field
refinement may affect the behavior 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;">putfield</code>.
For a<br>
null-restricted class, attempts to <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;">putfield</code>
a null will result in<br>
<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;">NullPointerException</code>
(or perhaps a more general <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;">FieldStoreException</code>.)</p>
<p style="margin: 0px 0px 1.2em !important;">Looking ahead, for
the null-restriction of a B1 or B2 class, there is no change<br>
to the layout but we could enforce the storage restriction on <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;">putfield.</code>
When<br>
we get to species, the refinement for a species may affect the
layout, and<br>
attempting to store a value of the wrong species may result in
an exception or<br>
in an automatic conversion. </p>
<p style="margin: 0px 0px 1.2em !important;">It is a free choice
as to whether we want to translate a field of type<br>
<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;">Point![]</code>
using an array refinement or fully erase it to <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;">Point[]</code>.
</p>
<h4 id="refined-casts" style="margin: 1.3em 0px 1em; padding: 0px;
font-weight: bold;font-size: 1.2em;">Refined casts</h4>
<p style="margin: 0px 0px 1.2em !important;">The operand of a <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;">checkcast</code>
or <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;">instanceof</code>
may be a symbolic reference to a<br>
class or refinement. (Since <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;">instanceof</code>
is null-hostile, changing <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;">instanceof</code><br>
is not necessary now, but when we get to species, we will need
to be able to<br>
test for species membership.) 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;">cast</code>
operation may be pulled up from<br>
<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;">Class</code>
to <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;">RepresentableType</code>
so that casts can be done reflectively with<br>
either a <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;">Class</code>
or a refinement.</p>
<h4 id="refined-array-creation" style="margin: 1.3em 0px 1em;
padding: 0px; font-weight: bold;font-size: 1.2em;">Refined array
creation</h4>
<p style="margin: 0px 0px 1.2em !important;">An <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;">anewarray</code>
may make a symbolic reference to a class refinement type, as
well<br>
as to a class, array, or interface type. </p>
<p style="margin: 0px 0px 1.2em !important;">For a refined array,
<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;">a.getClass()</code>
continues to return the primary mirror for<br>
the array type, 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;">Class::getComponentType</code>
on that array continues to return<br>
the primary mirror for the component type, but we may provide an
additional API<br>
point akin to <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;">getComponentType</code>
that returns a <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;">RepresentableType</code>
which may be<br>
a <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;">RefinementType</code>.</p>
<p style="margin: 0px 0px 1.2em !important;">Arrays of
null-restricted values can be created reflectively; the existing<br>
<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;">Array::newInstance</code>
method will get an overload that takes <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;">RepresentableType</code>.<br>
<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;">Arrays::copyOf</code>
when presented with a refined array type will create a refined<br>
array.</p>
<h4 id="refinement-information-stays-in-the-background-until-summoned" style="margin: 1.3em 0px 1em; padding: 0px; font-weight:
bold;font-size: 1.2em;">Refinement information stays in the
background until summoned</h4>
<p style="margin: 0px 0px 1.2em !important;">The place where we
need discipline is avoiding the temptation of “but someone<br>
might profitably use the information that this field holds a
flat array.” Yes,<br>
they might — but supporting that as a general-purpose runtime
type (with<br>
descriptor and mirror) has costs. </p>
<p style="margin: 0px 0px 1.2em !important;">The model proposed
here resists the temptation to redefine mirrors, descriptors,<br>
symbolic resolution, and reflection, instead leaning on erasure
here for both<br>
null-restriction and specialization, and providing a secondary
reflective<br>
channel (which almost no users will actually need) to get
refinement<br>
information. (An example of code that needs to summon refinement
information is<br>
Arrays::copy, which would need to fetch the refined component
type and<br>
instantiate an array using the refined type; most other
reflective code would<br>
not need to even be aware of it.)</p>
<h4 id="bonus-round-specialization" style="margin: 1.3em 0px 1em;
padding: 0px; font-weight: bold;font-size: 1.2em;">Bonus round:
specialization</h4>
<p style="margin: 0px 0px 1.2em !important;">The framework so far
seems to accomodate specialization fairly well. There’ll<br>
be a new subtype 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;">RefinementType</code>
to represent a specialization, a reflective<br>
method for creating such specialization such as:</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 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;">static<T> SpecializedType<T> specialization(Class<T> baseClass,
RepresentableType<?>... arguments)
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">and a new way to get
such a type refinement in the constant pool (possibly just<br>
a condy whose bootstrap is the above method.) 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;">new</code>
bytecode is extended to<br>
accept a specialization refinement. Field refinements would then
be able to<br>
refer to specialization refinements.</p>
<h2 id="conclusions" style="margin: 1.3em 0px 1em; padding: 0px;
font-weight: bold;font-size: 1.4em; border-bottom: 1px solid
rgb(238, 238, 238);">Conclusions</h2>
<p style="margin: 0px 0px 1.2em !important;">In the current world
we have a (mostly) 1:1:1 relationship between runtime<br>
types, descriptors, and mirrors; a model where
species/refinements are not full<br>
runtime types preserves this. The surface area where refinement
information<br>
leaks to users who are not prepared for it is dramatically
smaller. Refinements<br>
are not full runtime types, they don’t have full Class mirrors.
We erase down<br>
to real runtime types in descriptors and in reflective API
points like<br>
<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;">Object::getClass</code>.
This seems a powerful simplification, and one that aligns<br>
with the previous language simplification. To summarize:</p>
<ul style="margin: 1.2em 0px;padding-left: 2em;">
<li style="margin: 0.5em 0px;">Yes, we should get rid of Q
descriptors, but should do so in a more<br>
principled way by getting rid of Q as a runtime type entirely,
replacing it<br>
with a refinement type which stays in the background until it
is actually<br>
needed. </li>
<li style="margin: 0.5em 0px;">We should erase Q from method and
field descriptors and from the obvious<br>
mirrors, because refinement information is on a need-to-know
basis. </li>
<li style="margin: 0.5em 0px;">Refinement information primarily
flows from source -> classfile -> VM, and<br>
mostly does not flow in the other direction. Specialized
reflection might<br>
expose it, but we should do so not on general principles, but
based on where<br>
it is actually needed by the programming model. </li>
<li style="margin: 0.5em 0px;">Null restriction is more like
specialization than not; they are both value<br>
set refinements that possibly enable layout optimization, and
we should seek<br>
to treat them the same. </li>
<li style="margin: 0.5em 0px;">While leaving the door open for
additional kinds of species and type<br>
migration, we use our new powers, at first, only to define
flattenable fields<br>
and flattenable one-dimensional arrays.</li>
</ul>
<div title="MDH:VGhpcyBtYWlsIHN1bW1hcml6ZXMgc29tZSBkaXNjdXNzaW9ucyB3ZSd2ZSBiZWVuIGhhdmluZyBhYm91dCBlbGltaW5hdGluZyBRIGRlc2NyaXB0b3JzIGZyb20gdGhlIFZNIGRlc2lnbi7CoCBPdmVy
IHRpbWUsIHdlJ3ZlIGJlZW4gZ2l2aW5nIFEgZmV3ZXIgYW5kIGZld2VyIGpvYnMgdG8gZG8sIHRv
IHRoZSBwb2ludCB3aGVyZSB3ZSBjYW4gcmVwbGFjZSB0aGUgcmVtYWluaW5nIGpvYnMgd2l0aCBz
aW1wbGVyIG1lY2hhbmlzbXMuwqAgQWRkaXRpb25hbGx5LCBhcyB0aGUgbGFuZ3VhZ2UgbW9kZWwg
aGFzIGV2b2x2ZWQsIHRoZSBnYXAgYmV0d2VlbiB0aGUgbGFuZ3VhZ2UgYW5kIFZNIGhhcyBpbmNy
ZWFzZWQsIGFuZCB0aGUgcHJvcG9zYWwgaGVyZWluIG5hcnJvd3MgdGhhdCBnYXAuwqAgPGJyPjxi
cj5JJ2xsIGJlIG9uIHZhY2F0aW9uIGZvciBhIHdoaWxlLCBidXQgRGFuIGFuZCBKb2huIHdpbGwg
YmUgYWJsZSB0byBjYXJyeSBmb3J3YXJkIHRoaXMgZGlzY3Vzc2lvbi7CoCA8YnI+PGJyPlBsZWFz
ZSBiZWFyIGluIG1pbmQgdGhhdCB0aGlzIGlzIGEgdmVyeSByb3VnaCBkcmFmdCBvZiBkaXJlY3Rp
b247IHdlIGRvbid0IG5lZWQgdG8gYmlrZXNoZWQgYW55dGhpbmcgcmlnaHQgbm93LCBhcyBtdWNo
IGFzIGFncmVlIHRoYXQgdGhlcmUgaXMgYSBiZXR0ZXIsIHNpbXBsZXIsIG1vcmUgYWxpZ25lZCBk
aXJlY3Rpb24gdGhhbiB3ZSBoYWQgcHJldmlvdXNseS7CoCA8YnI+PGJyPjxicj4jIFdlIGRvbid0
IG5lZWQgbm8gc3RpbmtpbicgUSB0eXBlczxicj48YnI+SW4gdGhlIGxhc3Qgc2l4IG1vbnRocywg
d2UgbWFkZSBhIHNpZ25pZmljYW50IGJyZWFrdGhyb3VnaCBhdCB0aGUgbGFuZ3VhZ2UvdXNlcjxi
cj5sZXZlbCAtLSB0byBkZWNvbXBvc2UgQjMgd2l0aCBpdHMgdmFsdWUgYW5kIHJlZmVyZW5jZSBj
b21wYW5pb25zLCBpbnRvIHR3bzxicj5zaW1wbGVyIGNvbmNlcHRzOiBpbXBsaWNpdCBjb25zdHJ1
Y3RpYmlsaXR5IChhIGRlY2xhcmF0aW9uLXNpdGUgcHJvcGVydHkpIGFuZDxicj5udWxsIHJlc3Ry
aWN0aW9uIChhIHVzZS1zaXRlIHByb3BlcnR5LinCoCBUaGUgLnJlZi8udmFsIGRpc3RpbmN0aW9u
LCBhbmQgYWxsIGl0czxicj5leGNlc3MgY29tcGxleGl0eSwgc3RlbW1lZCBmcm9tIHRoZSBtaXN0
YWtlbiBkZXNpcmUgdG8gbW9kZWwgdGhlIGludC9JbnRlZ2VyPGJyPmRpdmlkZSBkaXJlY3RseS7C
oCBCeSBicmVha2luZyBCMy1uZXNzIGRvd24gaW50byBtb3JlICJwcmltaXRpdmUiIHByb3BlcnRp
ZXM8YnI+KHNvbWUgb2Ygd2hpY2ggYXJlIHNoYXJlZCB3aXRoIG5vbi1CMyBjbGFzc2VzKSwgd2Ug
YXJyaXZlZCBhdCBhIHNpbXBsZXIgbW9kZWw7PGJyPm5vIG1vcmUgcmVmL3ZhbCBwcm9qZWN0aW9u
cywgYW5kIG1vcmUgdW5pZm9ybSB0cmVhdG1lbnQgb2YgWCEgKGluY2x1ZGluZyBmb3IgQjE8YnI+
YW5kIEIyIGNsYXNzZXMpLiA8YnI+PGJyPkFzIHdlIHdvcmtlZCB0aHJvdWdoIHRoZSBsYW5ndWFn
ZSBhbmQgdHJhbnNsYXRpb24gZGV0YWlscywgd2UgY29udGludWVkIHRvIHNlZWs8YnI+YSBsb3dl
ciBlbmVyZ3kgc3RhdGUuwqAgV2UgY29uY2x1ZGVkIHRoYXQgd2UgY2FuIGVyYXNlIGBYIWAgdG8g
YExYO2AgaW4gYSBudW1iZXI8YnI+b2YgcGxhY2VzIChsb2NhbHMsIG1ldGhvZCBkZXNjcmlwdG9y
cywgdmVyaWZpZXIgdHlwZSBzeXN0ZW0pIHdoaWxlIHN0aWxsIG1lZXRpbmc8YnI+b3VyIHBlcmZv
cm1hbmNlIG9iamVjdGl2ZXMuwqAgRG9pbmcgc28gZWxpbWluYXRlcyBhIG51bWJlciBvZiBpc3N1
ZXMgd2l0aCBtZXRob2Q8YnI+cmVzb2x1dGlvbiBhbmQgZGlzdGluZ3Vpc2hpbmcgb3ZlcmxvYWRz
IGZyb20gb3ZlcnJpZGVzLsKgIEluIGZhY3QsIHdlIGZvdW5kPGJyPm91cnNlbHZlcyB1c2luZyBR
IGZvciBmZXdlciBhbmQgZmV3ZXIgdGhpbmdzLCBhdCB3aGljaCBwb2ludCB3ZSBzdGFydGVkIHRv
IGFzazxicj5vdXJzZWx2ZXM6IGRvIHdlIG5lZWQgUSBkZXNjcmlwdG9ycyBhdCBhbGw/IDxicj48
YnI+SW4gb3VyIFZNLCB0aGVyZSBpcyBhIChtb3N0bHkpIDEtMS0xIGNvcnJlc3BvbmRlbmNlIGJl
dHdlZW4gcnVudGltZSB0eXBlcyw8YnI+ZGVzY3JpcHRvcnMsIGFuZCBjbGFzcyBtaXJyb3JzLsKg
IEluIGEgd29ybGQgd2hlcmUgUUZvbyBhbmQgTEZvbyBhcmUgc2VwYXJhdGU8YnI+cnVudGltZSB0
eXBlcywgaXQgbWFrZXMgc2Vuc2UgZm9yIHRoZW0gdG8gaGF2ZSB0aGVpciBvd24gZGVzY3JpcHRv
cnMgYW5kPGJyPm1pcnJvcnMuwqAgQnV0IGFzIGBGb28hYCBhbmQgYEZvbz9gIGhhdmUgY29tZSB0
b2dldGhlciBpbiB0aGUgbGFuZ3VhZ2UsIG1hcHBpbmc8YnI+dG8gYSBWTSB3aGljaCBzZWVtcyB0
aGVtIGFzIHNlcGFyYXRlIHJ1bnRpbWUgdHlwZXMgc3RhcnRzIHRvIHNob3cgZ2Fwcy4gPGJyPjxi
cj5UaGUgcm9sZSBvZiBRIGhhcyBoaXN0b3JpY2FsbHkgYmVlbiBvbmUgb2YgIm90aGVyIiwgcmF0
aGVyIHRoYW4gc29tZXRoaW5nIG9uIGl0czxicj5vd247IGFueSBjbGFzcyB3aGljaCBoYWQgYSBR
IHR5cGUsIGFsc28gaGFkIGFuIEwgdHlwZSwgYW5kIFEgd2FzIHRoZSAib3RoZXI8YnI+Zmxhdm9y
LiLCoCBUaGUgInR3byBmbGF2b3JzIiBvcmllbnRhdGlvbiBtYWRlIHNlbnNlIHdoZW4gd2Ugd2Vy
ZSBtb2RlbGluZyB0aGU8YnI+aW50L0ludGVnZXIgc3BsaXQ7IHdlIG5lZWRlZCB0d28gZmxhdm9y
cyBmb3IgdGhhdCBpbiBib3RoIGxhbmd1YWdlIGFuZCBWTS7CoCBUaGU8YnI+bGFuZ3VhZ2Ugc2lu
Y2UgZGlzY292ZXJlZCB0aGF0IHdlIGNhbiBicmVhayBkb3duIHRoZSBpbnQvSW50ZWdlciBkaXZp
ZGUgaW50byB0d288YnI+bW9yZSBwcmltaXRpdmUgbm90aW9ucyAtLSBpbXBsaWNpdCBjb25zdHJ1
Y3RpYmlsaXR5IChhbiBpbnQgY2FuIGJlIHVzZWQgd2l0aG91dDxicj5jYWxsaW5nIGEgY29uc3Ry
dWN0b3IsIGFuIEludGVnZXIgY2Fubm90KSBhbmQgbm9uLW51bGxpdHkgKG5vbi1pZGVudGl0eSBw
bHVzPGJyPmRlZmF1bHQgY29uc3RydWN0aWJpbGl0eSBwbHVzIG5vbi1udWxsaXR5IHVubG9ja3Mg
ZmxhdHRlbmluZy4pIDxicj48YnI+SWYgUSBpcyBhIHZhbGlkIGRlc2NyaXB0b3IgYW5kIHRoZXJl
IGlzIGFsd2F5cyBhIFEgbWlycm9yLCB3ZSBhcmUgaW4gYSBzdGFibGU8YnI+cGxhY2Ugd2l0aCBy
ZXNwZWN0IHRvIHJ1bnRpbWUgdHlwZXMuwqAgQnV0IGlmIHdlIGludGVuZCB0byBhbGxvdyBgbShG
b28hKWAgdG88YnI+b3ZlcnJpZGUgYG0oRm9vPylgLCB0byBiZSB0b2xlcmFudCBvZiBiYW5nLW1p
c21hdGNoZXMgaW4gbWV0aG9kIHJlc29sdXRpb24sIGFuZDxicj5naXZlIFEgZmV3ZXIgam9icywg
dGhlbiB3ZSBhcmUgbW92aW5nIHRvIGFuIHVuc3RhYmxlIHBsYWNlLsKgIFdlJ3ZlIGV4cGxvcmVk
IGE8YnI+bnVtYmVyIG9mICJvbmx5IHVzZSBRIGZvciBjZXJ0YWluIHRoaW5ncyIgcG9zaXRpb25z
LCBhbmQgaGF2ZSBmb3VuZCBtYW55IG9mIHRoZW08YnI+dG8gYmUgdW5zdGFibGUgaW4gdmFyaW91
cyB3YXlzLsKgIFRoZSBvdGhlciBzdGFibGUgcG9pbnQgaXMgdGhhdCB0aGVyZSBhcmUgbm8gUTxi
cj50eXBlcywgYW5kIG5vIFEgbWlycm9ycyAtLSBidXQgdGhlbiB3ZSBuZWVkIHNvbWUgbmV3IGNo
YW5uZWwgdG8gZW5jb2RlIHRoZTxicj5yZXF1ZXN0IHRvIGV4Y2x1ZGUgbnVsbCwgYW5kIHNvIGdp
dmUgdGhlIFZNIHRoZSBmbGF0dGVuaW5nIGhpbnQgdGhhdCBpcyBuZWVkZWQuPGJyPjxicj5BcyBp
dCB0dXJucyBvdXQsIHRoZXJlIGFyZSBzdXJwcmlzaW5nbHkgZmV3IHBsYWNlcyB0aGF0IHRydWx5
IG5lZWQgc3VjaCBhIG5ldzxicj5jaGFubmVsLsKgIFdlIGJhc2ljYWxseSBuZWVkIHRoZSBWTSB0
byB0YWtlICJRLW5lc3MiIGludG8gYWNjb3VudCBpbiB0aHJlZTxicj5wbGFjZXM6PGJyPjxicj7C
oC0gRmllbGQgbGF5b3V0IC0tIGEgZmllbGQgb2YgdHlwZSBgRm9vIWAgKHdoZXJlIEZvbyBpcyBp
bXBsaWNpdGx5PGJyPsKgwqAgY29uc3RydWN0aWJsZSkgbmVlZHMgYSBoaW50IHRoYXQgdGhpcyBm
aWVsZCBpcyBudWxsLXJlc3RyaWN0ZWQsIHNvIHdlIGNhbiBsYXk8YnI+wqDCoCBpdCBvdXQgZmxh
dC4gPGJyPsKgLSBBcnJheSBsYXlvdXQgLS0gYXQgdGhlIHBvaW50IG9mIGBhbmV3YXJyYXlgIGFu
ZCBmcmllbmRzLCB3ZSBuZWVkIGEgaGludCB3aGVuPGJyPsKgwqAgdGhlIGNvbXBvbmVudCB0eXBl
IGlzIGFuIGltcGxpY2l0bHktY29uc3RydWN0aWJsZSwgbnVsbC1yZXN0cmljdGVkIHR5cGUuPGJy
PsKgLSBDYXN0aW5nIC0tIGNhc3RzIG5lZWQgdG8gYmUgYWJsZSB0byBleHByZXNzIGEgdmFsdWUt
c2V0IGNoZWNrIGZvciB0aGU8YnI+wqDCoCByZXN0cmljdGVkIHZhbHVlIHNldCBvZiBgRm9vIWAg
YXMgd2VsbCBhcyB0aGUgdW5yZXN0cmljdGVkIHZhbHVlIHNldCBvZjxicj7CoMKgIGBGb29gLiA8
YnI+PGJyPldlIGFyZSBjb252aW5jZWQgdGhhdCB0aGVzZSB0aHJlZSBhcmUgYWxsIHRoYXQgaXMg
dHJ1bHkgcmVxdWlyZWQgdG8gZ2V0IHRoZTxicj5mbGF0dGVuaW5nIHdlIHdhbnQuwqAgU28gcmF0
aGVyIHRoYW4gaW52ZW50IG5ldyBydW50aW1lIHR5cGVzIC8gbWlycm9ycyAvPGJyPmRlc2NyaXB0
b3JzIHRoYXQgYXJlIGdvaW5nIHRvIGZsb3cgZXZlcnl3aGVyZSAoaW50byByZWZsZWN0aW9uLCBt
ZXRob2QgaGFuZGxlcyw8YnI+dmVyaWZpY2F0aW9uLCBldGMpLCBsZXQncyBpbnZlbnQgdGhlIG1p
bmltYWwgYWRkaXRpb25hbCBjbGFzc2ZpbGUgc3VyZmFjZSBhbmQgVk08YnI+bW9kZWwgdG8gbW9k
ZWwgdGhhdC7CoCBBdCB0aGUgc2FtZSB0aW1lLCBsZXQncyBtYWtlIHN1cmUgdGhhdCB0aGUgbmV3
IHRoaW5nPGJyPmFsaWducyB3aXRoIHRoZSBuZXcgbGFuZ3VhZ2UgbW9kZWwsIHdoZXJlIHRoZSBz
dGFyIG9mIHRoZSBzaG93IGlzPGJyPm51bGwtcmVzdHJpY3RlZCB0eXBlcy4gPGJyPjxicj4jIyMj
IFdoYXQgYWJvdXQgc3BlY2llcz88YnI+PGJyPkluIHNlcGFyYXRlIGludmVzdGlnYXRpb25zLCB3
ZSBoYXZlIGEgbm90aW9uIG9mICJzcGVjaWVzIiBmb3IgYSBsb25nIHRpbWUsIHdoaWNoPGJyPndl
IGtub3cgd2UncmUgZ29pbmcgdG8gbmVlZCB3aGVuIHdlIGdldCB0byBzcGVjaWFsaXphdGlvbi7C
oCBTcGVjaWVzIGZvcm0gYTxicj5wYXJ0aXRpb24gb2YgYSBjbGFzc2VzIGluc3RhbmNlczsgZXZl
cnkgaW5zdGFuY2Ugb2YgYSBjbGFzcyBiZWxvbmdzIHRvIGV4YWN0bHk8YnI+b25lIHNwZWNpZXMs
IGFuZCBkaWZmZXJlbnQgc3BlY2llcyBtYXkgaGF2ZSBkaWZmZXJlbnQgbGF5b3V0cyBhbmQgdmFs
dWUgc2V0PGJyPnJlc3RyaWN0aW9ucy7CoCBBbmQgd2Ugc3RydWdnbGVkIHdpdGggc3BlY2llcyBm
b3IgYSBsb25nIHRpbWUgb3ZlciB0aGUgc2FtZTxicj5ydW50aW1lIHR5cGUgYWZmb3JkYW5jZXMg
KG1pcnJvcnMgYW5kIGRlc2NyaXB0b3JzKSAtLSB3aGF0IGRvZXMgYSBmaWVsZDxicj5kZXNjcmlw
dG9yIGZvciBhIGZpZWxkIG9mIHR5cGUgYEFycmF5TGlzdCZsdDtpbnQmZ3Q7YCBsb29rIGxpa2U/
wqAgV2hhdCBkb2VzIGBnZXRDbGFzc2A8YnI+cmV0dXJuPyA8YnI+PGJyPkluIGJvdGggY2FzZXMs
IHRoZSBjb25zdHJhaW50cyBvZiBjb21wYXRpYmlsaXR5IGhhdmUgYmVlbiBwdXNoaW5nIHVzIHRv
d2FyZHM8YnI+bW9yZSBlcmFzdXJlIGluIGRlc2NyaXB0b3JzIGFuZCByZWZsZWN0aW9uLCB3aXRo
IHNpZGUgY2hhbm5lbHMgdG8gcmVjb25zdHJ1Y3Q8YnI+aW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZv
ciBvcHRpbWl6ZWQgaGVhcCBsYXlvdXQsIGFuZCB3aXRoIHNlcGFyYXRlIEFQSSBwb2ludHM8YnI+
Zm9yIGBnZXRDbGFzc2AgdnMgYGdldFNwZWNpZXNgLsKgIFdoaWxlIHNwZWNpYWxpemF0aW9uIGlz
IGNvbnNpZGVyYWJseSBtb3JlPGJyPmNvbXBsaWNhdGVkLCBuZWFybHkgYWxsIHRoZSBzYW1lIGNv
bnNpZGVyYXRpb25zIChkZXNjcmlwdG9ycywgbWlycm9ycyw8YnI+cmVmbGVjdGlvbikgYXJlIHBy
ZXNlbnQgZm9yIG51bGwtcmVzdHJpY3Rpb24gdHlwZXMuwqAgV2UgdG9vayBhbiBlYXJsaWVyIHN3
aW5nIGF0PGJyPnVuaWZ5aW5nIHRoZSB0d28gdW5kZXIgdGhlIHJ1YnJpYyBvZiAidHlwZSByZXN0
cmljdGlvbnMiLCBidXQgSSB0aGluayBvdXIgbW9kZWw8YnI+d2Fzbid0IHF1aXRlIGNsZWFuIGVu
b3VnaCBhdCB0aGUgdGltZSB0byBhZG1pdCB0aGlzIHVuaWZpY2F0aW9uLsKgIEJ1dCBJIHRoaW5r
IHdlPGJyPmFyZSBub3cgKGFsbW9zdCkgdGhlcmUsIGFuZCB0aGUgcGF5b2ZmIGlzIGJpZy4gPGJy
Pjxicj5XaGF0IHdlIGNvbmNsdWRlZCBhcm91bmQgc3BlY2llcyBhbmQgc3BlY2lhbGl6YXRpb24g
aXMgdGhhdCB3ZSB3b3VsZCBoYXZlIHRvPGJyPmNvbnRpbnVlIHRvIGVyYXNlIGRlc2NyaXB0b3Jz
IChgQXJyYXlMaXN0Jmx0O2ludCZndDtgIGFzIGEgbWV0aG9kIG9yIGZpZWxkIGRlc2NyaXB0b3I8
YnI+Y29udGludWVzIHRvIGVyYXNlIHRvIGBMQXJyYXlMaXN0O2ApLCB0aGF0IGBnZXRDbGFzc2Ag
cmV0dXJucyB0aGUgcHJpbWFyeSBtaXJyb3I8YnI+KGBBcnJheUxpc3RgKSwgYW5kIHRoYXQgc3Bl
Y2llcyBpbmZvcm1hdGlvbiBpcyBwdXNoZWQgaW50byBhIHNpZGUgY2hhbm5lbC48YnI+VGhlc2Ug
YXJlIHByZXR0eSBtdWNoIHRoZSBleGFjdCBzYW1lIGNvbnNpZGVyYXRpb25zIGFzIGZvciBudWxs
LXJlc3RyaWN0aW9uPGJyPnR5cGVzLiA8YnI+PGJyPiMjIyMgU3BlY2llcyBhbmQgYmFuZyB0eXBl
cyBhcmUgX3JlZmluZW1lbnQgdHlwZXNfPGJyPjxicj5BIF9yZWZpbmVtZW50IHR5cGVfIGlzIGEg
dHlwZSB3aG9zZSB2YWx1ZSBzZXQgaXMgdGhhdCBvZiBhbm90aGVyIHR5cGUsIHBsdXMgYTxicj5w
cmVkaWNhdGUgcmVzdHJpY3RpbmcgdGhlIHZhbHVlIHNldC7CoCBBICJiYW5nIiB0eXBlIGBQb2lu
dCFgIGlzIGEgcmVmaW5lbWVudCBvZjxicj5Qb2ludCwgd2hlcmUgd2UgZWxpbWluYXRlIHRoZSB2
YWx1ZSBgbnVsbGAuwqAgKE90aGVyIHdlbGwta25vd24gcmVmaW5lbWVudCB0eXBlczxicj5mcm9t
IFBMIGhpc3RvcnkgaW5jbHVkZSBDIGVudW1zIGFuZCBQYXNjYWwgcmFuZ2VzLinCoCBSZWZpbmVt
ZW50IHR5cGVzIGFyZSBvZnRlbjxicj5lcmFzZWQgdG8gdGhlaXIgYmFzZSB0eXBlLCBidXQgc29t
ZSByZWZpbmVtZW50cyBlbmFibGUgYmV0dGVyIGxheW91dC7CoCBJbmRlZWQsPGJyPm91ciBpbnRl
cmVzdCBpbiBRIHR5cGVzIGlzIGZsYXR0ZW5pbmcsIGFuZCBmb3IgYW4gaW1wbGljaXRseSBjb25z
dHJ1Y3RpYmxlPGJyPmNsYXNzLCBhIHZhcmlhYmxlIGhvbGRpbmcgYSBudWxsLWV4Y2x1ZGluZyB0
eXBlIGNhbiBiZSBmbGF0dGVuZWQuwqAgU2ltaWxhcmx5LDxicj5mb3IgYSBzdWZmaWNpZW50bHkg
Y29uc3RyYWluZWQgZ2VuZXJpYyB0eXBlIChlLmcuLCBgUG9pbnRbaW50LGludF1gKSwgdGhlIGxh
eW91dDxicj5vZiBzdWNoIGEgdmFyaWFibGUgY2FuIGJlIGZsYXR0ZW5lZCBhcyB3ZWxsLiA8YnI+
PGJyPldoYXQgd2UgcHJldmlvdXNseSBjYWxsZWQgInR5cGUgcmVzdHJpY3Rpb25zIiBpbiB0aGUg
W1BhcmFtZXRyaWM8YnI+Vk1dKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuamRrL3ZhbGhhbGxhLWRv
Y3MvYmxvYi9tYWluL3NpdGUvZGVzaWduLW5vdGVzL3BhcmFtZXRyaWMtdm0vcGFyYW1ldHJpYy12
bS5tZCN0eXBlLXJlc3RyaWN0ZWQtbWV0aG9kcy1hbmQtZmllbGRzLWFuZC10aGUtdHlwZXJlc3Ry
aWN0aW9uLWF0dHJpYnV0ZSk8YnI+ZG9jdW1lbnQgaXMgaW4gZmFjdCBhIHJlZmluZW1lbnQgdHlw
ZS7CoCBXZSBjbGFpbSB0aGF0IHdlIGNhbiBkZXNpZ24gdGhlPGJyPm51bGwtcmVzdHJpY3Rpb24g
Y2hhbm5lbCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuIGJlIGV4dGVuZGVkLCBpbiBzb21lPGJy
PnJlYXNvbmFibGUgd2F5LCB0byBzdXBwb3J0IG1vcmUgZ2VuZXJhbCBzcGVjaWFsaXphdGlvbi48
YnI+PGJyPkJvdGggc3BlY2lhbGl6YXRpb24sIGFuZCBudWxsLXJlc3RyaWN0aW9uLCBhcmUgZm9y
bXMgb2YgcmVmaW5lbWVudCB0eXBlcy7CoCBHaXZlbjxicj50aGF0IHdlJ3ZlIGFscmVhZHkgZGlz
Y292ZXJlZCB0aGF0IHdlIG5lZWQgdG8gZXJhc2UgdGhlc2UgdG8gdGhlaXIgcHJpbWFyeSAoTCk8
YnI+dHlwZSBpbiBhIGxvdCBvZiBwbGFjZXMsIGxldCdzIHN0YWtlIG91dCBzb21lIGdlbmVyYWwg
cHJpbmNpcGxlcyBmb3I8YnI+cmVwcmVzZW50aW5nIHJlZmluZW1lbnRzIGluIHRoZSBWTTo8YnI+
PGJyPsKgLSBSZWZpbmVtZW50IHR5cGVzIGFyZSBlcmFzZWQgdG8gdGhlaXIgYmFzZSB0eXBlIGlu
IG1ldGhvZCBhbmQgZmllbGQ8YnI+wqDCoCBkZXNjcmlwdG9ycy4gPGJyPsKgLSBSZWZpbmVtZW50
IHR5cGVzIGRvIG5vdCBoYXZlIF9jbGFzc18gbWlycm9ycy4gPGJyPsKgLSBgT2JqZWN0OjpnZXRD
bGFzc2AgcmV0dXJucyBhIGNsYXNzIG1pcnJvci4gPGJyPsKgLSBSZWZsZWN0aW9uIGRlYWxzIGlu
IGNsYXNzIG1pcnJvcnMsIHNvIHJlZmluZW1lbnRzIGFyZSBlcmFzZWQgZnJvbSBiYXNlPGJyPsKg
wqAgcmVmbGVjdGlvbi4gPGJyPsKgLSBNZXRob2QgaGFuZGxlcyBkZWFsIGluIGNsYXNzIG1pcnJv
cnMsIHNvIHJlZmluZW1lbnRzIGFyZSBlcmFzZWQgZnJvbSBtZXRob2Q8YnI+wqDCoCBoYW5kbGVz
LiA8YnI+PGJyPlRoYXQncyBhIGxvdCBvZiBlcmFzdXJlLCBzbyB3ZSBoYXZlIHRvIGJha2UgcmVm
aW5lbWVudCBiYWNrIGluIHdoZXJlIGl0IG1hdHRlcnMsPGJyPmJ1dCB3ZSB3YW50IHRvIGJlIGNh
cmVmdWwgdG8gbGltaXQgdGhlICJibGFzdCByYWRpdXMiIG9mIHRoZSByZWZpbmVtZW50PGJyPmlu
Zm9ybWF0aW9uIHRvIHdoZXJlIGl0IGRvZXMgYWN0dWFsbHkgbWF0dGVyLsKgIFRoZSBuZXcgY2hh
bm5lbCB0aGF0IGVuY29kZXMgYTxicj5yZWZpbmVtZW50IHR5cGUgd2lsbCBhcHBlYXIgb25seSB3
aGVuIG5lZWRlZCB0byBjYXJyeSBvdXQgdGhlIHRhc2tzIGxpc3RlZDxicj5hYm92ZTogZmllbGQg
ZGVjbGFyYXRpb24sIGFycmF5IGNyZWF0aW9uLCBhbmQgY2FzdGluZy4gwqA8YnI+PGJyPsKgLSBG
aWVsZHMgYXJlIGVuaGFuY2VkIHdpdGggc29tZSBzb3J0IG9mICJyZWZpbmVtZW50IiBhdHRyaWJ1
dGUsIHdoaWNoIChhKTxicj7CoMKgIGd1YXJkcyBhZ2FpbnN0IHN0b3JlcyBvZiBiYWQgdmFsdWVz
ICh0aGUgZmllbGQgZXF1aXZhbGVudCBvZjxicj7CoMKgIGBBcnJheVN0b3JlRXhjZXB0aW9uYCkg
YW5kIChiKSBlbmFibGVzIGZsYXR0ZXIgbGF5b3V0cyB3aGVuIHRoZSByZWZpbmVtZW50PGJyPsKg
wqAgcGVybWl0cy4gPGJyPsKgLSBBcnJheSBjcmVhdGlvbiAoYGFuZXdhcnJheWAgLyBgbXVsdGlh
bmV3YXJyYXknKSBpcyBlbmhhbmNlZCB0byBzdXBwb3J0PGJyPsKgwqAgY3JlYXRpbmcgYXJyYXlz
IHdpdGggcmVmaW5lZCBjb21wb25lbnQgdHlwZXMsIGVuYWJsaW5nIHRoZSBzYW1lIGJlbmVmaXRz
PGJyPsKgwqAgKHN0b3JhZ2Ugc2FmZXR5IC8gbGF5b3V0IGZsYXR0ZW5pbmcuKTxicj7CoC0gQ2Fz
dGluZyBpcyBlbmhhbmNlZCB0byBzdXBwb3J0IHJlZmluZW1lbnRzLsKgIFRoaXMgaXMgbmVlZGVk
IG1vc3RseSBiZWNhdXNlIG9mPGJyPsKgwqAgZXJhc3VyZSAtLSB3ZSBhcmUgZXJhc2luZyBhd2F5
IHJlZmluZW1lbnQgaW5mb3JtYXRpb24gYW5kIHNvbWV0aW1lcyBuZWVkIHRvPGJyPsKgwqAgcmVh
c3NlcnQgaXQuIDxicj7CoC0gV2hlbiB3ZSBnZXQgdG8gc3BlY2lhbGl6YXRpb24sIGBuZXdgIGlz
IGVuaGFuY2VkIHRvIHN1cHBvcnQgcmVmaW5lbWVudHMsIGFuZDxicj7CoMKgIHBvc3NpYmx5IG1l
dGhvZCBkZWNsYXJhdGlvbnMgKHRvIGVuYWJsZSBjYWxsaW5nIGNvbnZlbnRpb24gb3B0aW1pemF0
aW9uIGluPGJyPsKgwqAgdGhlIHByZXNlbmNlIG9mIGhpZ2hseSBzcGVjaWFsaXplZCB0eXBlcyBs
aWtlIGBQb2ludFtpbnQsaW50XWAuKTxicj48YnI+V2UgaGFkIHByZXZpb3VzbHkgYmVlbiBhc3N1
bWluZyB0aGF0IGBbUVBvaW50YCBpcyBzb21laG93IG1vcmUgb2YgYSAicmVhbCIgdHlwZTxicj50
aGFuIChzcGVjaWFsaXplZCkgYFBvaW50W2ludCxpbnRdYCwgYnV0IEkgdGhpbmsgd2UgYXJlIGJl
dHRlciBzZXJ2ZWQgc2VlaW5nPGJyPnRoZW0gYm90aCBhcyByZWZpbmVtZW50cywgd2hlcmUgd2Ug
Y29udGludWUgdG8gcmVwb3J0IGEgYnJvYWQgdHlwZSBidXQ8YnI+c29ydC1vZi1zZWNyZXRseSB1
c2UgcmVmaW5lbWVudCBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSBsYXlvdXQuPGJyPjxicj4jIyBB
IHN0cmF3bWFuPGJyPjxicj5XaGF0IGZvbGxvd3MgaXMgYSBzdHJhd21hbiB0aGF0IGVsaW1pbmF0
ZXMgUXMgY29tcGxldGVseSwgcmVwbGFjaW5nIHRoZSBmZXcgam9iczxicj5RIGhhcyAoZmllbGQg
bGF5b3V0LCBhcnJheSBsYXlvdXQsIGFuZCBjYXN0cykgd2l0aCBhIHNpbmdsZSBtZWNoYW5pc20g
Zm9yPGJyPnJlZmluZW1lbnQgdHlwZXMgd2hpY2ggc3RheXMgaW4gdGhlIGJhY2tncm91bmQgdW50
aWwgZXhwbGljaXRseSBzdW1tb25lZC4gV2U8YnI+YmVsaWV2ZSB0aGUgbW9kZWwgb3V0bGluZWQg
aGVyZSBjYW4gZXh0ZW5kIGNsZWFubHkgdG8gc3BlY2llcywgYXMgd2VsbCBhcyBgQjEhYDxicj50
eXBlcyBsaWtlIGBTdHJpbmchYCBhcyB3ZWxsLsKgIENhbGwgdGhpcyBOby1RIHdvcmxkLsKgIFRo
aXMgc2hvdWxkIG5vdCBiZSB0YWtlbjxicj5hcyBhIGNvbmNyZXRlIHByb3Bvc2FsLCBhcyBtdWNo
IGFzIGEgc2tldGNoIG9mIHRoZSBjb25jZXB0cyBhbmQgdGhlIHBsYXllcnMuIDxicj48YnI+V2Ug
aGF2ZSBjb21lIHRvIGJlbGlldmUgdGhhdCBhZGRpbmcgUSBkZXNjcmlwdG9ycyB0byB0aGUgSlZN
IHNwZWNpZmljYXRpb24sPGJyPndoaWxlIHBlcmhhcHMgdGhlIHJpZ2h0IG1vdmUgaW4gYSBmcm9t
LXNjcmF0Y2ggVk0gZGVzaWduLCB3b3VsZCBiZSBvdmVycmVhY2ggYXM8YnI+YW4gZXZvbHV0aW9u
YXJ5IHN0ZXAuwqAgRm9yIG9sZCBBUElzIHRvIGFkb3B0IG5ldyBkZXNjcmlwdG9ycyB3aWxsIHJl
cXVpcmUgbWFueTxicj5icmlkZ2UgbWV0aG9kcyB3aXRoIGNvbXBsZXggcHJvcGVydGllcy7CoCBU
byBhdm9pZCBzdWNoIGJyaWRnZXMsIG9sZCBBUElzIHdvdWxkPGJyPmJlIGZvcmJpZGRlbiBmcm9t
IG1lbnRpb25pbmcgdGhlIG5ldyB0eXBlcy7CoCBGb3IgdGhlc2UgcmVhc29ucywgbmV3IGRlc2Ny
aXB0b3JzLDxicj5hbmQgdGhlIG1pcnJvcnMgdGhhdCB3b3VsZCBhY2NvbXBhbnkgdGhlbSwgYXJl
IHF1aXRlIGxpdGVyYWxseSBhIGJyaWRnZSB0b28gZmFyLjxicj5BY2NvcmRpbmdseSwgaW4gTm8t
USB3b3JsZCwgZGVzY3JpcHRvcnMgcmVjbGFpbSB0aGVpciBmb3JtZXIgcm9sZTogZGVzY3JpYmlu
Zzxicj5wcmltaXRpdmVzIGFuZCBjbGFzc2VzLsKgIEZpZWxkIGFuZCBtZXRob2QgZGVzY3JpcHRv
cnMgd2lsbCB1c2UgYExgIGRlc2NyaXB0b3JzLDxicj5ldmVuIHdoZW4gY2FycnlpbmcgYSBudWxs
LXJlc3RyaWN0ZWQgdmFsdWUgKG9yIGEgc3BlY2llcy4pwqAgU2ltaWxhcmx5LCBjbGFzczxicj5t
aXJyb3JzIHJldHVybiB0byB0aGVpciBmb3JtZXIgcm9sZTogZGVzY3JpYmluZyBjbGFzc2ZpbGVz
IGFuZCBub24tcmVmaW5lZDxicj5WTS1kZXJpdmVkIHR5cGVzIChzdWNoIGFzIGFycmF5IHR5cGVz
LikgwqA8YnI+PGJyPkFzIGEgc2VsZi1pbXBvc2VkIHJ1bGUgb2YgdGhpcyBlc3NheSwgd2Ugd2ls
bCBub3QgYXBwZWFsIHRvIHJ1bnRpbWUgc3VwcG9ydCw8YnI+Y29uZHkgb3IgaW5keS4gRXZlcnl0
aGluZyB3aWxsIGJlIGRvbmUgd2l0aCBieXRlY29kZXMsIGRlc2NyaXB0b3JzLCBjb25zdGFudDxi
cj5wb29sIGVudHJpZXMsIGFuZCBvdGhlciBjbGFzc2ZpbGUgc3RydWN0dXJlcywgYW5kIG5vdCB2
aWEgc3BlY2lhbGx5LWtub3duPGJyPm1ldGhvZHMuwqAgQXMgdGhpcyBpcyBhIHN0cmF3bWFuLCB3
ZSBtYXkgaW5kdWxnZSBpbiBzb21lICJ3YXN0ZWZ1bCIgZGVzaWduLCB3aGljaDxicj5jYW4gYmUg
dHJhbnNmb3JtZWQgb3IgbHVtcGVkIGluIGxhdGVyIGl0ZXJhdGlvbnMuwqAgVGhlIG5ldyBlbGVt
ZW50cyBvZiB0aGU8YnI+ZGVzaWduIGFyZTo8YnI+PGJyPsKgLSBBIG5ldyByZWZsZWN0aXZlIGNv
bmNlcHQgZm9yIGBSZWZpbmVtZW50VHlwZWAsIHdoaWNoIHJlcHJlc2VudHMgYSByZWZpbmVtZW50
PGJyPsKgwqAgb2YgYW4gZXhpc3RpbmcgKGNsYXNzKSB0eXBlLiDCoDxicj7CoC0gQSBuZXcgcmVm
bGVjdGl2ZSBjb25jZXB0IGZvciBgUmVwcmVzZW50YWJsZVR5cGVgLCB3aGljaCBpcyB0aGUgY29t
bW9uPGJyPsKgwqAgc3VwZXJ0eXBlIGJldHdlZW4gYENsYXNzYCBhbmQgYFJlZmluZW1lbnRUeXBl
YC4gwqA8YnI+wqAtIE5ldyBjb25zdGFudCBwb29sIGZvcm1zIHJlcHJlc2VudGluZyBudWxsLXJl
c3RyaWN0aW9uIG9mIGNsYXNzZXMgYW5kIG9mPGJyPsKgwqAgYXJyYXlzLiDCoDxicj7CoC0gQSBu
ZXcgZmllbGQgYXR0cmlidXRlIGNhbGxlZCBgRmllbGRSZWZpbmVtZW50YC4gwqA8YnI+wqAtIEFk
anVzdG1lbnRzIHRvIHZhcmlvdXMgYnl0ZWNvZGVzIHRvIGludGVyYWN0IHdpdGggdGhlIG5ldyBj
b25zdGFudCBwb29sPGJyPsKgwqAgZm9ybXMuIMKgPGJyPsKgLSBBZGRpdGlvbnMgdG8gcmVmbGVj
dGl2ZSBBUElzLjxicj48YnI+IyMgUmVmaW5lZCB0eXBlczxicj48YnI+QSByZWZpbmVkIHR5cGUg
aXMgYSBjb21iaW5hdGlvbiBvZiBhIHR5cGUgKGNhbGxlZCB0aGUgYmFzZSB0eXBlKSBhbmQgYSB2
YWx1ZSBzZXQ8YnI+cmVzdHJpY3Rpb24gZm9yIHRoYXQgdHlwZSB3aGljaCBleGNsdWRlcyBzb21l
IHZhbHVlcyBpbiB0aGUgdmFsdWUgc2V0IG9mIHRoZTxicj5iYXNlIHR5cGUuwqAgTnVsbC1yZXN0
cmljdGVkIHR5cGVzLCBhcnJheXMgb2YgbnVsbC1yZXN0cmljdGVkIHR5cGVzLCBhbmQ8YnI+ZXZl
bnR1YWxseSwgc3BlY2llcyBvZiBnZW5lcmljcyBhcmUgcmVmaW5lZCB0eXBlcy4gwqA8YnI+PGJy
PlJlZmluZWQgdHlwZXMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgcmVmbGVjdGl2ZSBvYmplY3Q8
YnI+PGJyPmBgYDxicj5zZWFsZWQgaW50ZXJmYWNlIFJlZmluZW1lbnRUeXBlJmx0O1QmZ3Q7IGlt
cGxlbWVudHMgUmVwcmVzZW50YWJsZVR5cGUmbHQ7VCZndDsgezxicj7CoMKgwqAgUmVwcmVzZW50
YWJsZVR5cGUmbHQ7VCZndDsgYmFzZVR5cGUoKTs8YnI+fTxicj5gYGA8YnI+PGJyPlRoZSB0eXBl
IHBhcmFtZXRlciBgVGAgcmVwcmVzZW50cyB0aGUgYmFzZSB0eXBlLiDCoDxicj48YnI+VGhlcmUg
YXJlIGluaXRpYWxseSB0d28gaW1wbGVtZW50YXRpb25zIG9mIGBSZWZpbmVtZW50VHlwZWAsIHdo
aWNoIG1heSBiZSBwcml2YXRlLDxicj5hbmQgYXJlIGtub3duIHRvIHRoZSBWTTo8YnI+PGJyPmBg
YDxicj5wcml2YXRlIHJlY29yZCBOdWxsUmVzdHJpY3RlZENsYXNzJmx0O1QmZ3Q7KENsYXNzJmx0
O1QmZ3Q7IGJhc2VUeXBlKTxicj7CoMKgwqDCoMKgwqDCoCBpbXBsZW1lbnRzIFJlZmluZW1lbnRU
eXBlJmx0O1QmZ3Q7IHsgfTxicj48YnI+cHJpdmF0ZSByZWNvcmQgTnVsbFJlc3RyaWN0ZWRBcnJh
eSZsdDtUIGV4dGVuZHMgT2JqZWN0W10mZ3Q7KENsYXNzJmx0O1QmZ3Q7IGJhc2VUeXBlKTxicj7C
oMKgwqDCoMKgwqDCoCBpbXBsZW1lbnRzIFJlZmluZW1lbnRUeXBlJmx0O1QmZ3Q7IHsgfTxicj5g
YGA8YnI+PGJyPiMjIyMgQ29uc3RhbnQgcG9vbCBlbnRyaWVzPGJyPjxicj5UaGUgdHdvIGpvYnMg
Zm9yIG51bGwgcmVzdHJpY3Rpb24gbXVzdCBiZSByZXByZXNlbnRhYmxlIGluIHRoZSBjb25zdGFu
dCBwb29sOiBhPGJyPm51bGwtcmVzdHJpY3RlZCBCMywgYW5kIGFuIGFycmF5IG9mIGEgbnVsbC1y
ZXN0cmljdGVkIEIzLsKgIChUaGVzZSBjb3JyZXNwb25kIHRvPGJyPmBDb25zdGFudF9DbGFzc19p
bmZvYCB3aXRoIGEgZGVzY3JpcHRvciBvZiBgUUZvbztgIGFuZCBgW1FGb287YCBpbiB0aGU8YnI+
dHJhZGl0aW9uYWwgZGVzaWduLinCoCBJbiBhZGRpdGlvbiB0byBiZWluZyByZWZlcmVuY2VkIGJ5
IGJ5dGVjb2RlcyBhbmQ8YnI+YXR0cmlidXRlcywgc3VjaCBjb25zdGFudHMgc2hvdWxkIGlkZWFs
bHkgYmUgbG9hZGFibGUsIGV2YWx1YXRpbmcgdG8gYTxicj5gUmVmaW5lbWVudFR5cGVgIG9yIGBS
ZXByZXNlbnRhYmxlVHlwZWAuIMKgPGJyPjxicj5UaGUgZXhhY3QgZm9ybSBvZiB0aGUgY29uc3Rh
bnQgcG9vbCBlbnRyeSAod2hldGhlciBuZXcgYmVzcG9rZSBjb25zdGFudCBwb29sPGJyPmVudHJp
ZXMsIGFkLWhvYyBleHRlbnNpb25zIHRvIENvbnN0YW50X0NsYXNzX2luZm8sIG9yIGNvbmR5KSBj
YW4gYmUgYmlrZXNob2QgYXQ8YnI+dGhlIGFwcHJvcHJpYXRlIHRpbWU7IHRoZXJlIGFyZSBjbGVh
cmx5IHRyYWRlb2ZmcyBoZXJlLiDCoDxicj48YnI+SW5pdGlhbGx5LCBudWxsLXJlc3RyaWN0ZWQg
dHlwZXMgbXVzdCBiZSBpbXBsaWNpdGx5IGNvbnN0cnVjdGlibGUgKEIzKSwgd2hpY2g8YnI+d291
bGQgYmUgY2hlY2tlZCB3aGVuIHRoZSBjb25zdGFudCBpcyByZXNvbHZlZC7CoCBFdmVudHVhbGx5
LCB3ZSBjYW4gcmVsYXg8YnI+bnVsbC1yZXN0cmljdGlvbiB0byBzdXBwb3J0IGFsbCBjbGFzcyB0
eXBlcy7CoCBTaW1pbGFybHksIHdlIG1heSBpbml0aWFsbHk8YnI+cmVzdHJpY3QgdG8gb25lLWRp
bWVuc2lvbmFsIGZsYXQgYXJyYXlzLCBhbmQgbGVhdmUgYG11bHRpYW5ld2FycmF5YCB0byBpdHMg
b2xkPGJyPmpvYi48YnI+PGJyPiMjIyMgUmVwcmVzZW50YWJsZSB0eXBlczxicj48YnI+VGhlIG5l
dyBjb21tb24gc3VwZXJpbnRlcmZhY2UgYmV0d2VlbiBgQ2xhc3NgIGFuZCBgUmVmaW5lbWVudFR5
cGVgIGV4aXN0cyBzbyB0aGF0PGJyPmJvdGggY2xhc3NlcyBhbmQgY2xhc3MgcmVmaW5lbWVudHMg
Y2FuIGJlIHVzZWQgYXMgYXJyYXkgY29tcG9uZW50cywgdHlwZTxicj5wYXJhbWV0ZXJzIGZvciBz
cGVjaWFsaXphdGlvbnMsIGV0Yy7CoCBTb21lIG9wZXJhdGlvbnMgZnJvbSBgQ2xhc3NgLCBzdWNo
IGFzPGJyPmNhc3RpbmcsIG1heSBiZSBwdWxsZWQgdXAgaW50byB0aGlzIGludGVyZmFjZS48YnI+
PGJyPmBgYDxicj5zZWFsZWQgaW50ZXJmYWNlIFJlcHJlc2VudGFibGVUeXBlJmx0O1QmZ3Q7IHs8
YnI+wqDCoMKgIFQgY2FzdChPYmplY3QgbykgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbjs8YnI+
wqDCoMKgIC4uLjxicj59PGJyPmBgYDxicj48YnI+IyMjIyBSZWZpbmVkIGZpZWxkczxicj48YnI+
QW55IGZpZWxkIHdob3NlIHR5cGUgaXMgYSBudWxsLXJlc3RyaWN0ZWQgaW1wbGljaXRseSBjb25z
dHJ1Y3RpYmxlIGNsYXNzIG1heSBiZTxicj5jb25zaWRlcmVkIGJ5IHRoZSBWTSBhcyBhIGNhbmRp
ZGF0ZSBmb3IgZmxhdHRlbmluZy7CoCBSYXRoZXIgdGhhbiB1c2luZzxicj5gZmllbGRfaW5mby5k
ZXNjcmlwdG9yX2luZGV4YCB0byBlbmNvZGUgYSBudWxsLXJlc3RyaWN0ZWQgdHlwZSwgd2UgY29u
dGludWUgdG88YnI+ZXJhc2UgdG8gdGhlIHRyYWRpdGlvbmFsIGBMYCBkZXNjcmlwdG9yLCBidXQg
YWRkIGEgYEZpZWxkUmVmaW5lbWVudGAgYXR0cmlidXRlPGJyPm9uIHRoZSBmaWVsZC7CoCBTaW1p
bGFybHksIGBDb25zdGFudF9GaWVsZFJlZl9pbmZvYCBjb250aW51ZXMgdG8gbGluayBmaWVsZHM8
YnI+dXNpbmcgdGhlIGBMYCBkZXNjcmlwdG9yLiDCoDxicj48YnI+YGBgPGJyPkZpZWxkUmVmaW5l
bWVudCB7PGJyPsKgwqDCoCB1MiBuYW1lX2luZGV4O8KgwqDCoMKgwqDCoMKgIC8vICJGaWVsZFJl
ZmluZW1lbnQiPGJyPsKgwqDCoCB1NCBsZW5ndGg7PGJyPsKgwqDCoCB1MiByZWZpbmVtZW50X2lu
ZGV4O8KgIC8vIHN5bWJvbGljIHJlZmVyZW5jZSB0byBhIFJlZmluZW1lbnRUeXBlPGJyPn08YnI+
YGBgPGJyPjxicj5UaGUgc3ltYm9saWMgcmVmZXJlbmNlIG11c3QgYmUgdG8gYSBudWxsLXJlc3Ry
aWN0ZWQsIGltcGxpY2l0bHkgY29uc3RydWN0aWJsZTxicj5jbGFzcyB0eXBlLCBub3QgYW4gYXJy
YXkgdHlwZS7CoCBXZSBtYXkgcmVsYXggdGhpcyByZXN0cmljdGlvbiBsYXRlci4gwqA8YnI+PGJy
PkFkZGl0aW9uYWxseSwgYSBmaWVsZCByZWZpbmVtZW50IG1heSBhZmZlY3QgdGhlIGJlaGF2aW9y
IG9mIGBwdXRmaWVsZGAuwqAgRm9yIGE8YnI+bnVsbC1yZXN0cmljdGVkIGNsYXNzLCBhdHRlbXB0
cyB0byBgcHV0ZmllbGRgIGEgbnVsbCB3aWxsIHJlc3VsdCBpbjxicj5gTnVsbFBvaW50ZXJFeGNl
cHRpb25gIChvciBwZXJoYXBzIGEgbW9yZSBnZW5lcmFsIGBGaWVsZFN0b3JlRXhjZXB0aW9uYC4p
PGJyPjxicj5Mb29raW5nIGFoZWFkLCBmb3IgdGhlIG51bGwtcmVzdHJpY3Rpb24gb2YgYSBCMSBv
ciBCMiBjbGFzcywgdGhlcmUgaXMgbm8gY2hhbmdlPGJyPnRvIHRoZSBsYXlvdXQgYnV0IHdlIGNv
dWxkIGVuZm9yY2UgdGhlIHN0b3JhZ2UgcmVzdHJpY3Rpb24gb24gYHB1dGZpZWxkLmDCoCBXaGVu
PGJyPndlIGdldCB0byBzcGVjaWVzLCB0aGUgcmVmaW5lbWVudCBmb3IgYSBzcGVjaWVzIG1heSBh
ZmZlY3QgdGhlIGxheW91dCwgYW5kPGJyPmF0dGVtcHRpbmcgdG8gc3RvcmUgYSB2YWx1ZSBvZiB0
aGUgd3Jvbmcgc3BlY2llcyBtYXkgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbiBvcjxicj5pbiBhbiBh
dXRvbWF0aWMgY29udmVyc2lvbi4gwqA8YnI+PGJyPkl0IGlzIGEgZnJlZSBjaG9pY2UgYXMgdG8g
d2hldGhlciB3ZSB3YW50IHRvIHRyYW5zbGF0ZSBhIGZpZWxkIG9mIHR5cGU8YnI+YFBvaW50IVtd
YCB1c2luZyBhbiBhcnJheSByZWZpbmVtZW50IG9yIGZ1bGx5IGVyYXNlIGl0IHRvIGBQb2ludFtd
YC4gwqA8YnI+PGJyPiMjIyMgUmVmaW5lZCBjYXN0czxicj48YnI+VGhlIG9wZXJhbmQgb2YgYSBg
Y2hlY2tjYXN0YCBvciBgaW5zdGFuY2VvZmAgbWF5IGJlIGEgc3ltYm9saWMgcmVmZXJlbmNlIHRv
IGE8YnI+Y2xhc3Mgb3IgcmVmaW5lbWVudC7CoCAoU2luY2UgYGluc3RhbmNlb2ZgIGlzIG51bGwt
aG9zdGlsZSwgY2hhbmdpbmcgYGluc3RhbmNlb2ZgPGJyPmlzIG5vdCBuZWNlc3Nhcnkgbm93LCBi
dXQgd2hlbiB3ZSBnZXQgdG8gc3BlY2llcywgd2Ugd2lsbCBuZWVkIHRvIGJlIGFibGUgdG88YnI+
dGVzdCBmb3Igc3BlY2llcyBtZW1iZXJzaGlwLinCoCBUaGUgYGNhc3RgIG9wZXJhdGlvbiBtYXkg
YmUgcHVsbGVkIHVwIGZyb208YnI+YENsYXNzYCB0byBgUmVwcmVzZW50YWJsZVR5cGVgIHNvIHRo
YXQgY2FzdHMgY2FuIGJlIGRvbmUgcmVmbGVjdGl2ZWx5IHdpdGg8YnI+ZWl0aGVyIGEgYENsYXNz
YCBvciBhIHJlZmluZW1lbnQuPGJyPjxicj4jIyMjIFJlZmluZWQgYXJyYXkgY3JlYXRpb248YnI+
PGJyPkFuIGBhbmV3YXJyYXlgIG1heSBtYWtlIGEgc3ltYm9saWMgcmVmZXJlbmNlIHRvIGEgY2xh
c3MgcmVmaW5lbWVudCB0eXBlLCBhcyB3ZWxsPGJyPmFzIHRvIGEgY2xhc3MsIGFycmF5LCBvciBp
bnRlcmZhY2UgdHlwZS4gPGJyPjxicj5Gb3IgYSByZWZpbmVkIGFycmF5LCBgYS5nZXRDbGFzcygp
YCBjb250aW51ZXMgdG8gcmV0dXJuIHRoZSBwcmltYXJ5IG1pcnJvciBmb3I8YnI+dGhlIGFycmF5
IHR5cGUsIGFuZCBgQ2xhc3M6OmdldENvbXBvbmVudFR5cGVgIG9uIHRoYXQgYXJyYXkgY29udGlu
dWVzIHRvIHJldHVybjxicj50aGUgcHJpbWFyeSBtaXJyb3IgZm9yIHRoZSBjb21wb25lbnQgdHlw
ZSwgYnV0IHdlIG1heSBwcm92aWRlIGFuIGFkZGl0aW9uYWwgQVBJPGJyPnBvaW50IGFraW4gdG8g
YGdldENvbXBvbmVudFR5cGVgIHRoYXQgcmV0dXJucyBhIGBSZXByZXNlbnRhYmxlVHlwZWAgd2hp
Y2ggbWF5IGJlPGJyPmEgYFJlZmluZW1lbnRUeXBlYC48YnI+PGJyPkFycmF5cyBvZiBudWxsLXJl
c3RyaWN0ZWQgdmFsdWVzIGNhbiBiZSBjcmVhdGVkIHJlZmxlY3RpdmVseTsgdGhlIGV4aXN0aW5n
PGJyPmBBcnJheTo6bmV3SW5zdGFuY2VgIG1ldGhvZCB3aWxsIGdldCBhbiBvdmVybG9hZCB0aGF0
IHRha2VzIGBSZXByZXNlbnRhYmxlVHlwZWAuPGJyPmBBcnJheXM6OmNvcHlPZmAgd2hlbiBwcmVz
ZW50ZWQgd2l0aCBhIHJlZmluZWQgYXJyYXkgdHlwZSB3aWxsIGNyZWF0ZSBhIHJlZmluZWQ8YnI+
YXJyYXkuPGJyPjxicj4jIyMjIFJlZmluZW1lbnQgaW5mb3JtYXRpb24gc3RheXMgaW4gdGhlIGJh
Y2tncm91bmQgdW50aWwgc3VtbW9uZWQ8YnI+PGJyPlRoZSBwbGFjZSB3aGVyZSB3ZSBuZWVkIGRp
c2NpcGxpbmUgaXMgYXZvaWRpbmcgdGhlIHRlbXB0YXRpb24gb2YgImJ1dCBzb21lb25lPGJyPm1p
Z2h0IHByb2ZpdGFibHkgdXNlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoaXMgZmllbGQgaG9sZHMg
YSBmbGF0IGFycmF5LiLCoCBZZXMsPGJyPnRoZXkgbWlnaHQgLS0gYnV0IHN1cHBvcnRpbmcgdGhh
dCBhcyBhIGdlbmVyYWwtcHVycG9zZSBydW50aW1lIHR5cGUgKHdpdGg8YnI+ZGVzY3JpcHRvciBh
bmQgbWlycm9yKSBoYXMgY29zdHMuIDxicj48YnI+VGhlIG1vZGVsIHByb3Bvc2VkIGhlcmUgcmVz
aXN0cyB0aGUgdGVtcHRhdGlvbiB0byByZWRlZmluZSBtaXJyb3JzLCBkZXNjcmlwdG9ycyw8YnI+
c3ltYm9saWMgcmVzb2x1dGlvbiwgYW5kIHJlZmxlY3Rpb24sIGluc3RlYWQgbGVhbmluZyBvbiBl
cmFzdXJlIGhlcmUgZm9yIGJvdGg8YnI+bnVsbC1yZXN0cmljdGlvbiBhbmQgc3BlY2lhbGl6YXRp
b24sIGFuZCBwcm92aWRpbmcgYSBzZWNvbmRhcnkgcmVmbGVjdGl2ZTxicj5jaGFubmVsICh3aGlj
aCBhbG1vc3Qgbm8gdXNlcnMgd2lsbCBhY3R1YWxseSBuZWVkKSB0byBnZXQgcmVmaW5lbWVudDxi
cj5pbmZvcm1hdGlvbi7CoCAoQW4gZXhhbXBsZSBvZiBjb2RlIHRoYXQgbmVlZHMgdG8gc3VtbW9u
IHJlZmluZW1lbnQgaW5mb3JtYXRpb24gaXM8YnI+QXJyYXlzOjpjb3B5LCB3aGljaCB3b3VsZCBu
ZWVkIHRvIGZldGNoIHRoZSByZWZpbmVkIGNvbXBvbmVudCB0eXBlIGFuZDxicj5pbnN0YW50aWF0
ZSBhbiBhcnJheSB1c2luZyB0aGUgcmVmaW5lZCB0eXBlOyBtb3N0IG90aGVyIHJlZmxlY3RpdmUg
Y29kZSB3b3VsZDxicj5ub3QgbmVlZCB0byBldmVuIGJlIGF3YXJlIG9mIGl0Lik8YnI+PGJyPiMj
IyMgQm9udXMgcm91bmQ6IHNwZWNpYWxpemF0aW9uPGJyPjxicj5UaGUgZnJhbWV3b3JrIHNvIGZh
ciBzZWVtcyB0byBhY2NvbW9kYXRlIHNwZWNpYWxpemF0aW9uIGZhaXJseSB3ZWxsLsKgIFRoZXJl
J2xsPGJyPmJlIGEgbmV3IHN1YnR5cGUgb2YgYFJlZmluZW1lbnRUeXBlYCB0byByZXByZXNlbnQg
YSBzcGVjaWFsaXphdGlvbiwgYSByZWZsZWN0aXZlPGJyPm1ldGhvZCBmb3IgY3JlYXRpbmcgc3Vj
aCBzcGVjaWFsaXphdGlvbiBzdWNoIGFzOjxicj48YnI+wqDCoMKgIHN0YXRpYyZsdDtUJmd0OyBT
cGVjaWFsaXplZFR5cGUmbHQ7VCZndDsgc3BlY2lhbGl6YXRpb24oQ2xhc3MmbHQ7VCZndDsgYmFz
ZUNsYXNzLDxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFJlcHJlc2Vu
dGFibGVUeXBlJmx0Oz8mZ3Q7Li4uIGFyZ3VtZW50cyk8YnI+PGJyPmFuZCBhIG5ldyB3YXkgdG8g
Z2V0IHN1Y2ggYSB0eXBlIHJlZmluZW1lbnQgaW4gdGhlIGNvbnN0YW50IHBvb2wgKHBvc3NpYmx5
IGp1c3Q8YnI+YSBjb25keSB3aG9zZSBib290c3RyYXAgaXMgdGhlIGFib3ZlIG1ldGhvZC4pwqAg
VGhlIGBuZXdgIGJ5dGVjb2RlIGlzIGV4dGVuZGVkIHRvPGJyPmFjY2VwdCBhIHNwZWNpYWxpemF0
aW9uIHJlZmluZW1lbnQuwqAgRmllbGQgcmVmaW5lbWVudHMgd291bGQgdGhlbiBiZSBhYmxlIHRv
PGJyPnJlZmVyIHRvIHNwZWNpYWxpemF0aW9uIHJlZmluZW1lbnRzLjxicj48YnI+IyMgQ29uY2x1
c2lvbnM8YnI+PGJyPkluIHRoZSBjdXJyZW50IHdvcmxkIHdlIGhhdmUgYSAobW9zdGx5KSAxOjE6
MSByZWxhdGlvbnNoaXAgYmV0d2VlbiBydW50aW1lPGJyPnR5cGVzLCBkZXNjcmlwdG9ycywgYW5k
IG1pcnJvcnM7IGEgbW9kZWwgd2hlcmUgc3BlY2llcy9yZWZpbmVtZW50cyBhcmUgbm90IGZ1bGw8
YnI+cnVudGltZSB0eXBlcyBwcmVzZXJ2ZXMgdGhpcy7CoCBUaGUgc3VyZmFjZSBhcmVhIHdoZXJl
IHJlZmluZW1lbnQgaW5mb3JtYXRpb248YnI+bGVha3MgdG8gdXNlcnMgd2hvIGFyZSBub3QgcHJl
cGFyZWQgZm9yIGl0IGlzIGRyYW1hdGljYWxseSBzbWFsbGVyLsKgIFJlZmluZW1lbnRzPGJyPmFy
ZSBub3QgZnVsbCBydW50aW1lIHR5cGVzLCB0aGV5IGRvbid0IGhhdmUgZnVsbCBDbGFzcyBtaXJy
b3JzLsKgIFdlIGVyYXNlIGRvd248YnI+dG8gcmVhbCBydW50aW1lIHR5cGVzIGluIGRlc2NyaXB0
b3JzIGFuZCBpbiByZWZsZWN0aXZlIEFQSSBwb2ludHMgbGlrZTxicj5gT2JqZWN0OjpnZXRDbGFz
c2AuwqAgVGhpcyBzZWVtcyBhIHBvd2VyZnVsIHNpbXBsaWZpY2F0aW9uLCBhbmQgb25lIHRoYXQg
YWxpZ25zPGJyPndpdGggdGhlIHByZXZpb3VzIGxhbmd1YWdlIHNpbXBsaWZpY2F0aW9uLsKgIFRv
IHN1bW1hcml6ZTo8YnI+PGJyPsKgLSBZZXMsIHdlIHNob3VsZCBnZXQgcmlkIG9mIFEgZGVzY3Jp
cHRvcnMsIGJ1dCBzaG91bGQgZG8gc28gaW4gYSBtb3JlPGJyPsKgwqAgcHJpbmNpcGxlZCB3YXkg
YnkgZ2V0dGluZyByaWQgb2YgUSBhcyBhIHJ1bnRpbWUgdHlwZSBlbnRpcmVseSwgcmVwbGFjaW5n
IGl0PGJyPsKgwqAgd2l0aCBhIHJlZmluZW1lbnQgdHlwZSB3aGljaCBzdGF5cyBpbiB0aGUgYmFj
a2dyb3VuZCB1bnRpbCBpdCBpcyBhY3R1YWxseTxicj7CoMKgIG5lZWRlZC4gPGJyPsKgLSBXZSBz
aG91bGQgZXJhc2UgUSBmcm9tIG1ldGhvZCBhbmQgZmllbGQgZGVzY3JpcHRvcnMgYW5kIGZyb20g
dGhlIG9idmlvdXM8YnI+wqDCoCBtaXJyb3JzLCBiZWNhdXNlIHJlZmluZW1lbnQgaW5mb3JtYXRp
b24gaXMgb24gYSBuZWVkLXRvLWtub3cgYmFzaXMuIDxicj7CoC0gUmVmaW5lbWVudCBpbmZvcm1h
dGlvbiBwcmltYXJpbHkgZmxvd3MgZnJvbSBzb3VyY2UgLSZndDsgY2xhc3NmaWxlIC0mZ3Q7IFZN
LCBhbmQ8YnI+wqDCoCBtb3N0bHkgZG9lcyBub3QgZmxvdyBpbiB0aGUgb3RoZXIgZGlyZWN0aW9u
LsKgIFNwZWNpYWxpemVkIHJlZmxlY3Rpb24gbWlnaHQ8YnI+wqDCoCBleHBvc2UgaXQsIGJ1dCB3
ZSBzaG91bGQgZG8gc28gbm90IG9uIGdlbmVyYWwgcHJpbmNpcGxlcywgYnV0IGJhc2VkIG9uIHdo
ZXJlPGJyPsKgwqAgaXQgaXMgYWN0dWFsbHkgbmVlZGVkIGJ5IHRoZSBwcm9ncmFtbWluZyBtb2Rl
bC4gPGJyPsKgLSBOdWxsIHJlc3RyaWN0aW9uIGlzIG1vcmUgbGlrZSBzcGVjaWFsaXphdGlvbiB0
aGFuIG5vdDsgdGhleSBhcmUgYm90aCB2YWx1ZTxicj7CoMKgIHNldCByZWZpbmVtZW50cyB0aGF0
IHBvc3NpYmx5IGVuYWJsZSBsYXlvdXQgb3B0aW1pemF0aW9uLCBhbmQgd2Ugc2hvdWxkIHNlZWs8
YnI+wqDCoCB0byB0cmVhdCB0aGVtIHRoZSBzYW1lLiA8YnI+wqAtIFdoaWxlIGxlYXZpbmcgdGhl
IGRvb3Igb3BlbiBmb3IgYWRkaXRpb25hbCBraW5kcyBvZiBzcGVjaWVzIGFuZCB0eXBlPGJyPsKg
wqAgbWlncmF0aW9uLCB3ZSB1c2Ugb3VyIG5ldyBwb3dlcnMsIGF0IGZpcnN0LCBvbmx5IHRvIGRl
ZmluZSBmbGF0dGVuYWJsZSBmaWVsZHM8YnI+wqDCoCBhbmQgZmxhdHRlbmFibGUgb25lLWRpbWVu
c2lvbmFsIGFycmF5cy48YnI+PGJyPjxicj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>