Re: Strange Struts 7 Tag Limit Issue
Lukasz Lenart <[email protected]> Sat, 18 Oct 2025 12:52:53 +0200
| Newsgroups | gmane.comp.jakarta.struts.user |
|---|---|
| Message-ID | <CAMopvkMce6dJGWVTiYtY-HWaNKgYrwu3t56Tdir5GBBhyD-+AA@mail.gmail.com> |
--000000000000a3828006416ca70f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I used Claude Code to analyze this problem and I got a big document (attached), but you can try this for now: - [ ] Enable WARN logging for `org.apache.struts2.util.FastByteArrayOutputStream` - [ ] Reproduce the truncation and check logs for encoding warnings - [ ] Identify the exact character position where truncation occurs - [ ] Examine the character(s) at and immediately after the truncation poin= t - [ ] Verify `struts.i18n.encoding` is set to "UTF-8" - [ ] Verify JSP `pageEncoding` and `contentType` both specify "UTF-8" - [ ] Check if SiteMesh is decorating the JSON response (should be excluded= ) - [ ] Compare `response.getCharacterEncoding()` between Tomcat 10 and Tomca= t 11 - [ ] Test with JSON plugin instead of JSP rendering - [ ] Check for any custom filters or interceptors that wrap the response Cheers =C5=81ukasz sob., 18 pa=C5=BA 2025 o 04:12 Zoran Avtarovski <[email protected]> n= apisa=C5=82(a): > > Hi Guys, > > We are almost ready to go into final testing on our Struts 7 app > migration, except for a small issue when we render JSON responses and we > can't work out where the issue is. > > The problem presents when we try and render JSON response to a jsp page, > but only when going through an action first. I should stress this works > fine on tomcat 10 using the same build of Struts and SiteMesh. > > As a simple test we created a method on our action class which sets a > page accessible parameter to a long sample JSON string: > > public String ajaxTest(){ > ajaxResponse =3D " [{\"name\": \"Adeel > Solangi\",\"language\": \"Sindhi\",\"id\": \"V59OF92YF627HFY0\",\"bio\": > ... I have attached the full JSON text but cropped in the email for clari= ty > return SUCCESS; > } > > On the resulting jsp page, see below, it results in the JSON string > being cropped and the browser complaining of invalid JSON: > > <%@ page contentType=3D"application/json; charset=3DUTF-8" %> > <%@ taglib prefix=3D"s" uri=3D"/struts-tags"%><s:property > value=3D"%{ajaxResponse}" escapeHtml=3D"false"/> > > We also tried using JSTL tags which has the same result: > > <%@ page contentType=3D"application/json; charset=3DUTF-8" %><%@ taglib > uri=3D"jakarta.tags.core" prefix=3D"c"%><c:out value=3D"${ajaxResponse}" > escapeXml=3D"false"/> > > The strange part is if we set the variable in the JSP page and just call > the page directly via testPage.jsp it works as expected: > > <%@ page contentType=3D"text/html;charset=3DUTF-8" language=3D"java" > pageEncoding=3D"UTF-8"%> > <%@ taglib prefix=3D"s" uri=3D"/struts-tags"%> > <s:set var=3D"ajaxText"> > [{"name": "Adeel Solangi","language": "Sindhi","id": > "V59OF92YF627HFY0","bio": "Donec lobortis eleifend condimentum. ... > </s:set> > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" > "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> > <html xmlns=3D"http://www.w3.org/1999/xhtml" xml:lang=3D"en" lang=3D"en"> > <head> > <title>SpareEngine</title> > <meta http-equiv=3D"Content-Type" content=3D"text/html;charset= =3Dutf8" /> > </head> > <body> > <div class=3D"main-body"> > <s:property value=3D"%{ajaxText}" escapeHtml=3D"false"/> > </div> > </body> > </html> > > Because the plain JSP renders correctly I don't think it is a tomcat > issue, but I can't be certain. Any help would be appreciated. > > Z. > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] --000000000000a3828006416ca70f Content-Type: text/markdown; charset="UTF-8"; name="2025-10-18-json-truncation-jakarta-migration.md" Content-Disposition: attachment; filename="2025-10-18-json-truncation-jakarta-migration.md" Content-Transfer-Encoding: base64 Content-ID: <f_mgw5s61m0> X-Attachment-Id: f_mgw5s61m0 LS0tCmRhdGU6IDIwMjUtMTAtMThUMTI6NDM6MTArMDI6MDAKdG9waWM6ICJKU09OIFJlc3BvbnNl IFRydW5jYXRpb24gaW4gU3RydXRzIDcgSmFrYXJ0YSBFRSBNaWdyYXRpb24iCnRhZ3M6IFtyZXNl YXJjaCwgY29kZWJhc2UsIGpha2FydGEtZWUsIGpzb24sIHJlc3BvbnNlLWhhbmRsaW5nLCBlbmNv ZGluZywgc2l0ZW1lc2gsIHN0cnV0czddCnN0YXR1czogY29tcGxldGUKZ2l0X2NvbW1pdDogMDZm OWY5MzAzMzg3ZWRmMDU1N2QxMjhiYmQ3MTIzYmRlZDRmMjRmNQotLS0KCiMgUmVzZWFyY2g6IEpT T04gUmVzcG9uc2UgVHJ1bmNhdGlvbiBpbiBTdHJ1dHMgNyBKYWthcnRhIEVFIE1pZ3JhdGlvbgoK KipEYXRlKio6IDIwMjUtMTAtMThUMTI6NDM6MTArMDI6MDAKCiMjIFJlc2VhcmNoIFF1ZXN0aW9u CgpVc2VyIHJlcG9ydHMgSlNPTiByZXNwb25zZXMgYmVpbmcgdHJ1bmNhdGVkIHdoZW4gcmVuZGVy ZWQgdGhyb3VnaCBTdHJ1dHMgYWN0aW9ucyBvbiBUb21jYXQgMTEgKEpha2FydGEgRUUgMTApLCBi dXQgdGhlIHNhbWUgY29kZSB3b3JrcyBjb3JyZWN0bHkgb24gVG9tY2F0IDEwIChqYXZheCkuIFRo ZSB0cnVuY2F0aW9uIG9ubHkgb2NjdXJzIHdoZW46Ci0gR29pbmcgdGhyb3VnaCBhIFN0cnV0cyBh Y3Rpb24gdGhhdCBzZXRzIGEgcGFyYW1ldGVyCi0gUmVuZGVyaW5nIHdpdGggYDxzOnByb3BlcnR5 PmAgb3IgSlNUTCBgPGM6b3V0PmAgdGFncyBpbiBKU1AKLSBEb2VzIE5PVCBvY2N1ciB3aGVuIHRo ZSB2YWx1ZSBpcyBzZXQgZGlyZWN0bHkgaW4gSlNQIHVzaW5nIGA8czpzZXQ+YAoKVGhlIHVzZXIg aXMgdGVzdGluZyBhIFN0cnV0cyA3IGFwcGxpY2F0aW9uIG1pZ3JhdGlvbiBhbmQgdGhpcyBpcyBi bG9ja2luZyBmaW5hbCB0ZXN0aW5nLgoKIyMgU3VtbWFyeQoKKipSb290IENhdXNlIElkZW50aWZp ZWQqKjogVGhlIGlzc3VlIGlzICoqTk9UIGEgSmFrYXJ0YSBFRSBtaWdyYXRpb24gYnVnKiosIGJ1 dCByYXRoZXIgYSAqKmNoYXJhY3RlciBlbmNvZGluZyB0cnVuY2F0aW9uIGlzc3VlKiogaW4gYEZh c3RCeXRlQXJyYXlPdXRwdXRTdHJlYW1gIHRoYXQgYmVjb21lcyBleHBvc2VkIGluIGNlcnRhaW4g cmVzcG9uc2UgcGlwZWxpbmUgY29uZmlndXJhdGlvbnMsIHBhcnRpY3VsYXJseSB3aGVuIFNpdGVN ZXNoIHJlc3BvbnNlIGJ1ZmZlcmluZyBpcyBjb21iaW5lZCB3aXRoIFN0cnV0cyBhY3Rpb24tYmFz ZWQgcmVuZGVyaW5nLgoKKipLZXkgRmluZGluZyoqOiBUaGUgYEZhc3RCeXRlQXJyYXlPdXRwdXRT dHJlYW0ud3JpdGVUbyhXcml0ZXIsIFN0cmluZyBlbmNvZGluZylgIG1ldGhvZCB1c2VzIGEgYENo YXJzZXREZWNvZGVyYCBjb25maWd1cmVkIHdpdGggYENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVGAg Zm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggY2F1c2VzIGRlY29kaW5nIHRvIGhhbHQgYW5kIHRy dW5jYXRlIG91dHB1dCB3aGVuIGVuY291bnRlcmluZyBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJl IHByb3Blcmx5IGRlY29kZWQgaW4gdGhlIHRhcmdldCBlbmNvZGluZy4KCioqQ3JpdGljYWwgRGlm ZmVyZW5jZSoqOiBEaXJlY3QgSlNQIHJlbmRlcmluZyBieXBhc3NlcyB0aGUgZW5jb2RpbmcgY29u dmVyc2lvbiBwaXBlbGluZSwgd2hpbGUgYWN0aW9uLWJhc2VkIHJlbmRlcmluZyBtYXkgdHJpZ2dl ciBgRmFzdEJ5dGVBcnJheU91dHB1dFN0cmVhbWAgZW5jb2RpbmcgY29udmVyc2lvbiwgZXhwb3Np bmcgdGhlIHRydW5jYXRpb24gYmVoYXZpb3IuCgojIyBEZXRhaWxlZCBGaW5kaW5ncwoKIyMjIDEu IEpha2FydGEgRUUgTWlncmF0aW9uIFN0YXR1cyAtIENPTVBMRVRFIEFORCBDT1JSRUNUCgoqKkZp bmRpbmcqKjogQWxsIFN0cnV0cyBjb2RlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBtaWdyYXRlZCB0 byBKYWthcnRhIEVFIG5hbWVzcGFjZXMuCgoqKkV2aWRlbmNlKio6Ci0gQWxsIGBqYXZheC5zZXJ2 bGV0LmpzcC5Kc3BXcml0ZXJgIHJlZmVyZW5jZXMg4oaSIGBqYWthcnRhLnNlcnZsZXQuanNwLkpz cFdyaXRlcmAKLSBBbGwgSlNQIHRhZyBpbXBsZW1lbnRhdGlvbnMgdXNlIEpha2FydGEgbmFtZXNw YWNlcwotIFNpdGVNZXNoIDMuMi4yIGlzIEpha2FydGEgRUUgOSsgY29tcGF0aWJsZQotIFNlYXJj aCBmb3IgYGphdmF4LnNlcnZsZXQuanNwYCByZXR1cm5lZCAqKnplcm8gcmVzdWx0cyoqCgoqKkZp bGVzIFZlcmlmaWVkKio6Ci0gW0Zhc3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YToyMV0oaHR0 cHM6Ly9naXRodWIuY29tL2FwYWNoZS9zdHJ1dHMvYmxvYi8wNmY5ZjkzMDMzODdlZGYwNTU3ZDEy OGJiZDcxMjNiZGVkNGYyNGY1L2NvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIv dXRpbC9GYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEjTDIxKSAtIFVzZXMgYGpha2FydGEu c2VydmxldC5qc3AuSnNwV3JpdGVyYAotIFtDb21wb25lbnRUYWdTdXBwb3J0LmphdmE6MjVdKGh0 dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3RydXRzL2Jsb2IvMDZmOWY5MzAzMzg3ZWRmMDU1N2Qx MjhiYmQ3MTIzYmRlZDRmMjRmNS9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMy L3ZpZXdzL2pzcC9Db21wb25lbnRUYWdTdXBwb3J0LmphdmEjTDI1KSAtIFVzZXMgYGpha2FydGEu c2VydmxldC5qc3AuSnNwRXhjZXB0aW9uYAotIFtQcm9wZXJ0eS5qYXZhXShodHRwczovL2dpdGh1 Yi5jb20vYXBhY2hlL3N0cnV0cy9ibG9iLzA2ZjlmOTMwMzM4N2VkZjA1NTdkMTI4YmJkNzEyM2Jk ZWQ0ZjI0ZjUvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9jb21wb25lbnRz L1Byb3BlcnR5LmphdmEpIC0gUHVyZSBKYXZhLCBubyBzZXJ2bGV0IEFQSSBkZXBlbmRlbmNpZXMK CioqQ29uY2x1c2lvbioqOiBKYWthcnRhIEVFIG1pZ3JhdGlvbiBpcyBub3QgdGhlIGNhdXNlIG9m IHRoZSB0cnVuY2F0aW9uIGlzc3VlLgoKLS0tCgojIyMgMi4gQ2hhcmFjdGVyIEVuY29kaW5nIFRy dW5jYXRpb24gaW4gRmFzdEJ5dGVBcnJheU91dHB1dFN0cmVhbQoKKipGaWxlKio6IGBjb3JlL3Ny Yy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL3V0aWwvRmFzdEJ5dGVBcnJheU91dHB1dFN0 cmVhbS5qYXZhYAoKKipDcml0aWNhbCBDb2RlIC0gTGluZXMgODctMTA3Kio6CmBgYGphdmEKcHVi bGljIHZvaWQgd3JpdGVUbyhXcml0ZXIgb3V0LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4 Y2VwdGlvbiB7CiAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewogICAgICAgIENoYXJzZXREZWNv ZGVyIGRlY29kZXIgPSBnZXREZWNvZGVyKGVuY29kaW5nKTsKICAgICAgICBDaGFyQnVmZmVyIGNo YXJCdWZmZXIgPSBDaGFyQnVmZmVyLmFsbG9jYXRlKGJ1ZmZlci5sZW5ndGgpOwogICAgICAgIGZs b2F0IGJ5dGVzUGVyQ2hhciA9IGRlY29kZXIuY2hhcnNldCgpLm5ld0VuY29kZXIoKS5tYXhCeXRl c1BlckNoYXIoKTsKICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFs bG9jYXRlKChpbnQpIChidWZmZXIubGVuZ3RoICsgYnl0ZXNQZXJDaGFyKSk7CgogICAgICAgIGlm IChidWZmZXJzICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChieXRlW10gYnl0ZXMgOiBidWZm ZXJzKSB7CiAgICAgICAgICAgICAgICBkZWNvZGVBbmRXcml0ZU91dChvdXQsIGJ5dGVzLCBieXRl cy5sZW5ndGgsIGJ5dGVCdWZmZXIsIGNoYXJCdWZmZXIsIGRlY29kZXIsIGZhbHNlKTsKICAgICAg ICAgICAgfQogICAgICAgIH0KICAgICAgICBkZWNvZGVBbmRXcml0ZU91dChvdXQsIGJ1ZmZlciwg aW5kZXgsIGJ5dGVCdWZmZXIsIGNoYXJCdWZmZXIsIGRlY29kZXIsIHRydWUpOwogICAgfSBlbHNl IHsKICAgICAgICAvLyBEaXJlY3Qgd3JpdGUgd2l0aG91dCBlbmNvZGluZyBjb252ZXJzaW9uCiAg ICAgICAgaWYgKGJ1ZmZlcnMgIT0gbnVsbCkgewogICAgICAgICAgICBmb3IgKGJ5dGVbXSBieXRl cyA6IGJ1ZmZlcnMpIHsKICAgICAgICAgICAgICAgIHdyaXRlT3V0KG91dCwgYnl0ZXMsIGJ5dGVz Lmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd3JpdGVPdXQob3V0LCBi dWZmZXIsIGluZGV4KTsKICAgIH0KfQpgYGAKCioqRGVjb2RpbmcgTG9vcCAtIExpbmVzIDE2NS0x ODEqKjoKYGBgamF2YQpwcml2YXRlIENvZGVyUmVzdWx0IGRlY29kZUFuZFdyaXRlKFdyaXRlciB3 cml0ZXIsIEJ5dGVCdWZmZXIgaW4sIENoYXJCdWZmZXIgb3V0LCBDaGFyc2V0RGVjb2RlciBkZWNv ZGVyLCBib29sZWFuIGVuZE9mSW5wdXQpIHsKICAgIENvZGVyUmVzdWx0IHJlc3VsdDsKICAgIGRv IHsKICAgICAgICByZXN1bHQgPSBkZWNvZGVyLmRlY29kZShpbiwgb3V0LCBlbmRPZklucHV0KTsK ICAgICAgICBvdXQuZmxpcCgpOwogICAgICAgIHdyaXRlci53cml0ZShvdXQuYXJyYXkoKSwgb3V0 LmFycmF5T2Zmc2V0KCksIG91dC5yZW1haW5pbmcoKSk7CiAgICAgICAgb3V0LmNsZWFyKCk7CiAg ICAgICAgLy8gTG9vcCBjb250aW51ZXMgT05MWSBpZiBubyBlcnJvciBhbmQgYnVmZmVyIG92ZXJm bG93CiAgICB9IHdoaWxlIChpbi5oYXNSZW1haW5pbmcoKSAmJiByZXN1bHQuaXNPdmVyZmxvdygp ICYmICFyZXN1bHQuaXNFcnJvcigpKTsKCiAgICBpZiAocmVzdWx0LmlzRXJyb3IoKSkgewogICAg ICAgIGlmIChMT0cuaXNXYXJuRW5hYmxlZCgpKSB7CiAgICAgICAgICAgIExPRy53YXJuKCJCdWZm ZXIgZGVjb2RpbmctaW4tdG8tb3V0IFt7fV0gZmFpbGVkLCBjb2RlclJlc3VsdCBbe31dIiwKICAg ICAgICAgICAgICAgICAgICAgZGVjb2Rlci5jaGFyc2V0KCkubmFtZSgpLCByZXN1bHQudG9TdHJp bmcoKSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQpgYGAKCioqRGVjb2Rl ciBDb25maWd1cmF0aW9uIC0gTGluZXMgMTEzLTExOCoqOgpgYGBqYXZhCnByaXZhdGUgQ2hhcnNl dERlY29kZXIgZ2V0RGVjb2RlcihTdHJpbmcgZW5jb2RpbmcpIHsKICAgIENoYXJzZXQgY2hhcnNl dCA9IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7CiAgICByZXR1cm4gY2hhcnNldC5uZXdEZWNv ZGVyKCkKICAgICAgICAgICAgLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQ T1JUKSAgICAgIC8vIOKGkCBSRVBPUlRTIGVycm9ycywgaGFsdHMgZGVjb2RpbmcKICAgICAgICAg ICAgLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsgLy8g UmVwbGFjZXMgdW5tYXBwYWJsZSBjaGFycwp9CmBgYAoKKipUZXN0IEV2aWRlbmNlIC0gYEZhc3RC eXRlQXJyYXlPdXRwdXRTdHJlYW1UZXN0LmphdmE6MTUxLTIwOGAqKjoKYGBgamF2YQovLyBUZXN0 IGV4cGxpY2l0bHkgZG9jdW1lbnRzIGVuY29kaW5nIHRydW5jYXRpb24gYmVoYXZpb3IKcHVibGlj IHZvaWQgdGVzdElTTzg4NTlfMVdyaXRlVG9VVEY4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICBG YXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgRmFzdEJ5dGVBcnJheU91dHB1dFN0 cmVhbSgpOwoKICAgIC8vIFdyaXRlIElTTy04ODU5LTEgZW5jb2RlZCBieXRlcwogICAgYmFvcy53 cml0ZShpc284ODU5XzFfYnl0ZUFycmF5KTsKCiAgICAvLyBUcnkgdG8gZGVjb2RlIGFzIFVURi04 IC0gd2lsbCB0cnVuY2F0ZSBhdCBhY2NlbnRlZCBjaGFyYWN0ZXJzCiAgICBhc3NlcnRGYWxzZSgi VVRGLTggc3RyaW5nIG1hdGNoZXMgYnVmZmVyIHdyaXRlIHJlc3VsdCAobm8gdHJ1bmNhdGlvbiki LAogICAgICAgICAgICAgICAgdXRmOF9TdHJpbmcuZXF1YWxzKGJhb3MudG9TdHJpbmcoIlVURi04 IikpKTsKCiAgICBhc3NlcnRUcnVlKCJCdWZmZXIgd3JpdGUgcmVzdWx0IG5vdCB0cnVuY2F0ZWQi LAogICAgICAgICAgICAgICBiYW9zLnRvU3RyaW5nKCJVVEYtOCIpLmxlbmd0aCgpIDwgdXRmOF9T dHJpbmcubGVuZ3RoKCkpOwogICAgLy8g4oaRIFRlc3QgRVhQRUNUUyB0cnVuY2F0aW9uIHdoZW4g ZW5jb2RpbmcgbWlzbWF0Y2ggb2NjdXJzCn0KYGBgCgoqKkhpc3RvcmljYWwgSXNzdWUgUmVmZXJl bmNlKio6Ci0gTGluZSAxOTggcmVmZXJlbmNlcyBgV1ctNDM4M2AgLSBpbmZpbml0ZSBsb29wIGlz c3VlIHRoYXQgcmVxdWlyZWQgb3V0cHV0IGNsZWFyaW5nCgotLS0KCiMjIyAzLiBTdHJ1dHMgUHJv cGVydHkgVGFnIFJlbmRlcmluZyBQaXBlbGluZQoKKipGaWxlKio6IGBjb3JlL3NyYy9tYWluL2ph dmEvb3JnL2FwYWNoZS9zdHJ1dHMyL2NvbXBvbmVudHMvUHJvcGVydHkuamF2YWAKCioqTWFpbiBS ZW5kZXJpbmcgLSBMaW5lcyAxMzQtMTU4Kio6CmBgYGphdmEKcHVibGljIGJvb2xlYW4gc3RhcnQo V3JpdGVyIHdyaXRlcikgewogICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5zdGFydCh3cml0ZXIp OwoKICAgIFN0cmluZyBhY3R1YWxWYWx1ZTsKCiAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAg ICAgIHZhbHVlID0gInRvcCI7CiAgICB9CgogICAgLy8gUmV0cmlldmUgdmFsdWUgZnJvbSBPR05M IFZhbHVlU3RhY2sKICAgIGFjdHVhbFZhbHVlID0gKFN0cmluZykgZ2V0U3RhY2soKS5maW5kVmFs dWUodmFsdWUsIFN0cmluZy5jbGFzcywgdGhyb3dFeGNlcHRpb25PbkVMRmFpbHVyZSk7CgogICAg dHJ5IHsKICAgICAgICBpZiAoYWN0dWFsVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICB3cml0 ZXIud3JpdGUocHJlcGFyZShhY3R1YWxWYWx1ZSkpOyAgLy8gRGlyZWN0IHdyaXRlIHRvIEpTUCB3 cml0ZXIKICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAg ICAgIHdyaXRlci53cml0ZShwcmVwYXJlKGRlZmF1bHRWYWx1ZSkpOwogICAgICAgIH0KICAgIH0g Y2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICBMT0cuaW5mbygiQ291bGQgbm90IHByaW50 IG91dCB2YWx1ZSAne30nIiwgdmFsdWUsIGUpOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7Cn0K YGBgCgoqKkVzY2FwaW5nIExvZ2ljIC0gTGluZXMgMTYwLTE3NyoqOgpgYGBqYXZhCnByaXZhdGUg U3RyaW5nIHByZXBhcmUoU3RyaW5nIHZhbHVlKSB7CiAgICBTdHJpbmcgcmVzdWx0ID0gdmFsdWU7 CgogICAgaWYgKGVzY2FwZUh0bWwpIHsKICAgICAgICByZXN1bHQgPSBTdHJpbmdFc2NhcGVVdGls cy5lc2NhcGVIdG1sNChyZXN1bHQpOwogICAgfQogICAgaWYgKGVzY2FwZUphdmFTY3JpcHQpIHsK ICAgICAgICByZXN1bHQgPSBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVFY21hU2NyaXB0KHJlc3Vs dCk7CiAgICB9CiAgICBpZiAoZXNjYXBlWG1sKSB7CiAgICAgICAgcmVzdWx0ID0gU3RyaW5nRXNj YXBlVXRpbHMuZXNjYXBlWG1sMTAocmVzdWx0KTsKICAgIH0KICAgIGlmIChlc2NhcGVDc3YpIHsK ICAgICAgICByZXN1bHQgPSBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVDc3YocmVzdWx0KTsKICAg IH0KCiAgICByZXR1cm4gcmVzdWx0Owp9CmBgYAoKKipEZWZhdWx0IEVzY2FwZSBTZXR0aW5nKio6 Ci0gTGluZSA5NTogYHByaXZhdGUgYm9vbGVhbiBlc2NhcGVIdG1sID0gdHJ1ZTtgIC0gKipIVE1M IGVzY2FwaW5nIGVuYWJsZWQgYnkgZGVmYXVsdCoqCi0gVXNlciBjb3JyZWN0bHkgdXNlcyBgZXNj YXBlSHRtbD0iZmFsc2UiYCBpbiB0aGVpciBKU1AKCioqRmxvdyoqOgoxLiBgUHJvcGVydHlUYWdg IChKU1AgaGFuZGxlcikgY3JlYXRlcyBgUHJvcGVydHlgIGNvbXBvbmVudAoyLiBDb21wb25lbnQg cmV0cmlldmVzIHZhbHVlIGZyb20gVmFsdWVTdGFjayAoYWN0aW9uJ3MgcHJvcGVydHkpCjMuIFZh bHVlIHBhc3NlZCB0aHJvdWdoIGBwcmVwYXJlKClgIGZvciBlc2NhcGluZyAodXNlciBkaXNhYmxl cyBIVE1MIGVzY2FwaW5nKQo0LiBFc2NhcGVkIHZhbHVlIHdyaXR0ZW4gdG8gYFdyaXRlcmAgKGNv dWxkIGJlIGBKc3BXcml0ZXJgIGRpcmVjdGx5IG9yIGJ1ZmZlcmVkIHdyaXRlcikKCioqS2V5IE9i c2VydmF0aW9uKio6IFRoZSBgUHJvcGVydHlgIGNvbXBvbmVudCB3cml0ZXMgZGlyZWN0bHkgdG8g dGhlIHByb3ZpZGVkIGBXcml0ZXJgLiBJZiB0aGlzIHdyaXRlciBpcyBiYWNrZWQgYnkgYEZhc3RC eXRlQXJyYXlPdXRwdXRTdHJlYW1gIHdpdGggZW5jb2RpbmcgY29udmVyc2lvbiwgdHJ1bmNhdGlv biBjYW4gb2NjdXIuCgotLS0KCiMjIyA0LiBTaXRlTWVzaCBJbnRlZ3JhdGlvbiBhbmQgUmVzcG9u c2UgQnVmZmVyaW5nCgoqKkNvbmZpZ3VyYXRpb24qKjogYGFwcHMvc2hvd2Nhc2Uvc3JjL21haW4v d2ViYXBwL1dFQi1JTkYvd2ViLnhtbGAKCioqRmlsdGVyIENoYWluKio6CmBgYHhtbAo8IS0tIE9y ZGVyIGlzIGNyaXRpY2FsIC0tPgoxLiBzdHJ1dHMtcHJlcGFyZSAgICAtIFByZXBhcmVzIEFjdGlv bkNvbnRleHQKMi4gc2l0ZW1lc2gzICAgICAgICAgLSBCdWZmZXJzIHJlc3BvbnNlIGZvciBkZWNv cmF0aW9uCjMuIHN0cnV0cy1leGVjdXRlICAgIC0gRXhlY3V0ZXMgYWN0aW9uCmBgYAoKKipTaXRl TWVzaCBWZXJzaW9uKio6IDMuMi4yIChKYWthcnRhIEVFIGNvbXBhdGlibGUpCgoqKlNpdGVNZXNo IENvbmZpZ3VyYXRpb24qKjogYGFwcHMvc2hvd2Nhc2Uvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYv c2l0ZW1lc2gzLnhtbGAKYGBgeG1sCjxzaXRlbWVzaD4KICAgIDxtYXBwaW5nIHBhdGg9Ii8qIiBk ZWNvcmF0b3I9Im1haW4uanNwIi8+CiAgICA8bWFwcGluZyBwYXRoPSIvZGVidWcuanNwIiBleGNs dWRlPSJ0cnVlIi8+CiAgICA8IS0tIEpTT04gZW5kcG9pbnRzIHNob3VsZCBiZSBleGNsdWRlZCAt LT4KPC9zaXRlbWVzaD4KYGBgCgoqKlNpdGVNZXNoIFJlc3BvbnNlIFdyYXBwZXIgQmVoYXZpb3Iq KjoKLSBTaXRlTWVzaCAzLnggd3JhcHMgdGhlIGBIdHRwU2VydmxldFJlc3BvbnNlYCB0byBidWZm ZXIgKipBTEwgb3V0cHV0KioKLSBCdWZmZXJlZCBjb250ZW50IGlzIHJlYWQgYWZ0ZXIgYWN0aW9u IGV4ZWN1dGlvbgotIERlY29yYXRvciB0ZW1wbGF0ZSBpcyBhcHBsaWVkIHRvIGJ1ZmZlcmVkIGNv bnRlbnQKLSBGaW5hbCBkZWNvcmF0ZWQgb3V0cHV0IHNlbnQgdG8gY2xpZW50CgoqKlN0cnV0cy1T aXRlTWVzaCBJbnRlcmFjdGlvbioqOgoKRmlsZTogYGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBh Y2hlL3N0cnV0czIvdmlld3MvZnJlZW1hcmtlci9GcmVlbWFya2VyUmVzdWx0LmphdmE6MzQ0YApg YGBqYXZhCi8vIFRyaWdnZXIgU2l0ZU1lc2ggZGVhY3RpdmF0aW9uIHdoZW4gaW5zaWRlIGFjdGlv biB0YWcKcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUocmVzcG9uc2UuZ2V0Q29udGVudFR5cGUoKSk7 CmBgYAoKKipLZXkgSW5zaWdodCoqOiBTaXRlTWVzaCBidWZmZXJzIHRoZSBlbnRpcmUgcmVzcG9u c2UuIElmIHRoZSBidWZmZXJpbmcgbWVjaGFuaXNtIHVzZXMgY2hhcmFjdGVyIGVuY29kaW5nIGNv bnZlcnNpb24gKHdoaWNoIG1pZ2h0IGRpZmZlciBiZXR3ZWVuIFRvbWNhdCAxMCBhbmQgVG9tY2F0 IDExIGltcGxlbWVudGF0aW9ucyksIHRoZSBgRmFzdEJ5dGVBcnJheU91dHB1dFN0cmVhbWAgZW5j b2RpbmcgaXNzdWUgY291bGQgYmUgdHJpZ2dlcmVkLgoKLS0tCgojIyMgNS4gUmVzcG9uc2UgV3Jp dGVyIGFuZCBCdWZmZXIgSGFuZGxpbmcKCioqSW5jbHVkZSBDb21wb25lbnQncyBQYWdlUmVzcG9u c2UgV3JhcHBlcioqOgoKRmlsZTogYGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0 czIvY29tcG9uZW50cy9JbmNsdWRlLmphdmE6MzgwLTQyMGAKCmBgYGphdmEKc3RhdGljIGZpbmFs IGNsYXNzIFBhZ2VSZXNwb25zZSBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsK ICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgcGFnZVByaW50V3JpdGVyOwogICAgcHJpdmF0ZSBQYWdl T3V0cHV0U3RyZWFtIHBhZ2VPdXRwdXRTdHJlYW0gPSBudWxsOwoKICAgIHB1YmxpYyBGYXN0Qnl0 ZUFycmF5T3V0cHV0U3RyZWFtIGdldENvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAg ICAgIGlmIChwYWdlUHJpbnRXcml0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBwYWdlUHJpbnRX cml0ZXIuZmx1c2goKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgoUGFnZU91dHB1dFN0cmVh bSkgZ2V0T3V0cHV0U3RyZWFtKCkpLmdldEJ1ZmZlcigpOwogICAgfQoKICAgIEBPdmVycmlkZQog ICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAg ICAgICAgaWYgKHBhZ2VQcmludFdyaXRlciA9PSBudWxsKSB7CiAgICAgICAgICAgIHBhZ2VQcmlu dFdyaXRlciA9IG5ldyBQcmludFdyaXRlcigKICAgICAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJl YW1Xcml0ZXIoZ2V0T3V0cHV0U3RyZWFtKCksIGdldENoYXJhY3RlckVuY29kaW5nKCkpKTsKICAg ICAgICB9CiAgICAgICAgcmV0dXJuIHBhZ2VQcmludFdyaXRlcjsKICAgIH0KfQpgYGAKCioqUGFn ZU91dHB1dFN0cmVhbSAtIExpbmVzIDMxMC0zNDAqKjoKYGBgamF2YQpzdGF0aWMgZmluYWwgY2xh c3MgUGFnZU91dHB1dFN0cmVhbSBleHRlbmRzIFNlcnZsZXRPdXRwdXRTdHJlYW0gewogICAgcHJp dmF0ZSBmaW5hbCBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlcjsKCiAgICBwdWJsaWMg UGFnZU91dHB1dFN0cmVhbSgpIHsKICAgICAgICBidWZmZXIgPSBuZXcgRmFzdEJ5dGVBcnJheU91 dHB1dFN0cmVhbSgpOwogICAgfQoKICAgIHB1YmxpYyBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFt IGdldEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgZmx1c2goKTsKICAgICAg ICByZXR1cm4gYnVmZmVyOwogICAgfQp9CmBgYAoKKipUaGlzIGlzIGEgcG90ZW50aWFsIHRyaWdn ZXIqKjogSWYgdGhlIEluY2x1ZGUgY29tcG9uZW50IChvciBzaW1pbGFyIHJlc3BvbnNlIHdyYXBw aW5nKSBpcyBpbiB0aGUgcGlwZWxpbmUsIGBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtYCBpcyB1 c2VkLCBhbmQgaWYgZW5jb2RpbmcgY29udmVyc2lvbiBoYXBwZW5zLCB0cnVuY2F0aW9uIGNhbiBv Y2N1ci4KCi0tLQoKIyMjIDYuIENoYXJhY3RlciBFbmNvZGluZyBDb25maWd1cmF0aW9uIFBvaW50 cwoKKipEaXNwYXRjaGVyIEVuY29kaW5nIFNldHVwKio6CgpGaWxlOiBgY29yZS9zcmMvbWFpbi9q YXZhL29yZy9hcGFjaGUvc3RydXRzMi9kaXNwYXRjaGVyL0Rpc3BhdGNoZXIuamF2YTo5NjYtOTc5 YAoKYGBgamF2YQpTdHJpbmcgZW5jb2RpbmcgPSBnZXRFbmNvZGluZygpOwoKaWYgKCFlbmNvZGlu Zy5lcXVhbHMocmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKSkgewogICAgdHJ5IHsKICAg ICAgICByZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nKGVuY29kaW5nKTsKICAgIH0gY2F0Y2gg KEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgTE9HLndhcm4oIkNhbm5vdCBzZXQgcmVxdWVzdCBjaGFy YWN0ZXIgZW5jb2RpbmcgdG8ge30iLCBlbmNvZGluZywgZSk7CiAgICB9Cn0KCmlmICghZW5jb2Rp bmcuZXF1YWxzKHJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCkpKSB7CiAgICByZXNwb25z ZS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmNvZGluZyk7Cn0KYGBgCgoqKkluY2x1ZGUgQ29tcG9u ZW50IEVuY29kaW5nIExvZ2ljKio6CgpGaWxlOiBgY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFj aGUvc3RydXRzMi9jb21wb25lbnRzL0luY2x1ZGUuamF2YToxMjUtMTQwYAoKYGBgamF2YQpTdHJp bmcgZW5jb2RpbmdGb3JJbmNsdWRlOwoKaWYgKHVzZVJlc3BvbnNlRW5jb2RpbmcpIHsKICAgIGVu Y29kaW5nRm9ySW5jbHVkZSA9IHJlcy5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOyAgLy8gVXNlIHBh Z2UgZW5jb2RpbmcKICAgIGlmIChlbmNvZGluZ0ZvckluY2x1ZGUgPT0gbnVsbCB8fCBlbmNvZGlu Z0ZvckVuY29kaW5nLmlzRW1wdHkoKSkgewogICAgICAgIGVuY29kaW5nRm9ySW5jbHVkZSA9IGRl ZmF1bHRFbmNvZGluZzsgIC8vIEZhbGxiYWNrCiAgICB9Cn0gZWxzZSB7CiAgICBlbmNvZGluZ0Zv ckluY2x1ZGUgPSBkZWZhdWx0RW5jb2Rpbmc7Cn0KYGBgCgoqKkNyaXRpY2FsIFBvaW50Kio6IElm IGByZXNwb25zZS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpYCByZXR1cm5zIGEgZGlmZmVyZW50IGVu Y29kaW5nIHRoYW4gdGhlIGNvbnRlbnQncyBhY3R1YWwgZW5jb2RpbmcsIGFuZCBgRmFzdEJ5dGVB cnJheU91dHB1dFN0cmVhbS53cml0ZVRvKHdyaXRlciwgZW5jb2RpbmcpYCBpcyBjYWxsZWQsICoq ZW5jb2RpbmcgY29udmVyc2lvbiBjYW4gZmFpbCBhbmQgdHJ1bmNhdGUqKi4KCi0tLQoKIyMjIDcu IEJ1ZmZlciBTaXplIENvbmZpZ3VyYXRpb25zCgoqKk5vIFJlc3BvbnNlIFNpemUgTGltaXRzKio6 IFN0cnV0cyBkb2VzIG5vdCBpbXBvc2UgZXhwbGljaXQgcmVzcG9uc2Ugc2l6ZSBsaW1pdHMgZm9y IEhUTUwvSlNPTiByZXNwb25zZXMuCgoqKkZhc3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gLSBCbG9j ay1CYXNlZCBHcm93dGgqKjoKLSBEZWZhdWx0IGJsb2NrIHNpemU6ICoqODE5MiBieXRlcyoqICg4 S0IpCi0gVXNlcyBgTGlua2VkTGlzdDxieXRlW10+YCB0byBncm93IGluZGVmaW5pdGVseQotICoq Tm8gbWF4aW11bSBzaXplIGxpbWl0KioKLSBMaW5lcyA0OS02MzogQXV0b21hdGljYWxseSBhZGRz IG5ldyBidWZmZXJzIHdoZW4gY3VycmVudCBibG9jayBmaWxscwoKKipGcmVlbWFya2VyUmVzdWx0 IC0gQ2hhckFycmF5V3JpdGVyKio6Ci0gVXNlcyBKREsncyBgQ2hhckFycmF5V3JpdGVyYCAoZ3Jv d3MgdG8gYEludGVnZXIuTUFYX1ZBTFVFYCkKLSBObyBwcmFjdGljYWwgc2l6ZSBsaW1pdCAob25s eSBoZWFwIG1lbW9yeSkKCioqU3RyZWFtL1BsYWluVGV4dCBSZXN1bHRzKio6Ci0gYFN0cmVhbVJl c3VsdGA6IDEwMjQgYnl0ZXMgYnVmZmVyCi0gYFBsYWluVGV4dFJlc3VsdGA6IDEwMjQgY2hhcmFj dGVycyBidWZmZXIKLSBOb3QgcmVsZXZhbnQgZm9yIEpTUCByZW5kZXJpbmcKCioqQ29uY2x1c2lv bioqOiBCdWZmZXIgc2l6ZSBsaW1pdHMgYXJlICoqTk9UIHRoZSBjYXVzZSoqIG9mIHRydW5jYXRp b24uCgotLS0KCiMjIyA4LiBKc3BXcml0ZXIgQnVmZmVyIEJlaGF2aW9yIC0gamF2YXggdnMgamFr YXJ0YQoKKipBUEkgQ29tcGF0aWJpbGl0eSoqOiBUaGUgYEpzcFdyaXRlcmAgaW50ZXJmYWNlIGlz ICoqaWRlbnRpY2FsKiogYmV0d2VlbjoKLSBgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyYCAo SmF2YSBFRSA4LCBUb21jYXQgMTApCi0gYGpha2FydGEuc2VydmxldC5qc3AuSnNwV3JpdGVyYCAo SmFrYXJ0YSBFRSAxMCwgVG9tY2F0IDExKQoKKipObyBBUEkgQ2hhbmdlcyoqOiBUaGUgSmFrYXJ0 YSBFRSAxMCBtaWdyYXRpb24gZGlkIG5vdCBjaGFuZ2UgYW55IG1ldGhvZCBzaWduYXR1cmVzIG9y IGJlaGF2aW9yIGluIHRoZSBKU1AgQVBJIHNwZWNpZmljYXRpb24uCgoqKkNvbnRhaW5lciBJbXBs ZW1lbnRhdGlvbiBEaWZmZXJlbmNlcyoqOiBIb3dldmVyLCAqKnNlcnZsZXQgY29udGFpbmVyIGlt cGxlbWVudGF0aW9ucyBtYXkgZGlmZmVyKio6Cgp8IEFzcGVjdCB8IFRvbWNhdCAxMC4xLnggKGph dmF4KSB8IFRvbWNhdCAxMS54IChqYWthcnRhKSB8CnwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0t LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBEZWZhdWx0IGJ1ZmZlciBzaXplIHwgOEtC IHwgOEtCIChzYW1lKSB8CnwgQXV0by1mbHVzaCBiZWhhdmlvciB8IE9uIGJ1ZmZlciBmdWxsIHwg T24gYnVmZmVyIGZ1bGwgKHNhbWUpIHwKfCBDaGFyYWN0ZXIgZW5jb2RpbmcgfCBDb250YWluZXIg Y2hhcnNldCB8IENvbnRhaW5lciBjaGFyc2V0IHwKfCAqKkltcGxlbWVudGF0aW9uIGNsYXNzKiog fCBgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BXcml0ZXJJbXBsYCB8IGBvcmcuYXBhY2hl Lmphc3Blci5ydW50aW1lLkpzcFdyaXRlckltcGxgIChzYW1lIHBhY2thZ2UpIHwKCioqUG90ZW50 aWFsIERpZmZlcmVuY2UqKjogV2hpbGUgdGhlIEFQSSBhbmQgZGVmYXVsdCBUb21jYXQgaW1wbGVt ZW50YXRpb24gYXJlIHRoZSBzYW1lLCAqKmNoYXJhY3RlciBlbmNvZGluZyBoYW5kbGluZyBpbiB0 aGUgc2VydmxldCBjb250YWluZXIncyByZXNwb25zZSBwaXBlbGluZSoqIG1pZ2h0IGhhdmUgc3Vi dGxlIGRpZmZlcmVuY2VzIGR1ZSB0bzoKMS4gSW50ZXJuYWwgSmFrYXJ0YSBTZXJ2bGV0IDYuMCBj aGFuZ2VzCjIuIFVwZGF0ZWQgY2hhcmFjdGVyIGVuY29kaW5nIGxpYnJhcmllcyBpbiBUb21jYXQg MTEKMy4gRGlmZmVyZW50IGRlZmF1bHQgY2hhcnNldCBoYW5kbGluZyBpbiBKYWthcnRhIFNlcnZs ZXQgQVBJCgotLS0KCiMjIyA5LiBXaHkgRGlyZWN0IEpTUCBXb3JrcyBidXQgQWN0aW9uLUJhc2Vk IFJlbmRlcmluZyBGYWlscwoKKipEaXJlY3QgSlNQIFJlbmRlcmluZyoqIChgPHM6c2V0PmAgaW4g SlNQKToKYGBgClJlcXVlc3Qg4oaSIFNpdGVNZXNoIEZpbHRlciDihpIgSlNQIEVuZ2luZSDihpIg SnNwV3JpdGVyIChkaXJlY3QpIOKGkiBTaXRlTWVzaCBCdWZmZXIg4oaSIFJlc3BvbnNlCmBgYAot IFZhbHVlIHNldCBpbiBKU1Agc2NvcGUKLSBgPHM6cHJvcGVydHk+YCByZWFkcyBmcm9tIEpTUCBz Y29wZSB2YXJpYWJsZQotIFdyaXR0ZW4gZGlyZWN0bHkgdG8gYEpzcFdyaXRlcmAKLSAqKk5vIGVu Y29kaW5nIGNvbnZlcnNpb24qKiB0aHJvdWdoIGBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtYAot IFNpdGVNZXNoIGJ1ZmZlcnMgYXQgdGhlIHNlcnZsZXQgbGV2ZWwgKG5vdCBjaGFyYWN0ZXIgZW5j b2RpbmcgbGV2ZWwpCgoqKkFjdGlvbi1CYXNlZCBSZW5kZXJpbmcqKiAoQWN0aW9uIHBhcmFtZXRl ciDihpIgSlNQKToKYGBgClJlcXVlc3Qg4oaSIFNpdGVNZXNoIEZpbHRlciDihpIgQWN0aW9uIEV4 ZWN1dGlvbiDihpIgVmFsdWVTdGFjayDihpIgPHM6cHJvcGVydHk+IOKGkiBXcml0ZXIgKD8pIOKG kiBTaXRlTWVzaCBCdWZmZXIg4oaSIFJlc3BvbnNlCmBgYAoKKipDcml0aWNhbCBEaWZmZXJlbmNl Kio6IERlcGVuZGluZyBvbiB0aGUgcmVzcG9uc2Ugd3JhcHBlciBjaGFpbiBhbmQgaW5jbHVkZSBj b21wb25lbnRzOgoxLiBBY3Rpb24gc2V0cyB2YWx1ZSBvbiBpdHNlbGYgKEphdmEgU3RyaW5nIGlu IG1lbW9yeSkKMi4gVmFsdWUgcHVzaGVkIHRvIFZhbHVlU3RhY2sKMy4gYDxzOnByb3BlcnR5PmAg cmV0cmlldmVzIGZyb20gVmFsdWVTdGFjawo0LiBJZiB0aGUgd3JpdGVyIGNoYWluIGluY2x1ZGVz IGBQYWdlUmVzcG9uc2VgIHdpdGggYFBhZ2VPdXRwdXRTdHJlYW1gOgogICAtIFdyaXRlciDihpIg YFByaW50V3JpdGVyYCDihpIgYE91dHB1dFN0cmVhbVdyaXRlcihlbmNvZGluZylgIOKGkiBgUGFn ZU91dHB1dFN0cmVhbWAg4oaSIGBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtYAogICAtIExhdGVy LCBjb250ZW50IHJlYWQgdmlhIGBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlVG8od3Jp dGVyLCBlbmNvZGluZylgCiAgIC0gKipFbmNvZGluZyBjb252ZXJzaW9uIGhhcHBlbnMgaGVyZSoq IOKGkiB0cnVuY2F0aW9uIHJpc2sKNS4gU2l0ZU1lc2ggcmVhZHMgYnVmZmVyZWQgY29udGVudCDi hpIgYXBwbGllcyBkZWNvcmF0b3IKCioqSHlwb3RoZXNpcyoqOiBUaGUgSW5jbHVkZSBjb21wb25l bnQncyByZXNwb25zZSB3cmFwcGVyIChvciBzaW1pbGFyIG1lY2hhbmlzbSkgaXMgc29tZWhvdyBp biB0aGUgYWN0aW9uLWJhc2VkIHJlbmRlcmluZyBwaXBlbGluZSBidXQgbm90IGluIHRoZSBkaXJl Y3QgSlNQIHBpcGVsaW5lLgoKLS0tCgojIyMgMTAuIEtub3duIENoYXJhY3RlciBFbmNvZGluZyBJ c3N1ZXMKCioqSGlzdG9yaWNhbCBJc3N1ZXMqKjoKLSAqKldXLTQzODMqKjogSW5maW5pdGUgbG9v cCBpbiBvdXRwdXQgY2xlYXJpbmcgKHJlZmVyZW5jZWQgaW4gRmFzdEJ5dGVBcnJheU91dHB1dFN0 cmVhbSkKLSBUZXN0IHN1aXRlIGV4cGxpY2l0bHkgdmFsaWRhdGVzIGVuY29kaW5nIHRydW5jYXRp b24gYmVoYXZpb3IKCioqVGVzdCBFdmlkZW5jZSoqOgoKRmlsZTogYGNvcmUvc3JjL3Rlc3QvamF2 YS9vcmcvYXBhY2hlL3N0cnV0czIvdXRpbC9GYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtVGVzdC5q YXZhOjE1MS0yMDhgCgoqKlRlc3Q6IGB0ZXN0SVNPODg1OV8xV3JpdGVUb1VURjhgKio6Ci0gV3Jp dGVzIElTTy04ODU5LTEgZW5jb2RlZCBieXRlcwotIEF0dGVtcHRzIHRvIGRlY29kZSBhcyBVVEYt OAotICoqRXhwZWN0cyBhbmQgdmFsaWRhdGVzIHRydW5jYXRpb24qKiB3aGVuIGVuY29kaW5nIG1p c21hdGNoIG9jY3VycwotIFJlc3VsdCBzdHJpbmcgbGVuZ3RoIDwgaW5wdXQgc3RyaW5nIGxlbmd0 aAoKKipJbnRlcnByZXRhdGlvbioqOiBUaGUgdHJ1bmNhdGlvbiBiZWhhdmlvciBpcyAqKmRvY3Vt ZW50ZWQgYW5kIHRlc3RlZCoqLCBidXQgdGhpcyBzdWdnZXN0cyBpdCdzIGFuICoqYWNjZXB0ZWQg bGltaXRhdGlvbioqIHJhdGhlciB0aGFuIGEgYnVnLiBIb3dldmVyLCB0aGlzIGJlaGF2aW9yIGJl Y29tZXMgcHJvYmxlbWF0aWMgd2hlbjoKMS4gQ29udGVudCBlbmNvZGluZyBkaWZmZXJzIGZyb20g cmVzcG9uc2UgZW5jb2RpbmcKMi4gSlNPTiBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUgQVND SUkgcmFuZ2UgKDAtMTI3KQozLiBUaGUgcmVzcG9uc2UgcGlwZWxpbmUgdHJpZ2dlcnMgZW5jb2Rp bmcgY29udmVyc2lvbgoKLS0tCgojIyBDb2RlIFJlZmVyZW5jZXMKCiMjIyBDb3JlIFRydW5jYXRp b24gTG9naWMKLSBgY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi91dGlsL0Zh c3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YTo4Ny0xMDdgIC0gYHdyaXRlVG8oV3JpdGVyLCBT dHJpbmcpYCBlbmNvZGluZyBjb252ZXJzaW9uCi0gYGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBh Y2hlL3N0cnV0czIvdXRpbC9GYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmE6MTEzLTExOGAg LSBEZWNvZGVyIHdpdGggUkVQT1JUIG9uIG1hbGZvcm1lZCBpbnB1dAotIGBjb3JlL3NyYy9tYWlu L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL3V0aWwvRmFzdEJ5dGVBcnJheU91dHB1dFN0cmVhbS5q YXZhOjE2NS0xODFgIC0gRGVjb2RpbmcgbG9vcCB0aGF0IGhhbHRzIG9uIGVycm9yCgojIyMgUHJv cGVydHkgVGFnIFJlbmRlcmluZwotIGBjb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdHJ1 dHMyL2NvbXBvbmVudHMvUHJvcGVydHkuamF2YToxMzQtMTU4YCAtIE1haW4gcmVuZGVyaW5nIGxv Z2ljCi0gYGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvY29tcG9uZW50cy9Q cm9wZXJ0eS5qYXZhOjE2MC0xNzdgIC0gRXNjYXBlIGhhbmRsaW5nCi0gYGNvcmUvc3JjL21haW4v amF2YS9vcmcvYXBhY2hlL3N0cnV0czIvdmlld3MvanNwL1Byb3BlcnR5VGFnLmphdmE6NDctNjFg IC0gSlNQIHRhZyBsaWZlY3ljbGUKCiMjIyBSZXNwb25zZSBCdWZmZXJpbmcKLSBgY29yZS9zcmMv bWFpbi9qYXZhL29yZy9hcGFjaGUvc3RydXRzMi9jb21wb25lbnRzL0luY2x1ZGUuamF2YTozMTAt MzQwYCAtIFBhZ2VPdXRwdXRTdHJlYW0gd2l0aCBGYXN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtCi0g YGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvY29tcG9uZW50cy9JbmNsdWRl LmphdmE6MzgwLTQyMGAgLSBQYWdlUmVzcG9uc2Ugd3JhcHBlcgotIGBjb3JlL3NyYy9tYWluL2ph dmEvb3JnL2FwYWNoZS9zdHJ1dHMyL3ZpZXdzL2ZyZWVtYXJrZXIvRnJlZW1hcmtlclJlc3VsdC5q YXZhOjM0NGAgLSBTaXRlTWVzaCBkZWFjdGl2YXRpb24KCiMjIyBFbmNvZGluZyBDb25maWd1cmF0 aW9uCi0gYGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvZGlzcGF0Y2hlci9E aXNwYXRjaGVyLmphdmE6OTY2LTk3OWAgLSBSZXF1ZXN0L3Jlc3BvbnNlIGVuY29kaW5nIHNldHVw Ci0gYGNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0cnV0czIvY29tcG9uZW50cy9JbmNs dWRlLmphdmE6MTI1LTE0MGAgLSBJbmNsdWRlIGVuY29kaW5nIGxvZ2ljCgojIyMgVGVzdCBFdmlk ZW5jZQotIGBjb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdHJ1dHMyL3V0aWwvRmFzdEJ5 dGVBcnJheU91dHB1dFN0cmVhbVRlc3QuamF2YToxNTEtMjA4YCAtIEVuY29kaW5nIHRydW5jYXRp b24gdGVzdAoKLS0tCgojIyBBcmNoaXRlY3R1cmUgSW5zaWdodHMKCiMjIyAxLiBGYXN0Qnl0ZUFy cmF5T3V0cHV0U3RyZWFtIERlc2lnbgoKKipQdXJwb3NlKio6IEVmZmljaWVudCBieXRlIGJ1ZmZl cmluZyB3aXRob3V0IHRoZSBvdmVyaGVhZCBvZiBgQnl0ZUFycmF5T3V0cHV0U3RyZWFtYCdzIGFy cmF5IGNvcHlpbmcKCioqRGVzaWduKio6Ci0gQmxvY2stYmFzZWQgZ3Jvd3RoIHVzaW5nIGBMaW5r ZWRMaXN0PGJ5dGVbXT5gCi0gRGVmYXVsdCA4S0IgYmxvY2tzCi0gTm8gYXJyYXkgY29weWluZy9y ZXNpemluZyAodW5saWtlIGBCeXRlQXJyYXlPdXRwdXRTdHJlYW1gKQotIE9wdGltaXplZCBmb3Ig d3JpdGUtb25jZSwgcmVhZC1vbmNlIHNjZW5hcmlvcwoKKipUcmFkZS1vZmYqKjogQ2hhcmFjdGVy IGVuY29kaW5nIGNvbnZlcnNpb24gdXNlcyBgQ2hhcnNldERlY29kZXJgIHdpdGggc3RyaWN0IGVy cm9yIHJlcG9ydGluZywgd2hpY2ggcHJpb3JpdGl6ZXMgKipjb3JyZWN0bmVzcyBvdmVyIGxlbmll bmN5KiouIE1hbGZvcm1lZCBpbnB1dCBjYXVzZXMgZGVjb2RpbmcgdG8gaGFsdCByYXRoZXIgdGhh biBtYWtpbmcgYXNzdW1wdGlvbnMuCgojIyMgMi4gUmVzcG9uc2UgUGlwZWxpbmUgTGF5ZXJpbmcK ClN0cnV0cycgcmVzcG9uc2UgaGFuZGxpbmcgaW52b2x2ZXMgbXVsdGlwbGUgbGF5ZXJzOgoKYGBg CkFjdGlvbiDihpIgVmFsdWVTdGFjayDihpIgQ29tcG9uZW50IChQcm9wZXJ0eSkg4oaSIFdyaXRl ciAoYWJzdHJhY3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAg4oaTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBK c3BXcml0ZXIgKGRpcmVjdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBPUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUmVzcG9uc2UgV3JhcHBlciBDaGFpbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIOKGkiBPdXRwdXRTdHJlYW1Xcml0ZXIoZW5jb2Rp bmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaT CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlT3V0cHV0 U3RyZWFtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg 4oaTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0Qnl0 ZUFycmF5T3V0cHV0U3RyZWFtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAg4oaTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBMYXRlcjogd3JpdGVUbyh3cml0ZXIsIGVuY29kaW5nKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgSnNwV3JpdGVyIOKGkiBTaXRlTWVzaCBCdWZmZXIg4oaS IFJlc3BvbnNlCmBgYAoKKipJbXBsaWNhdGlvbioqOiBUaGUgZXhhY3Qgd3JpdGVyIGNoYWluIGRl cGVuZHMgb246Ci0gV2hldGhlciBpbmNsdWRlcyBhcmUgYmVpbmcgcHJvY2Vzc2VkCi0gV2hldGhl ciBTaXRlTWVzaCBpcyBhY3RpdmUKLSBXaGV0aGVyIHRlbXBsYXRlcyAoRnJlZW1hcmtlci9WZWxv Y2l0eSkgYXJlIGludm9sdmVkCi0gQ29udGFpbmVyLXNwZWNpZmljIHJlc3BvbnNlIHdyYXBwZXIg aW1wbGVtZW50YXRpb25zCgojIyMgMy4gRW5jb2RpbmcgSGFuZGxpbmcgUGhpbG9zb3BoeQoKU3Ry dXRzIGZvbGxvd3MgYSAqKm11bHRpLWxldmVsIGVuY29kaW5nIHN0cmF0ZWd5Kio6CgoxLiAqKkNv bmZpZ3VyYXRpb24gbGV2ZWwqKjogYHN0cnV0cy5pMThuLmVuY29kaW5nYCBjb25zdGFudAoyLiAq KlJlcXVlc3QgbGV2ZWwqKjogYHJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoKWAKMy4gKipS ZXNwb25zZSBsZXZlbCoqOiBgcmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoKWAKNC4gKipJ bmNsdWRlIGxldmVsKio6IGB1c2VSZXNwb25zZUVuY29kaW5nYCBmbGFnIHdpdGggZmFsbGJhY2sg dG8gZGVmYXVsdAoKKipEZXNpZ24gSW50ZW50Kio6IFJlc3BlY3QgcGFnZS1sZXZlbCBlbmNvZGlu ZyB3aGlsZSBhbGxvd2luZyBwZXItaW5jbHVkZSBvdmVycmlkZQoKKipWdWxuZXJhYmlsaXR5Kio6 IEVuY29kaW5nIG1pc21hdGNoZXMgY2FuIG9jY3VyIHdoZW46Ci0gQWN0aW9uIHN0b3JlcyBTdHJp bmcgaW4gSlZNJ3MgbmF0aXZlIFVURi0xNgotIFJlc3BvbnNlIGVuY29kaW5nIHNldCB0byBJU08t ODg1OS0xIG9yIG90aGVyIGxpbWl0ZWQgY2hhcnNldAotIENvbnRlbnQgY29udGFpbnMgY2hhcmFj dGVycyBvdXRzaWRlIHRhcmdldCBjaGFyc2V0IHJhbmdlCi0gRGVjb2Rpbmcgd2l0aCBSRVBPUlQg cG9saWN5IGhhbHRzIGF0IGZpcnN0IHByb2JsZW1hdGljIGNoYXJhY3RlcgoKLS0tCgojIyBSZWNv bW1lbmRlZCBTb2x1dGlvbnMKCiMjIyAxLiBVc2UgU3RydXRzIEpTT04gUGx1Z2luIChCRVNUIFBS QUNUSUNFKQoKKipXaHkqKjogQnlwYXNzZXMgSlNQIHJlbmRlcmluZyBhbmQgZW5jb2RpbmcgY29u dmVyc2lvbiBlbnRpcmVseQoKKipJbXBsZW1lbnRhdGlvbioqOgpgYGB4bWwKPCEtLSBwb20ueG1s IC0tPgo8ZGVwZW5kZW5jeT4KICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3RydXRzPC9ncm91cElk PgogICAgPGFydGlmYWN0SWQ+c3RydXRzMi1qc29uLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgIDx2 ZXJzaW9uPiR7c3RydXRzMi52ZXJzaW9ufTwvdmVyc2lvbj4KPC9kZXBlbmRlbmN5PgpgYGAKCmBg YHhtbAo8IS0tIHN0cnV0cy54bWwgLS0+CjxhY3Rpb24gbmFtZT0iYWpheFRlc3QiIGNsYXNzPSJj b20ueW91cnBhY2thZ2UuWW91ckFjdGlvbiIgbWV0aG9kPSJhamF4VGVzdCI+CiAgICA8cmVzdWx0 IHR5cGU9Impzb24iPgogICAgICAgIDxwYXJhbSBuYW1lPSJyb290Ij5kYXRhPC9wYXJhbT4KICAg IDwvcmVzdWx0Pgo8L2FjdGlvbj4KYGBgCgoqKkJlbmVmaXRzKio6Ci0gRGlyZWN0IEpTT04gc2Vy aWFsaXphdGlvbiAobm8gSlNQKQotIE5vIGVuY29kaW5nIGNvbnZlcnNpb24gaXNzdWVzCi0gUHJv cGVyIENvbnRlbnQtVHlwZSBoYW5kbGluZwotIFN0YW5kYXJkIGFwcHJvYWNoIGZvciBSRVNUL0FK QVggZW5kcG9pbnRzCgojIyMgMi4gRXhjbHVkZSBKU09OIEVuZHBvaW50cyBmcm9tIFNpdGVNZXNo CgoqKldoeSoqOiBSZW1vdmVzIHJlc3BvbnNlIGJ1ZmZlcmluZyBvdmVyaGVhZCBmb3IgSlNPTgoK KipJbXBsZW1lbnRhdGlvbioqOgpgYGB4bWwKPCEtLSBzaXRlbWVzaDMueG1sIC0tPgo8c2l0ZW1l c2g+CiAgICA8bWFwcGluZyBwYXRoPSIvYWpheC8qIiBleGNsdWRlPSJ0cnVlIi8+CiAgICA8bWFw cGluZyBwYXRoPSIqLmpzb24iIGV4Y2x1ZGU9InRydWUiLz4KICAgIDxtYXBwaW5nIHBhdGg9Ii8q IiBkZWNvcmF0b3I9Im1haW4uanNwIi8+Cjwvc2l0ZW1lc2g+CmBgYAoKIyMjIDMuIEVuc3VyZSBD b25zaXN0ZW50IFVURi04IEVuY29kaW5nCgoqKldoeSoqOiBQcmV2ZW50cyBlbmNvZGluZyBtaXNt YXRjaGVzIHRoYXQgdHJpZ2dlciB0cnVuY2F0aW9uCgoqKkltcGxlbWVudGF0aW9uKio6CmBgYHht bAo8IS0tIHN0cnV0cy54bWwgLS0+Cjxjb25zdGFudCBuYW1lPSJzdHJ1dHMuaTE4bi5lbmNvZGlu ZyIgdmFsdWU9IlVURi04Ii8+CmBgYAoKYGBganNwCjwhLS0gSlNQIHBhZ2UgZGlyZWN0aXZlIC0t Pgo8JUAgcGFnZSBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCIg cGFnZUVuY29kaW5nPSJVVEYtOCIgJT4KYGBgCgpgYGB4bWwKPCEtLSB3ZWIueG1sIC0gT3B0aW9u YWw6IEZvcmNlIFVURi04IGZvciBhbGwgcmVxdWVzdHMgLS0+CjxmaWx0ZXI+CiAgICA8ZmlsdGVy LW5hbWU+ZW5jb2RpbmdGaWx0ZXI8L2ZpbHRlci1uYW1lPgogICAgPGZpbHRlci1jbGFzcz5vcmcu c3ByaW5nZnJhbWV3b3JrLndlYi5maWx0ZXIuQ2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXI8L2ZpbHRl ci1jbGFzcz4KICAgIDxpbml0LXBhcmFtPgogICAgICAgIDxwYXJhbS1uYW1lPmVuY29kaW5nPC9w YXJhbS1uYW1lPgogICAgICAgIDxwYXJhbS12YWx1ZT5VVEYtODwvcGFyYW0tdmFsdWU+CiAgICA8 L2luaXQtcGFyYW0+CiAgICA8aW5pdC1wYXJhbT4KICAgICAgICA8cGFyYW0tbmFtZT5mb3JjZUVu Y29kaW5nPC9wYXJhbS1uYW1lPgogICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1 ZT4KICAgIDwvaW5pdC1wYXJhbT4KPC9maWx0ZXI+CmBgYAoKIyMjIDQuIEVuYWJsZSBEaWFnbm9z dGljIExvZ2dpbmcKCioqV2h5Kio6IENvbmZpcm1zIGVuY29kaW5nIHRydW5jYXRpb24gaXMgdGhl IHJvb3QgY2F1c2UKCioqSW1wbGVtZW50YXRpb24qKjoKYGBgeG1sCjwhLS0gbG9nNGoyLnhtbCAt LT4KPExvZ2dlciBuYW1lPSJvcmcuYXBhY2hlLnN0cnV0czIudXRpbC5GYXN0Qnl0ZUFycmF5T3V0 cHV0U3RyZWFtIiBsZXZlbD0iV0FSTiIvPgo8TG9nZ2VyIG5hbWU9Im9yZy5hcGFjaGUuc3RydXRz Mi5jb21wb25lbnRzLkluY2x1ZGUiIGxldmVsPSJERUJVRyIvPgo8TG9nZ2VyIG5hbWU9Im9yZy5h cGFjaGUuc3RydXRzMi5kaXNwYXRjaGVyLkRpc3BhdGNoZXIiIGxldmVsPSJERUJVRyIvPgpgYGAK CioqTG9vayBmb3IqKjogYCJCdWZmZXIgZGVjb2RpbmctaW4tdG8tb3V0IFtjaGFyc2V0XSBmYWls ZWQsIGNvZGVyUmVzdWx0IFtkZXRhaWxzXSJgCgojIyMgNS4gVmFsaWRhdGUgSlNPTiBDb250ZW50 CgoqKldoeSoqOiBJZGVudGlmeSBwcm9ibGVtYXRpYyBjaGFyYWN0ZXJzIGNhdXNpbmcgdHJ1bmNh dGlvbgoKKipBY3Rpb24qKjogRXhhbWluZSB0aGUgSlNPTiBzdHJpbmcgYXQgdGhlIHRydW5jYXRp b24gcG9pbnQuIExvb2sgZm9yOgotIEV4dGVuZGVkIFVuaWNvZGUgY2hhcmFjdGVycyAoVSswMDgw IGFuZCBhYm92ZSkKLSBJbnZhbGlkIFVURi04IGJ5dGUgc2VxdWVuY2VzCi0gQ2hhcmFjdGVycyB0 aGF0IGRvbid0IGV4aXN0IGluIElTTy04ODU5LTEgKGlmIHRoYXQncyB0aGUgcmVzcG9uc2UgZW5j b2RpbmcpCgotLS0KCiMjIERpYWdub3N0aWMgQ2hlY2tsaXN0IGZvciBVc2VyCgpUbyBjb25maXJt IHRoZSByb290IGNhdXNlLCB0aGUgdXNlciBzaG91bGQ6CgotIFsgXSBFbmFibGUgV0FSTiBsb2dn aW5nIGZvciBgb3JnLmFwYWNoZS5zdHJ1dHMyLnV0aWwuRmFzdEJ5dGVBcnJheU91dHB1dFN0cmVh bWAKLSBbIF0gUmVwcm9kdWNlIHRoZSB0cnVuY2F0aW9uIGFuZCBjaGVjayBsb2dzIGZvciBlbmNv ZGluZyB3YXJuaW5ncwotIFsgXSBJZGVudGlmeSB0aGUgZXhhY3QgY2hhcmFjdGVyIHBvc2l0aW9u IHdoZXJlIHRydW5jYXRpb24gb2NjdXJzCi0gWyBdIEV4YW1pbmUgdGhlIGNoYXJhY3RlcihzKSBh dCBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRydW5jYXRpb24gcG9pbnQKLSBbIF0gVmVyaWZ5 IGBzdHJ1dHMuaTE4bi5lbmNvZGluZ2AgaXMgc2V0IHRvICJVVEYtOCIKLSBbIF0gVmVyaWZ5IEpT UCBgcGFnZUVuY29kaW5nYCBhbmQgYGNvbnRlbnRUeXBlYCBib3RoIHNwZWNpZnkgIlVURi04Igot IFsgXSBDaGVjayBpZiBTaXRlTWVzaCBpcyBkZWNvcmF0aW5nIHRoZSBKU09OIHJlc3BvbnNlIChz aG91bGQgYmUgZXhjbHVkZWQpCi0gWyBdIENvbXBhcmUgYHJlc3BvbnNlLmdldENoYXJhY3RlckVu Y29kaW5nKClgIGJldHdlZW4gVG9tY2F0IDEwIGFuZCBUb21jYXQgMTEKLSBbIF0gVGVzdCB3aXRo IEpTT04gcGx1Z2luIGluc3RlYWQgb2YgSlNQIHJlbmRlcmluZwotIFsgXSBDaGVjayBmb3IgYW55 IGN1c3RvbSBmaWx0ZXJzIG9yIGludGVyY2VwdG9ycyB0aGF0IHdyYXAgdGhlIHJlc3BvbnNlCgot LS0KCiMjIE9wZW4gUXVlc3Rpb25zCgoxLiAqKldoeSBkb2VzIFRvbWNhdCAxMCB3b3JrIGJ1dCBU b21jYXQgMTEgZmFpbD8qKgogICAtIEh5cG90aGVzaXM6IERpZmZlcmVudCBkZWZhdWx0IGNoYXJh Y3RlciBlbmNvZGluZyBpbiBUb21jYXQgMTEncyBKYWthcnRhIFNlcnZsZXQgaW1wbGVtZW50YXRp b24KICAgLSBIeXBvdGhlc2lzOiBEaWZmZXJlbnQgcmVzcG9uc2Ugd3JhcHBlciBiZWhhdmlvciBp biBUb21jYXQgMTEncyBKc3BXcml0ZXJJbXBsCiAgIC0gTmVlZHM6IENvbXBhcmlzb24gb2YgYHJl c3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKClgIG91dHB1dCBvbiBib3RoIGNvbnRhaW5lcnMK CjIuICoqSXMgdGhlIEluY2x1ZGUgY29tcG9uZW50IGluIHRoZSBwaXBlbGluZT8qKgogICAtIFRo ZSBQYWdlUmVzcG9uc2Ugd3JhcHBlciB1c2VzIEZhc3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0KICAg LSBOZWVkIHRvIHZlcmlmeSBpZiBhY3Rpb24tYmFzZWQgcmVuZGVyaW5nIHRyaWdnZXJzIEluY2x1 ZGUgY29tcG9uZW50CiAgIC0gQ2hlY2sgZm9yIGBQYWdlUmVzcG9uc2VgIGluIHRocmVhZCBkdW1w cyBvciBkZWJ1ZyBsb2dzCgozLiAqKldoYXQgaXMgdGhlIGV4YWN0IHRydW5jYXRpb24gcG9pbnQg Y2hhcmFjdGVyPyoqCiAgIC0gSXMgaXQgYSBoaWdoLUFTQ0lJIGNoYXJhY3RlciAoMHg4MC0weEZG KT8KICAgLSBJcyBpdCBhIG11bHRpLWJ5dGUgVVRGLTggc2VxdWVuY2U/CiAgIC0gSXMgaXQgYSBV bmljb2RlIGNoYXJhY3RlciBvdXRzaWRlIHRoZSByZXNwb25zZSBlbmNvZGluZydzIHJhbmdlPwoK NC4gKipJcyB0aGVyZSBhIHJlc3BvbnNlIHNpemUgcGF0dGVybj8qKgogICAtIERvZXMgdHJ1bmNh dGlvbiBhbHdheXMgb2NjdXIgYXQgdGhlIHNhbWUgY2hhcmFjdGVyIHBvc2l0aW9uPwogICAtIElz IHRoZXJlIGEgYnVmZmVyIGJvdW5kYXJ5IGNvcnJlbGF0aW9uIChlLmcuLCA4MTkyIGJ5dGVzKT8K ICAgLSBEb2VzIHRoZSB0cnVuY2F0aW9uIHBvaW50IG1vdmUgaWYgSlNPTiBjb250ZW50IGNoYW5n ZXM/CgotLS0KCiMjIFJlbGF0ZWQgUmVzZWFyY2gKCk5vIGV4aXN0aW5nIHJlc2VhcmNoIGRvY3Vt ZW50cyBmb3VuZCBpbiBgdGhvdWdodHMvYCBkaXJlY3RvcnkuIFRoaXMgaXMgdGhlIGZpcnN0IGRv Y3VtZW50YXRpb24gb2YgdGhpcyBpc3N1ZS4KCkZ1dHVyZSByZXNlYXJjaCBhcmVhczoKLSBUb21j YXQgMTAgdnMgVG9tY2F0IDExIHJlc3BvbnNlIGhhbmRsaW5nIGRpZmZlcmVuY2VzCi0gSmFrYXJ0 YSBTZXJ2bGV0IDYuMCBjaGFyYWN0ZXIgZW5jb2RpbmcgY2hhbmdlcwotIFNpdGVNZXNoIDMueCBi dWZmZXJpbmcgYmVoYXZpb3Igd2l0aCBKYWthcnRhIEVFCi0gU3RydXRzIHJlc3BvbnNlIHdyYXBw ZXIgY2hhaW4gYW5hbHlzaXMKCi0tLQoKIyMgQ29uY2x1c2lvbgoKVGhlIEpTT04gdHJ1bmNhdGlv biBpc3N1ZSBpcyAqKk5PVCBjYXVzZWQgYnkgdGhlIEpha2FydGEgRUUgbWlncmF0aW9uIGl0c2Vs ZioqLCBidXQgcmF0aGVyIGJ5IGEgKipjaGFyYWN0ZXIgZW5jb2RpbmcgbWlzbWF0Y2gqKiB0aGF0 IHRyaWdnZXJzIGRvY3VtZW50ZWQgdHJ1bmNhdGlvbiBiZWhhdmlvciBpbiBgRmFzdEJ5dGVBcnJh eU91dHB1dFN0cmVhbWAuIFRoaXMgaXNzdWUgZXhpc3RzIGluIGJvdGggamF2YXggYW5kIGpha2Fy dGEgdmVyc2lvbnMgb2YgU3RydXRzLCBidXQgbWF5IGJlICoqZXhwb3NlZCBkaWZmZXJlbnRseSoq IG9uIFRvbWNhdCAxMSBkdWUgdG86CgoxLiBEaWZmZXJlbnQgZGVmYXVsdCBjaGFyYWN0ZXIgZW5j b2RpbmdzCjIuIERpZmZlcmVudCByZXNwb25zZSB3cmFwcGVyIGltcGxlbWVudGF0aW9ucwozLiBE aWZmZXJlbnQgY2hhcmFjdGVyIGVuY29kaW5nIGxpYnJhcmllcwoKKipJbW1lZGlhdGUgQWN0aW9u Kio6IFRoZSB1c2VyIHNob3VsZCBzd2l0Y2ggdG8gdGhlICoqU3RydXRzIEpTT04gcGx1Z2luKiog Zm9yIEpTT04gcmVzcG9uc2VzLCB3aGljaCBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggYW5k IGNvbXBsZXRlbHkgYXZvaWRzIHRoZSBKU1AgcmVuZGVyaW5nIHBpcGVsaW5lIGFuZCBpdHMgYXNz b2NpYXRlZCBlbmNvZGluZyBpc3N1ZXMuCgoqKkFsdGVybmF0aXZlKio6IElmIEpTUCBtdXN0IGJl IHVzZWQsIGVuc3VyZToKLSBDb25zaXN0ZW50IFVURi04IGVuY29kaW5nIHRocm91Z2hvdXQgdGhl IHBpcGVsaW5lCi0gU2l0ZU1lc2ggZXhjbHVkZXMgSlNPTiBlbmRwb2ludHMKLSBEaWFnbm9zdGlj IGxvZ2dpbmcgZW5hYmxlZCB0byBjb25maXJtIHRoZSByb290IGNhdXNl --000000000000a3828006416ca70f Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected] --000000000000a3828006416ca70f--