<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body>
<div class="markdown-here-wrapper">
<p style="margin-bottom: 19.2px; margin-top: 0px;">On 23/10/2025
11:25, Stephan Herrmann wrote:</p>
<blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 119); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div class="external-content" id="extcontent-0" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">Hi
Maurizio
<br>
<br>
thanks for taking the time.
<br>
<br>
Am 22.10.25 um 12:05 schrieb Maurizio Cimadamore:
<br>
<blockquote type="cite">first, I'll note that this issue seems
dangerously close to this open spec issue:
<br>
<br>
<a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8016196">https://bugs.openjdk.org/browse/JDK-8016196</a> </blockquote>
<br>
In this particular issue I'm puzzled by this statement:
<br>
<br>
"The correct behavior is unspecified: what is the
parameterization of List that is a supertype of
ArrayList<?>? How do we derive it?"
<br>
<br>
Doesn't 4.10.2 clearly state that type arguments should be
captured here? <br>
</div>
</blockquote>
<p style="margin-bottom: 19.2px; margin-top: 0px;">Yes, but that
means that we will generate “spurious” capture variables during
inference which will end up in the result. Depending on the
case, this might result in failures.</p>
<p style="margin-bottom: 19.2px; margin-top: 0px;">Dan (CC’ed)
might add more details.</p>
<blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 119); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div class="external-content" id="extcontent-1" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<blockquote type="cite">We have other examples where applying
capture conversion during incorporation this way leads to
issues:
<br>
<br>
<a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8206142">https://bugs.openjdk.org/browse/JDK-8206142</a> </blockquote>
<br>
The issue states that rejecting the example is a regression
(in 9). FWIW, ecj accepts the example ever since Java 1.8.
Seeing that a fix for javac exists for many years, why is that
fix not applied? Is this an indication that perhaps JLS is to
be changed rather than javac? <br>
</div>
</blockquote>
IIRC, we realized that this is a case where we’re doomed no matter
what we do. When running that fix through our tests we got some
compatibility issues, so in general we were skeptical of applying
it w/o having some kind of spec coverage.
<blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 119); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div class="external-content" id="extcontent-2" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);"><br>
What do you recommend for the current issue? Is it OK for ecj
to accept the program, and if people complain about the
difference to javac, explain that this is a bug in javac? Or
are there any fine points in the spec which we are missing,
that justify rejecting? <br>
</div>
</blockquote>
<p style="margin-bottom: 19.2px; margin-top: 0px;">If this is
indeed connected to the spec issue I mentioned above, then I’d
say that it’s sad but also sort of ok for the compilers to
diverge, given that a “real” fix will in reality be a lot more
convoluted than just applying capture.</p>
<blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 119); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div class="external-content" id="extcontent-3" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);"><br>
<blockquote type="cite">(That said, I would have expected
javac to perform a capture there -- @Vicente, when you have
time, can you please take a look and see why javac is not
capturing?)
<br>
</blockquote>
<br>
OK, I might just wait for Vicente's answer here :) <br>
</div>
</blockquote>
<p style="margin-bottom: 19.2px; margin-top: 0px;">Ok.</p>
<p style="margin-bottom: 19.2px; margin-top: 0px;">Thanks<br>
Maurizio</p>
<blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin: 19.2px 0px; outline-color: rgb(119, 119, 119); padding-inline: 16px; padding-left: 16px; padding-right: 16px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div class="external-content" id="extcontent-4" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);"><br>
thanks,
<br>
Stephan
<br>
<blockquote type="cite">Thanks
<br>
Maurizio
<br>
<br>
On 21/10/2025 20:26, Stephan Herrmann wrote:
<br>
<blockquote type="cite">Once more, I have a bunch of tests
on my desk where javac and ecj disagree.
<br>
<br>
The pending fix for one case, makes ecj accept the
following program, which is rejected by javac:
<br>
<br>
//---
<br>
import java.util.function.Function;
<br>
public class Test {
<br>
public static void main(String[] args) {
<br>
C<B<?>> c = null;
<br>
m(
<br>
_ -> new A<>(c),
<br>
b -> b.intValue());
<br>
}
<br>
static <T, R> void
m(Function<B<Number>, A<T>> f1,
Function<T, R> f2) {}
<br>
static class A<U> {
<br>
public A(C<? extends C<U>> t) {}
<br>
}
<br>
private record B<V extends Number>(V t)
implements C<V> {
<br>
<br>
}
<br>
private interface C<W> {
<br>
W t();
<br>
}
<br>
}
<br>
//---
<br>
<br>
javac reports:
<br>
Test.java:5: error: cannot infer type arguments for
A<>
<br>
_ -> new
A<>((C<B<?>>) null),
<br>
^
<br>
reason: cannot infer type-variable(s) U
<br>
(argument mismatch; C<B<?>> cannot be
converted to C<? extends C<U>>)
<br>
where U is a type-variable:
<br>
U extends Object declared in class A
<br>
Test.java:6: error: cannot find symbol
<br>
b -> b.intValue());
<br>
^
<br>
symbol: method intValue()
<br>
location: variable b of type Object
<br>
2 errors
<br>
<br>
<br>
With my pending fix ecj would accept, with these details:
<br>
<br>
Outer inference of m() yields:
<br>
T#0 : capture#1-of ?
<br>
R#1 : java.lang.Integer
<br>
U#3 : capture#1-of ?
<br>
so m() resolves as:
<br>
void m(Function<B<Number>,A<capture#1-of
?>>, Function<capture#1-of ?,Integer>)
<br>
<br>
With target types
Function<B<Number>,A<capture#1-of ?>>
and Function<capture#1-of ?,Integer> the two lambdas
complete resolution just fine.
<br>
<br>
<br>
Am I missing any detail, why this inference solution is
not valid?
<br>
<br>
<br>
FYI, the pending fix relates to capturing while computing
super types of A<?>. While normally we ensure
uniqueness of captures per source location, when type
inference requests a capture for supertype computation we
use the current invocation as the point of reference,
i.e., repeatedly capturing the same wildcard during one
invocation of type inference will share one unified
capture. Is this OK? Or what are the rules for uniqueness
vs. unification in this case?
<br>
<br>
<br>
<br>
thanks,
<br>
Stephan
<br>
</blockquote>
</blockquote>
<br>
<br>
<br>
</div>
</blockquote>
</div>
<div class="mdhr-raw" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0;padding:0;margin:0;" aria-hidden="true" title="MDH:PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDIzLzEwLzIwMjUgMTE6MjUsIFN0ZXBoYW4gSGVycm1hbm4gd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIHR5cGU9ImNpdGUiIGNpdGU9Im1pZDo5NjIzNjI5ZC0wNzE0LTQwNmItYjg5YS1mYjZjYTgyOWFhN2NAYmVybGluLmRlIj5IaSBNYXVyaXppbwo8YnI+Cjxicj50aGFua3MgZm9yIHRha2luZyB0aGUgdGltZS4KPGJyPgo8YnI+QW0gMjIuMTAuMjUgdW0gMTI6MDUgc2NocmllYiBNYXVyaXppbyBDaW1hZGFtb3JlOgo8YnI+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+Zmlyc3QsIEknbGwgbm90ZSB0aGF0IHRoaXMgaXNzdWUgc2VlbXMgZGFuZ2Vyb3VzbHkgY2xvc2UgdG8gdGhpcyBvcGVuIHNwZWMgaXNzdWU6Cjxicj4KPGJyPmh0dHBzOi8vYnVncy5vcGVuamRrLm9yZy9icm93c2UvSkRLLTgwMTYxOTYgCjwvYmxvY2txdW90ZT4KPGJyPkluIHRoaXMgcGFydGljdWxhciBpc3N1ZSBJJ20gcHV6emxlZCBieSB0aGlzIHN0YXRlbWVudDoKPGJyPgo8YnI+IlRoZSBjb3JyZWN0IGJlaGF2aW9yIGlzIHVuc3BlY2lmaWVkOiB3aGF0IGlzIHRoZSBwYXJhbWV0ZXJpemF0aW9uIG9mIExpc3QgdGhhdCAKaXMgYSBzdXBlcnR5cGUgb2YgQXJyYXlMaXN0Jmx0Oz8mZ3Q7PyBIb3cgZG8gd2UgZGVyaXZlIGl0PyIKPGJyPgo8YnI+RG9lc24ndCA0LjEwLjIgY2xlYXJseSBzdGF0ZSB0aGF0IHR5cGUgYXJndW1lbnRzIHNob3VsZCBiZSBjYXB0dXJlZCBoZXJlPyZuYnNwOzxicj48L2Jsb2NrcXVvdGU+PHA+WWVzLCBidXQgdGhhdCBtZWFucyB0aGF0IHdlIHdpbGwgZ2VuZXJhdGUgInNwdXJpb3VzIiBjYXB0dXJlIHZhcmlhYmxlcyBkdXJpbmcgaW5mZXJlbmNlIHdoaWNoIHdpbGwgZW5kIHVwIGluIHRoZSByZXN1bHQuIERlcGVuZGluZyBvbiB0aGUgY2FzZSwgdGhpcyBtaWdodCByZXN1bHQgaW4gZmFpbHVyZXMuPC9wPjxwPkRhbiAoQ0MnZWQpIG1pZ2h0IGFkZCBtb3JlIGRldGFpbHMuPC9wPjxwPiZsdDtzbmlwJmd0OzwvcD48YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6OTYyMzYyOWQtMDcxNC00MDZiLWI4OWEtZmI2Y2E4MjlhYTdjQGJlcmxpbi5kZSI+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+V2UgaGF2ZSBvdGhlciBleGFtcGxlcyB3aGVyZSBhcHBseWluZyBjYXB0dXJlIGNvbnZlcnNpb24gZHVyaW5nIGluY29ycG9yYXRpb24gCnRoaXMgd2F5IGxlYWRzIHRvIGlzc3VlczoKPGJyPgo8YnI+aHR0cHM6Ly9idWdzLm9wZW5qZGsub3JnL2Jyb3dzZS9KREstODIwNjE0MiAKPC9ibG9ja3F1b3RlPgo8YnI+VGhlIGlzc3VlIHN0YXRlcyB0aGF0IHJlamVjdGluZyB0aGUgZXhhbXBsZSBpcyBhIHJlZ3Jlc3Npb24gKGluIDkpLiBGV0lXLCBlY2ogCmFjY2VwdHMgdGhlIGV4YW1wbGUgZXZlciBzaW5jZSBKYXZhIDEuOC4gU2VlaW5nIHRoYXQgYSBmaXggZm9yIGphdmFjIGV4aXN0cyBmb3IgCm1hbnkgeWVhcnMsIHdoeSBpcyB0aGF0IGZpeCBub3QgYXBwbGllZD8gSXMgdGhpcyBhbiBpbmRpY2F0aW9uIHRoYXQgcGVyaGFwcyBKTFMgCmlzIHRvIGJlIGNoYW5nZWQgcmF0aGVyIHRoYW4gamF2YWM/Jm5ic3A7PGJyPjwvYmxvY2txdW90ZT5JSVJDLCB3ZSByZWFsaXplZCB0aGF0IHRoaXMgaXMgYSBjYXNlIHdoZXJlIHdlJ3JlIGRvb21lZCBubyBtYXR0ZXIgd2hhdCB3ZSBkby4gV2hlbiBydW5uaW5nIHRoYXQgZml4IHRocm91Z2ggb3VyIHRlc3RzIHdlIGdvdCBzb21lIGNvbXBhdGliaWxpdHkgaXNzdWVzLCBzbyBpbiBnZW5lcmFsIHdlIHdlcmUgc2tlcHRpY2FsIG9mIGFwcGx5aW5nIGl0IHcvbyBoYXZpbmcgc29tZSBraW5kIG9mIHNwZWMgY292ZXJhZ2UuPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOjk2MjM2MjlkLTA3MTQtNDA2Yi1iODlhLWZiNmNhODI5YWE3Y0BiZXJsaW4uZGUiPjxicj5XaGF0IGRvIHlvdSByZWNvbW1lbmQgZm9yIHRoZSBjdXJyZW50IGlzc3VlPyBJcyBpdCBPSyBmb3IgZWNqIHRvIGFjY2VwdCB0aGUgCnByb2dyYW0sIGFuZCBpZiBwZW9wbGUgY29tcGxhaW4gYWJvdXQgdGhlIGRpZmZlcmVuY2UgdG8gamF2YWMsIGV4cGxhaW4gdGhhdCB0aGlzIAppcyBhIGJ1ZyBpbiBqYXZhYz8gT3IgYXJlIHRoZXJlIGFueSBmaW5lIHBvaW50cyBpbiB0aGUgc3BlYyB3aGljaCB3ZSBhcmUgCm1pc3NpbmcsIHRoYXQganVzdGlmeSByZWplY3Rpbmc/Jm5ic3A7PGJyPjwvYmxvY2txdW90ZT48cD5JZiB0aGlzIGlzIGluZGVlZCBjb25uZWN0ZWQgdG8gdGhlIHNwZWMgaXNzdWUgSSBtZW50aW9uZWQgYWJvdmUsIHRoZW4gSSdkIHNheSB0aGF0IGl0J3Mgc2FkIGJ1dCBhbHNvIHNvcnQgb2Ygb2sgZm9yIHRoZSBjb21waWxlcnMgdG8gZGl2ZXJnZSwgZ2l2ZW4gdGhhdCBhICJyZWFsIiBmaXggd2lsbCBpbiByZWFsaXR5IGJlIGEgbG90IG1vcmUgY29udm9sdXRlZCB0aGFuIGp1c3QgYXBwbHlpbmcgY2FwdHVyZS48L3A+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOjk2MjM2MjlkLTA3MTQtNDA2Yi1iODlhLWZiNmNhODI5YWE3Y0BiZXJsaW4uZGUiPjxicj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4oVGhhdCBzYWlkLCBJIHdvdWxkIGhhdmUgZXhwZWN0ZWQgamF2YWMgdG8gcGVyZm9ybSBhIGNhcHR1cmUgdGhlcmUgLS0gQFZpY2VudGUsIAp3aGVuIHlvdSBoYXZlIHRpbWUsIGNhbiB5b3UgcGxlYXNlIHRha2UgYSBsb29rIGFuZCBzZWUgd2h5IGphdmFjIGlzIG5vdCBjYXB0dXJpbmc/KQo8YnI+PC9ibG9ja3F1b3RlPgo8YnI+T0ssIEkgbWlnaHQganVzdCB3YWl0IGZvciBWaWNlbnRlJ3MgYW5zd2VyIGhlcmUgOikmbmJzcDs8YnI+PC9ibG9ja3F1b3RlPjxwPk9rLjwvcD48cD5UaGFua3M8YnI+TWF1cml6aW88L3A+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOjk2MjM2MjlkLTA3MTQtNDA2Yi1iODlhLWZiNmNhODI5YWE3Y0BiZXJsaW4uZGUiPjxicj50aGFua3MsCjxicj5TdGVwaGFuCjxicj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIj5UaGFua3MKPGJyPk1hdXJpemlvCjxicj4KPGJyPk9uIDIxLzEwLzIwMjUgMjA6MjYsIFN0ZXBoYW4gSGVycm1hbm4gd3JvdGU6Cjxicj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIj5PbmNlIG1vcmUsIEkgaGF2ZSBhIGJ1bmNoIG9mIHRlc3RzIG9uIG15IGRlc2sgd2hlcmUgamF2YWMgYW5kIGVjaiBkaXNhZ3JlZS4KPGJyPgo8YnI+VGhlIHBlbmRpbmcgZml4IGZvciBvbmUgY2FzZSwgbWFrZXMgZWNqIGFjY2VwdCB0aGUgZm9sbG93aW5nIHByb2dyYW0sIHdoaWNoIGlzIApyZWplY3RlZCBieSBqYXZhYzoKPGJyPgo8YnI+Ly8tLS0KPGJyPmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247Cjxicj5wdWJsaWMgY2xhc3MgVGVzdCB7Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewo8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEMmbHQ7QiZsdDs/Jmd0OyZndDsgYyA9IG51bGw7Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgbSgKPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBfIC0mZ3Q7IG5ldyBBJmx0OyZndDsoYyksCjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYiAtJmd0OyBiLmludFZhbHVlKCkpOwo8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0aWMgJmx0O1QsIFImZ3Q7IHZvaWQgbShGdW5jdGlvbiZsdDtCJmx0O051bWJlciZndDssIEEmbHQ7VCZndDsmZ3Q7IGYxLCBGdW5jdGlvbiZsdDtULCBSJmd0OyBmMikge30KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBzdGF0aWMgY2xhc3MgQSZsdDtVJmd0OyB7Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIEEoQyZsdDs/IGV4dGVuZHMgQyZsdDtVJmd0OyZndDsgdCkge30KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB9Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgcHJpdmF0ZSByZWNvcmQgQiZsdDtWIGV4dGVuZHMgTnVtYmVyJmd0OyhWIHQpIGltcGxlbWVudHMgQyZsdDtWJmd0OyB7Cjxicj4KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB9Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgcHJpdmF0ZSBpbnRlcmZhY2UgQyZsdDtXJmd0OyB7Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgVyB0KCk7Cjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgfQo8YnI+fQo8YnI+Ly8tLS0KPGJyPgo8YnI+amF2YWMgcmVwb3J0czoKPGJyPlRlc3QuamF2YTo1OiBlcnJvcjogY2Fubm90IGluZmVyIHR5cGUgYXJndW1lbnRzIGZvciBBJmx0OyZndDsKPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBfIC0mZ3Q7IG5ldyBBJmx0OyZndDsoKEMmbHQ7QiZsdDs/Jmd0OyZndDspIG51bGwpLAo8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IF4KPGJyPiZuYnNwOyByZWFzb246IGNhbm5vdCBpbmZlciB0eXBlLXZhcmlhYmxlKHMpIFUKPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAoYXJndW1lbnQgbWlzbWF0Y2g7IEMmbHQ7QiZsdDs/Jmd0OyZndDsgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBDJmx0Oz8gZXh0ZW5kcyBDJmx0O1UmZ3Q7Jmd0OykKPGJyPiZuYnNwOyB3aGVyZSBVIGlzIGEgdHlwZS12YXJpYWJsZToKPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBVIGV4dGVuZHMgT2JqZWN0IGRlY2xhcmVkIGluIGNsYXNzIEEKPGJyPlRlc3QuamF2YTo2OiBlcnJvcjogY2Fubm90IGZpbmQgc3ltYm9sCjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYiAtJmd0OyBiLmludFZhbHVlKCkpOwo8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IF4KPGJyPiZuYnNwOyBzeW1ib2w6Jm5ic3A7Jm5ic3A7IG1ldGhvZCBpbnRWYWx1ZSgpCjxicj4mbmJzcDsgbG9jYXRpb246IHZhcmlhYmxlIGIgb2YgdHlwZSBPYmplY3QKPGJyPjIgZXJyb3JzCjxicj4KPGJyPgo8YnI+V2l0aCBteSBwZW5kaW5nIGZpeCBlY2ogd291bGQgYWNjZXB0LCB3aXRoIHRoZXNlIGRldGFpbHM6Cjxicj4KPGJyPk91dGVyIGluZmVyZW5jZSBvZiBtKCkgeWllbGRzOgo8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7VCMwJm5ic3A7Jm5ic3A7Jm5ic3A7IDombmJzcDsmbmJzcDsmbmJzcDsgY2FwdHVyZSMxLW9mID8KPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1IjMSZuYnNwOyZuYnNwOyZuYnNwOyA6Jm5ic3A7Jm5ic3A7Jm5ic3A7IGphdmEubGFuZy5JbnRlZ2VyCjxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtVIzMmbmJzcDsmbmJzcDsmbmJzcDsgOiZuYnNwOyZuYnNwOyZuYnNwOyBjYXB0dXJlIzEtb2YgPwo8YnI+c28gbSgpIHJlc29sdmVzIGFzOgo8YnI+dm9pZCBtKEZ1bmN0aW9uJmx0O0ImbHQ7TnVtYmVyJmd0OyxBJmx0O2NhcHR1cmUjMS1vZiA/Jmd0OyZndDssIEZ1bmN0aW9uJmx0O2NhcHR1cmUjMS1vZiA/LEludGVnZXImZ3Q7KQo8YnI+Cjxicj5XaXRoIHRhcmdldCB0eXBlcyBGdW5jdGlvbiZsdDtCJmx0O051bWJlciZndDssQSZsdDtjYXB0dXJlIzEtb2YgPyZndDsmZ3Q7IGFuZCAKRnVuY3Rpb24mbHQ7Y2FwdHVyZSMxLW9mID8sSW50ZWdlciZndDsgdGhlIHR3byBsYW1iZGFzIGNvbXBsZXRlIHJlc29sdXRpb24ganVzdCBmaW5lLgo8YnI+Cjxicj4KPGJyPkFtIEkgbWlzc2luZyBhbnkgZGV0YWlsLCB3aHkgdGhpcyBpbmZlcmVuY2Ugc29sdXRpb24gaXMgbm90IHZhbGlkPwo8YnI+Cjxicj4KPGJyPkZZSSwgdGhlIHBlbmRpbmcgZml4IHJlbGF0ZXMgdG8gY2FwdHVyaW5nIHdoaWxlIGNvbXB1dGluZyBzdXBlciB0eXBlcyBvZiBBJmx0Oz8mZ3Q7LiAKV2hpbGUgbm9ybWFsbHkgd2UgZW5zdXJlIHVuaXF1ZW5lc3Mgb2YgY2FwdHVyZXMgcGVyIHNvdXJjZSBsb2NhdGlvbiwgd2hlbiB0eXBlIAppbmZlcmVuY2UgcmVxdWVzdHMgYSBjYXB0dXJlIGZvciBzdXBlcnR5cGUgY29tcHV0YXRpb24gd2UgdXNlIHRoZSBjdXJyZW50IAppbnZvY2F0aW9uIGFzIHRoZSBwb2ludCBvZiByZWZlcmVuY2UsIGkuZS4sIHJlcGVhdGVkbHkgY2FwdHVyaW5nIHRoZSBzYW1lIAp3aWxkY2FyZCBkdXJpbmcgb25lIGludm9jYXRpb24gb2YgdHlwZSBpbmZlcmVuY2Ugd2lsbCBzaGFyZSBvbmUgdW5pZmllZCAKY2FwdHVyZS4gSXMgdGhpcyBPSz8gT3Igd2hhdCBhcmUgdGhlIHJ1bGVzIGZvciB1bmlxdWVuZXNzIHZzLiB1bmlmaWNhdGlvbiBpbiAKdGhpcyBjYXNlPwo8YnI+Cjxicj4KPGJyPgo8YnI+dGhhbmtzLAo8YnI+U3RlcGhhbgo8YnI+PC9ibG9ja3F1b3RlPjwvYmxvY2txdW90ZT4KPGJyPgo8YnI+Cjxicj48L2Jsb2NrcXVvdGU+PHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IHRleHRjb21wbGV0ZS1kcm9wZG93biIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMTAwMDsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiIHBvcG92ZXI9ImF1dG8iPjwvdWw+">​</div>
</body>
</html>