
Hi guys,<br><br>I've spent some time working on UI Plugins proof-of-concep= t (PoC) implementation, and thought I'd share my results with you. I've att= ached a patch that reflects the current progress. <br><br>The actual PoC im=
</li></ul><p>The current PoC declares a simple plugin that gets loaded usi= ng hard-coded values in <span style=3D"font-style: italic;">PluginSourcePag= eServlet</span>. Actual plugin code registers the plugin into global <span =
--=_156c716f-6003-47a3-bcaa-20301ab51501 Content-Type: multipart/alternative; boundary="=_1a8d4419-a4c3-4d94-96e2-c9d519481224" --=_1a8d4419-a4c3-4d94-96e2-c9d519481224 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi guys, I've spent some time working on UI Plugins proof-of-concept (PoC) implement= ation, and thought I'd share my results with you. I've attached a patch tha= t reflects the current progress. The actual PoC implementation takes some inspiration from oVirt UI Plugins = wiki page, and simplifies/streamlines/improves its main concepts. The goal = is to have simple-to-use, yet flexible and robust plugin infrastructure. Ma= jor changes to the original design are outlined below. Each UI plugin runs within the context of an iframe, and therefore requires= a plugin source page that executes the actual plugin code. =E2=80=A2 iframe is essentially the sandbox for each plugin. We can dis= able plugins by detaching their iframe elements from the main document duri= ng WebAdmin runtime. This also allows us to implement features such as plug= in safe mode (no plugins loaded on WebAdmin startup). =E2=80=A2 Plugin source pages and WebAdmin host page share the same ori= gin (protocol, domain, port), with plugin source pages being served through= EngineManager application server (JBoss AS). This is to avoid cross-domain= window/iframe communication issues, when the actual plugin code running in= an iframe tries to register itself into WebAdmin main document's pluginApi= object. =E2=80=A2 There's a servlet designed to render plugin source page for a= ll plugins ( PluginSourcePageServlet ). For the given plugin, it detects it= s dependencies (3rd party JavaScript libraries) and configuration object (J= SON data), reads the actual plugin code, and assembles everything into the = resulting HTML page (to be evaluated by the plugin iframe). =E2=80=A2 iframe isolates plugin dependencies (3rd party JavaScript lib= raries) from other plugins and the main WebAdmin document. In practice, thi= s means that plugin A can use jQuery 1.7 and plugin B can use jQuery 1.6 wi= thout the fear of any clashes. =E2=80=A2 Last but not least, writing plugins in Google Web Toolkit (GW= T) should be as easy as providing your own plugin source page. Just deploy = your GWT plugin application on JBoss AS (next to engine.ear ), and point to= GWT plugin application host page. The current PoC declares a simple plugin that gets loaded using hard-coded = values in PluginSourcePageServlet . Actual plugin code registers the plugin= into global pluginApi.plugins object, with one sample event handler functi= on ( ActionButtonClick ). Just after that, the plugin reports in as ready b= y calling pluginApi.ready function. This essentially puts the plugin into u= se within WebAdmin. To simulate extension point (application event to be consumed by plugins), = when the user clicks "New server" button on "Virtual Machines" main tab, Ac= tionButtonClickEvent gets fired through WebAdmin event bus. PluginEventHand= ler receives this event and invokes ActionButtonClick event handler functio= n on all plugins. (Note: for passing context objects from WebAdmin to plugin event handler fu= nctions, I'm planning to experiment with gwt-exporter project [1]. This wou= ld greatly simplify the way how WebAdmin exposes context-specific plugin AP= I to event handler functions.) As for the next step, I suggest to have some meeting (conference) to discus= s the PoC in detail, and outline tasks for the near future. Also, please le= t me know what you think of the PoC so far. Cheers, Vojtech [1] http://code.google.com/p/gwt-exporter/ --=_1a8d4419-a4c3-4d94-96e2-c9d519481224 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable <html><head><style type=3D'text/css'>p { margin: 0; }</style></head><body><= div style=3D'font-family: Times New Roman; font-size: 12pt; color: #000000'= plementation takes some inspiration from oVirt UI Plugins wiki page, and si= mplifies/streamlines/improves its main concepts. The goal is to have simple= -to-use, yet flexible and robust plugin infrastructure. Major changes to th= e original design are outlined below.<br><br><strong>Each UI plugin runs wi= thin the context of an iframe, and therefore requires a </strong><span styl= e=3D"font-style: italic; font-weight: bold;">plugin source page</span><span= style=3D"font-weight: bold;"> that executes the actual plugin code.</span>= <br><ul><li>iframe is essentially the sandbox for each plugin. We can disab= le plugins by detaching their iframe elements from the main document during= WebAdmin runtime. This also allows us to implement features such as <em>pl= ugin safe mode</em> (no plugins loaded on WebAdmin startup).</li><li>Plugin= source pages and WebAdmin host page share the same origin (protocol, domai= n, port), with plugin source pages being served through EngineManager appli= cation server (JBoss AS). This is to avoid cross-domain window/iframe commu= nication issues, when the actual plugin code running in an iframe tries to = register itself into WebAdmin main document's <span style=3D"font-style: it= alic;">pluginApi</span> object.</li><li>There's a servlet designed to rende= r plugin source page for all plugins (<span style=3D"font-style: italic;">P= luginSourcePageServlet</span>). For the given plugin, it detects its depend= encies (3rd party JavaScript libraries) and configuration object (JSON data= ), reads the actual plugin code, and assembles everything into the resultin= g HTML page (to be evaluated by the plugin iframe).</li><li>iframe isolates= plugin dependencies (3rd party JavaScript libraries) from other plugins an= d the main WebAdmin document. In practice, this means that plugin A can use= jQuery 1.7 and plugin B can use jQuery 1.6 without the fear of any clashes= .</li><li>Last but not least, writing plugins in Google Web Toolkit (GWT) s= hould be as easy as providing your own plugin source page. Just deploy your= GWT plugin application on JBoss AS (next to <span style=3D"font-style: ita= lic;">engine.ear</span>), and point to GWT plugin application host page.<br= style=3D"font-style: italic;">pluginApi.plugins</span> object, with one sam= ple event handler function (<span style=3D"font-style: italic;">ActionButto= nClick</span>). Just after that, the plugin reports in as ready by calling = <span style=3D"font-style: italic;">pluginApi.ready</span> function. This e= ssentially puts the plugin into use within WebAdmin.<br></p><p><br></p>To s= imulate extension point (application event to be consumed by plugins), when= the user clicks "New server" button on "Virtual Machines" main tab, <span = style=3D"font-style: italic;">ActionButtonClickEvent</span> gets fired thro= ugh WebAdmin event bus. <span style=3D"font-style: italic;">PluginEventHand= ler</span> receives this event and invokes <span style=3D"font-style: itali= c;">ActionButtonClick</span> event handler function on all plugins.<br><p><= br></p><p>(Note: for passing context objects from WebAdmin to plugin event = handler functions, I'm planning to experiment with gwt-exporter project [1]= . This would greatly simplify the way how WebAdmin exposes context-specific= plugin API to event handler functions.)</p><p><br></p><p>As for the next s= tep, I suggest to have some meeting (conference) to discuss the PoC in deta= il, and outline tasks for the near future. Also, please let me know what yo= u think of the PoC so far.<br></p><br>Cheers,<br>Vojtech<br><br>[1] http://= code.google.com/p/gwt-exporter/<p><br></p><p></p></div></body></html> --=_1a8d4419-a4c3-4d94-96e2-c9d519481224-- --=_156c716f-6003-47a3-bcaa-20301ab51501 Content-Type: text/x-patch; name=WIP-UI-Plugins-PoC.patch Content-Disposition: attachment; filename=WIP-UI-Plugins-PoC.patch Content-Transfer-Encoding: base64 RnJvbSA5NGM0NThkYzk4NThlZTcyMjBhY2Y1MzMyNDU0NGI5ODE0MGM3NTJhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0 ZTogVGh1LCAxOSBKdWwgMjAxMiAxNDo0ODo0MCArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFdJUDog VUkgUGx1Z2lucyBQb0MKCkNoYW5nZS1JZDogSWQyODgxMmRkYmU5MDU3NGRlMDE3OGYwYzA3ZGE3 MTNmZTlmZDhjZGEKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBTem9jcyA8dnN6b2NzQHJlZGhhdC5j b20+Ci0tLQogLi4uL3NlcnZlci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YSAgICAg ICAgfCAgIDQxICsrKysrKwogLi4uL3NlcnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9zdGluZ1Nl cnZsZXQuamF2YSAgfCAgICA0ICsKIC4uLi9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1N5 c3RlbU1vZHVsZS5qYXZhIHwgICAgNCArCiAuLi4vdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkFw aU1hbmFnZXIuamF2YSAgICAgICB8ICAxNDMgKysrKysrKysrKysrKysrKysrKysKIC4uLi91aS93 ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMuamF2YSAgICAgIHwgICAzMCArKysrCiAu Li4vdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxlci5qYXZhICAgICB8ICAgMjQg KysrKwogLi4uL3dlYmFkbWluL3BsdWdpbi9ldmVudC9BY3Rpb25CdXR0b25DbGljay5qYXZhICAg fCAgICA4ICsKIC4uLi9tYWluL3ZpZXcvdGFiL01haW5UYWJWaXJ0dWFsTWFjaGluZVZpZXcuamF2 YSAgIHwgICAgOCArCiAuLi4vd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnht bCAgICAgICB8ICAgMTAgKysKIDkgZmlsZXMgY2hhbmdlZCwgMjcyIGluc2VydGlvbnMoKyksIDAg ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2Vy dmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmly dC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkFwaU1hbmFnZXIuamF2YQogY3JlYXRl IG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4v amF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZpbml0aW9u cy5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJh ZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1Bs dWdpbkV2ZW50SGFuZGxlci5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2Vi YWRtaW4vcGx1Z2luL2V2ZW50L0FjdGlvbkJ1dHRvbkNsaWNrLmphdmEKCmRpZmYgLS1naXQgYS9m cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3JnL292aXJ0 L2VuZ2luZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VTZXJ2bGV0Lmph dmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3Jn L292aXJ0L2VuZ2luZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VTZXJ2 bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwOGQ4ZQotLS0g L2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21h aW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvUGx1Z2luU291 cmNlUGFnZVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIG9yZy5vdmlydC5l bmdpbmUudWkuZnJvbnRlbmQuc2VydmVyLmd3dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRp b247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQu aHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRS ZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwor CisvKioKKyAqIFJlbmRlcnMgdGhlIEhUTUwgc291cmNlIHBhZ2UgZm9yIHRoZSBnaXZlbiBVSSBw bHVnaW4uCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5Tb3VyY2VQYWdlU2VydmxldCBleHRlbmRz IEh0dHBTZXJ2bGV0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVy c2lvblVJRCA9IDFMOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQo SHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2Up IHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3Bv bnNlLmdldFdyaXRlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9o dG1sOyBjaGFyc2V0PVVURi04Iik7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICB3cml0ZXIuYXBw ZW5kKCI8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD4iKTsgLy8kTk9OLU5MUy0xJAorICAgICAg ICB3cml0ZXIuYXBwZW5kKCI8bWV0YSBodHRwLWVxdWl2PVwiY29udGVudC10eXBlXCIgY29udGVu dD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiPiIpOyAvLyROT04tTkxTLTEkCisgICAgICAg IHdyaXRlci5hcHBlbmQoIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0 dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuNy4yL2pxdWVyeS5t aW4uanNcIj48L3NjcmlwdD4iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3cml0ZXIuYXBwZW5k KCI8L2hlYWQ+PGJvZHk+Iik7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICB3cml0ZXIuYXBwZW5k KCI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iKTsgLy8kTk9OLU5MUy0xJAorICAg ICAgICB3cml0ZXIuYXBwZW5kKCIoZnVuY3Rpb24oIHBsdWdpbkFwaSwgcGx1Z2luQ29uZmlnICkg eyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHdyaXRlci5hcHBlbmQoIiAgd2luZG93LmFsZXJ0 KCdJbnZva2luZyBhY3R1YWwgcGx1Z2luIGNvZGUhJyk7Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAg ICAgd3JpdGVyLmFwcGVuZCgiICB3aW5kb3cuYWxlcnQoJ1JlYWRpbmcgcGx1Z2luIGNvbmZpZ3Vy YXRpb246ICcgKyBwbHVnaW5Db25maWcuZm9vKTsiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3 cml0ZXIuYXBwZW5kKCIgIHBsdWdpbkFwaS5wbHVnaW5zWydteVBsdWdpbiddID0geyIpOyAvLyRO T04tTkxTLTEkCisgICAgICAgIHdyaXRlci5hcHBlbmQoIiAgICBBY3Rpb25CdXR0b25DbGljazog ZnVuY3Rpb24oY29udGV4dE9iamVjdCkgeyB3aW5kb3cuYWxlcnQoJ1dvb2hvbyEnKTsgfSIpOyAv LyROT04tTkxTLTEkCisgICAgICAgIHdyaXRlci5hcHBlbmQoIiAgfTsiKTsgLy8kTk9OLU5MUy0x JAorICAgICAgICB3cml0ZXIuYXBwZW5kKCIgIHBsdWdpbkFwaS5yZWFkeSgnbXlQbHVnaW4nKTsi KTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3cml0ZXIuYXBwZW5kKCJ9KSAoIHBhcmVudC5wbHVn aW5BcGksIHsgXCJmb29cIjogMTIzIH0gKTsiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3cml0 ZXIuYXBwZW5kKCI8L3NjcmlwdD4iKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIHdyaXRlci5h cHBlbmQoIjwvYm9keT48L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKKyAgICB9CisKK30KZGlmZiAt LWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9v cmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9z dGluZ1NlcnZsZXQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3Jj L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvV2ViYWRt aW5EeW5hbWljSG9zdGluZ1NlcnZsZXQuamF2YQppbmRleCA0MjhkY2M1Li5kY2FmNDlhIDEwMDY0 NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEv b3JnL292aXJ0L2VuZ2luZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1dlYmFkbWluRHluYW1pY0hv c3RpbmdTZXJ2bGV0LmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVu ZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9X ZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhCkBAIC0zNiw2ICszNiwxMCBAQCBwdWJs aWMgY2xhc3MgV2ViYWRtaW5EeW5hbWljSG9zdGluZ1NlcnZsZXQgZXh0ZW5kcyBHd3REeW5hbWlj SG9zdFBhZ2VTZXJ2bGV0IHsKICAgICAgICAgICAgIGFwcE1vZGVEYXRhLnB1dCgidmFsdWUiLCBT dHJpbmcudmFsdWVPZihhcHBsaWNhdGlvbk1vZGUpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAg ICAgd3JpdGVKc09iamVjdCh3cml0ZXIsICJhcHBsaWNhdGlvbk1vZGUiLCBhcHBNb2RlRGF0YSk7 IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQorCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4g cGx1Z2luRGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAg ICAgcGx1Z2luRGVmaW5pdGlvbnMucHV0KCJteVBsdWdpbiIsICIvd2ViYWRtaW4vd2ViYWRtaW4v UGx1Z2luU291cmNlUGFnZT9wbHVnaW49bXlQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04t TkxTLTIkCisgICAgICAgIHdyaXRlSnNPYmplY3Qod3JpdGVyLCAicGx1Z2luRGVmaW5pdGlvbnMi LCBwbHVnaW5EZWZpbml0aW9ucyk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICBwcml2YXRl IEludGVnZXIgZ2V0QXBwbGljYXRpb25Nb2RlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7 CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWlu L2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vU3lzdGVtTW9kdWxlLmphdmEg Yi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292 aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vU3lzdGVtTW9kdWxlLmphdmEKaW5kZXggMzA2OWI5 OS4uNzg5NjNhZCAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1N5c3RlbU1v ZHVsZS5qYXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21h aW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9TeXN0ZW1Nb2R1bGUuamF2 YQpAQCAtOSw2ICs5LDggQEAgaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uQXBw bGljYXRpb25SZXNvdXJjZXM7CiBpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5B cHBsaWNhdGlvblRlbXBsYXRlczsKIGltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu LnBsYWNlLkFwcGxpY2F0aW9uUGxhY2VzOwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2Vi YWRtaW4ucGxhY2UuV2ViQWRtaW5QbGFjZU1hbmFnZXI7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2lu ZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luQXBpTWFuYWdlcjsKK2ltcG9ydCBvcmcub3ZpcnQu ZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5FdmVudEhhbmRsZXI7CiBpbXBvcnQgb3Jn Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zeXN0ZW0uQXBwbGljYXRpb25Jbml0OwogaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc3lzdGVtLkludGVybmFsQ29uZmlndXJhdGlv bjsKIApAQCAtMzEsNiArMzMsOCBAQCBwdWJsaWMgY2xhc3MgU3lzdGVtTW9kdWxlIGV4dGVuZHMg QmFzZVN5c3RlbU1vZHVsZSB7CiAgICAgICAgIGJpbmQoUGxhY2VNYW5hZ2VyLmNsYXNzKS50byhX ZWJBZG1pblBsYWNlTWFuYWdlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKICAgICAgICAg YmluZChBcHBsaWNhdGlvbkluaXQuY2xhc3MpLmFzRWFnZXJTaW5nbGV0b24oKTsKICAgICAgICAg YmluZChJbnRlcm5hbENvbmZpZ3VyYXRpb24uY2xhc3MpLmFzRWFnZXJTaW5nbGV0b24oKTsKKyAg ICAgICAgYmluZChQbHVnaW5BcGlNYW5hZ2VyLmNsYXNzKS5hc0VhZ2VyU2luZ2xldG9uKCk7Cisg ICAgICAgIGJpbmQoUGx1Z2luRXZlbnRIYW5kbGVyLmNsYXNzKS5hc0VhZ2VyU2luZ2xldG9uKCk7 CiAgICAgfQogCiAgICAgdm9pZCBiaW5kQ29uZmlndXJhdGlvbigpIHsKZGlmZiAtLWdpdCBhL2Zy b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv ZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5BcGlNYW5hZ2VyLmphdmEgYi9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu ZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luQXBpTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYmRkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu ZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luQXBpTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTQz IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBv cnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZh LnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVu dC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50Lkpz QXJyYXlTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5Eb2N1bWVudDsK K2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LklGcmFtZUVsZW1lbnQ7CitpbXBvcnQg Y29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5TdHlsZS5Cb3JkZXJTdHlsZTsKK2ltcG9ydCBjb20u Z29vZ2xlLmd3dC5kb20uY2xpZW50LlN0eWxlLlBvc2l0aW9uOworaW1wb3J0IGNvbS5nb29nbGUu Z3d0LmRvbS5jbGllbnQuU3R5bGUuVW5pdDsKKworLyoqCisgKiBUaGUgbWFpbiBjb21wb25lbnQg b2YgV2ViQWRtaW4gVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlLgorICogPHA+CisgKiBTaG91bGQg YmUgYm91bmQgYXMgR0lOIGVhZ2VyIHNpbmdsZXRvbiwgY3JlYXRlZCBlYXJseSBvbiBkdXJpbmcg YXBwbGljYXRpb24gc3RhcnR1cC4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkFwaU1hbmFnZXIg eworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRM b2dnZXIoUGx1Z2luQXBpTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLy8gTWFwcyBw bHVnaW4gbmFtZXMgdG8gY29ycmVzcG9uZGluZyBpZnJhbWUgZWxlbWVudHMKKyAgICBwcml2YXRl IGZpbmFsIE1hcDxTdHJpbmcsIElGcmFtZUVsZW1lbnQ+IHBsdWdpbklGcmFtZXMgPSBuZXcgSGFz aE1hcDxTdHJpbmcsIElGcmFtZUVsZW1lbnQ+KCk7CisKKyAgICAvLyBNYXBzIHBsdWdpbiBuYW1l cyB0byBjb3JyZXNwb25kaW5nIHBsdWdpbiBvYmplY3RzIChvbmx5IGZvciBwbHVnaW5zIHdoaWNo IGFyZSBjdXJyZW50bHkgcmVhZHkpCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBKYXZh U2NyaXB0T2JqZWN0PiBwbHVnaW5PYmplY3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKYXZhU2Ny aXB0T2JqZWN0PigpOworCisgICAgcHVibGljIFBsdWdpbkFwaU1hbmFnZXIoKSB7CisgICAgICAg IGV4cG9zZVBsdWdpbkFwaSgpOworICAgICAgICBsb2FkUGx1Z2lucygpOworICAgIH0KKworICAg IC8qKgorICAgICAqIEludm9rZXMgdGhlIGdpdmVuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gb24g YWxsIHBsdWdpbnMgd2hpY2ggYXJlIGN1cnJlbnRseSByZWFkeS4KKyAgICAgKi8KKyAgICBwdWJs aWMgdm9pZCBpbnZva2VQbHVnaW5zKFN0cmluZyBmdW5jdGlvbk5hbWUsIEphdmFTY3JpcHRPYmpl Y3QgY29udGV4dE9iamVjdCkgeworICAgICAgICBmb3IgKEphdmFTY3JpcHRPYmplY3QgcGx1Z2lu T2JqZWN0IDogcGx1Z2luT2JqZWN0cy52YWx1ZXMoKSkgeworICAgICAgICAgICAgaW52b2tlUGx1 Z2luKHBsdWdpbk9iamVjdCwgZnVuY3Rpb25OYW1lLCBjb250ZXh0T2JqZWN0KTsKKyAgICAgICAg fQorICAgIH0KKworICAgIG5hdGl2ZSB2b2lkIGludm9rZVBsdWdpbihKYXZhU2NyaXB0T2JqZWN0 IHBsdWdpbk9iamVjdCwgU3RyaW5nIGZ1bmN0aW9uTmFtZSwgSmF2YVNjcmlwdE9iamVjdCBjb250 ZXh0T2JqZWN0KSAvKi17CisgICAgICAgIGlmIChjb250ZXh0T2JqZWN0ICE9IG51bGwpIHsKKyAg ICAgICAgICAgIHBsdWdpbk9iamVjdFtmdW5jdGlvbk5hbWVdKGNvbnRleHRPYmplY3QpOworICAg ICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGx1Z2luT2JqZWN0W2Z1bmN0aW9uTmFtZV0oKTsK KyAgICAgICAgfQorICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbGwgcGx1Z2lu cyB0aGF0IHdlcmUgZGV0ZWN0ZWQgd2hlbiBzZXJ2aW5nIFdlYkFkbWluIGhvc3QgcGFnZS4KKyAg ICAgKi8KKyAgICB2b2lkIGxvYWRQbHVnaW5zKCkgeworICAgICAgICBQbHVnaW5EZWZpbml0aW9u cyBkZWZzID0gUGx1Z2luRGVmaW5pdGlvbnMuaW5zdGFuY2UoKTsKKworICAgICAgICBpZiAoZGVm cyAhPSBudWxsKSB7CisgICAgICAgICAgICBKc0FycmF5U3RyaW5nIHBsdWdpbk5hbWVzID0gZGVm cy5nZXRQbHVnaW5OYW1lcygpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBs dWdpbk5hbWVzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9 IHBsdWdpbk5hbWVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlUGFnZVVy bCA9IGRlZnMuZ2V0UGx1Z2luU291cmNlUGFnZVVybChuYW1lKTsKKworICAgICAgICAgICAgICAg IGxvZ2dlci5pbmZvKCJMb2FkaW5nIHBsdWdpbiBbIiArIG5hbWUgKyAiXSBmcm9tIFVSTCAiICsg c291cmNlUGFnZVVybCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAg ICAgIGxvYWRQbHVnaW4obmFtZSwgc291cmNlUGFnZVVybCk7CisgICAgICAgICAgICB9CisgICAg ICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhIHBsdWdpbiB1c2luZyBpdHMg c291cmNlIHBhZ2UgKEhUTUwgcGFnZSB0aGF0IGV4ZWN1dGVzIHRoZSBhY3R1YWwgcGx1Z2luIGNv ZGUpLgorICAgICAqIDxwPgorICAgICAqIFdlYkFkbWluIHJlcXVpcmVzIGFsbCBwbHVnaW5zIHRv IGhhdmUgYSBzb3VyY2UgcGFnZSBiZWNhdXNlIGVhY2ggcGx1Z2luIHJ1bnMgd2l0aGluIHRoZSBj b250ZXh0IG9mIGFuIGlmcmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgcGx1Z2lu IHNvdXJjZSBwYWdlIFVSTHMgYXJlIGFsd2F5cyByZWxhdGl2ZSB0byBKQm9zcyBzZXJ2ZXIgcm9v dCBwYXRoLiBTb3VyY2UgcGFnZSBVUkxzIG11c3QgdGhlcmVmb3JlCisgICAgICogYWx3YXlzIGJl Z2luIHdpdGggc2xhc2ggKHtAY29kZSAvfSkgY2hhcmFjdGVyLiBUaGlzIGFsbG93cyBXZWJBZG1p biBob3N0IHBhZ2UgYW5kIGluZGl2aWR1YWwgcGx1Z2luIHNvdXJjZSBwYWdlcworICAgICAqIHRv IHNoYXJlIHRoZSBzYW1lIG9yaWdpbiAocHJvdG9jb2wsIGRvbWFpbiwgcG9ydCkgYW5kIGF2b2lk IGNyb3NzLWRvbWFpbiB3aW5kb3cvaWZyYW1lIGNvbW11bmljYXRpb24gaXNzdWVzLgorICAgICAq LworICAgIHZvaWQgbG9hZFBsdWdpbihTdHJpbmcgcGx1Z2luTmFtZSwgU3RyaW5nIHBsdWdpblNv dXJjZVBhZ2VVcmwpIHsKKyAgICAgICAgaWYgKCFwbHVnaW5Tb3VyY2VQYWdlVXJsLnN0YXJ0c1dp dGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBsb2dnZXIud2FybmluZygiQXR0 ZW1wdGluZyB0byBsb2FkIHBsdWdpbiBbIiArIHBsdWdpbk5hbWUgKyAiXSB1c2luZyBpbnZhbGlk IFVSTCAiICsgcGx1Z2luU291cmNlUGFnZVVybCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0y JAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBsdWdpbklG cmFtZXMuY29udGFpbnNLZXkocGx1Z2luTmFtZSkpIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJu aW5nKCJQbHVnaW4gWyIgKyBwbHVnaW5OYW1lICsgIl0gaXMgYWxyZWFkeSBsb2FkZWQiKTsgLy8k Tk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K KworICAgICAgICAvLyBDcmVhdGUgYW4gaWZyYW1lIHVzZWQgdG8gbG9hZCB0aGUgcGx1Z2luIHNv dXJjZSBwYWdlCisgICAgICAgIElGcmFtZUVsZW1lbnQgaWZyYW1lID0gRG9jdW1lbnQuZ2V0KCku Y3JlYXRlSUZyYW1lRWxlbWVudCgpOworICAgICAgICBpZnJhbWUuc2V0U3JjKHBsdWdpblNvdXJj ZVBhZ2VVcmwpOworICAgICAgICBpZnJhbWUuc2V0RnJhbWVCb3JkZXIoMCk7CisgICAgICAgIGlm cmFtZS5nZXRTdHlsZSgpLnNldFBvc2l0aW9uKFBvc2l0aW9uLkFCU09MVVRFKTsKKyAgICAgICAg aWZyYW1lLmdldFN0eWxlKCkuc2V0V2lkdGgoMCwgVW5pdC5QVCk7CisgICAgICAgIGlmcmFtZS5n ZXRTdHlsZSgpLnNldEhlaWdodCgwLCBVbml0LlBUKTsKKyAgICAgICAgaWZyYW1lLmdldFN0eWxl KCkuc2V0Qm9yZGVyU3R5bGUoQm9yZGVyU3R5bGUuTk9ORSk7CisgICAgICAgIHBsdWdpbklGcmFt ZXMucHV0KHBsdWdpbk5hbWUsIGlmcmFtZSk7CisKKyAgICAgICAgLy8gQXR0YWNoIHRoZSBpZnJh bWUgdG8gRE9NIGRvY3VtZW50IGJvZHkKKyAgICAgICAgRG9jdW1lbnQuZ2V0KCkuZ2V0Qm9keSgp LmFwcGVuZENoaWxkKGlmcmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVz IHRoYXQgdGhlIGdpdmVuIHBsdWdpbiBpcyByZWFkeSBmb3IgdXNlLgorICAgICAqIDxwPgorICAg ICAqIE5vdGUgdGhhdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyB3aWxsIGJlIGludm9rZWQgb25s eSBvbiBwbHVnaW5zIHdoaWNoIGFyZSBjdXJyZW50bHkgcmVhZHkuCisgICAgICovCisgICAgdm9p ZCBwbHVnaW5SZWFkeShTdHJpbmcgcGx1Z2luTmFtZSwgSmF2YVNjcmlwdE9iamVjdCBwbHVnaW5P YmplY3QpIHsKKyAgICAgICAgaWYgKHBsdWdpbk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAg bG9nZ2VyLndhcm5pbmcoIlBsdWdpbiBuYW1lIGlzIG51bGwgb3IgdW5kZWZpbmVkIik7IC8vJE5P Ti1OTFMtMSQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgh cGx1Z2luSUZyYW1lcy5jb250YWluc0tleShwbHVnaW5OYW1lKSkgeworICAgICAgICAgICAgbG9n Z2VyLndhcm5pbmcoIlBsdWdpbiBbIiArIHBsdWdpbk5hbWUgKyAiXSByZXBvcnRzIGluIGFzIHJl YWR5LCBidXQgaGFzIG5vIGlmcmFtZSBhc3NvY2lhdGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9O LU5MUy0yJAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcGx1Z2lu T2JqZWN0cy5wdXQocGx1Z2luTmFtZSwgcGx1Z2luT2JqZWN0KTsKKyAgICB9CisKKyAgICBuYXRp dmUgdm9pZCBleHBvc2VQbHVnaW5BcGkoKSAvKi17CisgICAgICAgIHZhciBpbnN0YW5jZSA9IHRo aXM7CisKKyAgICAgICAgLy8gRXhwb3NlIHRoZSBnbG9iYWwgcGx1Z2luQXBpIG9iamVjdAorICAg ICAgICAkd25kLnBsdWdpbkFwaSA9IHsKKworICAgICAgICAgICAgLy8gUGx1Z2lucyB3aWxsIHJl Z2lzdGVyIHRoZW1zZWx2ZXMgaW50byB0aGlzIG9iamVjdCBieSBhZGRpbmcgbmV3IHByb3BlcnR5 OgorICAgICAgICAgICAgLy8gLSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwbHVn aW4KKyAgICAgICAgICAgIC8vIC0gcHJvcGVydHkgdmFsdWUgaXMgdGhlIHBsdWdpbiBvYmplY3Qg Y29udGFpbmluZyBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucworICAgICAgICAgICAgcGx1Z2luczog e30sCisKKyAgICAgICAgICAgIHJlYWR5OiBmdW5jdGlvbihwbHVnaW5OYW1lKSB7CisgICAgICAg ICAgICAgICAgdmFyIHBsdWdpbk9iamVjdCA9IHRoaXMucGx1Z2luc1twbHVnaW5OYW1lXTsKKyAg ICAgICAgICAgICAgICBpbnN0YW5jZS5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVn aW4uUGx1Z2luQXBpTWFuYWdlcjo6cGx1Z2luUmVhZHkoTGphdmEvbGFuZy9TdHJpbmc7TGNvbS9n b29nbGUvZ3d0L2NvcmUvY2xpZW50L0phdmFTY3JpcHRPYmplY3Q7KShwbHVnaW5OYW1lLHBsdWdp bk9iamVjdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICB9LSovOworCit9CmRp ZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2ph dmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMu amF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9v cmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZpbml0aW9ucy5qYXZh Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTE4Y2IKLS0tIC9kZXYvbnVs bAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEv b3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMuamF2 YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4u cGx1Z2luOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9i amVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5U3RyaW5nOwor CisvKioKKyAqIE92ZXJsYXkgdHlwZSBmb3Ige0Bjb2RlIHBsdWdpbkRlZmluaXRpb25zfSBnbG9i YWwgSlMgb2JqZWN0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGx1Z2luRGVmaW5pdGlvbnMg ZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKworICAgIHByb3RlY3RlZCBQbHVnaW5EZWZpbml0 aW9ucygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBQbHVnaW5EZWZpbml0 aW9ucyBpbnN0YW5jZSgpIC8qLXsKKyAgICAgICAgcmV0dXJuICR3bmQucGx1Z2luRGVmaW5pdGlv bnM7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBuYXRpdmUgSnNBcnJheVN0cmluZyBnZXRQbHVn aW5OYW1lcygpIC8qLXsKKyAgICAgICAgdmFyIHBsdWdpbk5hbWVzID0gW107CisgICAgICAgIGZv ciAodmFyIGtleSBpbiB0aGlzKSB7CisgICAgICAgICAgICBwbHVnaW5OYW1lcy5wdXNoKGtleSk7 CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBsdWdpbk5hbWVzOworICAgIH0tKi87CisKKyAg ICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXRQbHVnaW5Tb3VyY2VQYWdlVXJsKFN0cmluZyBwbHVn aW5OYW1lKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzW3BsdWdpbk5hbWVdOworICAgIH0tKi87 CisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3Jj L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVu dEhhbmRsZXIuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21h aW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhh bmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjUwMWFjCi0t LSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50 SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51 aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu LnBsdWdpbi5ldmVudC5BY3Rpb25CdXR0b25DbGlja0V2ZW50OworaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmV2ZW50LkFjdGlvbkJ1dHRvbkNsaWNrRXZlbnQuQWN0 aW9uQnV0dG9uQ2xpY2tIYW5kbGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hh cmVkLkV2ZW50QnVzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworLyoqCisg KiBIYW5kbGVzIFdlYkFkbWluIGFwcGxpY2F0aW9uIGV2ZW50cyB0byBiZSBjb25zdW1lZCBieSBV SSBwbHVnaW5zLgorICovCitwdWJsaWMgY2xhc3MgUGx1Z2luRXZlbnRIYW5kbGVyIHsKKworICAg IEBJbmplY3QKKyAgICBwdWJsaWMgUGx1Z2luRXZlbnRIYW5kbGVyKEV2ZW50QnVzIGV2ZW50QnVz LCBmaW5hbCBQbHVnaW5BcGlNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgZXZlbnRCdXMuYWRk SGFuZGxlcihBY3Rpb25CdXR0b25DbGlja0V2ZW50LmdldFR5cGUoKSwgbmV3IEFjdGlvbkJ1dHRv bkNsaWNrSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVi bGljIHZvaWQgb25BY3Rpb25CdXR0b25DbGljayhBY3Rpb25CdXR0b25DbGlja0V2ZW50IGV2ZW50 KSB7CisgICAgICAgICAgICAgICAgbWFuYWdlci5pbnZva2VQbHVnaW5zKCJBY3Rpb25CdXR0b25D bGljayIsIG51bGwpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0pOwor ICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL2V2ZW50 L0FjdGlvbkJ1dHRvbkNsaWNrLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFk bWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vZXZl bnQvQWN0aW9uQnV0dG9uQ2xpY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi42MTQ1YjNkCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1 Z2luL2V2ZW50L0FjdGlvbkJ1dHRvbkNsaWNrLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdl IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmV2ZW50OworCitpbXBvcnQgY29t Lmd3dHBsYXRmb3JtLmRpc3BhdGNoLmFubm90YXRpb24uR2VuRXZlbnQ7CisKK0BHZW5FdmVudAor cHVibGljIGNsYXNzIEFjdGlvbkJ1dHRvbkNsaWNrIHsKKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRl bmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdp bmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJWaXJ0dWFsTWFjaGlu ZVZpZXcuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4v amF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9N YWluVGFiVmlydHVhbE1hY2hpbmVWaWV3LmphdmEKaW5kZXggODc4OGNjNy4uMDE4ZDMxYyAxMDA2 NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZh L29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5U YWJWaXJ0dWFsTWFjaGluZVZpZXcuamF2YQorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz L3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0 aW9uL21haW4vdmlldy90YWIvTWFpblRhYlZpcnR1YWxNYWNoaW5lVmlldy5qYXZhCkBAIC0xNyw2 ICsxNyw4IEBAIGltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy52 bXMuQ29uc29sZU1vZGVsOwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIu bW9kZWxzLnZtcy5WbUxpc3RNb2RlbDsKIGltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFk bWluLkFwcGxpY2F0aW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2Vi YWRtaW4uQXBwbGljYXRpb25SZXNvdXJjZXM7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53 ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLm92aXJ0LmVu Z2luZS51aS53ZWJhZG1pbi5wbHVnaW4uZXZlbnQuQWN0aW9uQnV0dG9uQ2xpY2tFdmVudDsKIGlt cG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIu dGFiLk1haW5UYWJWaXJ0dWFsTWFjaGluZVByZXNlbnRlcjsKIGltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LkFic3RyYWN0TWFpblRhYldpdGhEZXRh aWxzVGFibGVWaWV3OwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4udWljb21t b24uUmVwb3J0QWN0aW9uc0hlbHBlcjsKQEAgLTE2Myw2ICsxNjUsMTIgQEAgcHVibGljIGNsYXNz IE1haW5UYWJWaXJ0dWFsTWFjaGluZVZpZXcgZXh0ZW5kcyBBYnN0cmFjdE1haW5UYWJXaXRoRGV0 YWlsc1RhYmxlVmkKICAgICAgICAgICAgIHByb3RlY3RlZCBVSUNvbW1hbmQgcmVzb2x2ZUNvbW1h bmQoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE1haW5Nb2RlbCgpLmdldE5ld1NlcnZl ckNvbW1hbmQoKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAg ICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKExpc3Q8Vk0+IHNlbGVjdGVkSXRlbXMpIHsKKyAg ICAgICAgICAgICAgICBzdXBlci5vbkNsaWNrKHNlbGVjdGVkSXRlbXMpOworICAgICAgICAgICAg ICAgIEFjdGlvbkJ1dHRvbkNsaWNrRXZlbnQuZmlyZShDbGllbnRHaW5qZWN0b3JQcm92aWRlci5p bnN0YW5jZSgpLmdldEV2ZW50QnVzKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAg ICAgICAgZ2V0VGFibGUoKS5hZGRBY3Rpb25CdXR0b24obmV3IFdlYkFkbWluQnV0dG9uRGVmaW5p dGlvbjxWTT4oY29uc3RhbnRzLm5ld0Rlc2t0b3BWbSgpKSB7CiAgICAgICAgICAgICBAT3ZlcnJp ZGUKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21h aW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2Vi YWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAppbmRleCBhNTBmOGFhLi42MmYw MzEyIDEwMDY0NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9t YWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0yMyw2ICsyMywx NiBAQAogCQk8dXJsLXBhdHRlcm4+L3dlYmFkbWluL1dlYkFkbWluLmh0bWw8L3VybC1wYXR0ZXJu PgogCTwvc2VydmxldC1tYXBwaW5nPgogCisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UGx1 Z2luU291cmNlUGFnZTwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3ZpcnQu ZW5naW5lLnVpLmZyb250ZW5kLnNlcnZlci5nd3QuUGx1Z2luU291cmNlUGFnZVNlcnZsZXQ8L3Nl cnZsZXQtY2xhc3M+CisJPC9zZXJ2bGV0PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZs ZXQtbmFtZT5QbHVnaW5Tb3VyY2VQYWdlPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4v d2ViYWRtaW4vUGx1Z2luU291cmNlUGFnZTwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBp bmc+CisKIAk8IS0tIERlZmF1bHQgcGFnZSB0byBzZXJ2ZSAtLT4KIAk8d2VsY29tZS1maWxlLWxp c3Q+CiAJCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotLSAKMS43LjQu NAoK --=_156c716f-6003-47a3-bcaa-20301ab51501--