[castor-dev] XML Marshall bug report

"superbible" <[email protected]> Fri, 22 Mar 2013 17:09:01 +0800
Newsgroups gmane.comp.java.castor.devel
Message-ID <[email protected]>
--====001__MESSAGE__ID__54yg6f6h6y456345====
Content-Type: multipart/alternative;
	boundary="====003__MESSAGE__ID__54yg6f6h6y456345===="

--====003__MESSAGE__ID__54yg6f6h6y456345====
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

QnVnOg0KVXNpbmcgQ2FzdG9yIFhNTCB0byBnZW5lcmF0ZSBqYXZhIGZpbGVzIGFjY29yZGluZyB0
byBteSB4c2QgZmlsZSwgdGhlbiBjYWxsIG1hcnNoYWwoKSB0byBjb252ZXJ0IGphdmEgb2JqZWN0
IHRvIFhNTCwgaWYgdGhlIHhzZCBmaWxlIGNvbnRhaW5zIHhzOk5NVE9LRU5TIHByb3BlcnR5LCB0
aGVuIG1hcnNoYWwoKSB0aHJvd3MgZXhjZXB0aW9uIDoNCm9yZy5leG9sYWIuY2FzdG9yLnhtbC5N
YXJzaGFsRXhjZXB0aW9uOiBObyBjb2xsZWN0aW9uIGhhbmRsZXIgZm9yIGNvbGxlY3Rpb24gb2Yg
dHlwZSBqYXZhLmxhbmcuU3RyaW5nDQoNCg0KSG93IHRvIHJlcHJvZHVjZToNCjEuIHRlc3QueHNk
IChzZWUgYXR0YWNobWVudCkNCjIuIHRlc3QueG1sIChzZWUgYXR0YWNobWVudCkNCjMuIHVzZSBj
YXN0b3IgYW50IHRhc2sgdG8gZ2VuZXJhdGUgamF2YSBzb3VyY2UgY29kZSBmb3IgdGVzdC54c2QN
CjQuIHVzZSBiZWxvdyBjb2RlIHNuaXBwZXQgdG8gY2FsbCBtYXJzaGFsKCk6DQpwdWJsaWMgc3Rh
dGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCiAgUm9vdCBy
b290PVJvb3QudW5tYXJzaGFsKG5ldyBGaWxlUmVhZGVyKCJjOi8vdGVzdC54bWwiKSk7DQogIHJv
b3QubWFyc2hhbChuZXcgRmlsZVdyaXRlcihuZXcgRmlsZSgiYzovL3Rlc3RPdXQueG1sIikpKTsN
CiB9DQp0aGUgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLg0KDQpCdWcgRml4Og0Kc2VlIE1hcnNo
YWxsZXIuamF2YSBhdHRhY2hlbWVudA0KbGluZSAyNjIzLTI2MjQgaXMgbXkgZml4LiBKdXN0IHRv
IHNwbGl0IHN0cmluZyB2YWx1ZSBpbnRvIGFycmF5LCB0aGVuIGV2ZXJ5dGhpbmcgaXMgT0suDQoy
MDEzLTAzLTIyDQoNCg0KDQpzdXBlcmJpYmxl
--====003__MESSAGE__ID__54yg6f6h6y456345====
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: base64

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPFNUWUxFIHR5cGU9dGV4dC9jc3M+IDwhLS1AaW1wb3J0IHVy
bChzY3JvbGxiYXIuY3NzKTsgLS0+PC9TVFlMRT4NCg0KPE1FVEEgY29udGVudD0idGV4dC9odG1s
OyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxTVFlMRT4JCQlCTE9D
S1FVT1RFe21hcmdpbi1Ub3A6IDBweDsgbWFyZ2luLUJvdHRvbTogMHB4OyBtYXJnaW4tTGVmdDog
MmVtfQkJCWJvZHl7Rk9OVC1TSVpFOjEyLjFwdDsgQ09MT1I6IzAwMTsgRk9OVC1GQU1JTFk65a6L
5L2TLHNlcmlmO30JCTwvU1RZTEU+DQoNCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRlbnQ9Ik1T
SFRNTCA5LjAwLjgxMTIuMTY0NjQiPjxCQVNFIA0KdGFyZ2V0PV9ibGFuaz48L0hFQUQ+DQo8Qk9E
WSANCnN0eWxlPSJMSU5FLUhFSUdIVDogMS4zOyBCT1JERVItUklHSFQtV0lEVEg6IDBweDsgTUFS
R0lOOiAxMnB4OyBCT1JERVItVE9QLVdJRFRIOiAwcHg7IEJPUkRFUi1CT1RUT00tV0lEVEg6IDBw
eDsgQk9SREVSLUxFRlQtV0lEVEg6IDBweCIgDQptYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRo
PSIwIj48U1RBVElPTkVSWT4NCjxESVY+PEZPTlQgY29sb3I9IzAwMDAwMCBzaXplPTMgZmFjZT3l
rovkvZM+QnVnOjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwMDAwMCBzaXplPTM+
VXNpbmcgQ2FzdG9yIFhNTCB0byBnZW5lcmF0ZSBqYXZhIGZpbGVzIA0KYWNjb3JkaW5nIHRvIG15
IHhzZCBmaWxlLCB0aGVuIGNhbGwgbWFyc2hhbCgpIHRvIGNvbnZlcnQgamF2YSBvYmplY3QgdG8g
WE1MLCBpZiANCnRoZSB4c2QgZmlsZSBjb250YWlucyB4czpOTVRPS0VOUyBwcm9wZXJ0eSwgdGhl
biBtYXJzaGFsKCkgdGhyb3dzIGV4Y2VwdGlvbiANCjo8L0ZPTlQ+PC9ESVY+DQo8RElWPm9yZy5l
eG9sYWIuY2FzdG9yLnhtbC5NYXJzaGFsRXhjZXB0aW9uOiBObyBjb2xsZWN0aW9uIGhhbmRsZXIg
Zm9yIA0KY29sbGVjdGlvbiBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmc8L0RJVj4NCjxESVY+Jm5i
c3A7PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj5Ib3cgdG8gcmVwcm9kdWNlOjwvRElW
Pg0KPERJVj4xLiB0ZXN0LnhzZCAoc2VlIGF0dGFjaG1lbnQpPC9ESVY+DQo8RElWPjIuIHRlc3Qu
eG1sIChzZWUgYXR0YWNobWVudCk8L0RJVj4NCjxESVY+My4gdXNlIGNhc3RvciBhbnQgdGFzayB0
byBnZW5lcmF0ZSBqYXZhIHNvdXJjZSBjb2RlIGZvciB0ZXN0LnhzZDwvRElWPg0KPERJVj40LiB1
c2UgYmVsb3cgY29kZSBzbmlwcGV0IHRvIGNhbGwgbWFyc2hhbCgpOjwvRElWPg0KPERJVj5wdWJs
aWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIA0KezxC
Uj4mbmJzcDsmbmJzcDtSb290IHJvb3Q9Um9vdC51bm1hcnNoYWwobmV3IA0KRmlsZVJlYWRlcigi
YzovL3Rlc3QueG1sIikpOzxCUj4mbmJzcDsmbmJzcDtyb290Lm1hcnNoYWwobmV3IEZpbGVXcml0
ZXIobmV3IA0KRmlsZSgiYzovL3Rlc3RPdXQueG1sIikpKTs8QlI+Jm5ic3A7fTwvRElWPg0KPERJ
Vj50aGUgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLjwvRElWPg0KPERJVj4mbmJzcDs8L0RJVj4N
CjxESVY+QnVnIEZpeDo8L0RJVj4NCjxESVY+c2VlIE1hcnNoYWxsZXIuamF2YSBhdHRhY2hlbWVu
dDwvRElWPg0KPERJVj5saW5lIDI2MjMtMjYyNCBpcyBteSBmaXguIEp1c3QgdG8gc3BsaXQgc3Ry
aW5nIHZhbHVlIGludG8gYXJyYXksIHRoZW4gDQpldmVyeXRoaW5nIGlzIE9LLjwvRElWPg0KPERJ
ViBhbGlnbj1sZWZ0PjxGT05UIGNvbG9yPSNjMGMwYzAgc2l6ZT0yIA0KZmFjZT1WZXJkYW5hPjIw
MTMtMDMtMjI8L0ZPTlQ+PC9ESVY+PEZPTlQgc2l6ZT0yIGZhY2U9VmVyZGFuYT4NCjxIUiBzdHls
ZT0iV0lEVEg6IDEyMnB4OyBIRUlHSFQ6IDJweCIgaWQ9U2lnbk5hbWVIUiBhbGlnbj1sZWZ0IFNJ
WkU9Mj4NCjwvRk9OVD4NCjxESVY+PEZPTlQgY29sb3I9I2MwYzBjMCBzaXplPTIgZmFjZT1WZXJk
YW5hPjxTUEFOIA0KaWQ9X0ZsYXNoU2lnbk5hbWU+c3VwZXJiaWJsZTwvU1BBTj48L0ZPTlQ+PC9E
SVY+PC9TVEFUSU9ORVJZPjwvQk9EWT48L0hUTUw+
--====003__MESSAGE__ID__54yg6f6h6y456345====--

--====001__MESSAGE__ID__54yg6f6h6y456345====
Content-Type: application/octet-stream; name="test.xsd"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.xsd"

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhLS0gZWRpdGVkIHdpdGgg
WE1MU3B5IHYyMDA2IHJlbC4gMyBzcDIgKGh0dHA6Ly93d3cuYWx0b3ZhLmNvbSkgYnkgbHVjYXNs
ZWUgKEVNQlJBQ0UpIC0tPg0KPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcv
MjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVG
b3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPg0KCTx4czplbGVtZW50IG5hbWU9InJvb3QiPg0KCQk8
eHM6YW5ub3RhdGlvbj4NCgkJCTx4czpkb2N1bWVudGF0aW9uPkNvbW1lbnQgZGVzY3JpYmluZyB5
b3VyIHJvb3QgZWxlbWVudDwveHM6ZG9jdW1lbnRhdGlvbj4NCgkJPC94czphbm5vdGF0aW9uPg0K
CQk8eHM6Y29tcGxleFR5cGU+DQoJCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVMaXN0IiB0eXBl
PSJ4czpOTVRPS0VOUyIvPg0KCQk8L3hzOmNvbXBsZXhUeXBlPg0KCTwveHM6ZWxlbWVudD4NCjwv
eHM6c2NoZW1hPg0K
--====001__MESSAGE__ID__54yg6f6h6y456345====
Content-Type: application/octet-stream; name="test.xml"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.xml"

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxyb290IHhtbG5zOnhzaT0i
aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpub05hbWVzcGFj
ZVNjaGVtYUxvY2F0aW9uPSJHOi90ZW1wL3Rlc3QueHNkIiBuYW1lTGlzdD0ieHgiLz4NCg==
--====001__MESSAGE__ID__54yg6f6h6y456345====
Content-Type: application/octet-stream; name="Marshaller.java"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Marshaller.java"

LyogDQogKiBEdWUgdG8gYnVnIHdoaWxlIG1hcnNoYWwgeG1sICh1c2VkIGluIFZpc3VhbCBEZXNp
Z25lcikgaGF2ZSBwcm9wZXJ0eSB0YWJsZS9maWVsZC9jb21wb25lbnQvY29uZGl0aW9uRmllbGRz
IHdoaWNoIGlzIHhzOk5NVE9LRU5TIHR5cGUsDQogKiBtYWtlIGEgZml4IG9uIHRoaXMgZmlsZSwg
dGhlIG1vZGlmaWVkIGNvZGUgbWFya2VkICJMdWNhcyIuDQogKi8NCg0KDQovKioNCiAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVu
dGF0aW9uDQogKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQNCiAqIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZSBtZXQ6DQogKg0KICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIGNvcHlyaWdodA0KICogICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0
aW9ucyBtdXN0IGFsc28gY29udGFpbiBhDQogKiAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuDQog
Kg0KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZQ0KICogICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZQ0KICogICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyDQogKiAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLg0KICoNCiAqIDMuIFRoZSBuYW1lICJFeG9sYWIiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlDQogKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2Fy
ZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4NCiAqICAgIHBlcm1pc3Npb24gb2YgSW50YWxpbywgSW5j
LiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwNCiAqICAgIHBsZWFzZSBjb250YWN0IGluZm9AZXhv
bGFiLm9yZy4NCiAqDQogKiA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBt
YXkgbm90IGJlIGNhbGxlZCAiRXhvbGFiIg0KICogICAgbm9yIG1heSAiRXhvbGFiIiBhcHBlYXIg
aW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuDQogKiAgICBwZXJtaXNzaW9uIG9m
IEludGFsaW8sIEluYy4gRXhvbGFiIGlzIGEgcmVnaXN0ZXJlZA0KICogICAgdHJhZGVtYXJrIG9m
IEludGFsaW8sIEluYy4NCiAqDQogKiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byB0
aGUgRXhvbGFiIFByb2plY3QNCiAqICAgIChodHRwOi8vd3d3LmV4b2xhYi5vcmcvKS4NCiAqDQog
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIElOVEFMSU8sIElOQy4gQU5EIENPTlRSSUJV
VE9SUw0KICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQNCiAqIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQNCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwNCiAqIElOVEFMSU8sIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQogKiBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMNCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUg0KICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQogKiBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsDQogKiBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
DQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEDQogKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQog
Kg0KICogQ29weXJpZ2h0IDE5OTktMjAwNCAoQykgSW50YWxpbywgSW5jLiBBbGwgUmlnaHRzIFJl
c2VydmVkLg0KICoNCiAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgS2Vp
dGggVmlzY28gZHVyaW5nIHRoZQ0KICogY291cnNlIG9mIGVtcGxveW1lbnQgYXQgSW50YWxpbyBJ
bmMuDQogKiBBbGwgcG9ydGlvbnMgb2YgdGhpcyBmaWxlIGRldmVsb3BlZCBieSBLZWl0aCBWaXNj
byBhZnRlciBKYW4gMTkgMjAwNSBhcmUNCiAqIENvcHlyaWdodCAoQykgMjAwNSBLZWl0aCBWaXNj
by4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiAkSWQ6IE1hcnNoYWxsZXIuamF2YSA4ODIw
IDIwMTEtMDMtMDUgMjA6NDA6NTlaIHdndXR0bW4gJA0KICovDQpwYWNrYWdlIG9yZy5leG9sYWIu
Y2FzdG9yLnhtbDsNCg0KaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQppbXBvcnQgamF2YS5p
by5QcmludFdyaXRlcjsNCmltcG9ydCBqYXZhLmlvLldyaXRlcjsNCmltcG9ydCBqYXZhLmxhbmcu
cmVmbGVjdC5BcnJheTsNCmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQppbXBvcnQg
amF2YS5tYXRoLkJpZ0RlY2ltYWw7DQppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCmltcG9y
dCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQppbXBv
cnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KaW1wb3J0IGph
dmEudXRpbC5TZXQ7DQppbXBvcnQgamF2YS51dGlsLlN0YWNrOw0KaW1wb3J0IGphdmEudXRpbC5T
dHJpbmdUb2tlbml6ZXI7DQoNCmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5TdHJpbmdV
dGlsczsNCmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQppbXBvcnQgb3Jn
LmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCmltcG9ydCBvcmcuY2FzdG9yLmNv
cmUudXRpbC5CYXNlNjRFbmNvZGVyOw0KaW1wb3J0IG9yZy5jYXN0b3IuY29yZS51dGlsLkhleERl
Y29kZXI7DQppbXBvcnQgb3JnLmNhc3Rvci5jb3JlLnV0aWwuTWVzc2FnZXM7DQppbXBvcnQgb3Jn
LmNhc3Rvci5tYXBwaW5nLkJpbmRpbmdUeXBlOw0KaW1wb3J0IG9yZy5jYXN0b3IubWFwcGluZy5N
YXBwaW5nVW5tYXJzaGFsbGVyOw0KaW1wb3J0IG9yZy5jYXN0b3IueG1sLkludGVybmFsQ29udGV4
dDsNCmltcG9ydCBvcmcuY2FzdG9yLnhtbC5YTUxQcm9wZXJ0aWVzOw0KaW1wb3J0IG9yZy5leG9s
YWIuY2FzdG9yLm1hcHBpbmcuQ2xhc3NEZXNjcmlwdG9yOw0KaW1wb3J0IG9yZy5leG9sYWIuY2Fz
dG9yLm1hcHBpbmcuQ29sbGVjdGlvbkhhbmRsZXI7DQppbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3Iu
bWFwcGluZy5GaWVsZEhhbmRsZXI7DQppbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IubWFwcGluZy5N
YXBIYW5kbGVyOw0KaW1wb3J0IG9yZy5leG9sYWIuY2FzdG9yLm1hcHBpbmcuTWFwSXRlbTsNCmlt
cG9ydCBvcmcuZXhvbGFiLmNhc3Rvci5tYXBwaW5nLk1hcHBpbmc7DQppbXBvcnQgb3JnLmV4b2xh
Yi5jYXN0b3IubWFwcGluZy5NYXBwaW5nRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5leG9sYWIuY2Fz
dG9yLm1hcHBpbmcuTWFwcGluZ0xvYWRlcjsNCmltcG9ydCBvcmcuZXhvbGFiLmNhc3Rvci5tYXBw
aW5nLmhhbmRsZXJzLk1hcEhhbmRsZXJzOw0KaW1wb3J0IG9yZy5leG9sYWIuY2FzdG9yLm1hcHBp
bmcubG9hZGVyLkNvbGxlY3Rpb25IYW5kbGVyczsNCmltcG9ydCBvcmcuZXhvbGFiLmNhc3Rvci50
eXBlcy5BbnlOb2RlOw0KaW1wb3J0IG9yZy5leG9sYWIuY2FzdG9yLnV0aWwuU2FmZVN0YWNrOw0K
aW1wb3J0IG9yZy5leG9sYWIuY2FzdG9yLnhtbC5kZXNjcmlwdG9ycy5Sb290QXJyYXlEZXNjcmlw
dG9yOw0KaW1wb3J0IG9yZy5leG9sYWIuY2FzdG9yLnhtbC5kZXNjcmlwdG9ycy5TdHJpbmdDbGFz
c0Rlc2NyaXB0b3I7DQppbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLmhhbmRsZXJzLkRhdGVG
aWVsZEhhbmRsZXI7DQppbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLmhhbmRsZXJzLkVudW1G
aWVsZEhhbmRsZXI7DQppbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLnV0aWwuQW55Tm9kZTJT
QVgyOw0KaW1wb3J0IG9yZy5leG9sYWIuY2FzdG9yLnhtbC51dGlsLkF0dHJpYnV0ZVNldEltcGw7
DQppbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLnV0aWwuRG9jdW1lbnRIYW5kbGVyQWRhcHRl
cjsNCmltcG9ydCBvcmcuZXhvbGFiLmNhc3Rvci54bWwudXRpbC5TQVgyRE9NSGFuZGxlcjsNCmlt
cG9ydCBvcmcuZXhvbGFiLmNhc3Rvci54bWwudXRpbC5YTUxDbGFzc0Rlc2NyaXB0b3JBZGFwdGVy
Ow0KaW1wb3J0IG9yZy5leG9sYWIuY2FzdG9yLnhtbC51dGlsLlhNTENsYXNzRGVzY3JpcHRvcklt
cGw7DQppbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLnV0aWwuWE1MRmllbGREZXNjcmlwdG9y
SW1wbDsNCmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRl
bnRIYW5kbGVyOw0KaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsNCmltcG9ydCBv
cmcueG1sLnNheC5TQVhFeGNlcHRpb247DQppbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRy
aWJ1dGVzSW1wbDsNCg0KLyoqDQogKiBBIE1hcnNoYWxsZXIgdGhhdCBzZXJpYWxpemVzIEphdmEg
T2JqZWN0J3MgdG8gWE1MDQogKg0KICogTm90ZTogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkIHNh
ZmUsIGFuZCBub3QgaW50ZW5kZWQgdG8gYmUsDQogKiBzbyBwbGVhc2UgY3JlYXRlIGEgbmV3IE1h
cnNoYWxsZXIgZm9yIGVhY2ggdGhyZWFkIGlmIGl0DQogKiBpcyB0byBiZSB1c2VkIGluIGEgbXVs
dGl0aHJlYWRlZCBlbnZpcm9ubWVudC4NCiAqDQogKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpr
ZWl0aCBBVCBrdmlzY28gRE9UIGNvbSI+S2VpdGggVmlzY288L2E+DQogKiBAdmVyc2lvbiAkUmV2
aXNpb246IDg4MjAgJCAkRGF0ZTogMjAwNi0wNC0xMyAwNjo0NzozNiAtMDYwMCAoVGh1LCAxMyBB
cHIgMjAwNikgJA0KICovDQpwdWJsaWMgY2xhc3MgTWFyc2hhbGxlciBleHRlbmRzIE1hcnNoYWxG
cmFtZXdvcmsgew0KDQoNCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8NCiAgICAv
Ly0gUHJpdmF0ZSBDbGFzcyB2YXJpYWJsZXMgLS8NCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS8NCg0KICAgIC8qKg0KICAgICAqIExvZ2dlciBmcm9tIGNvbW1vbnMtbG9nZ2luZy4N
CiAgICAgKi8NCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5n
ZXRMb2coTWFyc2hhbGxlci5jbGFzcyk7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgQ0RBVEEgdHlw
ZS4udXNlcyBmb3IgU0FYIGF0dHJpYnV0ZXMuDQogICAgKiovDQogICAgcHJpdmF0ZSBzdGF0aWMg
ZmluYWwgU3RyaW5nIENEQVRBID0gIkNEQVRBIjsNCg0KICAgIC8qKg0KICAgICAqIERlZmF1bHQg
cHJlZml4IGZvciB1c2Ugd2hlbiBjcmVhdGluZw0KICAgICAqIG5hbWVzcGFjZSBwcmVmaXhlcy4N
CiAgICAqKi8NCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUkVGSVgg
PSAibnMiOw0KDQoNCiAgICAvKioNCiAgICAgKiBNZXNzYWdlIG5hbWUgZm9yIGEgbm9uIHNheCBj
YXBhYmxlIHNlcmlhbGl6ZXIgZXJyb3IuDQogICAgKiovDQogICAgcHJpdmF0ZSBzdGF0aWMgZmlu
YWwgU3RyaW5nIFNFUklBTElaRVJfTk9UX1NBWF9DQVBBQkxFDQogICAgICAgID0gImNvbmYuc2Vy
aWFsaXplck5vdFNheENhcGFibGUiOw0KDQogICAgLyoqDQogICAgICogTmFtZXNwYWNlIGRlY2xh
cmF0aW9uIGZvciB4bWwgc2NoZW1hIGluc3RhbmNlLg0KICAgICAqLw0KICAgIHByaXZhdGUgc3Rh
dGljIGZpbmFsIFN0cmluZyBYU0lfUFJFRklYID0gInhzaSI7DQoNCiAgICAvKioNCiAgICAgKiBU
aGUgeHNpOnR5cGUgYXR0cmlidXRlLg0KICAgICAqLw0KICAgIHByaXZhdGUgc3RhdGljIGZpbmFs
IFN0cmluZyBYU0lfVFlQRSA9ICJ4c2k6dHlwZSI7DQoNCiAgICAvKioNCiAgICAgKiBOYW1lc3Bh
Y2UgcHJlZml4IGNvdW50ZXIuDQogICAgICovDQogICAgcHJpdmF0ZSBpbnQgX25hbWVzcGFjZUNv
dW50ZXIgPSAwOw0KDQogICAgLyoqDQogICAgICogQW4gaW5zdGFuY2Ugb2YgU3RyaW5nQ2xhc3NE
ZXNjcmlwdG9yLg0KICAgICAqLw0KICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ0NsYXNz
RGVzY3JpcHRvciBTVFJJTkdfQ0xBU1NfREVTQ1JJUFRPUg0KICAgICAgICA9IG5ldyBTdHJpbmdD
bGFzc0Rlc2NyaXB0b3IoKTsNCg0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8N
CiAgICAvLy0gUHJpdmF0ZSBtZW1iZXIgdmFyaWFibGVzIC0vDQogICAgLy8tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLw0KDQogICAgLyoqDQogICAgICogQSBib29sZWFuIHRvIGluZGljYXRl
IHdoZXRoZXIgb3Igbm90IHdlIGFyZQ0KICAgICAqIG1hcnNoYWxsaW5nIGFzIGEgY29tcGxldGUg
ZG9jdW1lbnQgb3Igbm90Lg0KICAgICoqLw0KICAgIHByaXZhdGUgYm9vbGVhbiBfYXNEb2N1bWVu
dCA9IHRydWU7DQoNCiAgICAvKioNCiAgICAgKiBUaGUgZGVwdGggb2YgdGhlIHN1YiB0cmVlLCAw
IGRlbm90ZXMgZG9jdW1lbnQgbGV2ZWwuDQogICAgICovDQogICAgcHJpdmF0ZSBpbnQgX2RlcHRo
ID0gMDsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBvdXRwdXQgZm9ybWF0IHRvIHVzZSB3aXRoIHRo
ZSBzZXJpYWxpemVyLg0KICAgICAqIFRoaXMgd2lsbCBiZSBudWxsIGlmIHRoZSB1c2VyIHBhc3Nl
ZCBpbiB0aGVpcg0KICAgICAqIG93biBEb2N1bWVudEhhbmRsZXIuDQogICAgKiovDQogICAgcHJp
dmF0ZSBPdXRwdXRGb3JtYXQgX2Zvcm1hdCA9IG51bGw7DQoNCiAgICAvKioNCiAgICAgKiBUaGUg
Q29udGVudEhhbmRsZXIgd2UgYXJlIG1hcnNoYWxsaW5nIHRvLg0KICAgICoqLw0KICAgIHByaXZh
dGUgQ29udGVudEhhbmRsZXIgIF9oYW5kbGVyICAgICAgPSBudWxsOw0KDQogICAgLyoqDQogICAg
ICogZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0byB1c2UgeHNpOnR5cGUuDQogICAg
KiovDQogICAgcHJpdmF0ZSBib29sZWFuIF9tYXJzaGFsRXh0ZW5kZWRUeXBlID0gdHJ1ZTsNCg0K
ICAgIC8qKg0KICAgICAqIFRoZSByZWdpc3RlcmVkIE1hcnNoYWxMaXN0ZW5lciB0byByZWNlaXZl
DQogICAgICogbm90aWZpY2F0aW9ucyBvZiBwcmUgYW5kIHBvc3QgbWFyc2hhbCBmb3INCiAgICAg
KiBlYWNoIG9iamVjdCBpbiB0aGUgdHJlZSBiZWluZyBtYXJzaGFsbGVkLg0KICAgICoqLw0KICAg
IHByaXZhdGUgTWFyc2hhbExpc3RlbmVyIF9tYXJzaGFsTGlzdGVuZXIgPSBudWxsOw0KDQogICAg
LyoqDQogICAgICogVGhlIG5hbWVzcGFjZSBzdGFjay4NCiAgICAqKi8NCiAgICBwcml2YXRlIE5h
bWVzcGFjZXMgX25hbWVzcGFjZXMgPSBuZXcgTmFtZXNwYWNlcygpOw0KDQogICAgLyoqDQogICAg
ICogUmVjb3JkcyBKYXZhIHBhY2thZ2VzIGJlaW5nIHVzZWQgZHVyaW5nIG1hcnNoYWxsaW5nLg0K
ICAgICoqLw0KICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IF9wYWNrYWdlcyA9IG5ldyBBcnJheUxp
c3Q8U3RyaW5nPigpOw0KDQogICAgLyoqDQogICAgICogQSBzdGFjayBvZiBwYXJlbnQgb2JqZWN0
cy4uLnRvIHByZXZlbnQgY2lyY3VsYXINCiAgICAgKiByZWZlcmVuY2VzIGZyb20gYmVpbmcgbWFy
c2hhbGxlZC4NCiAgICAqKi8NCiAgICBwcml2YXRlIFN0YWNrIF9wYXJlbnRzICA9IG5ldyBTYWZl
U3RhY2soKTsNCg0KICAgIC8qKg0KICAgICAqIEEgbGlzdCBvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rp
b25zIHRvIG91dHB1dA0KICAgICAqIHVwb24gbWFyc2hhbGxpbmcgb2YgdGhlIGRvY3VtZW50Lg0K
ICAgICoqLw0KICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+IF9wcm9jZXNz
aW5nSW5zdHJ1Y3Rpb25zID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24+KCk7
DQoNCiAgICAvKioNCiAgICAgKiBOYW1lIG9mIHRoZSByb290IGVsZW1lbnQgdG8gdXNlLg0KICAg
ICAqLw0KICAgIHByaXZhdGUgU3RyaW5nIF9yb290RWxlbWVudCAgPSBudWxsOw0KDQogICAgLyoq
DQogICAgICogQSBib29sZWFuIHRvIGluZGljYXRlIGtleXMgZnJvbSBhIG1hcA0KICAgICAqIHNo
b3VsZCBiZSBzYXZlZCB3aGVuIG5lY2Vzc2FyeS4NCiAgICAgKi8NCiAgICBwcml2YXRlIGJvb2xl
YW4gX3NhdmVNYXBLZXlzID0gdHJ1ZTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBzZXJpYWxpemVy
IHRoYXQgaXMgYmVpbmcgdXNlZCBmb3IgbWFyc2hhbGxpbmcuDQogICAgICogVGhpcyBtYXkgYmUg
bnVsbCBpZiB0aGUgdXNlciBwYXNzZWQgaW4gYSBEb2N1bWVudEhhbmRsZXIuDQogICAgKiovDQog
ICAgcHJpdmF0ZSBTZXJpYWxpemVyICAgICAgIF9zZXJpYWxpemVyICAgPSBudWxsOw0KDQogICAg
LyoqDQogICAgICogQSBmbGFnIHRvIGFsbG93IHN1cHByZXNzaW5nIG5hbWVzcGFjZXMuDQogICAg
ICovDQogICAgcHJpdmF0ZSBib29sZWFuIF9zdXBwcmVzc05hbWVzcGFjZXMgPSBmYWxzZTsNCg0K
ICAgIC8qKg0KICAgICAqIEEgZmxhZyB0byBhbGxvdyBzdXBwcmVzc2luZyB0aGUgeHNpOnR5cGUg
YXR0cmlidXRlLg0KICAgICAqLw0KICAgIHByaXZhdGUgYm9vbGVhbiBfc3VwcHJlc3NYU0lUeXBl
ID0gZmFsc2U7DQoNCiAgICBwcml2YXRlIGJvb2xlYW4gX3VzZVhTSVR5cGVBdFJvb3QgPSBmYWxz
ZTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSBzZXQgb2Ygb3B0aW9uYWwgdG9wLWxldmVsIGF0dHJp
YnV0ZXMNCiAgICAgKiBzZXQgYnkgdGhlIHVzZXIuDQogICAgKiovDQogICAgcHJpdmF0ZSBBdHRy
aWJ1dGVTZXRJbXBsIF90b3BMZXZlbEF0dHMgPSBuZXcgQXR0cmlidXRlU2V0SW1wbCgpOw0KDQog
ICAgLyoqDQogICAgICogVGhlIEF0dHJpYnV0ZUxpc3Qgd2hpY2ggaXMgdG8gYmUgdXNlZCBkdXJp
bmcgbWFyc2hhbGxpbmcsDQogICAgICogaW5zdGVhZCBvZiBjcmVhdGluZyBhIGJ1bmNoIG9mIG5l
dyBvbmVzLg0KICAgICAqLw0KICAgIHByaXZhdGUgQXR0cmlidXRlc0ltcGwgX2F0dHJpYnV0ZXMg
PSBuZXcgQXR0cmlidXRlc0ltcGwoKTsNCg0KICAgIC8qKg0KICAgICAqIFRoZSB2YWxpZGF0aW9u
IGZsYWcuDQogICAgICovDQogICAgcHJpdmF0ZSBib29sZWFuIF92YWxpZGF0ZSA9IGZhbHNlOw0K
DQogICAgLyoqIFNldCBvZiBmdWxsIGNsYXNzIG5hbWVzIG9mIHByb3h5IGludGVyZmFjZXMuIElm
IHRoZSBjbGFzcyB0byBiZSBtYXJzaGFsbGVkIGltcGxlbWVudHMNCiAgICAgKiAgb25lIG9mIHRo
ZW0gdGhlIHN1cGVyY2xhc3Mgd2lsbCBiZSBtYXJzaGFsbGVkIGluc3RlYWQgb2YgdGhlIGNsYXNz
IGl0c2VsZi4gKi8NCiAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IF9wcm94eUludGVyZmFj
ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQoNCiAgICAvKioNCiAgICAgKiBDcmVhdGVzIGEg
bmV3IHtAbGluayBNYXJzaGFsbGVyfSB3aXRoIHRoZSBnaXZlbiBTQVgge0BsaW5rIERvY3VtZW50
SGFuZGxlcn0uDQogICAgICoNCiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgU0FYIHtAbGluayBE
b2N1bWVudEhhbmRsZXJ9IHRvICJtYXJzaGFsIiB0by4NCiAgICAgKiANCiAgICAgKiBAZGVwcmVj
YXRlIFBsZWFzZSB1c2Uge0BsaW5rIFhNTENvbnRleHQjY3JlYXRlTWFyc2hhbGxlcigpfSBhbmQg
DQogICAgICogICAge0BsaW5rIE1hcnNoYWxsZXIjc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50
SGFuZGxlcil9IGluc3RlYWQNCiAgICAgKiANCiAgICAgKiBAc2VlIHtAbGluayBYTUxDb250ZXh0
I2NyZWF0ZU1hcnNoYWxsZXIoKX0NCiAgICAgKiBAc2VlIHtAbGluayBNYXJzaGFsbGVyI3NldERv
Y3VtZW50SGFuZGxlcihEb2N1bWVudEhhbmRsZXIpfQ0KICAgICAqIEBzZWUgWE1MQ29udGV4dA0K
ICAgICAqIA0KICAgICoqLw0KICAgIHB1YmxpYyBNYXJzaGFsbGVyKGZpbmFsIERvY3VtZW50SGFu
ZGxlciBoYW5kbGVyKSB7DQogICAgICAgIHN1cGVyKG51bGwpOw0KICAgICAgICBpZiAoaGFuZGxl
ciA9PSBudWxsKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0
aW9uKCJUaGUgZ2l2ZW4gJ29yZy5zYXguRG9jdW1lbnRIYW5kbGVyJyAiIA0KICAgICAgICAgICAg
ICAgICAgICArICJpbnN0YW5jZSBpcyBudWxsLiIpOw0KICAgICAgICB9DQoNCiAgICAgICAgc2V0
Q29udGVudEhhbmRsZXIobmV3IERvY3VtZW50SGFuZGxlckFkYXB0ZXIoaGFuZGxlcikpOw0KICAg
IH0NCg0KICAgIC8qKg0KICAgICAqIFNldHMgdGhlIGdpdmVuIFNBWCB7QGxpbmsgRG9jdW1lbnRI
YW5kbGVyfSB0byAnbWFyc2hhbCcgaW50by4NCiAgICAgKg0KICAgICAqIEBwYXJhbSBoYW5kbGVy
IHRoZSBTQVgge0BsaW5rIERvY3VtZW50SGFuZGxlcn0gdG8gIm1hcnNoYWwiIHRvLg0KICAgICoq
Lw0KICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50SGFuZGxlcihmaW5hbCBEb2N1bWVudEhhbmRs
ZXIgaGFuZGxlcikgew0KICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7DQogICAgICAgICAg
ICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZ2l2ZW4gJ29yZy5zYXgu
RG9jdW1lbnRIYW5kbGVyJyAiIA0KICAgICAgICAgICAgICAgICAgICArICJpbnN0YW5jZSBpcyBu
dWxsLiIpOw0KICAgICAgICB9DQoNCiAgICAgICAgc2V0Q29udGVudEhhbmRsZXIobmV3IERvY3Vt
ZW50SGFuZGxlckFkYXB0ZXIoaGFuZGxlcikpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENy
ZWF0ZXMgYSBuZXcge0BsaW5rIE1hcnNoYWxsZXJ9IHdpdGggdGhlIGdpdmVuIFNBWCB7QGxpbmsg
Q29udGVudEhhbmRsZXJ9Lg0KICAgICAqDQogICAgICogQHBhcmFtIGNvbnRlbnRIYW5kbGVyIHRo
ZSB7QGxpbmsgQ29udGVudEhhbmRsZXJ9IHRvICJtYXJzaGFsIiB0by4NCiAgICAgKiANCiAgICAg
KiBAZGVwcmVjYXRlIFBsZWFzZSB1c2Uge0BsaW5rIFhNTENvbnRleHQjY3JlYXRlTWFyc2hhbGxl
cigpfSBhbmQgDQogICAgICogICAge0BsaW5rIE1hcnNoYWxsZXIjc2V0Q29udGVudEhhbmRsZXIo
Q29udGVudEhhbmRsZXIpfSBpbnN0ZWFkDQogICAgICogDQogICAgICogQHNlZSB7QGxpbmsgWE1M
Q29udGV4dCNjcmVhdGVNYXJzaGFsbGVyKCl9DQogICAgICogQHNlZSB7QGxpbmsgTWFyc2hhbGxl
ciNzZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlcil9DQogICAgICogQHNlZSBYTUxDb250
ZXh0DQogICAgICogDQogICAgKiovDQogICAgcHVibGljIE1hcnNoYWxsZXIoZmluYWwgQ29udGVu
dEhhbmRsZXIgY29udGVudEhhbmRsZXIpIHsNCiAgICAgICAgc3VwZXIobnVsbCk7DQogICAgICAg
IGlmIChjb250ZW50SGFuZGxlciA9PSBudWxsKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgSWxs
ZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZ2l2ZW4gJ29yZy5zYXguQ29udGVudEhhbmRsZXIn
IGlzIG51bGwuIik7DQogICAgICAgIH0NCg0KICAgICAgICBzZXRDb250ZW50SGFuZGxlcihjb250
ZW50SGFuZGxlcik7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFRoZSBvbmUge0BsaW5r
IE1hcnNoYWxsZXJ9IGNvbnN0cnVjdG9yIHRoYXQgaXMgdXNlZCBieSB7QGxpbmsgWE1MQ29udGV4
dH0gd2hpY2gNCiAgICAgKiBzZXRzIGFuIHtAbGluayBJbnRlcm5hbENvbnRleHR9IHRoYXQgY29t
ZXMgZnJvbSBvdXRzaWRlLiBXcml0ZXIgb3Ige0BsaW5rIENvbnRlbnRIYW5kbGVyfQ0KICAgICAq
IGhhdmUgdG8gYmUgc2V0IGluIGEgc2Vjb25kIHN0ZXAuDQogICAgICogQHBhcmFtIGludGVybmFs
Q29udGV4dCB0aGUge0BsaW5rIEludGVybmFsQ29udGV4dH0gdG8gaW5pdGlhbGl6ZSB0aGUge0Bs
aW5rIE1hcnNoYWxsZXJ9DQogICAgICogaW5zdGFuY2Ugd2l0aA0KICAgICAqLw0KICAgIHB1Ymxp
YyBNYXJzaGFsbGVyKGZpbmFsIEludGVybmFsQ29udGV4dCBpbnRlcm5hbENvbnRleHQpIHsNCiAg
ICAgICAgc3VwZXIoaW50ZXJuYWxDb250ZXh0KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBD
cmVhdGVzIGEgZGVmYXVsdCBpbnN0YW5jZSBvZiBNYXJzaGFsbGVyLCB3aGVyZSB0aGUgc2luayBu
ZWVkcyB0byBiZSBzZXQNCiAgICAgKiBzZXBhcmF0ZWx5Lg0KICAgICAqLw0KICAgIHB1YmxpYyBN
YXJzaGFsbGVyICgpIHsNCiAgICAgICAgc3VwZXIobnVsbCk7DQogICAgfQ0KDQogICAgLyoqDQog
ICAgICogQ3JlYXRlcyBhIG5ldyBNYXJzaGFsbGVyIHdpdGggdGhlIGdpdmVuIHdyaXRlci4NCiAg
ICAgKiBAcGFyYW0gb3V0IHRoZSBXcml0ZXIgdG8gc2VyaWFsaXplIHRvDQogICAgICogQHRocm93
cyBJT0V4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4ge0BsaW5rIFdyaXRlcn0gaW5zdGFuY2UgY2Fubm90
IGJlIG9wZW5lZC4NCiAgICAgKiBAZGVwcmVjYXRlIFBsZWFzZSB1c2Uge0BsaW5rIFhNTENvbnRl
eHQjY3JlYXRlTWFyc2hhbGxlcigpfSBhbmQgDQogICAgICogICAge0BsaW5rIE1hcnNoYWxsZXIj
c2V0V3JpdGVyKFdyaXRlcil9IGluc3RlYWQNCiAgICAgKiANCiAgICAgKiBAc2VlIHtAbGluayBY
TUxDb250ZXh0I2NyZWF0ZU1hcnNoYWxsZXIoKX0NCiAgICAgKiBAc2VlIHtAbGluayBNYXJzaGFs
bGVyI3NldFdyaXRlcihXcml0ZXIpfQ0KICAgICAqIEBzZWUgWE1MQ29udGV4dA0KICAgICAqIA0K
ICAgICoqLw0KICAgIHB1YmxpYyBNYXJzaGFsbGVyKGZpbmFsIFdyaXRlciBvdXQpIHRocm93cyBJ
T0V4Y2VwdGlvbiB7DQogICAgICAgIHN1cGVyKG51bGwpOw0KICAgICAgICBzZXRXcml0ZXIob3V0
KTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTZXRzIHRoZSBqYXZhLmlvLldyaXRlciB0byBi
ZSB1c2VkIGR1cmluZyBtYXJzaGFsbGluZy4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gb3V0DQog
ICAgICogICAgICAgICAgICBUaGUgd3JpdGVyIHRvIHVzZSBmb3IgbWFyc2hhbGxpbmcNCiAgICAg
KiBAdGhyb3dzIElPRXhjZXB0aW9uDQogICAgICogICAgICAgICAgICAgSWYgdGhlcmUncyBhIHBy
b2JsZW0gYWNjZXNzaW5nIHRoZSBqYXZhLmlvLldyaXRlciBwcm92aWRlZA0KICAgICAqLw0KICAg
IHB1YmxpYyB2b2lkIHNldFdyaXRlciAoZmluYWwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0
aW9uIHsNCiAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcg
SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZ2l2ZW4gJ2phdmEuaW8uV3JpdGVyIGluc3Rh
bmNlJyBpcyBudWxsLiIpOw0KICAgICAgICB9DQogICAgICAgIGNvbmZpZ3VyZVNlcmlhbGl6ZXIo
b3V0KTsNCiAgICB9DQoNCg0KICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVTZXJpYWxpemVyKFdy
aXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbg0KICAgIHsNCiAgICAgICAgX3NlcmlhbGl6ZXIg
PSBnZXRJbnRlcm5hbENvbnRleHQoKS5nZXRTZXJpYWxpemVyKCk7DQoNCiAgICAgICAgaWYgKF9z
ZXJpYWxpemVyID09IG51bGwpDQogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlv
bigiVW5hYmxlIHRvIG9idGFpbiBzZXJpYWxpemVyIik7DQoNCiAgICAgICAgX3NlcmlhbGl6ZXIu
c2V0T3V0cHV0Q2hhclN0cmVhbSggb3V0ICk7DQoNCiAgICAgICAgLy8tLSBEdWUgdG8gYSBYZXJj
ZXMgU2VyaWFsaXplciBidWcgdGhhdCBkb2Vzbid0IGFsbG93IGRlY2xhcmluZw0KICAgICAgICAv
Ly0tIG11bHRpcGxlIHByZWZpeGVzIHRvIHRoZSBzYW1lIG5hbWVzcGFjZSwgd2UgdXNlIHRoZSBv
bGQNCiAgICAgICAgLy8tLSBEb2N1bWVudEhhbmRsZXIgZm9ybWF0IGFuZCBwcm9jZXNzIG5hbWVz
cGFjZXMgb3Vyc2VsdmVzDQogICAgICAgIF9oYW5kbGVyID0gbmV3IERvY3VtZW50SGFuZGxlckFk
YXB0ZXIoX3NlcmlhbGl6ZXIuYXNEb2N1bWVudEhhbmRsZXIoKSk7DQoNCiAgICAgICAgaWYgKCBf
aGFuZGxlciA9PSBudWxsICkgew0KICAgICAgICAgICAgU3RyaW5nIGVyciA9IE1lc3NhZ2VzLmZv
cm1hdCggU0VSSUFMSVpFUl9OT1RfU0FYX0NBUEFCTEUsDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBfc2VyaWFsaXplci5nZXRDbGFzcygpLmdldE5hbWUoKSApOw0K
ICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGVyciApOw0KICAgICAgICB9
DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWFyc2hhbGxl
cn0gZm9yIHRoZSBnaXZlbiBET00ge0BsaW5rIE5vZGV9Lg0KICAgICAqDQogICAgICogQHBhcmFt
IG5vZGUgdGhlIERPTSB7QGxpbmsgTm9kZX0gdG8gbWFyc2hhbCBpbnRvLg0KICAgICAqIA0KICAg
ICAqIEBkZXByZWNhdGUgUGxlYXNlIHVzZSB7QGxpbmsgWE1MQ29udGV4dCNjcmVhdGVNYXJzaGFs
bGVyKCl9IGFuZCANCiAgICAgKiAgICB7QGxpbmsgTWFyc2hhbGxlciNzZXROb2RlKE5vZGUpfSBp
bnN0ZWFkDQogICAgICogDQogICAgICogQHNlZSB7QGxpbmsgWE1MQ29udGV4dCNjcmVhdGVNYXJz
aGFsbGVyKCl9DQogICAgICogQHNlZSB7QGxpbmsgTWFyc2hhbGxlciNzZXROb2RlKE5vZGUpfQ0K
ICAgICAqIEBzZWUgWE1MQ29udGV4dA0KICAgICAqIA0KICAgICAqIA0KICAgICoqLw0KICAgIHB1
YmxpYyBNYXJzaGFsbGVyKGZpbmFsIE5vZGUgbm9kZSkgew0KICAgICAgICBzdXBlcihudWxsKTsN
CiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVn
YWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGdpdmVuIG9yZy53M2MuZG9tLk5vZGUgaW5zdGFuY2Ug
aXMgbnVsbC4iKTsNCiAgICAgICAgfQ0KICAgICAgICBzZXRDb250ZW50SGFuZGxlcihuZXcgRG9j
dW1lbnRIYW5kbGVyQWRhcHRlcihuZXcgU0FYMkRPTUhhbmRsZXIobm9kZSkpKTsNCiAgICB9DQog
ICAgDQogICAgLyoqDQogICAgICogU2V0cyB0aGUgVzNDIHtAbGluayBOb2RlfSBpbnN0YW5jZSB0
byBtYXJzaGFsIHRvLg0KICAgICAqDQogICAgICogQHBhcmFtIG5vZGUgdGhlIERPTSB7QGxpbmsg
Tm9kZX0gdG8gbWFyc2hhbCBpbnRvLg0KICAgICoqLw0KICAgIHB1YmxpYyB2b2lkIHNldE5vZGUo
ZmluYWwgTm9kZSBub2RlKSB7DQogICAgICAgIGlmIChub2RlID09IG51bGwpIHsNCiAgICAgICAg
ICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBnaXZlbiBvcmcudzNj
LmRvbS5Ob2RlIGluc3RhbmNlIGlzIG51bGwuIik7DQogICAgICAgIH0NCiAgICAgICAgc2V0Q29u
dGVudEhhbmRsZXIobmV3IERvY3VtZW50SGFuZGxlckFkYXB0ZXIobmV3IFNBWDJET01IYW5kbGVy
KG5vZGUpKSk7DQogICAgfQ0KICAgIA0KICAvKioNCiAgICogVG8gc2V0IHRoZSB7QGxpbmsgSW50
ZXJuYWxDb250ZXh0fSB0byB1c2UsIGFuZCB0byANCiAgICogaW5pdGlhbGl6ZSB7QGxpbmsgTWFy
c2hhbGxlcn0gcHJvcGVydGllcyBsaW5rZWQgdG8gaXQuDQogICAqIEBwYXJhbSBpbnRlcm5hbENv
bnRleHQgdGhlIHtAbGluayBJbnRlcm5hbENvbnRleHR9IHRvIHVzZQ0KICAgKi8NCiAgcHVibGlj
IHZvaWQgc2V0SW50ZXJuYWxDb250ZXh0KGZpbmFsIEludGVybmFsQ29udGV4dCBpbnRlcm5hbENv
bnRleHQpIHsNCiAgICAgIHN1cGVyLnNldEludGVybmFsQ29udGV4dChpbnRlcm5hbENvbnRleHQp
Ow0KICAgICAgZGVyaXZlUHJvcGVydGllcygpOw0KICB9DQoNCg0KICAvKioNCiAgICAgKiBEZXJp
dmUgY2xhc3MtbGV2ZWwgcHJvcGVydGllcyBmcm9tIHtAbGluayBYTUxQcm9wZXJ0aWVzfSBhcyBk
ZWZpbmVkDQogICAgICoge0BsaW5rIEludGVybmFsQ29udGV4dH0uIFRoaXMgbWV0aG9kIHdpbGwg
YmUgY2FsbGVkIGFmdGVyIGEgbmV3DQogICAgICoge0BsaW5rIEludGVybmFsQ29udGV4dH0gb3Ig
YSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQuDQogICAgICogDQogICAgICogQGxpbmsgI3NldEludGVy
bmFsQ29udGV4dChJbnRlcm5hbENvbnRleHQpDQogICAgICovDQogICAgcHJpdmF0ZSB2b2lkIGRl
cml2ZVByb3BlcnRpZXMoKSB7DQogICAgICAgIF92YWxpZGF0ZSA9IGdldEludGVybmFsQ29udGV4
dCgpLm1hcnNoYWxsaW5nVmFsaWRhdGlvbigpOw0KICAgICAgICBfc2F2ZU1hcEtleXMgPSBnZXRJ
bnRlcm5hbENvbnRleHQoKS5nZXRCb29sZWFuUHJvcGVydHkoDQogICAgICAgICAgICAgICAgWE1M
UHJvcGVydGllcy5TQVZFX01BUF9LRVlTKS5ib29sZWFuVmFsdWUoKTsNCg0KICAgICAgICBTdHJp
bmcgcHJvcCA9IGdldEludGVybmFsQ29udGV4dCgpLmdldFN0cmluZ1Byb3BlcnR5KA0KICAgICAg
ICAgICAgICAgIFhNTFByb3BlcnRpZXMuUFJPWFlfSU5URVJGQUNFUyk7DQogICAgICAgIGlmIChw
cm9wICE9IG51bGwpIHsNCiAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBu
ZXcgU3RyaW5nVG9rZW5pemVyKHByb3AsICIsICIpOw0KICAgICAgICAgICAgd2hpbGUgKHRva2Vu
aXplci5oYXNNb3JlVG9rZW5zKCkpIHsNCiAgICAgICAgICAgICAgICBfcHJveHlJbnRlcmZhY2Vz
LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQog
ICAgfQ0KICAgIA0KICAgLyoqDQogICAgICogQWRkcyB0aGUgZ2l2ZW4gcHJvY2Vzc2luZyBpbnN0
cnVjdGlvbiBkYXRhIHRvIHRoZSBzZXQgb2YNCiAgICAgKiBwcm9jZXNzaW5nIGluc3RydWN0aW9u
cyB0byBvdXRwdXQgZHVyaW5nIG1hcnNoYWxsaW5nLg0KICAgICAqDQogICAgICogQHBhcmFtIHRh
cmdldCB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQNCiAgICAgKiBAcGFyYW0gZGF0
YSB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBkYXRhDQogICAgKiovDQogICAgcHVibGljIHZv
aWQgYWRkUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7
DQoNCiAgICAgICAgaWYgKCh0YXJnZXQgPT0gbnVsbCkgfHwgKHRhcmdldC5sZW5ndGgoKSA9PSAw
KSkgew0KICAgICAgICAgICAgU3RyaW5nIGVyciA9ICJ0aGUgYXJndW1lbnQgJ3RhcmdldCcgbXVz
dCBub3QgYmUgbnVsbCBvciBlbXB0eS4iOw0KICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxB
cmd1bWVudEV4Y2VwdGlvbihlcnIpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGRhdGEgPT0g
bnVsbCkgew0KICAgICAgICAgICAgU3RyaW5nIGVyciA9ICJ0aGUgYXJndW1lbnQgJ2RhdGEnIG11
c3Qgbm90IGJlIG51bGwuIjsNCiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRF
eGNlcHRpb24oZXJyKTsNCiAgICAgICAgfQ0KICAgICAgICBfcHJvY2Vzc2luZ0luc3RydWN0aW9u
cy5hZGQobmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpKTsNCiAgICB9IC8v
LS0gYWRkUHJvY2Vzc2luZ0luc3RydWN0aW9uDQoNCiAgIC8qKg0KICAgICogU2V0cyB0aGUgZG9j
dW1lbnQgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgc2VyaWFsaXplci4gTm90ZSB0aGF0IHRoaXMg
bWV0aG9kDQogICAgKiBjYW5ub3QgYmUgY2FsbGVkIGlmIHlvdSd2ZSBwYXNzZWQgaW4geW91ciBv
d24gRG9jdW1lbnRIYW5kbGVyLg0KICAgICoNCiAgICAqIEBwYXJhbSBwdWJsaWNJZCB0aGUgcHVi
bGljIGlkZW50aWZpZXINCiAgICAqIEBwYXJhbSBzeXN0ZW1JZCB0aGUgc3lzdGVtIGlkZW50aWZp
ZXINCiAgICAqLw0KICAgIHB1YmxpYyB2b2lkIHNldERvY3R5cGUoU3RyaW5nIHB1YmxpY0lkLCBT
dHJpbmcgc3lzdGVtSWQpIHsNCg0KICAgICAgICBpZiAoX3NlcmlhbGl6ZXIgIT0gbnVsbCkgew0K
ICAgICAgICAgICAgaWYgKF9mb3JtYXQgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIF9mb3Jt
YXQgPSBnZXRJbnRlcm5hbENvbnRleHQoKS5nZXRPdXRwdXRGb3JtYXQoKTsNCiAgICAgICAgICAg
IH0NCiAgICAgICAgICAgIF9mb3JtYXQuc2V0RG9jdHlwZShwdWJsaWNJZCwgc3lzdGVtSWQpOw0K
ICAgICAgICAgICAgLy8tLSByZXNldCBvdXRwdXQgZm9ybWF0LCB0aGlzIG5lZWRzIHRvIGJlIGRv
bmUNCiAgICAgICAgICAgIC8vLS0gYW55IHRpbWUgYSBjaGFuZ2Ugb2NjdXJzIHRvIHRoZSBmb3Jt
YXQuDQogICAgICAgICAgICBfc2VyaWFsaXplci5zZXRPdXRwdXRGb3JtYXQoIF9mb3JtYXQgKTsN
CiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgLy8tLSBEdWUgdG8gYSBYZXJjZXMg
U2VyaWFsaXplciBidWcgdGhhdCBkb2Vzbid0IGFsbG93IGRlY2xhcmluZw0KICAgICAgICAgICAg
ICAgIC8vLS0gbXVsdGlwbGUgcHJlZml4ZXMgdG8gdGhlIHNhbWUgbmFtZXNwYWNlLCB3ZSB1c2Ug
dGhlIG9sZA0KICAgICAgICAgICAgICAgIC8vLS0gRG9jdW1lbnRIYW5kbGVyIGZvcm1hdCBhbmQg
cHJvY2VzcyBuYW1lc3BhY2VzIG91cnNlbHZlcw0KICAgICAgICAgICAgICAgIF9oYW5kbGVyID0g
bmV3IERvY3VtZW50SGFuZGxlckFkYXB0ZXIoX3NlcmlhbGl6ZXIuYXNEb2N1bWVudEhhbmRsZXIo
KSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlv
biBpb3gpIHsNCiAgICAgICAgICAgICAgICAvLy0tIHdlIGNhbiBpZ25vcmUgdGhpcyBleGNlcHRp
b24gc2luY2UgaXQgc2hvdWxkbid0DQogICAgICAgICAgICAgICAgLy8tLSBoYXBwZW4uIElmIF9z
ZXJpYWxpemVyIGlzIG5vdCBudWxsLCBpdCBtZWFucw0KICAgICAgICAgICAgICAgIC8vLS0gd2Un
dmUgYWxyZWFkeSBjYWxsZWQgdGhpcyBtZXRob2Qgc3VjZXNzZnVsbHkNCiAgICAgICAgICAgICAg
ICAvLy0tIGluIHRoZSBNYXJzaGFsbGVyKCkgY29uc3RydWN0b3INCiAgICAgICAgICAgICAgICBp
ZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVn
KCJFcnJvciBzZXR0aW5nIHVwIGRvY3VtZW50IGhhbmRsZXIiLCBpb3gpOw0KICAgICAgICAgICAg
ICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAg
ICAgIFN0cmluZyBlcnJvciA9ICJkb2N0eXBlIGNhbm5vdCBiZSBzZXQgaWYgeW91J3ZlIHBhc3Nl
ZCBpbiAiKw0KICAgICAgICAgICAgInlvdXIgb3duIERvY3VtZW50SGFuZGxlciI7DQogICAgICAg
ICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yKTsNCiAgICAgICAgfQ0K
ICAgIH0gLy8tLSBzZXREb2N0eXBlDQoNCg0KICAgIC8qKg0KICAgICAqIFNldHMgd2hldGhlciBv
ciBub3QgdG8gbWFyc2hhbCBhcyBhIGRvY3VtZW50IHdoaWNoIGluY2x1ZGVzDQogICAgICogdGhl
IFhNTCBkZWNsYXJhdGlvbiwgYW5kIGlmIG5lY2Vzc2FyeSB0aGUgRE9DVFlQRSBkZWNsYXJhdGlv
bi4NCiAgICAgKiBCeSBkZWZhdWx0IHRoZSBNYXJzaGFsbGVyIHdpbGwgbWFyc2hhbCBhcyBhIHdl
bGwgZm9ybWVkDQogICAgICogWE1MIGRvY3VtZW50IGluY2x1ZGluZyB0aGUgWE1MIERlY2xhcmF0
aW9uLg0KICAgICAqDQogICAgICogSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgdHJ1ZSwgdGhlIE1h
cnNoYWxsZXIgd2lsbCBtYXJzaGFsDQogICAgICogYXMgYSB3ZWxsIGZvcm1lZCBYTUwgZnJhZ21l
bnQgKG5vIFhNTCBkZWNsYXJhdGlvbiBvciBET0NUWVBFKS4NCiAgICAgKg0KICAgICAqIFRoaXMg
bWV0aG9kIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBjYWxsaW5nDQogICAgICogI3NldE1hcnNo
YWxBc0RvY3VtZW50KGZhbHNlKTsNCiAgICAgKg0KICAgICAqIEBwYXJhbSBzdXByZXNzWE1MRGVj
bGFyYXRpb24gYSBib29sZWFuIHRoYXQgd2hlbiB0cnVlDQogICAgICogaW5jbHVkZXMgdGhhdCBn
ZW5lcmF0ZWQgWE1MIHNob3VsZCBub3QgY29udGFpbg0KICAgICAqIHRoZSBYTUwgZGVjbGFyYXRp
b24uDQogICAgICogQHNlZSAjc2V0TWFyc2hhbEFzRG9jdW1lbnQNCiAgICAgKi8NCiAgICBwdWJs
aWMgdm9pZCBzZXRTdXByZXNzWE1MRGVjbGFyYXRpb24oYm9vbGVhbiBzdXByZXNzWE1MRGVjbGFy
YXRpb24pIHsNCiAgICAgICAgc2V0TWFyc2hhbEFzRG9jdW1lbnQoIXN1cHJlc3NYTUxEZWNsYXJh
dGlvbik7DQogICAgfSAvLy0tIHNldFN1cHJlc3NYTUxEZWNsYXJhdGlvbg0KDQogICAgLyoqDQog
ICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0byBtYXJzaGFsIGFzIGEgZG9jdW1lbnQgd2hpY2gg
aW5jbHVkZXMNCiAgICAgKiB0aGUgWE1MIGRlY2xhcmF0aW9uLCBhbmQgaWYgbmVjZXNzYXJ5IHRo
ZSBET0NUWVBFIGRlY2xhcmF0aW9uLg0KICAgICAqIEJ5IGRlZmF1bHQgdGhlIE1hcnNoYWxsZXIg
d2lsbCBtYXJzaGFsIGFzIGEgd2VsbCBmb3JtZWQNCiAgICAgKiBYTUwgZG9jdW1lbnQgaW5jbHVk
aW5nIHRoZSBYTUwgRGVjbGFyYXRpb24uDQogICAgICoNCiAgICAgKiBJZiB0aGUgZ2l2ZW4gYm9v
bGVhbiBpcyBmYWxzZSwgdGhlIE1hcnNoYWxsZXIgd2lsbCBtYXJzaGFsDQogICAgICogYXMgYSB3
ZWxsIGZvcm1lZCBYTUwgZnJhZ21lbnQgKG5vIFhNTCBkZWNsYXJhdGlvbiBvciBET0NUWVBFKS4N
CiAgICAgKg0KICAgICAqIFRoaXMgbWV0aG9kIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBjYWxs
aW5nDQogICAgICogI3NldFN1cHJlc3NYTUxEZWNsYXJhdGlvbih0cnVlKTsNCiAgICAgKg0KICAg
ICAqIEBwYXJhbSBhc0RvY3VtZW50IGEgYm9vbGVhbiwgd2hlbiB0cnVlLCBpbmRpY2F0aW5nIHRv
IG1hcnNoYWwNCiAgICAgKiBhcyBhIGNvbXBsZXRlIFhNTCBkb2N1bWVudC4NCiAgICAgKiBAc2Vl
ICNzZXRTdXByZXNzWE1MRGVjbGFyYXRpb24NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRN
YXJzaGFsQXNEb2N1bWVudChib29sZWFuIGFzRG9jdW1lbnQpIHsNCg0KICAgICAgICBfYXNEb2N1
bWVudCA9IGFzRG9jdW1lbnQ7DQoNCiAgICAgICAgaWYgKF9zZXJpYWxpemVyICE9IG51bGwpIHsN
Cg0KICAgICAgICAgICAgaWYgKF9mb3JtYXQgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIF9m
b3JtYXQgPSBnZXRJbnRlcm5hbENvbnRleHQoKS5nZXRPdXRwdXRGb3JtYXQoKTsNCiAgICAgICAg
ICAgIH0NCiAgICAgICAgICAgIF9mb3JtYXQuc2V0T21pdFhNTERlY2xhcmF0aW9uKCAhIGFzRG9j
dW1lbnQgKTsNCiAgICAgICAgICAgIF9mb3JtYXQuc2V0T21pdERvY3VtZW50VHlwZSggISBhc0Rv
Y3VtZW50ICk7DQoNCiAgICAgICAgICAgIC8vLS0gcmVzZXQgb3V0cHV0IGZvcm1hdCwgdGhpcyBu
ZWVkcyB0byBiZSBkb25lDQogICAgICAgICAgICAvLy0tIGFueSB0aW1lIGEgY2hhbmdlIG9jY3Vy
cyB0byB0aGUgZm9ybWF0Lg0KICAgICAgICAgICAgX3NlcmlhbGl6ZXIuc2V0T3V0cHV0Rm9ybWF0
KCBfZm9ybWF0ICk7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIC8vLS0gRHVl
IHRvIGEgWGVyY2VzIFNlcmlhbGl6ZXIgYnVnIHRoYXQgZG9lc24ndCBhbGxvdyBkZWNsYXJpbmcN
CiAgICAgICAgICAgICAgICAvLy0tIG11bHRpcGxlIHByZWZpeGVzIHRvIHRoZSBzYW1lIG5hbWVz
cGFjZSwgd2UgdXNlIHRoZSBvbGQNCiAgICAgICAgICAgICAgICAvLy0tIERvY3VtZW50SGFuZGxl
ciBmb3JtYXQgYW5kIHByb2Nlc3MgbmFtZXNwYWNlcyBvdXJzZWx2ZXMNCiAgICAgICAgICAgICAg
ICBfaGFuZGxlciA9IG5ldyBEb2N1bWVudEhhbmRsZXJBZGFwdGVyKF9zZXJpYWxpemVyLmFzRG9j
dW1lbnRIYW5kbGVyKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGphdmEu
aW8uSU9FeGNlcHRpb24gaW94KSB7DQogICAgICAgICAgICAgICAgLy8tLSB3ZSBjYW4gaWdub3Jl
IHRoaXMgZXhjZXB0aW9uIHNpbmNlIGl0IHNob3VsZG4ndA0KICAgICAgICAgICAgICAgIC8vLS0g
aGFwcGVuLiBJZiBfc2VyaWFsaXplciBpcyBub3QgbnVsbCwgaXQgbWVhbnMNCiAgICAgICAgICAg
ICAgICAvLy0tIHdlJ3ZlIGFscmVhZHkgY2FsbGVkIHRoaXMgbWV0aG9kIHN1Y2Vzc2Z1bGx5DQog
ICAgICAgICAgICAgICAgLy8tLSBpbiB0aGUgTWFyc2hhbGxlcigpIGNvbnN0cnVjdG9yDQogICAg
ICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAgICAg
ICAgIExPRy5kZWJ1ZygiRXJyb3Igc2V0dGluZyB1cCBkb2N1bWVudCBoYW5kbGVyIiwgaW94KTsN
CiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgIH0gLy8t
LSBzZXRNYXJzaGFsQXNEb2N1bWVudA0KDQogICAgLyoqDQogICAgICogU2V0cyB0aGUgZ2l2ZW4g
bWFwcGluZyB0byBiZSB1c2VkIGJ5IHRoZSBtYXJzaGFsbGluZyBGcmFtZXdvcmsuIElmIGEgcmVz
b2x2ZXINCiAgICAgKiBleGlzdHMgdGhpcyBtYXBwaW5nIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGV4
aXN0aW5nIENsYXNzRGVzY3JpcHRvclJlc29sdmVyLg0KICAgICAqIE90aGVyd2lzZSBhIG5ldyBD
bGFzc0Rlc2NyaXB0b3JSZXNvbHZlciB3aWxsIGJlIGNyZWF0ZWQuDQogICAgICoNCiAgICAgKiBA
cGFyYW0gbWFwcGluZyBNYXBwaW5nIHRvIHVzaW5nIGR1cmluZyBtYXJzaGFsbGluZy4NCiAgICAg
Ki8NCiAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nKGZpbmFsIE1hcHBpbmcgbWFwcGluZykgdGhy
b3dzIE1hcHBpbmdFeGNlcHRpb24gew0KLy8gICAgICAgIGlmIChfY2RSZXNvbHZlciA9PSBudWxs
KSB7DQovLyAgICAgICAgICAgIF9jZFJlc29sdmVyID0gKFhNTENsYXNzRGVzY3JpcHRvclJlc29s
dmVyKSBDbGFzc0Rlc2NyaXB0b3JSZXNvbHZlckZhY3RvcnkNCi8vICAgICAgICAgICAgICAgIC5j
cmVhdGVDbGFzc0Rlc2NyaXB0b3JSZXNvbHZlcihCaW5kaW5nVHlwZS5YTUwpOw0KLy8gICAgICAg
IH0NCiAgICAgICAgaWYgKChnZXRJbnRlcm5hbENvbnRleHQoKSA9PSBudWxsKSANCiAgICAgICAg
ICAgICAgICB8fCAoZ2V0SW50ZXJuYWxDb250ZXh0KCkuZ2V0WE1MQ2xhc3NEZXNjcmlwdG9yUmVz
b2x2ZXIoKSA9PSBudWxsKSkgew0KICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm8gaW50
ZXJuYWwgY29udGV4dCBvciBubyBjbGFzcyBkZXNjcmlwdG9yIGluIGNvbnRleHQuIjsNCiAgICAg
ICAgICAgIExPRy53YXJuKG1lc3NhZ2UpOw0KICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxT
dGF0ZUV4Y2VwdGlvbihtZXNzYWdlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIE1hcHBpbmdVbm1h
cnNoYWxsZXIgbXVtID0gbmV3IE1hcHBpbmdVbm1hcnNoYWxsZXIoKTsNCiAgICAgICAgTWFwcGlu
Z0xvYWRlciByZXNvbHZlciA9IG11bS5nZXRNYXBwaW5nTG9hZGVyKG1hcHBpbmcsIEJpbmRpbmdU
eXBlLlhNTCk7DQogICAgICAgIGdldEludGVybmFsQ29udGV4dCgpLmdldFhNTENsYXNzRGVzY3Jp
cHRvclJlc29sdmVyKCkuc2V0TWFwcGluZ0xvYWRlcihyZXNvbHZlcik7DQogICAgfQ0KDQogICAg
LyoqDQogICAgICogU2V0cyBhbiBvcHRpb25hbCBNYXJzaGFsTGlzdGVuZXIgdG8gcmVjaWV2ZSBw
cmUgYW5kIHBvc3QNCiAgICAgKiBtYXJzaGFsIG5vdGlmaWNhdGlvbiBmb3IgZWFjaCBPYmplY3Qg
aW4gdGhlIHRyZWUuDQogICAgICogTWFyc2hhbExpc3RlbmVyIGlzIG9ubHkgZm9yIGNvbXBsZXgg
b2JqZWN0cyB0aGF0IG1hcA0KICAgICAqIGludG8gZWxlbWVudHMsIHNpbXBsZVR5cGVzIGFuZCB0
eXBlcyB0aGF0IG1hcCBpbnRvDQogICAgICogYXR0cmlidXRlcyBkbyBub3QgY2F1c2UgYW55IHBy
ZSBhbmQgcG9zdCBldmVudCBub3RpZmljYXRpb25zLg0KICAgICAqIEN1cnJlbnQgb25seSBvbmUg
KDEpIGxpc3RlbmVyIGlzIGFsbG93ZWQuIElmIHlvdSBuZWVkDQogICAgICogcmVnaXN0ZXIgbXVs
dGlwbGUgbGlzdGVuZXJzLCB5b3Ugd2lsbCBoYXZlIHRvIGNyZWF0ZQ0KICAgICAqIHlvdXIgb3du
IG1hc3RlciBsaXN0ZW5lciB0aGF0IHdpbGwgZm9yd2FyZCB0aGUNCiAgICAgKiBldmVudCBub3Rp
ZmljYXRpb25zIGFuZCBtYW5hZ2UgdGhlIG11bHRpcGxlDQogICAgICogbGlzdGVuZXJzLg0KICAg
ICAqDQogICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBNYXJzaGFsTGlzdGVuZXIgdG8gc2V0Lg0K
ICAgICoqLw0KICAgIHB1YmxpYyB2b2lkIHNldE1hcnNoYWxMaXN0ZW5lcihNYXJzaGFsTGlzdGVu
ZXIgbGlzdGVuZXIpIHsNCiAgICAgICAgX21hcnNoYWxMaXN0ZW5lciA9IGxpc3RlbmVyOw0KICAg
IH0gLy8tLSBzZXRNYXJzaGFsTGlzdGVuZXINCg0KICAgIC8qKg0KICAgICAqIFNldHMgdGhlIG1h
cHBpbmcgZm9yIHRoZSBnaXZlbiBOYW1lc3BhY2UgcHJlZml4Lg0KICAgICAqIA0KICAgICAqIEBw
YXJhbSBuc1ByZWZpeCB0aGUgbmFtZXNwYWNlIHByZWZpeA0KICAgICAqIEBwYXJhbSBuc1VSSSB0
aGUgbmFtZXNwYWNlIHRoYXQgdGhlIHByZWZpeCByZXNvbHZlcyB0bw0KICAgICoqLw0KICAgIHB1
YmxpYyB2b2lkIHNldE5hbWVzcGFjZU1hcHBpbmcoZmluYWwgU3RyaW5nIG5zUHJlZml4LCBmaW5h
bCBTdHJpbmcgbnNVUkkpIHsNCg0KICAgICAgICBpZiAoKG5zVVJJID09IG51bGwpIHx8IChuc1VS
SS5sZW5ndGgoKSA9PSAwKSkgew0KICAgICAgICAgICAgU3RyaW5nIGVyciA9ICJuYW1lc3BhY2Ug
VVJJIG11c3Qgbm90IGJlIG51bGwuIjsNCiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJn
dW1lbnRFeGNlcHRpb24oZXJyKTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9uYW1lc3BhY2VzLmFk
ZE5hbWVzcGFjZShuc1ByZWZpeCwgbnNVUkkpOw0KDQogICAgfSAvLy0tIHNldE5hbWVzcGFjZVBy
ZWZpeA0KDQogICAgLyoqDQogICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50
IHRvIHVzZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSByb290RWxlbWVudCBUaGUgbmFtZSBvZiB0
aGUgcm9vdCBlbGVtZW50IHRvIHVzZS4NCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRSb290
RWxlbWVudChmaW5hbCBTdHJpbmcgcm9vdEVsZW1lbnQpIHsNCiAgICAgICAgX3Jvb3RFbGVtZW50
ID0gcm9vdEVsZW1lbnQ7DQogICAgfSAvLy0tIHNldFJvb3RFbGVtZW50DQoNCiAgICAvKioNCiAg
ICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQgdG8gdXNlDQogICAgICog
QHJldHVybiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQgdG8gdXNlDQogICAg
ICovDQogICAgcHVibGljIFN0cmluZyBnZXRSb290RWxlbWVudCgpDQogICAgew0KICAgICAgICBy
ZXR1cm4gX3Jvb3RFbGVtZW50Ow0KICAgIH0gLy8tLSBnZXRSb290RWxlbWVudA0KDQogICAgLyoq
DQogICAgICogU2V0IHRvIFRydWUgdG8gZGVjbGFyZSB0aGUgZ2l2ZW4gbmFtZXNwYWNlIG1hcHBp
bmdzIGF0IHRoZSByb290IG5vZGUuIERlZmF1bHQgaXMgRmFsc2UuDQogICAgICogQHBhcmFtIG5z
UHJlZml4QXRSb290DQogICAgICogQGRlcHJlY2F0ZWQNCiAgICAgKi8NCiAgICBwdWJsaWMgdm9p
ZCBzZXROU1ByZWZpeEF0Um9vdChib29sZWFuIG5zUHJlZml4QXRSb290KQ0KICAgIHsNCiAgICAg
ICAgLy8gbGVhdmluZyBmb3Igbm93Li4uYmFja3dhcmQgY29tcGF0YWJpbGl0eQ0KICAgICAgICAv
L19uc1ByZWZpeEF0Um9vdCA9IG5zUHJlZml4QXRSb290Ow0KICAgIH0NCg0KICAgIC8qKg0KICAg
ICAqIFJldHVybnMgVHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZXNwYWNlIG1hcHBpbmdzIHdpbGwgYmUg
ZGVjbGFyZWQgYXQgdGhlIHJvb3Qgbm9kZS4NCiAgICAgKiBAcmV0dXJuIFJldHVybnMgVHJ1ZSBp
ZiB0aGUgZ2l2ZW4gbmFtZXNwYWNlIG1hcHBpbmdzIHdpbGwgYmUgZGVjbGFyZWQgYXQgdGhlIHJv
b3Qgbm9kZS4NCiAgICAgKiBAZGVwcmVjYXRlZA0KICAgICAqLw0KICAgIHB1YmxpYyBib29sZWFu
IGdldE5TUHJlZml4QXRSb290KCkNCiAgICB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0N
Cg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIENsYXNzRGVzY3JpcHRvclJlc29sdmVyIGZv
ciB1c2UgZHVyaW5nIG1hcnNoYWxsaW5nDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHRoZSBDbGFz
c0Rlc2NyaXB0b3JSZXNvbHZlcg0KICAgICAqIEBzZWUgI3NldFJlc29sdmVyDQogICAgICovDQog
ICAgcHVibGljIFhNTENsYXNzRGVzY3JpcHRvclJlc29sdmVyIGdldFJlc29sdmVyKCkgew0KDQov
LyAgICAgICAgaWYgKF9jZFJlc29sdmVyID09IG51bGwpIHsNCi8vICAgICAgICAgICAgX2NkUmVz
b2x2ZXIgPSAoWE1MQ2xhc3NEZXNjcmlwdG9yUmVzb2x2ZXIpDQovLyAgICAgICAgICAgIENsYXNz
RGVzY3JpcHRvclJlc29sdmVyRmFjdG9yeS5jcmVhdGVDbGFzc0Rlc2NyaXB0b3JSZXNvbHZlcihC
aW5kaW5nVHlwZS5YTUwpOw0KLy8gICAgICAgIH0NCiAgICAgICAgaWYgKChnZXRJbnRlcm5hbENv
bnRleHQoKSA9PSBudWxsKSANCiAgICAgICAgICAgICAgICB8fCAoZ2V0SW50ZXJuYWxDb250ZXh0
KCkuZ2V0WE1MQ2xhc3NEZXNjcmlwdG9yUmVzb2x2ZXIoKSA9PSBudWxsKSkgew0KICAgICAgICAg
ICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm8gaW50ZXJuYWwgY29udGV4dCBvciBubyBjbGFzcyBkZXNj
cmlwdG9yIGluIGNvbnRleHQuIjsNCiAgICAgICAgICAgIExPRy53YXJuKG1lc3NhZ2UpOw0KICAg
ICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlKTsNCiAgICAg
ICAgfQ0KICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxDb250ZXh0KCkuZ2V0WE1MQ2xhc3NEZXNj
cmlwdG9yUmVzb2x2ZXIoKTsNCg0KICAgIH0gLy8tLSBnZXRSZXNvbHZlcg0KDQogICAgLyoqDQog
ICAgICogU2V0cyB0aGUgQ2xhc3NEZXNjcmlwdG9yUmVzb2x2ZXIgdG8gdXNlIGR1cmluZyBtYXJz
aGFsbGluZy4NCiAgICAgKg0KICAgICAqIDxCUiAvPg0KICAgICAqIDxCPk5vdGU6PC9CPiBUaGlz
IG1ldGhvZCB3aWxsIG51bGxpZnkgYW55IE1hcHBpbmcNCiAgICAgKiBjdXJyZW50bHkgYmVpbmcg
dXNlZCBieSB0aGlzIE1hcnNoYWxsZXINCiAgICAgKg0KICAgICAqIEBwYXJhbSBjZHIgdGhlIENs
YXNzRGVzY3JpcHRvclJlc29sdmVyIHRvIHVzZQ0KICAgICAqIEBzZWUgI3NldE1hcHBpbmcNCiAg
ICAgKiBAc2VlICNnZXRSZXNvbHZlcg0KICAgICAqLw0KICAgIHB1YmxpYyB2b2lkIHNldFJlc29s
dmVyKGZpbmFsIFhNTENsYXNzRGVzY3JpcHRvclJlc29sdmVyIGNkcikgew0KDQogICAgICAgIGlm
IChjZHIgIT0gbnVsbCkgew0KICAgICAgICAgICAgZ2V0SW50ZXJuYWxDb250ZXh0KCkuc2V0WE1M
Q2xhc3NEZXNjcmlwdG9yUmVzb2x2ZXIoY2RyKTsNCi8vICAgICAgICAgICAgX2NkUmVzb2x2ZXIg
PSBjZHI7DQogICAgICAgIH0NCg0KICAgIH0gLy8tLSBzZXRSZXNvbHZlcg0KDQogICAgLyoqDQog
ICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0byB2YWxpZGF0ZSB0aGUgb2JqZWN0IG1vZGVsDQog
ICAgICogYmVmb3JlIG1hcnNoYWxsaW5nLiBCeSBkZWZhdWx0IHZhbGlkYXRpb24gaXMgZW5hYmxl
ZC4NCiAgICAgKiBUaGlzIG1ldGhvZCBpcyByZWFsbHkgZm9yIGRlYnVnZ2luZy4NCiAgICAgKiBJ
IGRvIG5vdCByZWNvbW1lbmQgdHVybmluZyBvZmYgdmFsaWRhdGlvbiwgc2luY2UNCiAgICAgKiB5
b3UgY291bGQgbWFyc2hhbCBhIGRvY3VtZW50LCB3aGljaCB5b3UgY2FuIHRoZW4NCiAgICAgKiBu
b3QgdW5tYXJzaGFsLiBJZiB5b3Uga25vdyB0aGUgb2JqZWN0IG1vZGVsDQogICAgICogaXMgZ3Vh
cmFudGVlZCB0byBiZSB2YWxpZCwgZGlzYWJsaW5nIHZhbGlkYXRpb24gd2lsbA0KICAgICAqIGlt
cHJvdmUgcGVyZm9ybWFjZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSB2YWxpZGF0ZSB0aGUgYm9v
bGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvDQogICAgICogdmFsaWRhdGUgdGhlIG9i
amVjdCBtb2RlbCBiZWZvcmUgbWFyc2hhbGxpbmcuDQogICAgKiovDQogICAgcHVibGljIHZvaWQg
c2V0VmFsaWRhdGlvbihib29sZWFuIHZhbGlkYXRlKSB7DQogICAgICAgIF92YWxpZGF0ZSA9IHZh
bGlkYXRlOw0KICAgIH0gLy8tLSBzZXRWYWxpZGF0aW9uDQogICAgDQogICAgcHVibGljIGJvb2xl
YW4gZ2V0VmFsaWRhdGlvbigpIHsNCiAgICAgICAgcmV0dXJuIF92YWxpZGF0ZTsNCiAgICB9DQoN
CiAgICAvKioNCiAgICAgKiBJZiBUcnVlIHRoZSBtYXJzaGFsbGVyIHdpbGwgdXNlIHRoZSAneHNp
OnR5cGUnIGF0dHJpYnV0ZQ0KICAgICAqIHRvIG1hcnNoYWxsIGEgZmllbGQgdmFsdWUgdGhhdCBl
eHRlbmRlZCB0aGUgZGVmaW5lZCBmaWVsZCB0eXBlLg0KICAgICAqIERlZmF1bHQgaXMgVHJ1ZS4N
CiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRNYXJzaGFsRXh0ZW5kZWRUeXBlKGJvb2xlYW4g
bWFyc2hhbEV4dGVuZGVkVHlwZSkNCiAgICB7DQogICAgICAgIF9tYXJzaGFsRXh0ZW5kZWRUeXBl
ID0gbWFyc2hhbEV4dGVuZGVkVHlwZTsNCiAgICB9IC8vLS0gc2V0TWFyc2hhbEV4dGVuZGVkVHlw
ZQ0KDQoNCiAgICAvKioNCiAgICAgKiBJZiBUcnVlIHRoZSBtYXJzaGFsbGVyIHdpbGwgdXNlIHRo
ZSAneHNpOnR5cGUnIGF0dHJpYnV0ZQ0KICAgICAqIHRvIG1hcnNoYWxsIGEgZmllbGQgdmFsdWUg
dGhhdCBleHRlbmRlZCB0aGUgZGVmaW5lZCBmaWVsZCB0eXBlLg0KICAgICAqIERlZmF1bHQgaXMg
VHJ1ZS4NCiAgICAgKiBAcmV0dXJuIElmIFRydWUgdGhlIG1hcnNoYWxsZXIgd2lsbCB1c2UgdGhl
ICd4c2k6dHlwZScgYXR0cmlidXRlDQogICAgICogdG8gbWFyc2hhbGwgYSBmaWVsZCB2YWx1ZSB0
aGF0IGV4dGVuZGVkIHRoZSBkZWZpbmVkIGZpZWxkIHR5cGUuDQogICAgICogRGVmYXVsdCBpcyBU
cnVlLg0KICAgICAqLw0KICAgIHB1YmxpYyBib29sZWFuIGdldE1hcnNoYWxFeHRlbmRlZFR5cGUo
KQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIF9tYXJzaGFsRXh0ZW5kZWRUeXBlOw0KICAgIH0gLy8t
LSBzZXRNYXJzaGFsbEV4dGVuZGVkVHlwZQ0KDQogICAgLyoqDQogICAgICogTWFyc2hhbHMgdGhl
IGdpdmVuIE9iamVjdCBhcyBYTUwgdXNpbmcgdGhlIGdpdmVuIHdyaXRlci4NCiAgICAgKg0KICAg
ICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBtYXJzaGFsLg0KICAgICAqIEBwYXJhbSBv
dXQgVGhlIHdyaXRlciB0byBtYXJzaGFsIHRvLg0KICAgICAqIEBleGNlcHRpb24gb3JnLmV4b2xh
Yi5jYXN0b3IueG1sLk1hcnNoYWxFeGNlcHRpb24NCiAgICAgKiBAZXhjZXB0aW9uIG9yZy5leG9s
YWIuY2FzdG9yLnhtbC5WYWxpZGF0aW9uRXhjZXB0aW9uDQogICAgICovDQogICAgcHVibGljIHN0
YXRpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCwgV3JpdGVyIG91dCkNCiAgICB0aHJvd3Mg
TWFyc2hhbEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7DQogICAgICAgIHRyeSB7DQog
ICAgICAgICAgICBzdGF0aWNNYXJzaGFsKG9iamVjdCwgbmV3IE1hcnNoYWxsZXIob3V0KSk7DQog
ICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBN
YXJzaGFsRXhjZXB0aW9uKGUpOw0KICAgICAgICB9DQogICAgfSAvLy0tIG1hcnNoYWwNCg0KICAg
IC8qKg0KICAgICAqIE1hcnNoYWxzIHRoZSBnaXZlbiBPYmplY3QgYXMgWE1MIHVzaW5nIHRoZSBn
aXZlbiBEb2N1bWVudEhhbmRsZXINCiAgICAgKiB0byBzZW5kIGV2ZW50cyB0by4NCiAgICAgKg0K
ICAgICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBtYXJzaGFsLg0KICAgICAqIEBwYXJh
bSBoYW5kbGVyIFRoZSBEb2N1bWVudEhhbmRsZXIgdG8gbWFyc2hhbCB0by4NCiAgICAgKiBAZXhj
ZXB0aW9uIG9yZy5leG9sYWIuY2FzdG9yLnhtbC5NYXJzaGFsRXhjZXB0aW9uDQogICAgICogQGV4
Y2VwdGlvbiBvcmcuZXhvbGFiLmNhc3Rvci54bWwuVmFsaWRhdGlvbkV4Y2VwdGlvbg0KICAgICAq
Lw0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmplY3QsIERvY3VtZW50
SGFuZGxlciBoYW5kbGVyKQ0KICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uLCBWYWxpZGF0aW9u
RXhjZXB0aW9uIHsNCiAgICAgICAgc3RhdGljTWFyc2hhbChvYmplY3QsIG5ldyBNYXJzaGFsbGVy
KGhhbmRsZXIpKTsNCiAgICB9IC8vLS0gbWFyc2hhbA0KDQogICAgLyoqDQogICAgICogTWFyc2hh
bHMgdGhlIGdpdmVuIE9iamVjdCBhcyBYTUwgdXNpbmcgdGhlIGdpdmVuIENvbnRlbnRIYW5kbGVy
DQogICAgICogdG8gc2VuZCBldmVudHMgdG8uDQogICAgICoNCiAgICAgKiBAcGFyYW0gb2JqZWN0
IFRoZSBPYmplY3QgdG8gbWFyc2hhbC4NCiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgQ29udGVu
dEhhbmRsZXIgdG8gbWFyc2hhbCB0by4NCiAgICAgKiBAZXhjZXB0aW9uIG9yZy5leG9sYWIuY2Fz
dG9yLnhtbC5NYXJzaGFsRXhjZXB0aW9uDQogICAgICogQGV4Y2VwdGlvbiBvcmcuZXhvbGFiLmNh
c3Rvci54bWwuVmFsaWRhdGlvbkV4Y2VwdGlvbg0KICAgICAqLw0KICAgIHB1YmxpYyBzdGF0aWMg
dm9pZCBtYXJzaGFsKE9iamVjdCBvYmplY3QsIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpDQogICAg
dGhyb3dzIE1hcnNoYWxFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9u
IHsNCiAgICAgICAgc3RhdGljTWFyc2hhbChvYmplY3QsIG5ldyBNYXJzaGFsbGVyKGhhbmRsZXIp
KTsNCiAgICB9IC8vLS0gbWFyc2hhbA0KDQogICAgLyoqDQogICAgICogTWFyc2hhbHMgdGhlIGdp
dmVuIE9iamVjdCBhcyBYTUwgdXNpbmcgdGhlIGdpdmVuIERPTSBOb2RlDQogICAgICogdG8gc2Vu
ZCBldmVudHMgdG8uDQogICAgICoNCiAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBPYmplY3QgdG8g
bWFyc2hhbC4NCiAgICAgKiBAcGFyYW0gbm9kZSBUaGUgRE9NIE5vZGUgdG8gbWFyc2hhbCB0by4N
CiAgICAgKiBAZXhjZXB0aW9uIG9yZy5leG9sYWIuY2FzdG9yLnhtbC5NYXJzaGFsRXhjZXB0aW9u
DQogICAgICogQGV4Y2VwdGlvbiBvcmcuZXhvbGFiLmNhc3Rvci54bWwuVmFsaWRhdGlvbkV4Y2Vw
dGlvbg0KICAgICAqLw0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmpl
Y3QsIE5vZGUgbm9kZSkNCiAgICB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4
Y2VwdGlvbiB7DQogICAgICAgIHN0YXRpY01hcnNoYWwob2JqZWN0LCBuZXcgTWFyc2hhbGxlcihu
b2RlKSk7DQogICAgfSAvLy0tIG1hcnNoYWwNCg0KICAgIC8qKg0KICAgICAqIFN0YXRpYyBoZWxw
ZXIgbWV0aG9kIHRvIG1hcnNoYWwgdGhlIGdpdmVuIG9iamVjdCB1c2luZyB0aGUNCiAgICAgKiBN
YXJzaGFsbGVyIGluc3RhbmNlIHByb3ZpZGVkLg0KICAgICAqDQogICAgICogQHBhcmFtIG9iamVj
dCBUaGUgT2JqZWN0IHRvIG1hcnNoYWwuDQogICAgICogQHBhcmFtIG1hcnNoYWxsZXIgVGhlIHtA
bGluayBNYXJzaGFsbGVyfSB0byB1c2UgZm9yIG1hcnNoYWxsaW5nLg0KICAgICAqIEB0aHJvd3Mg
TWFyc2hhbEV4Y2VwdGlvbiBhcyB0aHJvd24gYnkgbWFyc2hhbChPYmplY3QpDQogICAgICogQHRo
cm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIGFzIHRocm93biBieSBtYXJzaGFsKE9iamVjdCkNCiAg
ICAgKi8NCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHN0YXRpY01hcnNoYWwoZmluYWwgT2JqZWN0
IG9iamVjdCwgZmluYWwgTWFyc2hhbGxlciBtYXJzaGFsbGVyKQ0KICAgIHRocm93cyBNYXJzaGFs
RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsNCiAgICAgICAgaWYgKG9iamVjdCA9PSBu
dWxsKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigib2JqZWN0IG11
c3Qgbm90IGJlIG51bGwiKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChMT0cuaXNJbmZvRW5h
YmxlZCgpKSB7DQogICAgICAgICAgICBMT0cuaW5mbygiTWFyc2hhbGxlciBjYWxsZWQgdXNpbmcg
b25lIG9mIHRoZSAqc3RhdGljKiAiICsgDQogICAgICAgICAgICAgICAgICAgICIgbWFyc2hhbChP
YmplY3QsICopIG1ldGhvZHMuIFRoaXMgd2lsbCBpZ25vcmUgYW55ICIgKw0KICAgICAgICAgICAg
ICAgICAgICAiIG1hcHBpbmcgZmlsZXMgYXMgc3BlY2lmaWVkLiBQbGVhc2UgY29uc2lkZXIgc3dp
dGNoaW5nIHRvICIgKw0KICAgICAgICAgICAgICAgICAgICAiIHVzaW5nIE1hcnNoYWxsZXIgaW5z
dGFuY2VzIGFuZCBjYWxsaW5nIG9uZSBvZiB0aGUiICsNCiAgICAgICAgICAgICAgICAgICAgIiBt
YXJzaGFsKCopIG1ldGhvZHMuIik7DQogICAgICAgIH0NCg0KICAgICAgICBtYXJzaGFsbGVyLm1h
cnNoYWwob2JqZWN0KTsNCiAgICB9IC8vLS0gc3RhdGljTWFyc2hhbA0KDQogICAgLyoqDQogICAg
ICogTWFyc2hhbHMgdGhlIGdpdmVuIE9iamVjdCBhcyBYTUwgdXNpbmcgdGhlIERvY3VtZW50SGFu
ZGxlcg0KICAgICAqIGZvciB0aGlzIE1hcnNoYWxsZXIuDQogICAgICoNCiAgICAgKiBAcGFyYW0g
b2JqZWN0IFRoZSBPYmplY3QgdG8gbWFyc2hhbC4NCiAgICAgKiBAZXhjZXB0aW9uIG9yZy5leG9s
YWIuY2FzdG9yLnhtbC5NYXJzaGFsRXhjZXB0aW9uDQogICAgICogQGV4Y2VwdGlvbiBvcmcuZXhv
bGFiLmNhc3Rvci54bWwuVmFsaWRhdGlvbkV4Y2VwdGlvbg0KICAgICAqLw0KICAgIHB1YmxpYyB2
b2lkIG1hcnNoYWwoT2JqZWN0IG9iamVjdCkNCiAgICB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiwg
VmFsaWRhdGlvbkV4Y2VwdGlvbiB7DQogICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkNCiAgICAg
ICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJvYmplY3QgbXVzdCBub3QgYmUgbnVs
bCIpOw0KDQogICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KICAgICAgICAgICAg
TE9HLmRlYnVnKCJNYXJzaGFsbGluZyAiICsgb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsN
CiAgICAgICAgfQ0KDQogICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBbnlOb2RlKSB7DQog
ICAgICAgICAgIHRyeXsNCiAgICAgICAgICAgICAgQW55Tm9kZTJTQVgyLmZpcmVFdmVudHMoKEFu
eU5vZGUpb2JqZWN0LCBfaGFuZGxlciwgX25hbWVzcGFjZXMpOw0KICAgICAgICAgICB9IGNhdGNo
KFNBWEV4Y2VwdGlvbiBlKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNl
cHRpb24oZSk7DQogICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAg
ICAgICAgICB2YWxpZGF0ZShvYmplY3QpOw0KICAgICAgICAgICAgIE1hcnNoYWxTdGF0ZSBtc3Rh
dGUgPSBuZXcgTWFyc2hhbFN0YXRlKG9iamVjdCwgInJvb3QiKTsNCiAgICAgICAgICAgICBpZiAo
X2FzRG9jdW1lbnQpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAg
ICBfaGFuZGxlci5zdGFydERvY3VtZW50KCk7DQogICAgICAgICAgICAgICAgICAgIC8vLS0gaGFu
ZGxlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zDQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgX3Byb2Nlc3NpbmdJbnN0cnVjdGlvbnMuc2l6ZSgpOyBpKyspIHsNCiAgICAg
ICAgICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IF9wcm9jZXNzaW5n
SW5zdHJ1Y3Rpb25zLmdldChpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIF9oYW5kbGVyLnBy
b2Nlc3NpbmdJbnN0cnVjdGlvbihwaS5nZXRUYXJnZXQoKSwNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBwaS5nZXREYXRhKCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAg
ICAgICAgICAgIG1hcnNoYWwob2JqZWN0LCBudWxsLCBfaGFuZGxlciwgbXN0YXRlKTsNCiAgICAg
ICAgICAgICAgICAgICAgX2hhbmRsZXIuZW5kRG9jdW1lbnQoKTsNCiAgICAgICAgICAgICAgICB9
IGNhdGNoIChTQVhFeGNlcHRpb24gc3gpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IE1hcnNoYWxFeGNlcHRpb24oc3gpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9
DQogICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgbWFyc2hhbChvYmplY3QsIG51
bGwsIF9oYW5kbGVyLCBtc3RhdGUpOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAg
fSAvLy0tIG1hcnNoYWwNCg0KICAgIC8qKg0KICAgICAqIE1hcnNoYWxzIHRoZSBnaXZlbiBvYmpl
Y3QsIHVzaW5nIHRoZSBnaXZlbiBkZXNjcmlwdG9yDQogICAgICogYW5kIGRvY3VtZW50IGhhbmRs
ZXIuDQogICAgICoNCiAgICAgKiA8QlIvPg0KICAgICAqIDxCPk5vdGU6PC9CPg0KICAgICAqIDxJ
Pg0KICAgICAqICAgSXQgaXMgYW4gZXJyb3IgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGgg
YW4NCiAgICAgKiAgIEF0dHJpYnV0ZURlc2NyaXB0b3IuDQogICAgICogPC9JPg0KICAgICAqIEBw
YXJhbSBkZXNjcmlwdG9yIHRoZSBYTUxGaWVsZERlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBvYmpl
Y3QNCiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgRG9jdW1lbnRIYW5kbGVyIHRvIG1hcnNoYWwg
dG8NCiAgICAgKiBAZXhjZXB0aW9uIG9yZy5leG9sYWIuY2FzdG9yLnhtbC5NYXJzaGFsRXhjZXB0
aW9uDQogICAgICogQGV4Y2VwdGlvbiBvcmcuZXhvbGFiLmNhc3Rvci54bWwuVmFsaWRhdGlvbkV4
Y2VwdGlvbg0KICAgICAqIGR1cmluZyBtYXJzaGFsaW5nDQogICAgKiovDQogICAgcHJpdmF0ZSB2
b2lkIG1hcnNoYWwNCiAgICAgICAgKE9iamVjdCBvYmplY3QsDQogICAgICAgICBYTUxGaWVsZERl
c2NyaXB0b3IgZGVzY3JpcHRvciwNCiAgICAgICAgIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsDQog
ICAgICAgICBmaW5hbCBNYXJzaGFsU3RhdGUgbXN0YXRlKQ0KICAgICAgICB0aHJvd3MgTWFyc2hh
bEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbg0KICAgIHsNCg0KDQogICAgICAgIGlmIChv
YmplY3QgPT0gbnVsbCkgew0KICAgICAgICAgICAgU3RyaW5nIGVyciA9ICJNYXJzaGFsbGVyI21h
cnNoYWw6IG51bGwgcGFyYW1ldGVyOiAnb2JqZWN0JyI7DQogICAgICAgICAgICB0aHJvdyBuZXcg
TWFyc2hhbEV4Y2VwdGlvbihlcnIpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGRlc2NyaXB0
b3IgIT0gbnVsbCAmJiBkZXNjcmlwdG9yLmlzVHJhbnNpZW50KCkpDQogICAgICAgICAgICByZXR1
cm47DQoNCiAgICAgICAgLy8tLSBub3RpZnkgbGlzdGVuZXINCiAgICAgICAgaWYgKF9tYXJzaGFs
TGlzdGVuZXIgIT0gbnVsbCkgew0KICAgICAgICAgICAgYm9vbGVhbiB0b0JlTWFyc2hhbGxlZCA9
IHRydWU7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHRvQmVNYXJzaGFsbGVk
ID0gX21hcnNoYWxMaXN0ZW5lci5wcmVNYXJzaGFsKG9iamVjdCk7DQogICAgICAgICAgICB9IGNh
dGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIklu
dm9raW5nICNwcmVNYXJzaGFsKCkgb24geW91ciBjdXN0b20gTWFyc2hhbExpc3RlbmVyIGluc3Rh
bmNlIGNhdXNlZCB0aGUgZm9sbG93aW5nIHByb2JsZW06IiwgZSk7DQogICAgICAgICAgICB9DQog
ICAgICAgICAgICBpZiAoIXRvQmVNYXJzaGFsbGVkKSB7DQogICAgICAgICAgICAgICAgcmV0dXJu
Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8tLSBoYW5kbGUgQW55Tm9k
ZQ0KICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW55Tm9kZSkgew0KICAgICAgICAgICB0
cnkgew0KICAgICAgICAgICAgICAgQW55Tm9kZTJTQVgyLmZpcmVFdmVudHMoKEFueU5vZGUpIG9i
amVjdCwgaGFuZGxlciwgX25hbWVzcGFjZXMpOw0KICAgICAgICAgICB9Y2F0Y2ggKFNBWEV4Y2Vw
dGlvbiBlKSB7DQogICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihlKTsN
CiAgICAgICAgICAgfQ0KICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBi
b29sZWFuIGNvbnRhaW5lckZpZWxkID0gZmFsc2U7DQoNCiAgICAgICAgaWYgKGRlc2NyaXB0b3Ig
IT0gbnVsbCAmJiBkZXNjcmlwdG9yLmlzQ29udGFpbmVyKCkpIHsNCiAgICAgICAgICAgIGNvbnRh
aW5lckZpZWxkID0gdHJ1ZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vLS0gYWRkIG9iamVjdCB0
byBzdGFjayBzbyB3ZSBkb24ndCBwb3RlbnRpYWxseSBnZXQgaW50bw0KICAgICAgICAvLy0tIGFu
IGVuZGxlc3Nsb29wDQogICAgICAgIGlmIChfcGFyZW50cy5zZWFyY2gob2JqZWN0KSA+PSAwKSB7
DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgX3BhcmVudHMucHVzaChv
YmplY3QpOw0KDQogICAgICAgIGZpbmFsIGJvb2xlYW4gaXNOaWwgPSAob2JqZWN0IGluc3RhbmNl
b2YgTmlsT2JqZWN0KTsNCg0KICAgICAgICBDbGFzczw/PiBjbHMgPSBudWxsOw0KDQogICAgICAg
IGlmICghaXNOaWwpIHsNCiAgICAgICAgICAgIGNscyA9IG9iamVjdC5nZXRDbGFzcygpOw0KICAg
ICAgICAgICAgDQogICAgICAgICAgICBpZiAoX3Byb3h5SW50ZXJmYWNlcy5zaXplKCkgPiAwKSB7
DQogICAgICAgICAgICAgICAgYm9vbGVhbiBpc1Byb3h5ID0gZmFsc2U7DQogICAgICAgICAgICAg
ICAgDQogICAgICAgICAgICAgICAgQ2xhc3M8Pz5bXSBpbnRlcmZhY2VzID0gY2xzLmdldEludGVy
ZmFjZXMoKTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMu
bGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKF9wcm94eUludGVyZmFjZXMu
Y29udGFpbnMoaW50ZXJmYWNlc1tpXS5nZXROYW1lKCkpKSB7IA0KICAgICAgICAgICAgICAgICAg
ICAgICAgaXNQcm94eSA9IHRydWU7IA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAg
ICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIChpc1Byb3h5KSB7
IGNscyA9IGNscy5nZXRTdXBlcmNsYXNzKCk7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBl
bHNlIHsNCiAgICAgICAgICAgIGNscyA9ICgoTmlsT2JqZWN0KSBvYmplY3QpLmdldENsYXNzRGVz
Y3JpcHRvcigpLmdldEphdmFDbGFzcygpOw0KICAgICAgICB9DQoNCiAgICAgICAgYm9vbGVhbiBi
eXRlQXJyYXkgPSBmYWxzZTsNCiAgICAgICAgaWYgKGNscy5pc0FycmF5KCkpDQogICAgICAgICAg
ICBieXRlQXJyYXkgPSAoY2xzLmdldENvbXBvbmVudFR5cGUoKSA9PSBCeXRlLlRZUEUpOw0KDQog
ICAgICAgIGJvb2xlYW4gYXRSb290ID0gZmFsc2U7DQogICAgICAgIGlmIChkZXNjcmlwdG9yID09
IG51bGwpIHsNCiAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgWE1MRmllbGREZXNjcmlwdG9y
SW1wbChjbHMsICJyb290IiwgbnVsbCwgbnVsbCk7DQogICAgICAgICAgICBhdFJvb3QgPSB0cnVl
Ow0KICAgICAgICB9DQoNCg0KICAgICAgICAvLy0tIGNhbGN1bGF0ZSBPYmplY3QncyBuYW1lDQog
ICAgICAgIFN0cmluZyBuYW1lID0gZGVzY3JpcHRvci5nZXRYTUxOYW1lKCk7DQogICAgICAgIGlm
IChhdFJvb3QgJiYgX3Jvb3RFbGVtZW50IT1udWxsKQ0KICAgICAgICAgICAgbmFtZSA9IF9yb290
RWxlbWVudDsNCg0KICAgICAgICBib29sZWFuIGF1dG9OYW1lQnlDbGFzcyA9IGZhbHNlOw0KICAg
ICAgICBpZiAobmFtZSA9PSBudWxsKSB7DQogICAgICAgICAgICBhdXRvTmFtZUJ5Q2xhc3MgPSB0
cnVlOw0KICAgICAgICAgICAgbmFtZSA9IGNscy5nZXROYW1lKCk7DQogICAgICAgICAgICAvLy0t
IHJlbW92ZSBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gbmFtZQ0KICAgICAgICAgICAgaW50IGlk
eCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCiAgICAgICAgICAgIGlmIChpZHggPj0gMCkgew0K
ICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpZHgrMSk7DQogICAgICAgICAg
ICB9DQogICAgICAgICAgICAvLy0tIHJlbW92ZSBjYXBpdGFsaXphdGlvbg0KICAgICAgICAgICAg
bmFtZSA9IGdldEludGVybmFsQ29udGV4dCgpLmdldFhNTE5hbWluZygpLnRvWE1MTmFtZShuYW1l
KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vLS0gb2J0YWluIHRoZSBjbGFzcyBkZXNjcmlwdG9y
DQogICAgICAgIFhNTENsYXNzRGVzY3JpcHRvciBjbGFzc0Rlc2MgPSBudWxsOw0KICAgICAgICBi
b29sZWFuIHNhdmVUeXBlID0gZmFsc2U7IC8qIGZsYWcgZm9yIHhzaTp0eXBlICovDQoNCiAgICAg
ICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5pbE9iamVjdCkgew0KICAgICAgICAgICAgY2xhc3NE
ZXNjID0gKChOaWxPYmplY3Qpb2JqZWN0KS5nZXRDbGFzc0Rlc2NyaXB0b3IoKTsNCiAgICAgICAg
fSBlbHNlIGlmIChjbHMgPT0gZGVzY3JpcHRvci5nZXRGaWVsZFR5cGUoKSkgew0KICAgICAgICAg
ICAgY2xhc3NEZXNjID0gKFhNTENsYXNzRGVzY3JpcHRvcilkZXNjcmlwdG9yLmdldENsYXNzRGVz
Y3JpcHRvcigpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGNsYXNzRGVzYyA9PSBudWxsKSB7
DQoNCiAgICAgICAgICAgIC8vLS0gY2hlY2sgZm9yIHByaW1pdGl2ZSBvciBTdHJpbmcsIHdlIG5l
ZWQgdG8gdXNlDQogICAgICAgICAgICAvLy0tIHRoZSBzcGVjaWFsICNpc1ByaW1pdGl2ZSBtZXRo
b2Qgb2YgdGhpcyBjbGFzcw0KICAgICAgICAgICAgLy8tLSBzbyB0aGF0IHdlIGNhbiBjaGVjayBm
b3IgdGhlIHByaW1pdGl2ZSB3cmFwcGVyDQogICAgICAgICAgICAvLy0tIGNsYXNzZXMNCiAgICAg
ICAgICAgIGlmIChpc1ByaW1pdGl2ZShjbHMpIHx8IGJ5dGVBcnJheSkgew0KICAgICAgICAgICAg
ICAgIGNsYXNzRGVzYyA9IFNUUklOR19DTEFTU19ERVNDUklQVE9SOw0KICAgICAgICAgICAgICAg
IC8vLS0gY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gc2F2ZSB0aGUgeHNpOnR5cGUNCiAgICAg
ICAgICAgICAgICAvLy0tIGZvciB0aGlzIGNsYXNzDQogICAgICAgICAgICAgICAgQ2xhc3M8Pz4g
ZmllbGRUeXBlID0gZGVzY3JpcHRvci5nZXRGaWVsZFR5cGUoKTsNCiAgICAgICAgICAgICAgICBp
ZiAoY2xzICE9IGZpZWxkVHlwZSkgew0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZmllbGRU
eXBlLmlzQXJyYXkoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlID0gZmll
bGRUeXBlLmdldENvbXBvbmVudFR5cGUoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAg
ICAgICAgICAgICAgICBzYXZlVHlwZSA9ICghcHJpbWl0aXZlT3JXcmFwcGVyRXF1YWxzKGNscywg
ZmllbGRUeXBlKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAg
ICAgZWxzZSB7DQogICAgICAgICAgICAgICAgc2F2ZVR5cGUgPSBjbHMuaXNBcnJheSgpOw0KICAg
ICAgICAgICAgICAgIC8vLS0gc2F2ZSBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciB1c2Ugd2hlbiBz
ZWFyY2hpbmcNCiAgICAgICAgICAgICAgICAvLy0tIGZvciBNYXJzaGFsSW5mbyBjbGFzc2VzDQog
ICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNscy5nZXROYW1lKCk7DQogICAgICAg
ICAgICAgICAgaW50IGlkeCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOw0KICAgICAgICAg
ICAgICAgIFN0cmluZyBwa2dOYW1lID0gbnVsbDsNCiAgICAgICAgICAgICAgICBpZiAoaWR4ID4g
MCkgew0KICAgICAgICAgICAgICAgICAgICBwa2dOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygw
LGlkeCsxKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFfcGFja2FnZXMuY29udGFpbnMocGtn
TmFtZSkpDQogICAgICAgICAgICAgICAgICAgICAgICBfcGFja2FnZXMuYWRkKHBrZ05hbWUpOw0K
ICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChfbWFyc2hhbEV4dGVuZGVk
VHlwZSkgew0KICAgICAgICAgICAgICAgICAgICAvLy0tIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4g
ZGV0ZXJtaW5lIHRoZSBjbGFzcyBvcg0KICAgICAgICAgICAgICAgICAgICAvLy0tIENsYXNzRGVz
Y3JpcHRvciBmcm9tIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUNCiAgICAgICAgICAgICAgICAg
ICAgLy8tLSBGaWVsZEhhbmRsZXIgb3IgZnJvbSB0aGUgY3VycmVudCBDRFIgc3RhdGUNCg0KICAg
ICAgICAgICAgICAgICAgICBpZiAoKGNscyAhPSBkZXNjcmlwdG9yLmdldEZpZWxkVHlwZSgpKSB8
fCBhdFJvb3QpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVR5cGUgPSB0cnVlOw0K
DQogICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zRGVzYyA9IGZhbHNlOw0K
DQogICAgICAgICAgICAgICAgICAgICAgICAvLy0tIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcm9vdCwg
Y2hlY2sgdG8gc2VlIGlmIHdlIGNhbiByZXNvbHZlIG5hbWUuDQogICAgICAgICAgICAgICAgICAg
ICAgICAvLy0tIGlmIHdlJ3JlIGF0IHRoZSByb290LCB0aGUgbmFtZSB3aWxsIG1vc3QgbGlrZWx5
IGJlIHJlc29sdmFibGUNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0gZHVlIHRvIHRoZSB2
YWxpZGF0aW9uIHN0ZXAsIHNvIGluIG1vc3QgY2FzZXMsIGlmIHdlIGFyZSBub3QNCiAgICAgICAg
ICAgICAgICAgICAgICAgIC8vLS0gdXNpbmcgYSBtYXBwaW5nIHdlIG5lZWQgdGhlIHhzaTp0eXBl
IGF0IHRoZSByb290DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0Um9vdCkgew0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuc1VSSSA9IGRlc2NyaXB0b3IuZ2V0TmFt
ZVNwYWNlVVJJKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MQ2xhc3NEZXNjcmlw
dG9yIHRtcERlc2MgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcERlc2MgPSBnZXRSZXNvbHZlcigpLnJl
c29sdmVCeVhNTE5hbWUobmFtZSwgbnNVUkksIG51bGwpOw0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaChSZXNvbHZlckV4Y2Vw
dGlvbiByeCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tIGV4Y2VwdGlv
biBub3QgaW1wb3J0YW50IGFzIHdlJ3JlIHNpbXBseQ0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLy0tIHRlc3RpbmcgdG8gc2VlIGlmIHdlIGNhbiByZXNvbHZlIGR1cmluZw0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tIHVubWFyc2hhbGxpbmcNCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7DQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkVycm9yIHJlc29sdmlu
ZyIsIHJ4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBE
ZXNjICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4g
dG1wVHlwZSA9IHRtcERlc2MuZ2V0SmF2YUNsYXNzKCk7DQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICh0bXBUeXBlID09IGNscykgew0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29udGFpbnNEZXNjID0gKCF0bXBUeXBlLmlzSW50ZXJmYWNlKCkpOw0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIWNvbnRhaW5zRGVzYykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0g
Y2hlY2sgZm9yIGNsYXNzIG1hcHBpbmcsIHdlIGRvbid0IHVzZSB0aGUNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvLy0tIHJlc29sdmVyIGRpcmVjdGx5IGJlY2F1c2UgaXQgd2lsbCB0cnkg
dG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tIGxvYWQgYSBjb21waWxlZCBkZXNj
cmlwdG9yLCBvciBpbnRyb3NwZWN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSBv
bmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXRSb290KSB7DQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChfdXNlWFNJVHlwZUF0Um9vdCkgew0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MTWFwcGluZ0xvYWRlciBtbCA9IChYTUxNYXBw
aW5nTG9hZGVyKSBnZXRSZXNvbHZlcigpLmdldE1hcHBpbmdMb2FkZXIoKTsNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtbCAhPSBudWxsKSB7DQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNEZXNjID0gKG1sLmdldERlc2NyaXB0
b3IoY2xzLmdldE5hbWUoKSkgIT0gbnVsbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLy0tIHByZXZlbnQgeHNpOnR5cGUgZnJvbSBhcHBlYXJpbmcNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0gb24gcm9vdA0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29udGFpbnNEZXNjID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSBUaGUgZm9sbG93aW5nIGxvZ2ljIG5lZWRzIHRv
IGJlIGV4cGFuZGVkIHRvIHVzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0gbmFt
ZXNwYWNlIC10by0gcGFja2FnZSBtYXBwaW5ncw0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmICgoIWNvbnRhaW5zRGVzYykgJiYgKHBrZ05hbWUgPT0gbnVsbCkpIHsNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8tLSBjaGVjayB0byBzZWUgaWYgdGhlIGNsYXNzIG5hbWUg
aXMgZ3Vlc3NhYmxlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0gZnJvbSB0
aGUgeG1sIG5hbWUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjID0g
Z2V0Q2xhc3NEZXNjcmlwdG9yKGNscyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChjbGFzc0Rlc2MgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgU3RyaW5nIHRtcE5hbWUgPSBjbGFzc0Rlc2MuZ2V0WE1MTmFtZSgpOw0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHRtcE5hbWUpKQ0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVUeXBlID0gZmFsc2U7DQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChjb250YWluc0Rlc2MpIHNhdmVUeXBlID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAg
ICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIC8vICBtYXJzaGFsIGFzIHRoZSBhY3R1YWwg
dHlwZQ0KICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NEZXNjID09IG51bGwpDQogICAgICAg
ICAgICAgICAgICAgICAgICBjbGFzc0Rlc2MgPSBnZXRDbGFzc0Rlc2NyaXB0b3IoY2xzKTsNCg0K
ICAgICAgICAgICAgICAgIH0gLy8tLSBlbmQgaWYgKG1hcnNoYWxFeHRlbmRlZFR5cGUpDQogICAg
ICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vIG1hcnNoYWxsIGFzIHRo
ZSBiYXNlIGZpZWxkIHR5cGUNCiAgICAgICAgICAgICAgICAgICAgY2xzID0gZGVzY3JpcHRvci5n
ZXRGaWVsZFR5cGUoKTsNCiAgICAgICAgICAgICAgICAgICAgY2xhc3NEZXNjID0gZ2V0Q2xhc3NE
ZXNjcmlwdG9yKGNscyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgLy8t
LSBJZiB3ZSBhcmUgbWFyc2hhbGxpbmcgYW4gYXJyYXkgYXMgdGhlIHRvcA0KICAgICAgICAgICAg
ICAgIC8vLS0gbGV2ZWwgb2JqZWN0LCBvciBpZiB3ZSBydW4gaW50byBhIG11bHRpDQogICAgICAg
ICAgICAgICAgLy8tLSBkaW1lbnNpb25hbCBhcnJheSwgdXNlIHRoZSBzcGVjaWFsDQogICAgICAg
ICAgICAgICAgLy8tLSBBcnJheURlc2NyaXB0b3INCiAgICAgICAgICAgICAgICBpZiAoKGNsYXNz
RGVzYyA9PSBudWxsKSAmJiBjbHMuaXNBcnJheSgpKSB7DQogICAgICAgICAgICAgICAgICAgIGNs
YXNzRGVzYyA9IG5ldyBSb290QXJyYXlEZXNjcmlwdG9yKGNscyk7DQogICAgICAgICAgICAgICAg
ICAgIGlmIChhdFJvb3QpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckZpZWxk
ID0gKCFfYXNEb2N1bWVudCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg
ICB9DQogICAgICAgICAgICB9IC8vLS0gZW5kIGVsc2Ugbm90IHByaW1pdGl2ZQ0KDQogICAgICAg
ICAgICBpZiAoY2xhc3NEZXNjID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICAvLy0tIG1ha2Ug
c3VyZSB3ZSBhcmUgYWxsb3dlZCB0byBtYXJzaGFsIE9iamVjdA0KICAgICAgICAgICAgICAgIGlm
ICgoY2xzID09IFZvaWQuY2xhc3MpIHx8DQogICAgICAgICAgICAgICAgICAgIChjbHMgPT0gT2Jq
ZWN0LmNsYXNzKSB8fA0KICAgICAgICAgICAgICAgICAgICAoY2xzID09IENsYXNzLmNsYXNzKSkg
ew0KDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uDQogICAg
ICAgICAgICAgICAgICAgICAgICAoTWFyc2hhbEV4Y2VwdGlvbi5CQVNFX0NMQVNTX09SX1ZPSURf
RVJSKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgX3BhcmVudHMucG9wKCk7
DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAg
ICAgICAgLy8tLSBoYW5kbGUgYXV0by1uYW1pbmcgYnkgY2xhc3MNCiAgICAgICAgaWYgKGF1dG9O
YW1lQnlDbGFzcykgew0KICAgICAgICAgICAgaWYgKGNsYXNzRGVzYy5nZXRYTUxOYW1lKCkgIT0g
bnVsbCkgew0KICAgICAgICAgICAgICAgIG5hbWUgPSBjbGFzc0Rlc2MuZ2V0WE1MTmFtZSgpOw0K
ICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8tLSBhdCB0aGlzIHBvaW50IG5h
bWluZyBzaG91bGQgYmUgZG9uZSwgdXBkYXRlDQogICAgICAgIC8vLS0gTWFyc2hhbFN0YXRlLnht
bE5hbWUgaWYgcm9vdCBlbGVtZW50DQogICAgICAgIGlmIChhdFJvb3QpIHsNCiAgICAgICAgICAg
IG1zdGF0ZS5feG1sTmFtZSA9IG5hbWU7DQogICAgICAgIH0NCg0KICAgICAgICAvLy0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8NCiAgICAgICAgLy8tIE5l
eHQgZmV3IHNlY3Rpb25zIG9mIGNvZGUgZGVhbCB3aXRoIHhzaTp0eXBlIC0vDQogICAgICAgIC8v
LSBwcmV2ZW50aW9uLCBpZiBuZWNlc3NhcnkgICAgICAgICAgICAgICAgICAgICAtLw0KICAgICAg
ICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8NCg0K
ICAgICAgICAvLy0tIEFsbG93IHVzZXIgdG8gcHJldmVudCB4c2k6dHlwZQ0KICAgICAgICBzYXZl
VHlwZSA9IChzYXZlVHlwZSAmJiAoIV9zdXBwcmVzc1hTSVR5cGUpKTsNCg0KICAgICAgICAvLy0t
IFN1cHByZXNzIHhzaTp0eXBlIGZvciBzcGVjaWFsIHR5cGVzDQogICAgICAgIGlmIChzYXZlVHlw
ZSkgew0KICAgICAgICAgICAgLy8tLSBqYXZhLnV0aWwuRW51bWVyYXRpb24gYW5kIGphdmEudXRp
bC5EYXRlIGZpeA0KICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SGFuZGxlcigpIGluc3Rh
bmNlb2YgRGF0ZUZpZWxkSGFuZGxlcikNCiAgICAgICAgICAgICAgICBzYXZlVHlwZSA9IGZhbHNl
Ow0KICAgICAgICAgICAgZWxzZSBpZiAoZGVzY3JpcHRvci5nZXRIYW5kbGVyKCkgaW5zdGFuY2Vv
ZiBFbnVtRmllbGRIYW5kbGVyKQ0KICAgICAgICAgICAgICAgIHNhdmVUeXBlID0gZmFsc2U7DQog
ICAgICAgICAgICBlbHNlIGlmIChpc05pbCkNCiAgICAgICAgICAgICAgICBzYXZlVHlwZSA9IGZh
bHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8tLSBTdXBwcmVzcyAneHNpOnR5cGUnIGF0dHJp
YnV0ZXMgd2hlbiBDYXN0b3IgaXMgYWJsZSB0byBpbmZlcg0KICAgICAgICAvLy0tIHRoZSBjb3Jy
ZWN0IHR5cGUgZHVyaW5nIHVubWFyc2hhbGxpbmcNCiAgICAgICAgaWYgKHNhdmVUeXBlKSB7DQog
ICAgICAgICAgICAgLy8gV2hlbiB0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2Ugb2YgdGhlIGZpZWxk
IGlzIG5vdCB0aGUNCiAgICAgICAgICAgICAvLyB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIGZpZWxk
LCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8NCiAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgdHlw
ZSBleHBsaWNpdGx5ICh1c2luZyB4c2k6dHlwZSkgdG8gYXZvaWQNCiAgICAgICAgICAgICAvLyBj
b25mdXNpb24gZHVyaW5nIHVubWFyc2hhbGxpbmcuDQogICAgICAgICAgICAgLy8NCiAgICAgICAg
ICAgICAvLyBIb3dldmVyLCBpdCBtaWdodCBiZSBwb3NzaWJsZSB0byB1c2UgdGhlIFhNTE5hbWUg
b2YgdGhlDQogICAgICAgICAgICAgLy8gaW5zdGFuY2UgcmF0aGVyIHRoYW4gdGhlIFhNTE5hbWUg
b2YgdGhlIGZpZWxkLiBJZg0KICAgICAgICAgICAgIC8vIENhc3RvciBjb3VsZCBmaW5kIGJhY2sg
dGhlIHR5cGUgZnJvbSB0aGUgbmFtZSBvZiB0aGUNCiAgICAgICAgICAgICAvLyBlbGVtZW50LCB0
aGVyZSBpcyBubyBuZWVkIHRvIGFkZCBhbiB4c2k6dHlwZS4NCiAgICAgICAgICAgICAvLw0KICAg
ICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGRvIHRoYXQsIHRoZXJlIGlzIHR3byBjb25kaXRpb25z
Og0KICAgICAgICAgICAgIC8vIDEuIENhc3RvciBzaG91bGQgYmUgYWJsZSB0byBmaW5kIHRoZSBy
aWdodCBjbGFzcyB0bw0KICAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlIGZvcm0gdGhlIFhNTE5h
bWUgb2YgdGhlIGluc3RhbmNlLg0KICAgICAgICAgICAgIC8vIDIuIENhc3RvciBzaG91bGQgYmUg
c3VyZSB0aGFuIHdoZW4gdXNpbmcgdGhlIFhNTE5hbWUgb2YNCiAgICAgICAgICAgICAvLyB0aGUg
aW5zdGFuY2UsIHRoZXJlIGlzIG9ubHkgb25lIGZpZWxkIHdpY2ggd2lsbCBtYXRjaA0KICAgICAg
ICAgICAgIC8vIHRoYXQgbmFtZSAoYW5kIHRoYXQgaXQgaXMgdGhlIGN1cnJlbnQgZmllbGQpDQoN
CiAgICAgICAgICAgICAvLyBYTUwgTmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzIHdlIGFy
ZSBtYXJzaGFsbGluZw0KICAgICAgICAgICAgIFN0cmluZyB4bWxFbGVtZW50TmFtZSA9IG5hbWU7
DQogICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWVzcGFjZSA9IGRlc2NyaXB0b3IuZ2V0TmFtZVNw
YWNlVVJJKCk7DQoNCiAgICAgICAgICAgICAvLyBXZSB0cnkgdG8gZmluZCBpZiB0aGVyZSBpcyBh
IFhNTENsYXNzRGVzY3JpcHRvciBhc3NvY2lhdGVkDQogICAgICAgICAgICAgLy8gd2l0aCB0aGUg
WE1MIG5hbWUgb2YgdGhpcyBjbGFzcw0KICAgICAgICAgICAgIFhNTENsYXNzRGVzY3JpcHRvciB4
bWxFbGVtZW50TmFtZUNsYXNzRGVzYyA9IG51bGw7DQogICAgICAgICAgICAgdHJ5IHsNCiAgICAg
ICAgICAgICAgICAgeG1sRWxlbWVudE5hbWVDbGFzc0Rlc2MgPSBnZXRSZXNvbHZlcigpLnJlc29s
dmVCeVhNTE5hbWUoeG1sRWxlbWVudE5hbWUsIG51bGwsIG51bGwpOw0KICAgICAgICAgICAgIH0N
CiAgICAgICAgICAgICBjYXRjaChSZXNvbHZlckV4Y2VwdGlvbiByeCkgew0KICAgICAgICAgICAg
ICAgICAvLy0tIGV4Y2VwdGlvbiBub3QgaW1wb3J0YW50IGFzIHdlJ3JlIHNpbXBseQ0KICAgICAg
ICAgICAgICAgICAvLy0tIHRlc3RpbmcgdG8gc2VlIGlmIHdlIGNhbiByZXNvbHZlIGR1cmluZw0K
ICAgICAgICAgICAgICAgICAvLy0tIHVubWFyc2hhbGxpbmcNCiAgICAgICAgICAgICAgICAgaWYg
KExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1Zygi
RXJyb3IgcmVzb2x2aW5nICIgKyB4bWxFbGVtZW50TmFtZSwgcngpOw0KICAgICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAvLyBUZXN0IGlmIHdlIGFyZSBub3Qg
ZGVhbGluZyB3aXRoIGEgc291cmNlIGdlbmVyYXRlZCB2ZWN0b3INCiAgICAgICAgICAgICBpZiAo
KHhtbEVsZW1lbnROYW1lICE9IG51bGwpICYmICh4bWxFbGVtZW50TmFtZUNsYXNzRGVzYyAhPSBu
dWxsKSkgew0KICAgICAgICAgICAgICAgICAvLyBNb3JlIHRoYW4gb25lIGNsYXNzIGNhbiBtYXAg
dG8gYSBnaXZlbiBlbGVtZW50IG5hbWUNCiAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAg
ICAgICAgICAgICAgIEl0ZXJhdG9yPENsYXNzRGVzY3JpcHRvcj4gY2xhc3NEZXNjcmlwdG9ySXRl
ciA9IGdldFJlc29sdmVyKCkucmVzb2x2ZUFsbEJ5WE1MTmFtZSh4bWxFbGVtZW50TmFtZSwgbnVs
bCwgbnVsbCk7DQogICAgICAgICAgICAgICAgICAgICBmb3IgKDsgY2xhc3NEZXNjcmlwdG9ySXRl
ci5oYXNOZXh0KCk7KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWVD
bGFzc0Rlc2MgPSAoWE1MQ2xhc3NEZXNjcmlwdG9yKSBjbGFzc0Rlc2NyaXB0b3JJdGVyLm5leHQo
KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xzID09IHhtbEVsZW1lbnROYW1lQ2xh
c3NEZXNjLmdldEphdmFDbGFzcygpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAg
IC8vcmVzZXQgdGhlIGNsYXNzRGVzY3JpcHRvciAtLT4gbm9uZSBoYXMgYmVlbiBmb3VuZA0KICAg
ICAgICAgICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lQ2xhc3NEZXNjID0gbnVsbDsNCiAg
ICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAg
ICBjYXRjaChSZXNvbHZlckV4Y2VwdGlvbiByeCkgew0KICAgICAgICAgICAgICAgICAgICAgaWYg
KExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmRl
YnVnKCJFcnJvciByZXNvbHZpbmcgIiArIHhtbEVsZW1lbnROYW1lLCByeCk7DQogICAgICAgICAg
ICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZUNsYXNzRGVz
YyA9IG51bGw7DQogICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAvL21ha2Ug
c3VyZSB3ZSBvbmx5IHJ1biBpbnRvIHRoaXMgbG9naWMgaWYgdGhlIGNsYXNzRGVzY3JpcHRvcg0K
ICAgICAgICAgICAgICAgICAvL2lzIGNvbWluZyBmcm9tIGEgbWFwcGluZyBmaWxlLg0KICAgICAg
ICAgICAgICAgICBpZiAgKHhtbEVsZW1lbnROYW1lQ2xhc3NEZXNjIGluc3RhbmNlb2YgWE1MQ2xh
c3NEZXNjcmlwdG9yQWRhcHRlcikgew0KDQogICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBm
aW5kIGEgZmllbGQgZGVzY3JpcHRvciBkaXJlY3RseSBpbiB0aGUgcGFyZW50IG9iamVjdA0KICAg
ICAgICAgICAgICAgICAgICBYTUxDbGFzc0Rlc2NyaXB0b3IgdGVtcENvbnRhaW5pbmcgPSAoWE1M
Q2xhc3NEZXNjcmlwdG9yKWRlc2NyaXB0b3IuZ2V0Q29udGFpbmluZ0NsYXNzRGVzY3JpcHRvcigp
Ow0KDQogICAgICAgICAgICAgICAgICAgIC8vLS1pZiBubyBjb250YWluaW5nIGNsYXNzIGRlc2Ny
aXB0b3INCiAgICAgICAgICAgICAgICAgICAgLy8tLWl0IG1lYW5zIHRoZSBjb250YWluZXIgY2xh
c3MgY291bGQgaGF2ZSBiZWVuIGludHJvc3BlY3RlZA0KICAgICAgICAgICAgICAgICAgICAvLy0t
c28gbm8gbmVlZCB0byBlbnRlciB0aGUgbG9naWMNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRl
bXBDb250YWluaW5nICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIFhNTEZpZWxk
RGVzY3JpcHRvciBmaWVsZERlc2NNYXRjaCA9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
dGVtcENvbnRhaW5pbmcuZ2V0RmllbGREZXNjcmlwdG9yKHhtbEVsZW1lbnROYW1lLCB4bWxOYW1l
c3BhY2UsIE5vZGVUeXBlLkVsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAvLyBU
cnkgdG8gZmluZCBhIGZpZWxkIGRlc2NyaXB0b3IgYnkgaW5oZXJpdGFuY2UgaW4gdGhlIHBhcmVu
dCBvYmplY3QNCiAgICAgICAgICAgICAgICAgICAgICAgIEluaGVyaXRhbmNlTWF0Y2hbXSBtYXRj
aGVzID0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluaGVyaXRhbmNlKHht
bEVsZW1lbnROYW1lLCBudWxsLCB0ZW1wQ29udGFpbmluZyk7IC8vIFRPRE86IEpvYWNoaW0sIF9j
ZFJlc29sdmVyKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3Ro
ID09IDEpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRUaGVS
aWdodENsYXNzID0gKCh4bWxFbGVtZW50TmFtZUNsYXNzRGVzYyAhPSBudWxsKSAmJiAoY2xzID09
IHhtbEVsZW1lbnROYW1lQ2xhc3NEZXNjLmdldEphdmFDbGFzcygpKSk7DQoNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBib29sZWFuIG9uZUFuZE9ubHlPbmVNYXRjaGVkRmllbGQNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgID0gKChmaWVsZERlc2NNYXRjaCAhPSBudWxsKSB8fA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaGVzWzBdLnBhcmVudEZpZWxk
RGVzYyA9PSBkZXNjcmlwdG9yKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBD
YW4gd2UgcmVtb3ZlIHRoZSB4c2k6dHlwZSA/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGZvdW5kVGhlUmlnaHRDbGFzcyAmJiBvbmVBbmRPbmx5T25lTWF0Y2hlZEZpZWxkKSB7DQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVUeXBlID0gZmFsc2U7DQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm8gbmFtZSBzd2FwcGluZyBmb3Igbm93DQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfS8vbGVu
Z2ggaXMgb25lDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgfS8vdGhl
IGNsYXNzRGVzYyBjb21lcyBmcm9tIGEgbWFwcGluZyBmaWxlDQogICAgICAgICAgICAgfQ0KICAg
ICAgICAgfS8vLS0tIEVuZCBvZiAiaWYgKHNhdmVUeXBlKSINCg0KDQogICAgICAgIC8vLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLw0KICAgICAgICAvLy0gTmFtZXNwYWNlIE1hbmFnZW1lbnQgLS8N
CiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vDQoNCiAgICAgICAgLy8tLSBTZXQg
YSBuZXcgbmFtZXNwYWNlIHNjb3BpbmcNCiAgICAgICAgLy8tLSBOb3RlOiBXZSBzdGlsbCBuZWVk
IHRvIGRlY2xhcmUgYSBuZXcgc2NvcGUgZXZlbiBpZg0KICAgICAgICAvLy0tIHdlIGFyZSBzdXBw
cmVzc2luZyBtb3N0IG5hbWVzcGFjZXMuIENlcnRhaW4gZWxlbWVudHMNCiAgICAgICAgLy8tLSBs
aWtlIHhzaTp0eXBlIGFuZCB4c2k6bmlsIHdpbGwgcmVxdWlyZSBhIG5hbWVzcGFjZQ0KICAgICAg
ICAvLy0tIGRlY2xhcmF0aW9uIGFuZCBjYW5ub3QgYmUgc3VwcHJlc3NlZC4NCiAgICAgICAgaWYg
KCFhdFJvb3QpIHsNCiAgICAgICAgICAgIF9uYW1lc3BhY2VzID0gX25hbWVzcGFjZXMuY3JlYXRl
TmFtZXNwYWNlcygpOw0KICAgICAgICB9DQoNCiAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gIiI7
DQogICAgICAgIFN0cmluZyBuc1VSSSA9ICIiOw0KDQogICAgICAgIGlmICghX3N1cHByZXNzTmFt
ZXNwYWNlcykgew0KDQogICAgICAgICAgICAvLy0tIE11c3QgYmUgZG9uZSBiZWZvcmUgYW55IGF0
dHJpYnV0ZXMgYXJlIHByb2Nlc3NlZA0KICAgICAgICAgICAgLy8tLSBzaW5jZSBhdHRyaWJ1dGVz
IGNhbiBiZSBuYW1lc3BhY2VkIGFzIHdlbGwuDQoNCiAgICAgICAgICAgIG5zUHJlZml4ID0gZGVz
Y3JpcHRvci5nZXROYW1lU3BhY2VQcmVmaXgoKTsNCiAgICAgICAgICAgIGlmIChuc1ByZWZpeCA9
PSBudWxsKSBuc1ByZWZpeCA9IGNsYXNzRGVzYy5nZXROYW1lU3BhY2VQcmVmaXgoKTsNCg0KICAg
ICAgICAgICAgbnNVUkkgPSBkZXNjcmlwdG9yLmdldE5hbWVTcGFjZVVSSSgpOw0KICAgICAgICAg
ICAgaWYgKG5zVVJJID09IG51bGwpIG5zVVJJID0gY2xhc3NEZXNjLmdldE5hbWVTcGFjZVVSSSgp
Ow0KDQogICAgICAgICAgICBpZiAoKG5zVVJJID09IG51bGwpICYmIChuc1ByZWZpeCAhPSBudWxs
KSkgew0KICAgICAgICAgICAgICAgIG5zVVJJID0gX25hbWVzcGFjZXMuZ2V0TmFtZXNwYWNlVVJJ
KG5zUHJlZml4KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKChuc1ByZWZp
eCA9PSBudWxsKSAmJiAobnNVUkkgIT0gbnVsbCkpIHsNCiAgICAgICAgICAgICAgICBuc1ByZWZp
eCA9IF9uYW1lc3BhY2VzLmdldE5hbWVzcGFjZVByZWZpeChuc1VSSSk7DQogICAgICAgICAgICB9
DQogICAgICAgICAgICAvLy0tIGRlY2xhcmUgbmFtZXNwYWNlIGF0IHRoaXMgZWxlbWVudCBzY29w
ZT8NCiAgICAgICAgICAgIGlmIChuc1VSSSAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgU3Ry
aW5nIGRlZmF1bHROYW1lc3BhY2UgPSBfbmFtZXNwYWNlcy5nZXROYW1lc3BhY2VVUkkoIiIpOw0K
ICAgICAgICAgICAgICAgIGlmICgobnNQcmVmaXggPT0gbnVsbCkgJiYgKCFuc1VSSS5lcXVhbHMo
ZGVmYXVsdE5hbWVzcGFjZSkpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAg
ICAgaWYgKChkZWZhdWx0TmFtZXNwYWNlID09IG51bGwpICYmIGF0Um9vdCkgew0KICAgICAgICAg
ICAgICAgICAgICAgICAgbnNQcmVmaXggPSAiIjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAg
ICAgICAgICAgICAgICAgICBlbHNlIG5zUHJlZml4ID0gREVGQVVMVF9QUkVGSVggKyAoKytfbmFt
ZXNwYWNlQ291bnRlcik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRlY2xh
cmVOYW1lc3BhY2UobnNQcmVmaXgsIG5zVVJJKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAg
IGVsc2Ugew0KICAgICAgICAgICAgICAgIG5zVVJJID0gIiI7DQogICAgICAgICAgICAgICAgLy8t
LSByZWRlY2xhcmUgZGVmYXVsdCBuYW1lc3BhY2UgYXMgZW1wdHkNCiAgICAgICAgICAgICAgICBT
dHJpbmcgZGVmYXVsdE5hbWVzcGFjZSA9IF9uYW1lc3BhY2VzLmdldE5hbWVzcGFjZVVSSSgiIik7
DQogICAgICAgICAgICAgICAgaWYgKChkZWZhdWx0TmFtZXNwYWNlICE9IG51bGwpICYmICghIiIu
ZXF1YWxzKGRlZmF1bHROYW1lc3BhY2UpKSkNCiAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFj
ZXMuYWRkTmFtZXNwYWNlKCIiLCAiIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KDQoN
CiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0vDQogICAgICAgIC8vLSBoYW5kbGUgYXR0
cmlidXRlcyAtLw0KICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS8NCg0KICAgICAgICBB
dHRyaWJ1dGVzSW1wbCBhdHRzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7DQoNCiAgICAgICAgLy8t
LSB1c2VyIGRlZmluZWQgYXR0cmlidXRlcw0KICAgICAgICBpZiAoYXRSb290KSB7DQogICAgICAg
ICAgICAvLy0tIGRlY2xhcmUgeHNpIHByZWZpeCBpZiBuZWNlc3NhcnkNCiAgICAgICAgICAgIGlm
IChfdG9wTGV2ZWxBdHRzLmdldFNpemUoKSA+IDApDQogICAgICAgICAgICAgICAgX25hbWVzcGFj
ZXMuYWRkTmFtZXNwYWNlKFhTSV9QUkVGSVgsIFhTSV9OQU1FU1BBQ0UpOw0KDQogICAgICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IF90b3BMZXZlbEF0dHMuZ2V0U2l6ZSgpOyBpKyspIHsNCiAg
ICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gX3RvcExldmVsQXR0cy5nZXROYW1lKGkp
Ow0KICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSA9IGxvY2FsTmFtZTsNCiAgICAgICAgICAg
ICAgICBTdHJpbmcgbnMgPSAiIjsNCiAgICAgICAgICAgICAgICBpZiAoIV9zdXBwcmVzc05hbWVz
cGFjZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgbnMgPSBfdG9wTGV2ZWxBdHRzLmdldE5hbWVz
cGFjZShpKTsNCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7DQogICAg
ICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KG5zKSkgew0KICAgICAg
ICAgICAgICAgICAgICAgICAgcHJlZml4ID0gX25hbWVzcGFjZXMuZ2V0Tm9uRGVmYXVsdE5hbWVz
cGFjZVByZWZpeChucyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAg
ICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkocHJlZml4KSkgew0KICAgICAgICAgICAgICAg
ICAgICAgICAgcU5hbWUgPSBwcmVmaXggKyAnOicgKyBxTmFtZTsNCiAgICAgICAgICAgICAgICAg
ICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsNCiAgICAg
ICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYXR0cy5hZGRBdHRyaWJ1dGUobnMsIGxvY2Fs
TmFtZSwgcU5hbWUsIENEQVRBLA0KICAgICAgICAgICAgICAgICAgICBfdG9wTGV2ZWxBdHRzLmdl
dFZhbHVlKGkpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAvLy0tIHByb2Nlc3MgYXR0ciBkZXNjcmlw
dG9ycw0KICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICBp
bnQgbmVzdGVkQXR0Q291bnQgPSAwOw0KICAgICAgICBYTUxGaWVsZERlc2NyaXB0b3JbXSBuZXN0
ZWRBdHRzID0gbnVsbDsNCiAgICAgICAgWE1MRmllbGREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMg
PSBudWxsOw0KICAgICAgICBpZiAoKCFkZXNjcmlwdG9yLmlzUmVmZXJlbmNlKCkpICYmICghaXNO
aWwpKSB7DQogICAgICAgICAgICBkZXNjcmlwdG9ycyA9IGNsYXNzRGVzYy5nZXRBdHRyaWJ1dGVE
ZXNjcmlwdG9ycygpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgLy8g
cmVmZXJlbmNlcyBkb24ndCBoYXZlIGF0dHJpYnV0ZXMNCiAgICAgICAgICAgIGRlc2NyaXB0b3Jz
ID0gTk9fRklFTERfREVTQ1JJUFRPUlM7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBYTUxGaWVs
ZERlc2NyaXB0b3IgYXR0cmlidXRlRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2ldOw0KICAgICAg
ICAgICAgaWYgKGF0dHJpYnV0ZURlc2NyaXB0b3IgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAg
IGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBhdHRy
aWJ1dGVEZXNjcmlwdG9yLmdldExvY2F0aW9uUGF0aCgpOw0KICAgICAgICAgICAgaWYgKFN0cmlu
Z1V0aWxzLmlzTm90RW1wdHkocGF0aCkpIHsNCiAgICAgICAgICAgICAgICAvLy0tIHNhdmUgZm9y
IGxhdGVyIHByb2Nlc3NpbmcNCiAgICAgICAgICAgICAgICBpZiAobmVzdGVkQXR0cyA9PSBudWxs
KSB7DQogICAgICAgICAgICAgICAgICAgIG5lc3RlZEF0dHMgPSBuZXcgWE1MRmllbGREZXNjcmlw
dG9yW2Rlc2NyaXB0b3JzLmxlbmd0aCAtIGldOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAg
ICAgICAgICBuZXN0ZWRBdHRzW25lc3RlZEF0dENvdW50XSA9IGF0dHJpYnV0ZURlc2NyaXB0b3I7
DQogICAgICAgICAgICAgICAgbmVzdGVkQXR0Q291bnQrKzsNCiAgICAgICAgICAgIH0gZWxzZSB7
DQogICAgICAgICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZShvYmplY3QsIGF0dHJpYnV0ZURlc2Ny
aXB0b3IsIGF0dHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8tLSBo
YW5kbGUgYW5jZXN0b3IgbmVzdGVkIGF0dHJpYnV0ZXMNCiAgICAgICAgaWYgKG1zdGF0ZS5fbmVz
dGVkQXR0Q291bnQgPiAwKSB7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zdGF0
ZS5fbmVzdGVkQXR0cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIFhNTEZpZWxkRGVz
Y3JpcHRvciBhdHRyaWJ1dGVEZXNjcmlwdG9yID0gbXN0YXRlLl9uZXN0ZWRBdHRzW2ldOw0KICAg
ICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVEZXNjcmlwdG9yID09IG51bGwpIHsNCiAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAg
IFN0cmluZyBsb2NhdGlvblBhdGggPSBhdHRyaWJ1dGVEZXNjcmlwdG9yLmdldExvY2F0aW9uUGF0
aCgpOw0KICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhsb2NhdGlvblBhdGgpKSB7DQog
ICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhpcyAnbmVzdGVkJyBhdHRyaWJ1
dGUgaGFzIGJlZW4gcHJvY2Vzc2VkDQogICAgICAgICAgICAgICAgICAgIG1zdGF0ZS5fbmVzdGVk
QXR0c1tpXSA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlYXNlIG51bWJlciBv
ZiB1bnByb2Nlc3NlZCAnbmVzdGVkJyBhdHRyaWJ1dGVzIGJ5IG9uZQ0KICAgICAgICAgICAgICAg
ICAgICBtc3RhdGUuX25lc3RlZEF0dENvdW50LS07DQogICAgICAgICAgICAgICAgICAgIHByb2Nl
c3NBdHRyaWJ1dGUobXN0YXRlLmdldE93bmVyKCksIGF0dHJpYnV0ZURlc2NyaXB0b3IsIGF0dHMp
Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAg
IC8vLS0gTG9vayBmb3IgYXR0cmlidXRlcyBpbiBjb250YWluZXIgZmllbGRzLA0KICAgICAgICAv
Ly0tIChhbHNvIGhhbmRsZSBjb250YWluZXIgaW4gY29udGFpbmVyKQ0KICAgICAgICBpZiAoIWlz
TmlsKSBwcm9jZXNzQ29udGFpbmVyQXR0cmlidXRlcyhvYmplY3QsIGNsYXNzRGVzYywgYXR0cyk7
DQoNCiAgICAgICAgLy8tLSB4bWw6c3BhY2UNCiAgICAgICAgU3RyaW5nIGF0dFZhbHVlID0gZGVz
Y3JpcHRvci5nZXRYTUxQcm9wZXJ0eShYTUxGaWVsZERlc2NyaXB0b3IuUFJPUEVSVFlfWE1MX1NQ
QUNFKTsNCiAgICAgICAgaWYgKGF0dFZhbHVlICE9IG51bGwpIHsNCiAgICAgICAgICAgIGF0dHMu
YWRkQXR0cmlidXRlKE5hbWVzcGFjZXMuWE1MX05BTUVTUEFDRSwgU1BBQ0VfQVRUUiwgWE1MX1NQ
QUNFX0FUVFIsIENEQVRBLCBhdHRWYWx1ZSk7DQogICAgICAgIH0NCg0KICAgICAgICAvLy0tIHht
bDpsYW5nDQogICAgICAgIGF0dFZhbHVlID0gZGVzY3JpcHRvci5nZXRYTUxQcm9wZXJ0eShYTUxG
aWVsZERlc2NyaXB0b3IuUFJPUEVSVFlfWE1MX0xBTkcpOw0KICAgICAgICBpZiAoYXR0VmFsdWUg
IT0gbnVsbCkgew0KICAgICAgICAgICAgYXR0cy5hZGRBdHRyaWJ1dGUoTmFtZXNwYWNlcy5YTUxf
TkFNRVNQQUNFLCBMQU5HX0FUVFIsIFhNTF9MQU5HX0FUVFIsIENEQVRBLCBhdHRWYWx1ZSk7DQog
ICAgICAgIH0NCg0KDQogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLw0KICAgICAgICAvLy0g
Q3JlYXRlIGVsZW1lbnQgLS8NCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0vDQoNCg0KICAg
ICAgICAvLy0tIHNhdmUgeHNpOnR5cGUgaW5mb3JtYXRpb24sIGlmIG5lY2Vzc2FyeQ0KDQogICAg
ICAgIGlmIChzYXZlVHlwZSkgew0KICAgICAgICAgICAgLy8tLSBkZWNsYXJlIFhTSSBuYW1lc3Bh
Y2UsIGlmIG5lY2Vzc2FyeQ0KICAgICAgICAgICAgZGVjbGFyZU5hbWVzcGFjZShYU0lfUFJFRklY
LCBYU0lfTkFNRVNQQUNFKTsNCg0KICAgICAgICAgICAgLy8tLSBjYWxjdWxhdGUgdHlwZSBuYW1l
LCBlaXRoZXIgdXNlIGNsYXNzIG5hbWUgb3INCiAgICAgICAgICAgIC8vLS0gc2NoZW1hIHR5cGUg
bmFtZS4gSWYgWE1MQ2xhc3NEZXNjcmlwdG9yIGlzIGludHJvc3BlY3RlZCwNCiAgICAgICAgICAg
IC8vLS0gb3IgaXMgdGhlIGRlZmF1bHQgWE1MQ2xhc3NEZXNjcmlwdG9ySW1wbCwgdGhlbg0KICAg
ICAgICAgICAgLy8tLSB1c2UgamF2YTpjbGFzc25hbWUsIG90aGVyd2lzZSB1c2UgWE1MIG5hbWUu
DQogICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBjbGFzc0Rlc2MuZ2V0WE1MTmFtZSgpOw0K
DQogICAgICAgICAgICAvLy0tIENoZWNrIGZvciBpbnRyb3NwZWN0aW9uLi4uDQogICAgICAgICAg
ICBib29sZWFuIGludHJvc3BlY3RlZCA9IGZhbHNlOw0KICAgICAgICAgICAgaWYgKGNsYXNzRGVz
YyBpbnN0YW5jZW9mIEludGVybmFsWE1MQ2xhc3NEZXNjcmlwdG9yKQ0KICAgICAgICAgICAgICAg
IGludHJvc3BlY3RlZCA9ICgoSW50ZXJuYWxYTUxDbGFzc0Rlc2NyaXB0b3IpY2xhc3NEZXNjKS5p
bnRyb3NwZWN0ZWQoKTsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBpbnRyb3Nw
ZWN0ZWQgPSBJbnRyb3NwZWN0b3IuaW50cm9zcGVjdGVkKGNsYXNzRGVzYyk7DQoNCiAgICAgICAg
ICAgIGJvb2xlYW4gdXNlSmF2YVByZWZpeCA9IGZhbHNlOw0KICAgICAgICAgICAgaWYgKCh0eXBl
TmFtZSA9PSBudWxsKSB8fCBpbnRyb3NwZWN0ZWQpIHsNCiAgICAgICAgICAgICAgICB0eXBlTmFt
ZSA9IEpBVkFfUFJFRklYICsgY2xzLmdldE5hbWUoKTsNCiAgICAgICAgICAgICAgICB1c2VKYXZh
UHJlZml4ICA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChjbGFz
c0Rlc2MgaW5zdGFuY2VvZiBSb290QXJyYXlEZXNjcmlwdG9yKSB7DQogICAgICAgICAgICAgICAg
dHlwZU5hbWUgPSBKQVZBX1BSRUZJWCArIGNscy5nZXROYW1lKCk7DQogICAgICAgICAgICAgICAg
dXNlSmF2YVByZWZpeCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsN
CiAgICAgICAgICAgICAgICBTdHJpbmcgZGNuID0gY2xhc3NEZXNjLmdldENsYXNzKCkuZ2V0TmFt
ZSgpOw0KICAgICAgICAgICAgICAgIGlmIChkY24uZXF1YWxzKFhNTENsYXNzRGVzY3JpcHRvcklt
cGwuY2xhc3MuZ2V0TmFtZSgpKSkgew0KICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IEpB
VkFfUFJFRklYICsgY2xzLmdldE5hbWUoKTsNCiAgICAgICAgICAgICAgICAgICAgdXNlSmF2YVBy
ZWZpeCA9IHRydWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0K
ICAgICAgICAgICAgICAgICAgICAvLy0tIGNhbGN1bGF0ZSBwcm9wZXIgcHJlZml4DQogICAgICAg
ICAgICAgICAgICAgIFN0cmluZyB0bnMgPSBjbGFzc0Rlc2MuZ2V0TmFtZVNwYWNlVVJJKCk7DQog
ICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOw0KICAgICAgICAgICAgICAg
ICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSh0bnMpKSB7DQogICAgICAgICAgICAgICAg
ICAgICAgICBwcmVmaXggPSBfbmFtZXNwYWNlcy5nZXROYW1lc3BhY2VQcmVmaXgodG5zKTsNCiAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHByZWZpeCkp
IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IHByZWZpeCArICc6JyAr
IHR5cGVOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAg
ICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8tLSBz
YXZlIHR5cGUgaW5mb3JtYXRpb24NCiAgICAgICAgICAgIGF0dHMuYWRkQXR0cmlidXRlKFhTSV9O
QU1FU1BBQ0UsIFRZUEVfQVRUUiwgWFNJX1RZUEUsIENEQVRBLCB0eXBlTmFtZSk7DQogICAgICAg
ICAgICBpZiAodXNlSmF2YVByZWZpeCkgew0KICAgICAgICAgICAgICAgIC8vLS0gZGVjbGFyZSBK
YXZhIG5hbWVzcGFjZSwgaWYgbmVjZXNzYXJ5DQogICAgICAgICAgICAgICAgZGVjbGFyZU5hbWVz
cGFjZSgiamF2YSIsICJodHRwOi8vamF2YS5zdW4uY29tIik7DQogICAgICAgICAgICB9DQogICAg
ICAgIH0NCg0KICAgICAgICBpZiAoaXNOaWwgJiYgIV9zdXBwcmVzc1hTSVR5cGUpIHsNCiAgICAg
ICAgICAgIC8vLS0gZGVjbGFyZSBYU0kgbmFtZXNwYWNlLCBpZiBuZWNlc3NhcnkNCiAgICAgICAg
ICAgIGRlY2xhcmVOYW1lc3BhY2UoWFNJX1BSRUZJWCwgWFNJX05BTUVTUEFDRSk7DQogICAgICAg
ICAgICAvLy0tIGFkZCB4c2k6bmlsPSJ0cnVlIg0KICAgICAgICAgICAgYXR0cy5hZGRBdHRyaWJ1
dGUoWFNJX05BTUVTUEFDRSwgTklMX0FUVFIsIFhTSV9OSUxfQVRUUiwgQ0RBVEEsIFRSVUVfVkFM
VUUpOw0KICAgICAgICB9DQoNCiAgICAgICAvL2NoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIFFOYW1l
IHRoYXQgbmVlZHMgdG8NCiAgICAgICAvL2JlIHJlc29sdmVkICh7VVJJfXZhbHVlIC0+IG5zOnZh
bHVlKQ0KICAgICAgIC8vVGhpcyBzaG91bGQgYmUgZG9uZSBCRUZPUkUgZGVjbGFyaW5nIHRoZSBu
YW1lc3BhY2VzIGFzIGF0dHJpYnV0ZXMNCiAgICAgICAvL2JlY2F1c2Ugd2UgY2FuIGRlY2xhcmUg
bmV3IG5hbWVzcGFjZSBkdXJpbmcgdGhlIFFOYW1lIHJlc29sdXRpb24NCiAgICAgICBTdHJpbmcg
dmFsdWVUeXBlID0gZGVzY3JpcHRvci5nZXRTY2hlbWFUeXBlKCk7DQogICAgICAgaWYgKCh2YWx1
ZVR5cGUgIT0gbnVsbCkgJiYgKHZhbHVlVHlwZS5lcXVhbHMoUU5BTUVfTkFNRSkpKSB7DQogICAg
ICAgICAgIG9iamVjdCA9IHJlc29sdmVRTmFtZShvYmplY3QsIGRlc2NyaXB0b3IpOw0KICAgICAg
IH0NCg0KDQogICAgICAgIFN0cmluZyBxTmFtZSA9IG51bGw7DQogICAgICAgIGlmIChuc1ByZWZp
eCAhPSBudWxsKSB7DQogICAgICAgICAgICBpbnQgbGVuID0gbnNQcmVmaXgubGVuZ3RoKCk7DQog
ICAgICAgICAgICBpZiAobGVuID4gMCkgew0KICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBz
YiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuK25hbWUubGVuZ3RoKCkrMSk7DQogICAgICAgICAgICAg
ICAgc2IuYXBwZW5kKG5zUHJlZml4KTsNCiAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJzonKTsN
CiAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZSk7DQogICAgICAgICAgICAgICAgcU5hbWUg
PSBzYi50b1N0cmluZygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBxTmFtZSA9
IG5hbWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBxTmFtZSA9IG5hbWU7DQoNCg0KICAgICAg
ICBPYmplY3QgZmlyc3ROb25OdWxsVmFsdWUgPSBudWxsOw0KICAgICAgICBpbnQgICAgZmlyc3RO
b25OdWxsSWR4ICAgPSAwOw0KDQogICAgICAgIHRyeSB7DQoNCg0KICAgICAgICAgICAgaWYgKCFj
b250YWluZXJGaWVsZCkgew0KDQoNCiAgICAgICAgICAgICAgICAvLy0tIGlzTmlsbGFibGU/DQog
ICAgICAgICAgICAgICAgaWYgKCghaXNOaWwpICYmIGRlc2NyaXB0b3IuaXNOaWxsYWJsZSgpKSB7
DQogICAgICAgICAgICAgICAgICAgIFhNTEZpZWxkRGVzY3JpcHRvciBkZXNjID0gY2xhc3NEZXNj
LmdldENvbnRlbnREZXNjcmlwdG9yKCk7DQogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Jz
ID0gY2xhc3NEZXNjLmdldEVsZW1lbnREZXNjcmlwdG9ycygpOw0KICAgICAgICAgICAgICAgICAg
ICBpbnQgZGVzY0NvdW50ID0gZGVzY3JpcHRvcnMubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAg
ICBib29sZWFuIGlzTmlsQ29udGVudCA9IChkZXNjQ291bnQgPiAwKSB8fCAoZGVzYyAhPSBudWxs
KTsNCg0KICAgICAgICAgICAgICAgICAgICAvLy0tIGNoZWNrIGNvbnRlbnQgZGVzY3JpcHRvciBm
b3IgYSB2YWxpZCB2YWx1ZQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7
DQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBkZXNjLmdldEhhbmRsZXIo
KS5nZXRWYWx1ZShvYmplY3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9
IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05pbENvbnRlbnQgPSBmYWxz
ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjQ291bnQgPSAwOw0KICAgICAgICAg
ICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzYy5p
c05pbGxhYmxlKCkgJiYgZGVzYy5pc1JlcXVpcmVkKCkpIHsNCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpc05pbENvbnRlbnQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBkZXNjQ291bnQgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
ICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRl
c2NDb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gZGVzY3JpcHRv
cnNbaV07DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyA9PSBudWxsKSBjb250aW51
ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGRlc2MuZ2V0SGFuZGxl
cigpLmdldFZhbHVlKG9iamVjdCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUg
IT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTmlsQ29udGVudCA9IGZh
bHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9uTnVsbElkeCA9IGk7DQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25OdWxsVmFsdWUgPSB2YWx1ZTsNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlc2MuaXNOaWxsYWJsZSgpICYm
IGRlc2MuaXNSZXF1aXJlZCgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOaWxD
b250ZW50ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25OdWxs
SWR4ID0gaTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vbk51bGxWYWx1ZSA9
IG5ldyBOaWxPYmplY3QoY2xhc3NEZXNjLCBkZXNjKTsNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAg
ICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChpc05pbENvbnRlbnQpIHsNCiAgICAgICAg
ICAgICAgICAgICAgICAgIGRlY2xhcmVOYW1lc3BhY2UoWFNJX1BSRUZJWCwgWFNJX05BTUVTUEFD
RSk7DQogICAgICAgICAgICAgICAgICAgICAgICBhdHRzLmFkZEF0dHJpYnV0ZShYU0lfTkFNRVNQ
QUNFLCBOSUxfQVRUUiwgWFNJX05JTF9BVFRSLCBDREFUQSwgVFJVRV9WQUxVRSk7DQogICAgICAg
ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLy0t
IGRlY2xhcmUgYWxsIG5lY2Vzc3NhcnkgbmFtZXNwYWNlcw0KICAgICAgICAgICAgICAgIF9uYW1l
c3BhY2VzLnNlbmRTdGFydEV2ZW50cyhoYW5kbGVyKTsNCiAgICAgICAgICAgICAgICAvLy0tIE1h
a2Ugc3VyZSBxTmFtZSBpcyBub3QgbnVsbA0KICAgICAgICAgICAgICAgIGlmIChxTmFtZSA9PSBu
dWxsKSB7DQogICAgICAgICAgICAgICAgICAgIC8vLS0gaG9wZWZ1bGx5IHRoaXMgbmV2ZXIgaGFw
cGVucywgYnV0IGlmIGl0IGRvZXMsIGl0IG1lYW5zDQogICAgICAgICAgICAgICAgICAgIC8vLS0g
d2UgaGF2ZSBhIGJ1ZyBpbiBvdXIgbmFtaW5nIGxvZ2ljDQogICAgICAgICAgICAgICAgICAgIFN0
cmluZyBlcnIgPSAiRXJyb3IgaW4gZGVyaXZpbmcgbmFtZSBmb3IgdHlwZTogIiArDQogICAgICAg
ICAgICAgICAgICAgICAgICBjbHMuZ2V0TmFtZSgpICsgIiwgcGxlYXNlIHJlcG9ydCBidWcgdG86
ICIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9jYXN0b3IuZXhvbGFiLm9yZy4i
Ow0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVy
cik7DQogICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0
RWxlbWVudChuc1VSSSwgbmFtZSwgcU5hbWUsIGF0dHMpOw0KICAgICAgICAgICAgfQ0KICAgICAg
ICB9DQogICAgICAgIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc3gpIHsNCiAgICAg
ICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKHN4KTsNCiAgICAgICAgfQ0KDQoNCiAg
ICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAg
Ly8tLSBwcm9jZXNzIGFsbCBjaGlsZCBjb250ZW50LCBpbmNsdWRpbmcNCiAgICAgICAgLy8tLSB0
ZXh0IG5vZGVzICsgZGF1Z2h0ZXIgZWxlbWVudHMNCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICBTdGFjazxXcmFwcGVySW5mbz4gd3Jh
cHBlcnMgPSBudWxsOw0KDQoNCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAg
ICAgIC8vLS0gaGFuZGxlIHRleHQgY29udGVudA0KICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0NCg0KICAgICAgICBpZiAoIWlzTmlsKSB7DQoNCiAgICAgICAgICAgIFhNTEZpZWxkRGVz
Y3JpcHRvciBjZGVzYyA9IG51bGw7DQogICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IuaXNSZWZl
cmVuY2UoKSkgew0KICAgICAgICAgICAgICAgIGNkZXNjID0gY2xhc3NEZXNjLmdldENvbnRlbnRE
ZXNjcmlwdG9yKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoY2Rlc2MgIT0gbnVs
bCkgew0KICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOw0KICAgICAgICAgICAgICAg
IHRyeSB7DQogICAgICAgICAgICAgICAgICAgIG9iaiA9IGNkZXNjLmdldEhhbmRsZXIoKS5nZXRW
YWx1ZShvYmplY3QpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaChJ
bGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7DQogICAgICAgICAgICAgICAgICAgIExPRy53YXJu
KCJFcnJvciBnZXR0aW5nIHZhbHVlIGZyb206ICIgKyBvYmplY3QsIGlzZSk7DQogICAgICAgICAg
ICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7DQoNCiAgICAgICAg
ICAgICAgICAgICAgLy8tLSA8V3JhcHBlcj4NCiAgICAgICAgICAgICAgICAgICAgLy8tLSBoYW5k
bGUgWE1MIHBhdGgNCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjZGVzYy5nZXRM
b2NhdGlvblBhdGgoKTsNCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRMb2MgPSBu
dWxsOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsNCiAgICAgICAg
ICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmNsZWFyKCk7DQogICAgICAgICAgICAgICAgICAg
ICAgICBpZiAod3JhcHBlcnMgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdyYXBwZXJzICA9IG5ldyBTYWZlU3RhY2s8V3JhcHBlckluZm8+KCk7DQogICAgICAgICAgICAg
ICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdoaWxlIChwYXRoICE9IG51bGwpIHsNCg0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbU5hbWUgPSBudWxsOw0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcGF0aC5pbmRleE9mKCcvJyk7DQoNCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApIHsNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGVsZW1OYW1lID0gcGF0aC5zdWJzdHJpbmcoMCwgaWR4KTsNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhp
ZHgrMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBlbGVtTmFtZSA9IHBhdGg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYXRoID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0gc2F2ZSBjdXJyZW50IGxvY2F0aW9uIHdp
dGhvdXQgbmFtZXNwYWNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0gaW5m
b3JtYXRpb24gZm9yIG5vdy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1
cnJlbnRMb2MgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1
cnJlbnRMb2MgPSBlbGVtTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxz
ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExvYyA9IGN1cnJl
bnRMb2MgKyAiLyIgKyBlbGVtTmFtZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBTdHJpbmcgZWxlbVFOYW1lID0gZWxlbU5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KG5zUHJlZml4KSkgew0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVFOYW1lID0gbnNQcmVmaXggKyAnOicgKyBl
bGVtTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB3cmFwcGVycy5wdXNoKG5ldyBXcmFwcGVySW5mbyhlbGVtTmFt
ZSwgZWxlbVFOYW1lLCBjdXJyZW50TG9jKSk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBfYXR0cmlidXRlcy5jbGVhcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAobmVzdGVkQXR0Q291bnQgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmb3IgKGludCBuYSA9IDA7IG5hIDwgbmVzdGVkQXR0cy5sZW5ndGg7IG5hKysp
IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQXR0
c1tuYV0gPT0gbnVsbCkgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgU3RyaW5nIHRtcFBhdGggPSBuZXN0ZWRBdHRzW25hXS5nZXRMb2NhdGlvblBhdGgo
KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wUGF0aC5l
cXVhbHMoY3VycmVudExvYykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZShvYmplY3QsIG5lc3RlZEF0dHNbbmFdLF9hdHRyaWJ1
dGVzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVk
QXR0c1tuYV0gPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAtLW5lc3RlZEF0dENvdW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBoYW5kbGVyLnN0YXJ0RWxlbWVudChuc1VSSSwgZWxlbU5hbWUsIGVsZW1RTmFtZSwgX2F0dHJp
YnV0ZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAg
ICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKFNBWEV4Y2VwdGlvbiBzeCkg
ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9u
KHN4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0K
ICAgICAgICAgICAgICAgICAgICAvLy0tIDwvV3JhcHBlcj4NCg0KICAgICAgICAgICAgICAgICAg
ICBjaGFyW10gY2hhcnMgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBvYmpU
eXBlID0gb2JqLmdldENsYXNzKCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChvYmpUeXBlLmlz
QXJyYXkoKSAmJiAob2JqVHlwZS5nZXRDb21wb25lbnRUeXBlKCkgPT0gQnl0ZS5UWVBFKSkgew0K
ICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSBoYW5kbGUgYmFzZTY0L2hleGJpbmFyeSBjb250
ZW50DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1hVHlwZSA9IGRl
c2NyaXB0b3IuZ2V0U2NoZW1hVHlwZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEhl
eERlY29kZXIuREFUQV9UWVBFLmVxdWFscyhzY2hlbWFUeXBlKSkgew0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNoYXJzID0gbmV3IFN0cmluZyhIZXhEZWNvZGVyLmVuY29kZSgoYnl0ZVtd
KSBvYmopKS50b0NoYXJBcnJheSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycyA9IEJhc2U2NEVuY29kZXIuZW5jb2Rl
KChieXRlW10pIG9iaik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLy0tIGFsbCBvdGhlciB0
eXBlcw0KICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG9iai50b1N0cmluZygp
Ow0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoc3Ry
KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzID0gc3RyLnRvQ2hhckFycmF5
KCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAg
ICAgICAgICAgICAgICAgICAgaWYgKChjaGFycyAhPSBudWxsKSAmJiAoY2hhcnMubGVuZ3RoID4g
MCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaGFuZGxlci5jaGFyYWN0ZXJzKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgpOw0KICAg
ICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gob3Jn
LnhtbC5zYXguU0FYRXhjZXB0aW9uIHN4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
dGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oc3gpOw0KICAgICAgICAgICAgICAgICAgICAgICAg
fQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
fQ0KICAgICAgICAgICAgLy8tLSBlbGVtZW50IHJlZmVyZW5jZXMNCiAgICAgICAgICAgIGVsc2Ug
aWYgKGRlc2NyaXB0b3IuaXNSZWZlcmVuY2UoKSkgew0KICAgICAgICAgICAgICAgIE9iamVjdCBp
ZCA9IGdldE9iamVjdElEKG9iamVjdCk7DQogICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwp
IHsNCiAgICAgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gaWQudG9TdHJpbmcoKS50b0No
YXJBcnJheSgpOw0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAg
ICAgICAgaGFuZGxlci5jaGFyYWN0ZXJzKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgpOw0KICAgICAg
ICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoKG9yZy54bWwuc2F4LlNB
WEV4Y2VwdGlvbiBzeCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNo
YWxFeGNlcHRpb24oc3gpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAg
fQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBieXRlW10N
CiAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGVBcnJheSkgew0KICAgICAgICAgICAgICAgIC8vLS0g
QmFzZTY0RW5jb2RpbmcgLyBIZXhCaW5hcnkNCiAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1h
VHlwZSA9IGRlc2NyaXB0b3IuZ2V0U2NoZW1hVHlwZSgpOw0KICAgICAgICAgICAgICAgIFN0cmlu
ZyBjb21wb25lbnRUeXBlID0gZGVzY3JpcHRvci5nZXRDb21wb25lbnRUeXBlKCk7DQogICAgICAg
ICAgICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMF07DQogICAgICAgICAgICAgICAgaWYg
KChkZXNjcmlwdG9yLmlzTXVsdGl2YWx1ZWQoKSAmJiBIZXhEZWNvZGVyLkRBVEFfVFlQRS5lcXVh
bHMoY29tcG9uZW50VHlwZSkpIHx8IA0KICAgICAgICAgICAgICAgICAgICAgICAgSGV4RGVjb2Rl
ci5EQVRBX1RZUEUuZXF1YWxzKHNjaGVtYVR5cGUpKSB7DQogICAgICAgICAgICAgICAgICAgIGNo
YXJzID0gbmV3IFN0cmluZyhIZXhEZWNvZGVyLmVuY29kZSgoYnl0ZVtdKSBvYmplY3QpKS50b0No
YXJBcnJheSgpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAg
IGNoYXJzID0gQmFzZTY0RW5jb2Rlci5lbmNvZGUoKGJ5dGVbXSkgb2JqZWN0KTsNCiAgICAgICAg
ICAgICAgICB9DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgaGFu
ZGxlci5jaGFyYWN0ZXJzKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgpOw0KICAgICAgICAgICAgICAg
IH0gIGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc3gpIHsNCiAgICAgICAgICAgICAg
ICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oc3gpOw0KICAgICAgICAgICAgICAgIH0N
CiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgU3RyaW5ncyBh
bmQgcHJpbWl0aXZlcyAqLw0KICAgICAgICAgICAgZWxzZSBpZiAoaXNQcmltaXRpdmUoY2xzKSkg
ew0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGNoYXJbXSBjaGFyczsNCiAgICAg
ICAgICAgICAgICBpZiAoY2xzID09IGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzKSB7DQogICAg
ICAgICAgICAgICAgICAgIGNoYXJzID0gY29udmVydEJpZ0RlY2ltYWxUb1N0cmluZyhvYmplY3Qp
LnRvQ2hhckFycmF5KCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAg
ICAgICAgY2hhcnMgPSBvYmplY3QudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOw0KICAgICAgICAg
ICAgICAgIH0NCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICBoYW5k
bGVyLmNoYXJhY3RlcnMoY2hhcnMsMCxjaGFycy5sZW5ndGgpOw0KICAgICAgICAgICAgICAgIH0N
CiAgICAgICAgICAgICAgICBjYXRjaChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc3gpIHsNCiAg
ICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oc3gpOw0KICAgICAg
ICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGlzRW51bShj
bHMpKSB7DQogICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gb2JqZWN0LnRvU3RyaW5nKCku
dG9DaGFyQXJyYXkoKTsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAg
ICBoYW5kbGVyLmNoYXJhY3RlcnMoY2hhcnMsMCxjaGFycy5sZW5ndGgpOw0KICAgICAgICAgICAg
ICAgIH0NCiAgICAgICAgICAgICAgICBjYXRjaChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gc3gp
IHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oc3gpOw0K
ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAg
ICAgfQ0KDQogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIC8v
LS0gaGFuZGxlIGRhdWdodGVyIGVsZW1lbnRzDQogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tDQoNCiAgICAgICAgaWYgKGlzTmlsIHx8IGRlc2NyaXB0b3IuaXNSZWZlcmVuY2Uo
KSkgew0KICAgICAgICAgICAgZGVzY3JpcHRvcnMgPSBOT19GSUVMRF9ERVNDUklQVE9SUzsNCiAg
ICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGRlc2NyaXB0b3JzID0gY2xhc3NE
ZXNjLmdldEVsZW1lbnREZXNjcmlwdG9ycygpOw0KICAgICAgICB9DQoNCiAgICAgICAgKytfZGVw
dGg7DQoNCiAgICAgICAgLy8tLSBtYXJzaGFsIGVsZW1lbnRzDQogICAgICAgIGZvciAoaW50IGkg
PSBmaXJzdE5vbk51bGxJZHg7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgew0KDQogICAg
ICAgICAgICBYTUxGaWVsZERlc2NyaXB0b3IgZWxlbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1tp
XTsNCiAgICAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOw0KICAgICAgICAgICAgYm9vbGVhbiBu
aWwgPSBmYWxzZTsNCg0KICAgICAgICAgICAgLy8tLSB1c2VkIHByZXZpb3VzbHkgY2FjaGVkIHZh
bHVlPw0KICAgICAgICAgICAgaWYgKChpID09IGZpcnN0Tm9uTnVsbElkeCkgJiYgKGZpcnN0Tm9u
TnVsbFZhbHVlICE9IG51bGwpKSB7DQogICAgICAgICAgICAgICAgb2JqID0gZmlyc3ROb25OdWxs
VmFsdWU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIC8vLS0gb2J0YWlu
IHZhbHVlIGZyb20gaGFuZGxlcg0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAg
ICAgICAgIG9iaiA9IGVsZW1EZXNjcmlwdG9yLmdldEhhbmRsZXIoKS5nZXRWYWx1ZShvYmplY3Qp
Ow0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsN
CiAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIkVycm9yIG1hcnNoYWxsaW5nICIgKyBvYmpl
Y3QsIGlzZSk7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKG9iaiA9PSBu
dWxsIA0KICAgICAgICAgICAgICAgICAgICB8fCAob2JqIGluc3RhbmNlb2YgRW51bWVyYXRpb24g
JiYgISgoRW51bWVyYXRpb24pIG9iaikuaGFzTW9yZUVsZW1lbnRzKCkpKSB7DQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChlbGVtRGVzY3JpcHRvci5pc05pbGxhYmxlKCkgJiYgKGVs
ZW1EZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgbmlsID0g
dHJ1ZTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAg
Ly8tLSBoYW5kbGUgWE1MIHBhdGgNCiAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZWxlbURlc2Ny
aXB0b3IuZ2V0TG9jYXRpb25QYXRoKCk7DQogICAgICAgICAgICBTdHJpbmcgY3VycmVudExvYyA9
IG51bGw7DQogICAgICAgICAgICAvLy0tIFdyYXBwZXIvTG9jYXRpb24gY2xlYW51cA0KICAgICAg
ICAgICAgaWYgKHdyYXBwZXJzICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAg
ICAgICAgICAgICAgICAgICB3aGlsZSAoIXdyYXBwZXJzLmVtcHR5KCkpIHsNCiAgICAgICAgICAg
ICAgICAgICAgICAgIFdyYXBwZXJJbmZvIHdJbmZvID0gd3JhcHBlcnMucGVlaygpOw0KICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICh3SW5mby5fbG9jYXRpb24uZXF1YWxzKHBhdGgpKSB7DQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGF0aC5zdGFydHNXaXRoKHdJbmZvLl9sb2Nh
dGlvbiArICIvIikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBh
dGguc3Vic3RyaW5nKHdJbmZvLl9sb2NhdGlvbi5sZW5ndGgoKSsxKTsNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY3VycmVudExvYyA9IHdJbmZvLl9sb2NhdGlvbjsNCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAg
aGFuZGxlci5lbmRFbGVtZW50KG5zVVJJLCB3SW5mby5fbG9jYWxOYW1lLCB3SW5mby5fcU5hbWUp
Ow0KICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnMucG9wKCk7DQogICAgICAgICAgICAg
ICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2goU0FYRXhj
ZXB0aW9uIHN4KSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0
aW9uKHN4KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCg0KICAgICAgICAg
ICAgaWYgKHBhdGggIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmNsZWFy
KCk7DQogICAgICAgICAgICAgICAgaWYgKHdyYXBwZXJzID09IG51bGwpIHsNCiAgICAgICAgICAg
ICAgICAgICAgd3JhcHBlcnMgID0gbmV3IFNhZmVTdGFjazxXcmFwcGVySW5mbz4oKTsNCiAgICAg
ICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAg
d2hpbGUgKHBhdGggIT0gbnVsbCkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcg
ZWxlbU5hbWUgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHBhdGgu
aW5kZXhPZignLycpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID4gMCkgew0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1OYW1lID0gcGF0aC5zdWJzdHJpbmcoMCwg
aWR4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmco
aWR4KzEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbU5hbWUgPSBwYXRoOw0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBudWxsOw0KICAgICAgICAgICAgICAg
ICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAvLy0tIHNhdmUgY3VycmVudCBs
b2NhdGlvbiB3aXRob3V0IG5hbWVzcGFjZQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8tLSBp
bmZvcm1hdGlvbiBmb3Igbm93Lg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRM
b2MgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9jID0gZWxl
bU5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY3VycmVudExvYyA9IGN1cnJlbnRMb2MgKyAiLyIgKyBlbGVtTmFtZTsNCg0KICAg
ICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1RTmFtZSA9IGVsZW1OYW1lOw0KICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkobnNQcmVmaXgpKSB7
DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVFOYW1lID0gbnNQcmVmaXggKyAnOicg
KyBlbGVtTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAg
ICAgICAgIHdyYXBwZXJzLnB1c2gobmV3IFdyYXBwZXJJbmZvKGVsZW1OYW1lLCBlbGVtUU5hbWUs
IGN1cnJlbnRMb2MpKTsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlcy5j
bGVhcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lc3RlZEF0dENvdW50ID4gMCkg
ew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG5hID0gMDsgbmEgPCBuZXN0
ZWRBdHRzLmxlbmd0aDsgbmErKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAobmVzdGVkQXR0c1tuYV0gPT0gbnVsbCkgY29udGludWU7DQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFN0cmluZyB0bXBQYXRoID0gbmVzdGVkQXR0c1tuYV0uZ2V0TG9jYXRpb25Q
YXRoKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXBQYXRoLmVxdWFs
cyhjdXJyZW50TG9jKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJv
Y2Vzc0F0dHJpYnV0ZShvYmplY3QsIG5lc3RlZEF0dHNbbmFdLF9hdHRyaWJ1dGVzKTsNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZEF0dHNbbmFdID0gbnVsbDsNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbmVzdGVkQXR0Q291bnQ7DQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBo
YW5kbGVyLnN0YXJ0RWxlbWVudChuc1VSSSwgZWxlbU5hbWUsIGVsZW1RTmFtZSwgX2F0dHJpYnV0
ZXMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAg
ICAgICAgIGNhdGNoKFNBWEV4Y2VwdGlvbiBzeCkgew0KICAgICAgICAgICAgICAgICAgICB0aHJv
dyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihzeCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAg
ICAgfQ0KDQogICAgICAgICAgICBpZiAobmlsKSB7DQogICAgICAgICAgICAgICAgb2JqID0gbmV3
IE5pbE9iamVjdChjbGFzc0Rlc2MsIGVsZW1EZXNjcmlwdG9yKTsNCiAgICAgICAgICAgIH0NCg0K
ICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSA9IG9iai5nZXRDbGFzcygpOw0KDQogICAg
ICAgICAgICBNYXJzaGFsU3RhdGUgbXlTdGF0ZSA9IG1zdGF0ZS5jcmVhdGVNYXJzaGFsU3RhdGUo
b2JqZWN0LCBuYW1lKTsNCiAgICAgICAgICAgIG15U3RhdGUuX25lc3RlZEF0dHMgPSBuZXN0ZWRB
dHRzOw0KICAgICAgICAgICAgbXlTdGF0ZS5fbmVzdGVkQXR0Q291bnQgPSBuZXN0ZWRBdHRDb3Vu
dDsNCg0KDQogICAgICAgICAgICAvLy0tIGhhbmRsZSBieXRlIGFycmF5cw0KICAgICAgICAgICAg
aWYgKHR5cGUuaXNBcnJheSgpICYmICh0eXBlLmdldENvbXBvbmVudFR5cGUoKSA9PSBCeXRlLlRZ
UEUpKSB7DQogICAgICAgICAgICAgICAgbWFyc2hhbChvYmosIGVsZW1EZXNjcmlwdG9yLCBoYW5k
bGVyLCBteVN0YXRlKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0FycmF5KCkgJiYg
ZWxlbURlc2NyaXB0b3IuaXNEZXJpdmVkRnJvbVhTTGlzdCgpKSB7DQogICAgICAgICAgICAgICAg
T2JqZWN0IGJ1ZmZlciA9IHByb2Nlc3NYU0xpc3RUeXBlKG9iaiwgZWxlbURlc2NyaXB0b3IpOw0K
ICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtTmFtZSA9IGVsZW1EZXNjcmlwdG9yLmdldFhNTE5h
bWUoKTsNCiAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbVFOYW1lID0gZWxlbU5hbWU7DQogICAg
ICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkobnNQcmVmaXgpKSB7DQogICAg
ICAgICAgICAgICAgICAgIGVsZW1RTmFtZSA9IG5zUHJlZml4ICsgJzonICsgZWxlbU5hbWU7DQog
ICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IGJ1ZmZlci50
b1N0cmluZygpLnRvQ2hhckFycmF5KCk7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAg
ICAgICAgICAgICAgaGFuZGxlci5zdGFydEVsZW1lbnQobnNVUkksIGVsZW1OYW1lLCBlbGVtUU5h
bWUsIF9hdHRyaWJ1dGVzKTsNCiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jaGFyYWN0ZXJz
KGNoYXJzLDAsY2hhcnMubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5lbmRF
bGVtZW50KG5zVVJJLCBlbGVtTmFtZSwgZWxlbVFOYW1lKTsNCiAgICAgICAgICAgICAgICB9DQog
ICAgICAgICAgICAgICAgY2F0Y2gob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHN4KSB7DQogICAg
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKHN4KTsNCiAgICAgICAg
ICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLy0tIGhhbmRsZSBhbGwgb3Ro
ZXIgY29sbGVjdGlvbiB0eXBlcw0KICAgICAgICAgICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKHR5
cGUpKSB7DQogICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzQ29sbGVjdGlvbiA9IHRydWU7
DQogICAgICAgICAgICAgICAgaWYgKF9zYXZlTWFwS2V5cykgew0KICAgICAgICAgICAgICAgICAg
ICBNYXBIYW5kbGVyIG1hcEhhbmRsZXIgPSBNYXBIYW5kbGVycy5nZXRIYW5kbGVyKHR5cGUpOw0K
ICAgICAgICAgICAgICAgICAgICBpZiAobWFwSGFuZGxlciAhPSBudWxsKSB7DQogICAgICAgICAg
ICAgICAgICAgICAgICBwcm9jZXNzQ29sbGVjdGlvbiA9IGZhbHNlOw0KICAgICAgICAgICAgICAg
ICAgICAgICAgTWFwSXRlbSBpdGVtID0gbmV3IE1hcEl0ZW0oKTsNCiAgICAgICAgICAgICAgICAg
ICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBtYXBIYW5kbGVyLmtleXMob2JqKTsNCiAgICAgICAg
ICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7DQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRLZXkoa2V5cy5uZXh0RWxlbWVudCgpKTsNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFZhbHVlKG1hcEhhbmRsZXIuZ2V0KG9i
aiwgaXRlbS5nZXRLZXkoKSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWwo
aXRlbSwgZWxlbURlc2NyaXB0b3IsIGhhbmRsZXIsIG15U3RhdGUpOw0KICAgICAgICAgICAgICAg
ICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9DQog
ICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NDb2xsZWN0aW9uKSB7DQogICAgICAgICAgICAgICAg
ICAgIENvbGxlY3Rpb25IYW5kbGVyIGNvbEhhbmRsZXIgPSBnZXRDb2xsZWN0aW9uSGFuZGxlcih0
eXBlKTsNCiAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBjb2xI
YW5kbGVyLmVsZW1lbnRzKG9iaik7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJh
dGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0
IGl0ZW0gPSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOw0KICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKGl0ZW0gIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNo
YWwoaXRlbSwgZWxlbURlc2NyaXB0b3IsIGhhbmRsZXIsIG15U3RhdGUpOw0KICAgICAgICAgICAg
ICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0K
ICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8tLSBvdGhlcndpc2UganVzdCBtYXJzaGFsIG9i
amVjdCBhcyBpcw0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgbWFyc2hhbChv
YmosIGVsZW1EZXNjcmlwdG9yLCBoYW5kbGVyLCBteVN0YXRlKTsNCiAgICAgICAgICAgIH0NCg0K
ICAgICAgICAgICAgaWYgKG5lc3RlZEF0dENvdW50ID4gMCkgew0KICAgICAgICAgICAgICAgIG5l
c3RlZEF0dENvdW50ID0gbXlTdGF0ZS5fbmVzdGVkQXR0Q291bnQ7DQogICAgICAgICAgICB9DQoN
CiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8tLSBXcmFwcGVyL0xvY2F0aW9uIGNsZWFudXAgZm9y
IGVsZW1lbnRzDQogICAgICAgIGlmICh3cmFwcGVycyAhPSBudWxsKSB7DQogICAgICAgICAgICB0
cnkgew0KICAgICAgICAgICAgICAgIHdoaWxlICghd3JhcHBlcnMuZW1wdHkoKSkgew0KICAgICAg
ICAgICAgICAgICAgICBXcmFwcGVySW5mbyB3SW5mbyA9IHdyYXBwZXJzLnBlZWsoKTsNCiAgICAg
ICAgICAgICAgICAgICAgYm9vbGVhbiBwb3BTdGFjayA9IHRydWU7DQogICAgICAgICAgICAgICAg
ICAgIGlmIChuZXN0ZWRBdHRDb3VudCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZv
ciAoaW50IG5hID0gMDsgbmEgPCBuZXN0ZWRBdHRzLmxlbmd0aDsgbmErKykgew0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIFRPRE9bTExdOiByZWZhY3RvciB0byBhdm9pZCBjaGVjayBh
Z2FpbnN0IG51bGwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQXR0c1tu
YV0gPT0gbnVsbCkgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5n
IG5lc3RlZEF0dHJpYnV0ZVBhdGggPSBuZXN0ZWRBdHRzW25hXS5nZXRMb2NhdGlvblBhdGgoKTsN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQXR0cmlidXRlUGF0aC5zdGFy
dHNXaXRoKHdJbmZvLl9sb2NhdGlvbiArICIvIikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcG9wU3RhY2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlm
IChwb3BTdGFjaykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50
KG5zVVJJLCB3SW5mby5fbG9jYWxOYW1lLCB3SW5mby5fcU5hbWUpOw0KICAgICAgICAgICAgICAg
ICAgICAgICAgd3JhcHBlcnMucG9wKCk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQog
ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAg
ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoKFNBWEV4Y2Vw
dGlvbiBzeCkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKHN4
KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFRPRE86IEhhbmRsaW5n
IGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhdCB0aGUgZW5kIGNhdXNlcyBlbGVtZW50cyB0byBiZSBt
YXJzaGFsbGVkIGluIHRoZSB3cm9uZw0KICAgICAgICAvLyBvcmRlciB3aGVuIGVsZW1lbnQgJ3Rl
eHQnIGlzIG51bGwsIGJ1dCB0aGVpciBhdHRyaWJ1dGUgdmFsdWUgaXMgbm90IG51bGwuIENhbiB0
aGlzIGJlIGZpeGVkDQogICAgICAgIC8vIHRvIHByb2Nlc3MgZWxlbWVudCBhdHRyaWJ1dGVzIGV2
ZW4gd2hlbiB0aGUgZWxlbWVudCB0ZXh0IHZhbHVlIGlzIG51bGw/DQoNCiAgICAgICAgaWYgKHdy
YXBwZXJzICE9IG51bGwgJiYgIXdyYXBwZXJzLmlzRW1wdHkoKSkgew0KICAgICAgICAgICAgZGVh
bFdpdGhOZXN0ZWRBdHRyaWJ1dGVzTmVzdGVkKG9iamVjdCwgaGFuZGxlciwgbnNQcmVmaXgsIG5z
VVJJLA0KICAgICAgICAgICAgICAgICAgICBuZXN0ZWRBdHRDb3VudCwgbmVzdGVkQXR0cywgd3Jh
cHBlcnMpOw0KICAgICAgICB9DQoNCiAgICAgICAgZGVhbFdpdGhOZXN0ZWRBdHRyaWJ1dGVzKG9i
amVjdCwgaGFuZGxlciwgbnNQcmVmaXgsIG5zVVJJLA0KICAgICAgICAgICAgICAgIG5lc3RlZEF0
dENvdW50LCBuZXN0ZWRBdHRzLCBuZXcgU2FmZVN0YWNrPFdyYXBwZXJJbmZvPigpKTsNCg0KICAg
ICAgICAvLy0tIGZpbmlzaCBlbGVtZW50DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBpZiAo
IWNvbnRhaW5lckZpZWxkKSB7DQogICAgICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50KG5z
VVJJLCBuYW1lLCBxTmFtZSk7DQogICAgICAgICAgICAgICAgLy8tLSB1bmRlY2xhcmUgYWxsIG5l
Y2Vzc3NhcnkgbmFtZXNwYWNlcw0KICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzLnNlbmRFbmRF
dmVudHMoaGFuZGxlcik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2go
b3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHN4KSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgTWFy
c2hhbEV4Y2VwdGlvbihzeCk7DQogICAgICAgIH0NCg0KICAgICAgICAtLV9kZXB0aDsNCiAgICAg
ICAgX3BhcmVudHMucG9wKCk7DQogICAgICAgIGlmICghYXRSb290KSBfbmFtZXNwYWNlcyA9IF9u
YW1lc3BhY2VzLmdldFBhcmVudCgpOw0KDQogICAgICAgIC8vLS0gbm90aWZ5IGxpc3RlbmVyIG9m
IHBvc3QgbWFyc2hhbA0KICAgICAgICBpZiAoX21hcnNoYWxMaXN0ZW5lciAhPSBudWxsKSB7DQog
ICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgX21hcnNoYWxMaXN0ZW5lci5wb3N0TWFyc2hh
bChvYmplY3QpOw0KICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7DQog
ICAgICAgICAgICAgICAgTE9HLmVycm9yKCJJbnZva2luZyAjcG9zdE1hcnNoYWwoKSBvbiB5b3Vy
IGN1c3RvbSBNYXJzaGFsTGlzdGVuZXIgaW5zdGFuY2UgY2F1c2VkIHRoZSBmb2xsb3dpbmcgcHJv
YmxlbToiLCBlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgfSAvLy0tIHZvaWQg
bWFyc2hhbChEb2N1bWVudEhhbmRsZXIpDQoNCiAgICBwcml2YXRlIHZvaWQgZGVhbFdpdGhOZXN0
ZWRBdHRyaWJ1dGVzKE9iamVjdCBvYmplY3QsDQogICAgICAgICAgICBDb250ZW50SGFuZGxlciBo
YW5kbGVyLCBTdHJpbmcgbnNQcmVmaXgsIFN0cmluZyBuc1VSSSwNCiAgICAgICAgICAgIGludCBu
ZXN0ZWRBdHRDb3VudCwgWE1MRmllbGREZXNjcmlwdG9yW10gbmVzdGVkQXR0cywgU3RhY2s8V3Jh
cHBlckluZm8+IHdyYXBwZXJzKQ0KICAgICAgICAgICAgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24g
ew0KICAgICAgICAvLy0tIEhhbmRsZSBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGUgbG9jYXRpb25z
IHRoYXQgd2VyZQ0KICAgICAgICAvLy0tIG5vdCBoYW5kbGVkIHdoZW4gZGVhbGluZyB3aXRoIHdy
YXBwZXIgZWxlbWVudHMNCiAgICAgICAgaWYgKG5lc3RlZEF0dENvdW50ID4gMCkgew0KICAgICAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRBdHRzLmxlbmd0aDsgaSsrKSB7DQogICAg
ICAgICAgICAgICAgaWYgKG5lc3RlZEF0dHNbaV0gPT0gbnVsbCkgY29udGludWU7DQogICAgICAg
ICAgICAgICAgU3RyaW5nIHBhdGggPSBuZXN0ZWRBdHRzW2ldLmdldExvY2F0aW9uUGF0aCgpOw0K
ICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50TG9jID0gbnVsbDsNCiAgICAgICAgICAgICAg
ICANCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvLy0tIE1ha2Ugc3VyZSBhdHRy
aWJ1dGUgaGFzIHZhbHVlIGJlZm9yZSBjb250aW51aW5nDQogICAgICAgICAgICAgICAgLy8tLSBX
ZSByZWFsbHkgY291bGQgdXNlIGEgRmllbGRIYW5kbGVyI2hhc1ZhbHVlKCkNCiAgICAgICAgICAg
ICAgICAvLy0tIG1ldGhvZCAoc2luY2Ugc29tZXRpbWVzIGdldFZhbHVlKCkgbWV0aG9kcyBtYXkN
CiAgICAgICAgICAgICAgICAvLy0tIGJlIGV4cGVuc2l2ZSBhbmQgd2UgZG9uJ3QgYWx3YXlzIHdh
bnQgdG8gY2FsbCBpdA0KICAgICAgICAgICAgICAgIC8vLS0gbXVsdGlwbGUgdGltZXMpDQogICAg
ICAgICAgICAgICAgaWYgKG5lc3RlZEF0dHNbaV0uZ2V0SGFuZGxlcigpLmdldFZhbHVlKG9iamVj
dCkgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICBuZXN0ZWRBdHRzW2ldID0gbnVsbDsN
CiAgICAgICAgICAgICAgICAgICAgLS0gbmVzdGVkQXR0Q291bnQ7DQogICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0cnkgew0K
ICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGF0aCAhPSBudWxsKSB7DQogICAgICAgICAgICAg
ICAgICAgICAgICBpbnQgaWR4ID0gcGF0aC5pbmRleE9mKCcvJyk7DQogICAgICAgICAgICAgICAg
ICAgICAgICBTdHJpbmcgZWxlbU5hbWUgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKGlkeCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtTmFtZSA9IHBh
dGguc3Vic3RyaW5nKDAsaWR4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0g
cGF0aC5zdWJzdHJpbmcoaWR4KzEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxl
bU5hbWUgPSBwYXRoOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBudWxsOw0K
ICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1
cnJlbnRMb2MgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9j
ID0gZWxlbU5hbWU7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY3VycmVudExvYyA9IGN1cnJlbnRMb2MgKyAiLyIgKyBlbGVtTmFtZTsN
Cg0KICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1RTmFtZSA9IGVsZW1OYW1lOw0K
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkobnNQcmVm
aXgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVFOYW1lID0gbnNQcmVmaXgg
KyAnOicgKyBlbGVtTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAg
ICAgICAgICAgICAgIHdyYXBwZXJzLnB1c2gobmV3IFdyYXBwZXJJbmZvKGVsZW1OYW1lLCBlbGVt
UU5hbWUsIG51bGwpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMuY2xl
YXIoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXR0cmlidXRlKG9iamVjdCwgbmVzdGVkQXR0
c1tpXSxfYXR0cmlidXRlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkQXR0
c1tpXSA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1uZXN0ZWRBdHRDb3Vu
dDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChuZXN0ZWRBdHRDb3VudCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ig
KGludCBuYSA9IGkrMTsgbmEgPCBuZXN0ZWRBdHRzLmxlbmd0aDsgbmErKykgew0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQXR0c1tuYV0gPT0gbnVsbCkgY29udGlu
dWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0bXBQYXRoID0gbmVz
dGVkQXR0c1tuYV0uZ2V0TG9jYXRpb25QYXRoKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICh0bXBQYXRoLmVxdWFscyhjdXJyZW50TG9jKSkgew0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZShvYmplY3QsIG5lc3RlZEF0dHNb
bmFdLF9hdHRyaWJ1dGVzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5l
c3RlZEF0dHNbbmFdID0gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IC0tbmVzdGVkQXR0Q291bnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQog
ICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RWxlbWVudChuc1VSSSwgZWxlbU5h
bWUsIGVsZW1RTmFtZSwgX2F0dHJpYnV0ZXMpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAg
ICAgICAgICAgICAgICAgICAgd2hpbGUgKCF3cmFwcGVycy5lbXB0eSgpKSB7DQogICAgICAgICAg
ICAgICAgICAgICAgICBXcmFwcGVySW5mbyB3SW5mbyA9IHdyYXBwZXJzLnBvcCgpOw0KICAgICAg
ICAgICAgICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50KG5zVVJJLCB3SW5mby5fbG9jYWxO
YW1lLCB3SW5mby5fcU5hbWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAg
ICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IE1hcnNoYWxFeGNlcHRpb24oZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0K
ICAgICAgICB9IC8vIGlmIChuZXN0ZWRBdHRDb3VudCA+IDApDQogICAgfQ0KDQogICAgcHJpdmF0
ZSB2b2lkIGRlYWxXaXRoTmVzdGVkQXR0cmlidXRlc05lc3RlZChPYmplY3Qgb2JqZWN0LA0KICAg
ICAgICAgICAgQ29udGVudEhhbmRsZXIgaGFuZGxlciwgU3RyaW5nIG5zUHJlZml4LCBTdHJpbmcg
bnNVUkksDQogICAgICAgICAgICBpbnQgbmVzdGVkQXR0Q291bnQsIFhNTEZpZWxkRGVzY3JpcHRv
cltdIG5lc3RlZEF0dHMsIFN0YWNrPFdyYXBwZXJJbmZvPiB3cmFwcGVycykNCiAgICAgICAgICAg
IHRocm93cyBNYXJzaGFsRXhjZXB0aW9uIHsNCiAgICAgICAgLy8tLSBIYW5kbGUgYW55IGFkZGl0
aW9uYWwgYXR0cmlidXRlIGxvY2F0aW9ucyB0aGF0IHdlcmUNCiAgICAgICAgLy8tLSBub3QgaGFu
ZGxlZCB3aGVuIGRlYWxpbmcgd2l0aCB3cmFwcGVyIGVsZW1lbnRzDQogICAgICAgIA0KICAgICAg
ICBXcmFwcGVySW5mbyB3cmFwcGVySW5mbyA9IHdyYXBwZXJzLnBlZWsoKTsNCiAgICAgICAgU3Ry
aW5nIGN1cnJlbnRMb2NhdGlvbiA9IHdyYXBwZXJJbmZvLl9sb2NhdGlvbjsNCiAgICAgICAgDQog
ICAgICAgIGlmIChuZXN0ZWRBdHRDb3VudCA+IDApIHsNCiAgICAgICAgICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgbmVzdGVkQXR0cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChu
ZXN0ZWRBdHRzW2ldID09IG51bGwpIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIFN0cmluZyBu
ZXN0ZWRBdHRyaWJ1dGVQYXRoID0gbmVzdGVkQXR0c1tpXS5nZXRMb2NhdGlvblBhdGgoKTsNCiAg
ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZEF0dHJpYnV0ZVBhdGgu
c3RhcnRzV2l0aChjdXJyZW50TG9jYXRpb24gKyAiLyIpKSB7DQogICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAg
ICAgICAgICBuZXN0ZWRBdHRyaWJ1dGVQYXRoID0gbmVzdGVkQXR0cmlidXRlUGF0aC5zdWJzdHJp
bmcod3JhcHBlckluZm8uX2xvY2F0aW9uLmxlbmd0aCgpICsgMSk7DQogICAgICAgICAgICAgICAg
U3RyaW5nIGN1cnJlbnRMb2MgPSBjdXJyZW50TG9jYXRpb247DQogICAgICAgICAgICAgICAgDQog
ICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy8tLSBNYWtlIHN1cmUgYXR0cmlidXRl
IGhhcyB2YWx1ZSBiZWZvcmUgY29udGludWluZw0KICAgICAgICAgICAgICAgIC8vLS0gV2UgcmVh
bGx5IGNvdWxkIHVzZSBhIEZpZWxkSGFuZGxlciNoYXNWYWx1ZSgpDQogICAgICAgICAgICAgICAg
Ly8tLSBtZXRob2QgKHNpbmNlIHNvbWV0aW1lcyBnZXRWYWx1ZSgpIG1ldGhvZHMgbWF5DQogICAg
ICAgICAgICAgICAgLy8tLSBiZSBleHBlbnNpdmUgYW5kIHdlIGRvbid0IGFsd2F5cyB3YW50IHRv
IGNhbGwgaXQNCiAgICAgICAgICAgICAgICAvLy0tIG11bHRpcGxlIHRpbWVzKQ0KICAgICAgICAg
ICAgICAgIGlmIChuZXN0ZWRBdHRzW2ldLmdldEhhbmRsZXIoKS5nZXRWYWx1ZShvYmplY3QpID09
IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQXR0c1tpXSA9IG51bGw7DQogICAg
ICAgICAgICAgICAgICAgIC0tIG5lc3RlZEF0dENvdW50Ow0KICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAg
ICAgICAgICAgICAgICAgd2hpbGUgKG5lc3RlZEF0dHJpYnV0ZVBhdGggIT0gbnVsbCkgew0KICAg
ICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5lc3RlZEF0dHJpYnV0ZVBhdGguaW5kZXhP
ZignLycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1OYW1lID0gbnVsbDsN
CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPiAwKSB7DQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZWxlbU5hbWUgPSBuZXN0ZWRBdHRyaWJ1dGVQYXRoLnN1YnN0cmluZygwLGlk
eCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkQXR0cmlidXRlUGF0aCA9IG5l
c3RlZEF0dHJpYnV0ZVBhdGguc3Vic3RyaW5nKGlkeCsxKTsNCiAgICAgICAgICAgICAgICAgICAg
ICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGVsZW1OYW1lID0gbmVzdGVkQXR0cmlidXRlUGF0aDsNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBuZXN0ZWRBdHRyaWJ1dGVQYXRoID0gbnVsbDsNCiAgICAgICAgICAgICAg
ICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG9jID09IG51
bGwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExvYyA9IGVsZW1OYW1lOw0K
ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGN1cnJlbnRMb2MgPSBjdXJyZW50TG9jICsgIi8iICsgZWxlbU5hbWU7DQoNCiAgICAgICAgICAg
ICAgICAgICAgICAgIFN0cmluZyBlbGVtUU5hbWUgPSBlbGVtTmFtZTsNCiAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KG5zUHJlZml4KSkgew0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGVsZW1RTmFtZSA9IG5zUHJlZml4ICsgJzonICsgZWxlbU5h
bWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB3
cmFwcGVycy5wdXNoKG5ldyBXcmFwcGVySW5mbyhlbGVtTmFtZSwgZWxlbVFOYW1lLCBudWxsKSk7
DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmNsZWFyKCk7DQogICAgICAg
ICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQXR0cmlidXRlUGF0aCA9PSBudWxsKSB7DQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZShvYmplY3QsIG5lc3RlZEF0
dHNbaV0sX2F0dHJpYnV0ZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZEF0
dHNbaV0gPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbmVzdGVkQXR0Q291
bnQ7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBp
ZiAobmVzdGVkQXR0Q291bnQgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9y
IChpbnQgbmEgPSBpKzE7IG5hIDwgbmVzdGVkQXR0cy5sZW5ndGg7IG5hKyspIHsNCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lc3RlZEF0dHNbbmFdID09IG51bGwpIGNvbnRp
bnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG1wUGF0aCA9IG5l
c3RlZEF0dHNbbmFdLmdldExvY2F0aW9uUGF0aCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAodG1wUGF0aC5lcXVhbHMoY3VycmVudExvYykpIHsNCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGUob2JqZWN0LCBuZXN0ZWRBdHRz
W25hXSxfYXR0cmlidXRlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBu
ZXN0ZWRBdHRzW25hXSA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAtLW5lc3RlZEF0dENvdW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0K
ICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zdGFydEVsZW1lbnQobnNVUkksIGVsZW1O
YW1lLCBlbGVtUU5hbWUsIF9hdHRyaWJ1dGVzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQog
ICAgICAgICAgICAgICAgICAgIHdoaWxlICghd3JhcHBlcnMuZW1wdHkoKSkgew0KICAgICAgICAg
ICAgICAgICAgICAgICAgV3JhcHBlckluZm8gd0luZm8gPSB3cmFwcGVycy5wb3AoKTsNCiAgICAg
ICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZW5kRWxlbWVudChuc1VSSSwgd0luZm8uX2xvY2Fs
TmFtZSwgd0luZm8uX3FOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
ICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5l
dyBNYXJzaGFsRXhjZXB0aW9uKGUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0N
CiAgICAgICAgfSAvLyBpZiAobmVzdGVkQXR0Q291bnQgPiAwKQ0KICAgIH0NCg0KDQogICAgLyoq
DQogICAgICogQ29udmVydHMgYSB7QGxpbmsgQmlnRGVjaW1hbH0gaW5zdGFuY2UgdmFsdWUgdG8g
aXRzIFN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcw0KICAgICAqIG1ldGhvZCB3aWxsIHRha2Ug
aW50byBpbnRvIGFjY291bnQgdGhlIEphdmEgdmVyc2lvbiBudW1iZXIsIGFzIHRoZSBzZW1hbnRp
Y3Mgb2YNCiAgICAgKiBCaWdEZWNpbWFsLnRvU3RyaW5nKCkgaGF2ZSBjaGFuZ2VkIGJldHdlZW4g
SmF2YSAxLjQgYW5kIEphdmEgNS4wIGFuZCBhYm92ZS4NCiAgICAgKiBAcGFyYW0gb2JqZWN0IFRo
ZSB7QGxpbmsgQmlnRGVjaW1hbH0gaW5zdGFuY2UNCiAgICAgKiBAcmV0dXJuIFRoZSBTdHJpbmcg
cmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBCaWdEZWNpbWFsfSBpbnN0YW5jZQ0KICAgICAq
IEB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiBJZiBpbnZvY2F0aW9uIG9mIEJpZ0RlY2ltYWwjdG9Q
bGFpblN0cmluZygpIGZhaWxzLg0KICAgICAqLw0KICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRC
aWdEZWNpbWFsVG9TdHJpbmcoT2JqZWN0IG9iamVjdCkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24g
ew0KICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWU7DQogICAgICAgIGZsb2F0IGphdmFWZXJzaW9u
ID0gRmxvYXQucGFyc2VGbG9hdChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuc3BlY2lmaWNhdGlv
bi52ZXJzaW9uIikpOw0KICAgICAgICBpZiAoamF2YVZlcnNpb24gPj0gMS41KSB7DQogICAgICAg
ICAgICAvLyBhcyBvZiBKYXZhIDUuMCBhbmQgYWJvdmUsIEJpZ0RlY2ltYWwudG9QbGFpblN0cmlu
ZygpIHNob3VsZCBiZSB1c2VkLg0KICAgICAgICAgICAgLy8gVE9ETzogcmVjb25zaWRlciBpZiB3
ZSBzdGFydCB1c2luZyBCaWdEZWNpbWFsIGZvciBYU1R5cGVzIHRoYXQgY2FuIGhvbGQgc2NpZW50
aWZpYyB2YWx1ZXMNCiAgICAgICAgICAgIE1ldGhvZCBtZXRob2Q7DQogICAgICAgICAgICB0cnkg
ew0KICAgICAgICAgICAgICAgIG1ldGhvZCA9IGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLmdl
dE1ldGhvZCgidG9QbGFpblN0cmluZyIsIChDbGFzc1tdKSBudWxsKTsNCiAgICAgICAgICAgICAg
ICBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIG1ldGhvZC5pbnZva2Uob2JqZWN0LCAoT2JqZWN0W10p
IG51bGwpOw0KICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCiAgICAgICAgICAg
ICAgICBMT0cuZXJyb3IoIlByb2JsZW0gYWNjZXNzaW5nIGphdmEubWF0aC5CaWdEZWNpbWFsLnRv
UGxhaW5TdHJpbmcoKS4iLCBlKTsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4
Y2VwdGlvbigiUHJvYmxlbSBhY2Nlc3NpbmcgamF2YS5tYXRoLkJpZ0RlY2ltYWwudG9QbGFpblN0
cmluZygpLiIsIGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAg
ICAgLy8gdXNlIEJpZ0RlY2ltYWwudG9TdHJpbmcoKSB3aXRoIEphdmEgMS40IGFuZCBiZWxvdw0K
ICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBvYmplY3QudG9TdHJpbmcoKTsNCiAgICAgICAgfQ0K
ICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUmV0
cmlldmVzIHRoZSBJRCBmb3IgdGhlIGdpdmVuIE9iamVjdA0KICAgICAqDQogICAgICogQHBhcmFt
IG9iamVjdCB0aGUgT2JqZWN0IHRvIHJldHJpZXZlIHRoZSBJRCBmb3INCiAgICAgKiBAcmV0dXJu
IHRoZSBJRCBmb3IgdGhlIGdpdmVuIE9iamVjdA0KICAgICoqLw0KICAgIHByaXZhdGUgT2JqZWN0
IGdldE9iamVjdElEKE9iamVjdCBvYmplY3QpDQogICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0
aW9uDQogICAgew0KICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiBudWxsOw0KDQog
ICAgICAgIE9iamVjdCBpZCA9IG51bGw7DQogICAgICAgIFhNTENsYXNzRGVzY3JpcHRvciBjZCA9
IGdldENsYXNzRGVzY3JpcHRvcihvYmplY3QuZ2V0Q2xhc3MoKSk7DQogICAgICAgIFN0cmluZyBl
cnIgPSBudWxsOw0KICAgICAgICBpZiAoY2QgIT0gbnVsbCkgew0KICAgICAgICAgICAgWE1MRmll
bGREZXNjcmlwdG9yIGZpZWxkRGVzYw0KICAgICAgICAgICAgICAgID0gKFhNTEZpZWxkRGVzY3Jp
cHRvcikgY2QuZ2V0SWRlbnRpdHkoKTsNCiAgICAgICAgICAgIGlmIChmaWVsZERlc2MgIT0gbnVs
bCkgew0KICAgICAgICAgICAgICAgIEZpZWxkSGFuZGxlciBmaWVsZEhhbmRsZXIgPSBmaWVsZERl
c2MuZ2V0SGFuZGxlcigpOw0KICAgICAgICAgICAgICAgIGlmIChmaWVsZEhhbmRsZXIgIT0gbnVs
bCkgew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAg
aWQgPSBmaWVsZEhhbmRsZXIuZ2V0VmFsdWUob2JqZWN0KTsNCiAgICAgICAgICAgICAgICAgICAg
fQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7
DQogICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpc2UudG9TdHJpbmcoKTsNCiAgICAgICAg
ICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0vL2ZpZWxkSGFuZGxlciAhPSBudWxsDQog
ICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVyciA9ICJGaWVsZEhh
bmRsZXIgZm9yIElkZW50aXR5IGRlc2NyaXB0b3IgaXMgbnVsbC4iOw0KICAgICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgIH0vL2ZpZWxkRGVzYyAhPSBudWxsDQogICAgICAgICAgICBlbHNlIGVy
ciA9ICJObyBpZGVudGl0eSBkZXNjcmlwdG9yIGF2YWlsYWJsZSI7DQogICAgICAgIH0vL2NkIT1u
dWxsDQogICAgICAgIGVsc2UgIHsNCiAgICAgICAgICAgIGVyciA9ICJVbmFibGUgdG8gcmVzb2x2
ZSBDbGFzc0Rlc2NyaXB0b3IuIjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZXJyICE9IG51bGwp
IHsNCiAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiVW5hYmxlIHRvIHJlc29sdmUgSUQgZm9y
IGluc3RhbmNlIG9mIGNsYXNzICciOw0KICAgICAgICAgICAgZXJyTXNnICs9IG9iamVjdC5nZXRD
bGFzcygpLmdldE5hbWUoKTsNCiAgICAgICAgICAgIGVyck1zZyArPSAiJyBkdWUgdG8gdGhlIGZv
bGxvd2luZyBlcnJvcjogIjsNCiAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9u
KGVyck1zZyArIGVycik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGlkOw0KICAgIH0gLy8t
LSBnZXRJRA0KDQoNCiAgICAvKioNCiAgICAgKiBEZWNsYXJlcyB0aGUgZ2l2ZW4gbmFtZXNwYWNl
LCBpZiBub3QgYWxyZWFkeSBpbiBzY29wZQ0KICAgICAqDQogICAgICogQHBhcmFtIG5zUHJlZml4
IHRoZSBuYW1lc3BhY2UgcHJlZml4DQogICAgICogQHBhcmFtIG5zVVJJIHRoZSBuYW1lc3BhY2Ug
VVJJIHRvIGRlY2xhcmUNCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVzcGFjZSB3YXMg
bm90IGluIHNjb3BlIGFuZCB3YXMNCiAgICAgKiAgc3VjZXNzZnVsbHkgZGVjbGFyZWQsIG90aGVy
IGZhbHNlDQogICAgKiovDQogICAgcHJpdmF0ZSBib29sZWFuIGRlY2xhcmVOYW1lc3BhY2UoU3Ry
aW5nIG5zUHJlZml4LCBTdHJpbmcgbnNVUkkpDQogICAgew0KICAgICAgICBib29sZWFuIGRlY2xh
cmVkID0gZmFsc2U7DQoNCiAgICAgICAgLy8tLSBtYWtlIHN1cmUgaXQncyBub3QgYWxyZWFkeSBk
ZWNsYXJlZC4uLg0KICAgICAgICBpZiAoIChuc1VSSSAhPSBudWxsKSAmJiAobnNVUkkubGVuZ3Ro
KCkgIT0gMCkpIHsNCg0KICAgICAgICAgICAgU3RyaW5nIHRtcFVSSSA9IF9uYW1lc3BhY2VzLmdl
dE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7DQogICAgICAgICAgICBpZiAoKHRtcFVSSSAhPSBudWxs
KSAmJiAodG1wVVJJLmVxdWFscyhuc1VSSSkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRl
Y2xhcmVkOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgU3RyaW5nIHRtcFByZWZpeCA9IF9u
YW1lc3BhY2VzLmdldE5hbWVzcGFjZVByZWZpeChuc1VSSSk7DQogICAgICAgICAgICBpZiAoKHRt
cFByZWZpeCA9PSBudWxsKSB8fCAoIXRtcFByZWZpeC5lcXVhbHMobnNQcmVmaXgpKSkgew0KICAg
ICAgICAgICAgICAgIF9uYW1lc3BhY2VzLmFkZE5hbWVzcGFjZShuc1ByZWZpeCwgbnNVUkkpOw0K
ICAgICAgICAgICAgICAgIGRlY2xhcmVkID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAg
fQ0KICAgICAgICByZXR1cm4gZGVjbGFyZWQ7DQogICAgfSAvLy0tIGRlY2xhcmVOYW1lc3BhY2UN
Cg0KICAgIC8qKg0KICAgICAqIFNldHMgdGhlIFByaW50V3JpdGVyIHVzZWQgZm9yIGxvZ2dpbmcN
CiAgICAgKiBAcGFyYW0gcHJpbnRXcml0ZXIgdGhlIFByaW50V3JpdGVyIHRvIHVzZSBmb3IgbG9n
Z2luZw0KICAgICoqLw0KICAgIHB1YmxpYyB2b2lkIHNldExvZ1dyaXRlcihmaW5hbCBQcmludFdy
aXRlciBwcmludFdyaXRlcikgeyB9DQoNCiAgICAvKioNCiAgICAgKiBTZXRzIHRoZSBlbmNvZGlu
ZyBmb3IgdGhlIHNlcmlhbGl6ZXIuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZA0KICAgICAqIGNhbm5v
dCBiZSBjYWxsZWQgaWYgeW91J3ZlIHBhc3NlZCBpbiB5b3VyIG93biBEb2N1bWVudEhhbmRsZXIu
DQogICAgICoNCiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIHRvIHNldA0KICAg
ICoqLw0KICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgew0KDQog
ICAgICAgIGlmIChfc2VyaWFsaXplciAhPSBudWxsKSB7DQogICAgICAgICAgICBpZiAoX2Zvcm1h
dCA9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgX2Zvcm1hdCA9IGdldEludGVybmFsQ29udGV4
dCgpLmdldE91dHB1dEZvcm1hdCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgX2Zvcm1h
dC5zZXRFbmNvZGluZyhlbmNvZGluZyk7DQogICAgICAgICAgICAvLy0tIHJlc2V0IG91dHB1dCBm
b3JtYXQsIHRoaXMgbmVlZHMgdG8gYmUgZG9uZQ0KICAgICAgICAgICAgLy8tLSBhbnkgdGltZSBh
IGNoYW5nZSBvY2N1cnMgdG8gdGhlIGZvcm1hdC4NCiAgICAgICAgICAgIF9zZXJpYWxpemVyLnNl
dE91dHB1dEZvcm1hdCggX2Zvcm1hdCApOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAg
ICAgICAvLy0tIER1ZSB0byBhIFhlcmNlcyBTZXJpYWxpemVyIGJ1ZyB0aGF0IGRvZXNuJ3QgYWxs
b3cgZGVjbGFyaW5nDQogICAgICAgICAgICAgICAgLy8tLSBtdWx0aXBsZSBwcmVmaXhlcyB0byB0
aGUgc2FtZSBuYW1lc3BhY2UsIHdlIHVzZSB0aGUgb2xkDQogICAgICAgICAgICAgICAgLy8tLSBE
b2N1bWVudEhhbmRsZXIgZm9ybWF0IGFuZCBwcm9jZXNzIG5hbWVzcGFjZXMgb3Vyc2VsdmVzDQog
ICAgICAgICAgICAgICAgX2hhbmRsZXIgPSBuZXcgRG9jdW1lbnRIYW5kbGVyQWRhcHRlcihfc2Vy
aWFsaXplci5hc0RvY3VtZW50SGFuZGxlcigpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAg
IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlveCkgew0KICAgICAgICAgICAgICAgIC8vLS0g
d2UgY2FuIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBzaW5jZSBpdCBzaG91bGRuJ3QNCiAgICAgICAg
ICAgICAgICAvLy0tIGhhcHBlbi4gSWYgX3NlcmlhbGl6ZXIgaXMgbm90IG51bGwsIGl0IG1lYW5z
DQogICAgICAgICAgICAgICAgLy8tLSB3ZSd2ZSBhbHJlYWR5IGNhbGxlZCB0aGlzIG1ldGhvZCBz
dWNlc3NmdWxseQ0KICAgICAgICAgICAgICAgIC8vLS0gaW4gdGhlIE1hcnNoYWxsZXIoKSBjb25z
dHJ1Y3Rvcg0KICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KICAg
ICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkVycm9yIHNldHRpbmcgZW5jb2RpbmcgdG8gIiAr
IGVuY29kaW5nLCBpb3gpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAg
ICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICJlbmNvZGlu
ZyBjYW5ub3QgYmUgc2V0IGlmIHlvdSd2ZSBwYXNzZWQgaW4gIisNCiAgICAgICAgICAgICJ5b3Vy
IG93biBEb2N1bWVudEhhbmRsZXIiOw0KICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0
ZUV4Y2VwdGlvbihlcnJvcik7DQogICAgICAgIH0NCiAgICB9IC8vLS0gc2V0RW5jb2RpbmcNCg0K
ICAgIC8qKg0KICAgICAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgeHNpOm5vTmFtZXNwYWNlU2No
ZW1hTG9jYXRpb24gYXR0cmlidXRlLg0KICAgICAqIFdoZW4gc2V0LCB0aGlzIGF0dHJpYnV0ZSB3
aWxsIGFwcGVhciBvbiB0aGUgcm9vdCBlbGVtZW50DQogICAgICogb2YgdGhlIG1hcnNoYWxsZWQg
ZG9jdW1lbnQuDQogICAgICoNCiAgICAgKiBAcGFyYW0gc2NoZW1hTG9jYXRpb24gdGhlIFVSSSBs
b2NhdGlvbiBvZiB0aGUgc2NoZW1hDQogICAgICogdG8gd2hpY2ggdGhlIG1hcnNoYWxsZWQgZG9j
dW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YuDQogICAgKiovDQogICAgcHVibGljIHZvaWQgc2V0Tm9O
YW1lc3BhY2VTY2hlbWFMb2NhdGlvbihTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHsNCiAgICAgICAg
aWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsNCiAgICAgICAgICAgIC8vLS0gcmVtb3ZlIGlm
IG5lY2Vzc2FyeQ0KICAgICAgICAgICAgLy8tLSB0byBiZSBhZGRlZCBsYXRlci4NCiAgICAgICAg
fQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIF90b3BMZXZlbEF0dHMuc2V0QXR0cmlidXRl
KFhTSV9OT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OLA0KICAgICAgICAgICAgICAgIHNjaGVt
YUxvY2F0aW9uLCBYU0lfTkFNRVNQQUNFKTsNCiAgICAgICAgfQ0KICAgIH0gLy8tLSBzZXROb05h
bWVzcGFjZVNjaGVtYUxvY2F0aW9uDQoNCiAgICAvKioNCiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBm
b3IgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUuDQogICAgICogV2hlbiBzZXQsIHRo
aXMgYXR0cmlidXRlIHdpbGwgYXBwZWFyIG9uIHRoZSByb290IGVsZW1lbnQNCiAgICAgKiBvZiB0
aGUgbWFyc2hhbGxlZCBkb2N1bWVudC4NCiAgICAgKg0KICAgICAqIEBwYXJhbSBzY2hlbWFMb2Nh
dGlvbiB0aGUgVVJJIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWENCiAgICAgKiB0byB3aGljaCB0aGUg
bWFyc2hhbGxlZCBkb2N1bWVudCBpcyBhbiBpbnN0YW5jZSBvZi4NCiAgICAqKi8NCiAgICBwdWJs
aWMgdm9pZCBzZXRTY2hlbWFMb2NhdGlvbihTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHsNCiAgICAg
ICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsNCiAgICAgICAgICAgIC8vLS0gcmVtb3Zl
IGlmIG5lY2Vzc2FyeQ0KICAgICAgICAgICAgLy8tLSB0byBiZSBhZGRlZCBsYXRlci4NCiAgICAg
ICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIF90b3BMZXZlbEF0dHMuc2V0QXR0cmli
dXRlKFhTSV9TQ0hFTUFfTE9DQVRJT04sDQogICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb24s
IFhTSV9OQU1FU1BBQ0UpOw0KICAgICAgICB9DQogICAgfSAvLy0tIHNldFNjaGVtYUxvY2F0aW9u
DQoNCiAgICAvKioNCiAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IG5hbWVzcGFjZXMgYXJlIG91
dHB1dC4gQnkgZGVmYXVsdA0KICAgICAqIHRoZSBNYXJzaGFsbGVyIHdpbGwgb3V0cHV0IG5hbWVz
cGFjZSBkZWNsYXJhdGlvbnMgYW5kDQogICAgICogcHJlZml4IGVsZW1lbnRzIGFuZCBhdHRyaWJ1
dGVzIHdpdGggdGhlaXIgcmVzcGVjdGl2ZQ0KICAgICAqIG5hbWVzcGFjZSBwcmVmaXguIFRoaXMg
bWV0aG9kIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQNCiAgICAgKiB0aGUgdXNhZ2Ugb2YgbmFtZXNw
YWNlcy4NCiAgICAgKg0KICAgICAqIEBwYXJhbSBzdXBwcmVzc05hbWVzcGFjZXMgYSBib29sZWFu
IHRoYXQgd2hlbiB0cnVlDQogICAgICogd2lsbCBwcmV2ZW50IG5hbWVzcGFjZXMgZnJvbSBiZWlu
ZyBvdXRwdXQuDQogICAgICovDQogICAgcHVibGljIHZvaWQgc2V0U3VwcHJlc3NOYW1lc3BhY2Vz
KGJvb2xlYW4gc3VwcHJlc3NOYW1lc3BhY2VzKSB7DQogICAgICAgIF9zdXBwcmVzc05hbWVzcGFj
ZXMgPSBzdXBwcmVzc05hbWVzcGFjZXM7DQogICAgfSAvLy0tIHNldFN1cHByZXNzTmFtZXNwYWNl
cw0KDQogICAgLyoqDQogICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgeHNpOnR5cGUgYXR0
cmlidXRlIHNob3VsZCBhcHBlYXINCiAgICAgKiBvbiB0aGUgbWFyc2hhbGxlZCBkb2N1bWVudC4N
CiAgICAgKg0KICAgICAqIEBwYXJhbSBzdXBwcmVzc1hTSVR5cGUgYSBib29sZWFuIHRoYXQgd2hl
biB0cnVlIHdpbGwgcHJldmVudA0KICAgICAqIHhzaTp0eXBlIGF0dHJpYnV0ZSBmcm9tIGJlaW5n
IHVzZWQgaW4gdGhlIG1hcnNoYWxsaW5nIHByb2Nlc3MuDQogICAgICovDQogICAgIHB1YmxpYyB2
b2lkIHNldFN1cHByZXNzWFNJVHlwZShib29sZWFuIHN1cHByZXNzWFNJVHlwZSkgew0KICAgICAg
ICBfc3VwcHJlc3NYU0lUeXBlID0gc3VwcHJlc3NYU0lUeXBlOw0KICAgICB9IC8vLS0gc2V0U3Vw
cHJlc3NYU0lUeXBlDQoNCiAgICAgLyoqDQogICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdG8g
b3V0cHV0IHRoZSB4c2k6dHlwZSBhdCB0aGUgcm9vdA0KICAgICAgKiBlbGVtZW50LiBUaGlzIGlz
IHVzdWFsbHkgbmVlZGVkIHdoZW4gdGhlIHJvb3QgZWxlbWVudA0KICAgICAgKiB0eXBlIGNhbm5v
dCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBlbGVtZW50IG5hbWUgYWxvbmUuDQogICAgICAqIEJ5IGRl
ZmF1bHQgeHNpOnR5cGUgd2lsbCBub3QgYmUgb3V0cHV0IG9uIHRoZSByb290DQogICAgICAqIGVs
ZW1lbnQuDQogICAgICAqDQogICAgICAqIEBwYXJhbSB1c2VYU0lUeXBlQXRSb290IGEgYm9vbGVh
biB0aGF0IHdoZW4gdHJ1ZSBpbmRpY2F0ZXMNCiAgICAgICogdGhhdCB0aGUgeHNpOnR5cGUgc2hv
dWxkIGJlIG91dHB1dCBvbiB0aGUgcm9vdCBlbGVtZW50Lg0KICAgICAgKi8NCiAgICAgcHVibGlj
IHZvaWQgc2V0VXNlWFNJVHlwZUF0Um9vdChib29sZWFuIHVzZVhTSVR5cGVBdFJvb3QpIHsNCiAg
ICAgICAgIF91c2VYU0lUeXBlQXRSb290ID0gdXNlWFNJVHlwZUF0Um9vdDsNCiAgICAgfSAvLy0t
IHNldFVzZVhTSVR5cGVBdFJvb3QNCg0KICAgIC8qKg0KICAgICAqIEZpbmRzIGFuZCByZXR1cm5z
IGFuIFhNTENsYXNzRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGNsYXNzLiBJZg0KICAgICAqIGEg
WE1MQ2xhc3NEZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBmb3VuZCwgdGhpcyBtZXRob2Qgd2lsbCBh
dHRlbXB0IHRvDQogICAgICogY3JlYXRlIG9uZSBhdXRvbWF0aWNhbGx5IHVzaW5nIHJlZmxlY3Rp
b24uDQogICAgICogQHBhcmFtIGNscyB0aGUgQ2xhc3MgdG8gZ2V0IHRoZSBYTUxDbGFzc0Rlc2Ny
aXB0b3IgZm9yDQogICAgICogQGV4Y2VwdGlvbiBNYXJzaGFsRXhjZXB0aW9uIHdoZW4gdGhlcmUg
aXMgYSBwcm9ibGVtDQogICAgICogcmV0cmlldmluZyBvciBjcmVhdGluZyB0aGUgWE1MQ2xhc3NE
ZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gY2xhc3MNCiAgICAqKi8NCiAgICBwcml2YXRlIFhNTENs
YXNzRGVzY3JpcHRvciBnZXRDbGFzc0Rlc2NyaXB0b3IoZmluYWwgQ2xhc3M8Pz4gY2xzKQ0KICAg
IHRocm93cyBNYXJzaGFsRXhjZXB0aW9uIHsNCiAgICAgICAgWE1MQ2xhc3NEZXNjcmlwdG9yIGNs
YXNzRGVzYyA9IG51bGw7DQoNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICghaXNQcmlt
aXRpdmUoY2xzKSkNCiAgICAgICAgICAgICAgICBjbGFzc0Rlc2MgPSAoWE1MQ2xhc3NEZXNjcmlw
dG9yKSBnZXRSZXNvbHZlcigpLnJlc29sdmUoY2xzKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRj
aChSZXNvbHZlckV4Y2VwdGlvbiByeCkgew0KICAgICAgICAgICAgVGhyb3dhYmxlIGFjdHVhbCA9
IHJ4LmdldENhdXNlKCk7DQogICAgICAgICAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgTWFyc2hh
bEV4Y2VwdGlvbikgew0KICAgICAgICAgICAgICAgIHRocm93IChNYXJzaGFsRXhjZXB0aW9uKWFj
dHVhbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChhY3R1YWwgIT0gbnVsbCkgew0K
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKGFjdHVhbCk7DQogICAg
ICAgICAgICB9DQogICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihyeCk7DQog
ICAgICAgIH0NCg0KICAgICAgICBpZiAoY2xhc3NEZXNjICE9IG51bGwpDQogICAgICAgICAgICBj
bGFzc0Rlc2MgPSBuZXcgSW50ZXJuYWxYTUxDbGFzc0Rlc2NyaXB0b3IoY2xhc3NEZXNjKTsNCg0K
ICAgICAgICByZXR1cm4gY2xhc3NEZXNjOw0KICAgIH0gLy8tLSBnZXRDbGFzc0Rlc2NyaXB0b3IN
Cg0KICAgIC8qKg0KICAgICAqIFByb2Nlc3NlcyB0aGUgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0
aCB0aGUgZ2l2ZW4gYXR0RGVzY3JpcHRvciBhbmQgcGFyZW50DQogICAgICogb2JqZWN0Lg0KICAg
ICAqDQogICAgICogQHBhcmFtIGF0dHMgdGhlIFNBWCBhdHRyaWJ1dGUgbGlzdCB0byBhZGQgdGhl
IGF0dHJpYnV0ZSB0bw0KICAgICAqLw0KICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXR0cmlidXRl
DQogICAgICAgIChPYmplY3Qgb2JqZWN0LCBYTUxGaWVsZERlc2NyaXB0b3IgYXR0RGVzY3JpcHRv
ciwgQXR0cmlidXRlc0ltcGwgYXR0cykNCiAgICAgICAgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24N
CiAgICB7DQogICAgICAgIGlmIChhdHREZXNjcmlwdG9yID09IG51bGwpIHJldHVybjsNCg0KICAg
ICAgICAvLy0tIHByb2Nlc3MgTmFtZXNwYWNlIG5vZGVzIGZyb20gT2JqZWN0IE1vZGVsLA0KICAg
ICAgICAvLy0tIGlmIG5lY2Vzc2FyeS4NCiAgICAgICAgaWYgKGF0dERlc2NyaXB0b3IuZ2V0Tm9k
ZVR5cGUoKSA9PSBOb2RlVHlwZS5OYW1lc3BhY2UpIHsNCiAgICAgICAgICAgIGlmICghX3N1cHBy
ZXNzTmFtZXNwYWNlcykgew0KICAgICAgICAgICAgICAgIE9iamVjdCBtYXAgPSBhdHREZXNjcmlw
dG9yLmdldEhhbmRsZXIoKS5nZXRWYWx1ZShvYmplY3QpOw0KICAgICAgICAgICAgICAgIE1hcEhh
bmRsZXIgbWFwSGFuZGxlciA9IE1hcEhhbmRsZXJzLmdldEhhbmRsZXIobWFwKTsNCiAgICAgICAg
ICAgICAgICBpZiAobWFwSGFuZGxlciAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgIEVu
dW1lcmF0aW9uIGtleXMgPSBtYXBIYW5kbGVyLmtleXMobWFwKTsNCiAgICAgICAgICAgICAgICAg
ICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCiAgICAgICAgICAgICAgICAgICAg
ICAgIE9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7DQogICAgICAgICAgICAgICAgICAg
ICAgICBPYmplY3QgdmFsID0gbWFwSGFuZGxlci5nZXQobWFwLCBrZXkpOw0KICAgICAgICAgICAg
ICAgICAgICAgICAgZGVjbGFyZU5hbWVzcGFjZShrZXkudG9TdHJpbmcoKSwgdmFsLnRvU3RyaW5n
KCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAg
ICAgfQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgU3RyaW5nIGxv
Y2FsTmFtZSA9IGF0dERlc2NyaXB0b3IuZ2V0WE1MTmFtZSgpOw0KICAgICAgICBTdHJpbmcgcU5h
bWUgICAgID0gbG9jYWxOYW1lOw0KDQogICAgICAgIC8vLS0gaGFuZGxlIGF0dHJpYnV0ZSBuYW1l
c3BhY2VzDQogICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsNCiAgICAgICAgaWYgKCFfc3Vw
cHJlc3NOYW1lc3BhY2VzKSB7DQogICAgICAgICAgICBuYW1lc3BhY2UgPSBhdHREZXNjcmlwdG9y
LmdldE5hbWVTcGFjZVVSSSgpOw0KICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1w
dHkobmFtZXNwYWNlKSkgew0KICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBhdHREZXNj
cmlwdG9yLmdldE5hbWVTcGFjZVByZWZpeCgpOw0KICAgICAgICAgICAgICAgIGlmICgocHJlZml4
ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpDQogICAgICAgICAgICAgICAgICAg
IHByZWZpeCA9IF9uYW1lc3BhY2VzLmdldE5vbkRlZmF1bHROYW1lc3BhY2VQcmVmaXgobmFtZXNw
YWNlKTsNCg0KICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgu
bGVuZ3RoKCkgPT0gMCkpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8tLSBhdXRvbWF0aWNhbGx5
IGNyZWF0ZSBuYW1lc3BhY2UgcHJlZml4Pw0KICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBE
RUZBVUxUX1BSRUZJWCArICgrK19uYW1lc3BhY2VDb3VudGVyKTsNCiAgICAgICAgICAgICAgICB9
DQogICAgICAgICAgICAgICAgZGVjbGFyZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7DQog
ICAgICAgICAgICAgICAgcU5hbWUgPSBwcmVmaXggKyAnOicgKyBxTmFtZTsNCiAgICAgICAgICAg
IH0NCiAgICAgICAgICAgIGVsc2UgbmFtZXNwYWNlID0gIiI7DQogICAgICAgIH0NCg0KICAgICAg
ICBPYmplY3QgdmFsdWUgPSBudWxsOw0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICB2YWx1
ZSA9IGF0dERlc2NyaXB0b3IuZ2V0SGFuZGxlcigpLmdldFZhbHVlKG9iamVjdCk7DQogICAgICAg
IH0NCiAgICAgICAgY2F0Y2goSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgew0KICAgICAgICAg
ICAgTE9HLndhcm4oIkVycm9yIGdldHRpbmcgdmFsdWUgZnJvbSAiICsgb2JqZWN0LCBpc2UpOw0K
ICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8tLSBoYW5kbGUgSURS
RUYoUykNCiAgICAgICAgaWYgKGF0dERlc2NyaXB0b3IuaXNSZWZlcmVuY2UoKSAmJiAodmFsdWUg
IT0gbnVsbCkpIHsNCg0KICAgICAgICAgICAgaWYgKGF0dERlc2NyaXB0b3IuaXNNdWx0aXZhbHVl
ZCgpKSB7DQogICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBudWxsOw0K
ICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVudW1lcmF0aW9uKSB7DQogICAg
ICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uID0gKEVudW1lcmF0aW9uKXZhbHVlOw0KICAgICAg
ICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAg
Q29sbGVjdGlvbkhhbmRsZXIgY29sSGFuZGxlciA9IG51bGw7DQogICAgICAgICAgICAgICAgICAg
IHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xIYW5kbGVyID0gQ29sbGVjdGlvbkhh
bmRsZXJzLmdldEhhbmRsZXIodmFsdWUuZ2V0Q2xhc3MoKSk7DQogICAgICAgICAgICAgICAgICAg
IH0NCiAgICAgICAgICAgICAgICAgICAgY2F0Y2goTWFwcGluZ0V4Y2VwdGlvbiBteCkgew0KICAg
ICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24obXgpOw0KICAg
ICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uID0gY29s
SGFuZGxlci5lbGVtZW50cyh2YWx1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
ICAgIGlmIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgew0KICAgICAgICAgICAgICAg
ICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQogICAgICAgICAgICAg
ICAgICAgIGZvciAoaW50IHYgPSAwOyBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsgdisr
KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA+IDApIHNiLmFwcGVuZCgnICcpOw0K
ICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGdldE9iamVjdElEKGVudW1lcmF0aW9u
Lm5leHRFbGVtZW50KCkpLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAg
ICAgICAgICAgICAgICAgIHZhbHVlID0gc2I7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAg
ICAgICAgIGVsc2UgdmFsdWUgPSBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxz
ZSB7DQogICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRPYmplY3RJRCh2YWx1ZSk7DQogICAgICAg
ICAgICB9DQogICAgICAgIH0NCiAgICAgICAgLy8tLSBoYW5kbGUgbXVsdGktdmFsdWUgYXR0cmli
dXRlcw0KICAgICAgICBlbHNlIGlmIChhdHREZXNjcmlwdG9yLmlzTXVsdGl2YWx1ZWQoKSAmJiAo
dmFsdWUgIT0gbnVsbCkpIHsNCiAgICAgICAgCS8vQmVsb3cgaXMgbW9kaWZpZWQgYnkgTHVjYXMN
CiAgICAgICAgCVN0cmluZ1tdIHZhbHVlcz0oKFN0cmluZyl2YWx1ZSkuc3BsaXQoIiAiKTsNCiAg
ICAgICAgICAgIHZhbHVlID0gcHJvY2Vzc1hTTGlzdFR5cGUodmFsdWVzLCBhdHREZXNjcmlwdG9y
KTsNCiAgICAgICAgICAgIA0KICAgICAgICAJLy9CZWxvdyBpcyBvcmlnaW5hbCBjb2RlIA0KICAg
ICAgICAgICAgLy92YWx1ZSA9IHByb2Nlc3NYU0xpc3RUeXBlKHZhbHVlLCBhdHREZXNjcmlwdG9y
KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7DQogICAgICAg
ICAgICAvLy0tIGhhbmRsZSBoZXgvYmFzZTY0IGNvbnRlbnQNCiAgICAgICAgICAgIENsYXNzPD8+
IG9ialR5cGUgPSB2YWx1ZS5nZXRDbGFzcygpOw0KICAgICAgICAgICAgaWYgKG9ialR5cGUuaXNB
cnJheSgpICYmIChvYmpUeXBlLmdldENvbXBvbmVudFR5cGUoKSA9PSBCeXRlLlRZUEUpKSB7DQog
ICAgICAgICAgICAgICAgdmFsdWUgPSBlbmNvZGVCaW5hcnlEYXRhKHZhbHVlLCBhdHREZXNjcmlw
dG9yLmdldFNjaGVtYVR5cGUoKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAg
ICBpZiAodmFsdWUgIT0gbnVsbCkgew0KICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgdmFsdWUg
aXMgYSBRTmFtZSB0aGF0IG5lZWRzIHRvDQogICAgICAgICAgICAvL2JlIHJlc29sdmVkICh7VVJJ
fXZhbHVlIC0+IG5zOnZhbHVlKS4NCiAgICAgICAgICAgIFN0cmluZyB2YWx1ZVR5cGUgPSBhdHRE
ZXNjcmlwdG9yLmdldFNjaGVtYVR5cGUoKTsNCiAgICAgICAgICAgIGlmICgodmFsdWVUeXBlICE9
IG51bGwpICYmICh2YWx1ZVR5cGUuZXF1YWxzKFFOQU1FX05BTUUpKSkNCiAgICAgICAgICAgICAg
ICAgICAgdmFsdWUgPSByZXNvbHZlUU5hbWUodmFsdWUsIGF0dERlc2NyaXB0b3IpOw0KDQogICAg
ICAgICAgICBhdHRzLmFkZEF0dHJpYnV0ZShuYW1lc3BhY2UsIGxvY2FsTmFtZSwgcU5hbWUsIENE
QVRBLCB2YWx1ZS50b1N0cmluZygpKTsNCiAgICAgICAgfQ0KICAgIH0gLy8tLSBwcm9jZXNzQXR0
cmlidXRlDQoNCg0KICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NYU0xpc3RUeXBlKGZpbmFsIE9i
amVjdCB2YWx1ZSwgWE1MRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIA0KICAgIHRocm93cyBN
YXJzaGFsRXhjZXB0aW9uIHsNCiAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gbnVsbDsNCiAg
ICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBudWxsOw0KICAgICAgICBpZiAodmFsdWUg
aW5zdGFuY2VvZiBFbnVtZXJhdGlvbikgew0KICAgICAgICAgICAgZW51bWVyYXRpb24gPSAoRW51
bWVyYXRpb24pdmFsdWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBD
b2xsZWN0aW9uSGFuZGxlciBjb2xIYW5kbGVyID0gbnVsbDsNCiAgICAgICAgICAgIHRyeSB7DQog
ICAgICAgICAgICAgICAgY29sSGFuZGxlciA9IENvbGxlY3Rpb25IYW5kbGVycy5nZXRIYW5kbGVy
KHZhbHVlLmdldENsYXNzKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goTWFw
cGluZ0V4Y2VwdGlvbiBteCkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhj
ZXB0aW9uKG14KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVudW1lcmF0aW9uID0gY29s
SGFuZGxlci5lbGVtZW50cyh2YWx1ZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVudW1lcmF0
aW9uLmhhc01vcmVFbGVtZW50cygpKSB7DQogICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBu
ZXcgU3RyaW5nQnVmZmVyKCk7DQogICAgICAgICAgICBmb3IgKGludCB2ID0gMDsgZW51bWVyYXRp
b24uaGFzTW9yZUVsZW1lbnRzKCk7IHYrKykgew0KICAgICAgICAgICAgICAgIGlmICh2ID4gMCkg
ew0KICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsNCiAgICAgICAgICAgICAgICB9
DQogICAgICAgICAgICAgICAgT2JqZWN0IGNvbGxlY3Rpb25WYWx1ZSA9IGVudW1lcmF0aW9uLm5l
eHRFbGVtZW50KCk7DQogICAgICAgICAgICAgICAgLy8tLSBoYW5kbGUgaGV4L2Jhc2U2NCBjb250
ZW50DQogICAgICAgICAgICAgICAgQ2xhc3M8Pz4gb2JqVHlwZSA9IGNvbGxlY3Rpb25WYWx1ZS5n
ZXRDbGFzcygpOw0KICAgICAgICAgICAgICAgIGlmIChvYmpUeXBlLmlzQXJyYXkoKSAmJiAob2Jq
VHlwZS5nZXRDb21wb25lbnRUeXBlKCkgPT0gQnl0ZS5UWVBFKSkgew0KICAgICAgICAgICAgICAg
ICAgICBjb2xsZWN0aW9uVmFsdWUgPSBlbmNvZGVCaW5hcnlEYXRhKGNvbGxlY3Rpb25WYWx1ZSwg
ZGVzY3JpcHRvci5nZXRDb21wb25lbnRUeXBlKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAg
ICAgICAgICAgICANCiAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY29sbGVjdGlvblZhbHVlLnRv
U3RyaW5nKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzYjsN
CiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KICAgIH0N
Cg0KDQogICAgLyoqDQogICAgICogRW5jb2RlIGJpbmFyeSBkYXRhLg0KICAgICAqIEBwYXJhbSB2
YWx1ZVRvRW5jb2RlIFRoZSBiaW5hcnkgZGF0YSB0byBlbmNvZGUuDQogICAgICogQHBhcmFtIGNv
bXBvbmVudFR5cGUgVGhlIFhNTCBzY2hlbWEgY29tcG9uZW50IHR5cGUuDQogICAgICogQHJldHVy
biBFbmNvZGVkIGJpbmFyeSBkYXRhIGluIHtAbGluayBTdHJpbmd9IGZvcm0uDQogICAgICovDQog
ICAgcHJpdmF0ZSBPYmplY3QgZW5jb2RlQmluYXJ5RGF0YShmaW5hbCBPYmplY3QgdmFsdWVUb0Vu
Y29kZSwNCiAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnRUeXBlKSB7DQogICAgICAg
IFN0cmluZyBlbmNvZGVkVmFsdWU7DQogICAgICAgIGlmIChIZXhEZWNvZGVyLkRBVEFfVFlQRS5l
cXVhbHMoY29tcG9uZW50VHlwZSkpIHsNCiAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IEhleERl
Y29kZXIuZW5jb2RlKChieXRlW10pIHZhbHVlVG9FbmNvZGUpOw0KICAgICAgICB9IGVsc2Ugew0K
ICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gbmV3IFN0cmluZyhCYXNlNjRFbmNvZGVyLmVuY29k
ZSgoYnl0ZVtdKSB2YWx1ZVRvRW5jb2RlKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGVu
Y29kZWRWYWx1ZTsNCiAgICB9DQoNCg0KICAgIC8qKg0KICAgICAqIFByb2Nlc3NlcyB0aGUgYXR0
cmlidXRlcyBmb3IgY29udGFpbmVyIG9iamVjdHMNCiAgICAgKg0KICAgICAqIEBwYXJhbSB0YXJn
ZXQgdGhlIG9iamVjdCBjdXJyZW50bHkgYmVpbmcgbWFyc2hhbGxlZC4NCiAgICAgKiBAcGFyYW0g
Y2xhc3NEZXNjIHRoZSBYTUxDbGFzc0Rlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgb2JqZWN0DQog
ICAgICogQHBhcmFtIGF0dHMgdGhlIFNBWCBhdHRyaWJ1dGVzIGxpc3QgdG8gYWRkIGF0dHJpYnV0
ZXMgdG8NCiAgICAgKi8NCiAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbnRhaW5lckF0dHJpYnV0
ZXMNCiAgICAgICAgKE9iamVjdCB0YXJnZXQsIFhNTENsYXNzRGVzY3JpcHRvciBjbGFzc0Rlc2Ms
IEF0dHJpYnV0ZXNJbXBsIGF0dHMpDQogICAgICAgIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uDQog
ICAgew0KICAgICAgICBpZiAoY2xhc3NEZXNjIGluc3RhbmNlb2YgWE1MQ2xhc3NEZXNjcmlwdG9y
SW1wbCkgew0KICAgICAgICAgICAgaWYgKCEoKFhNTENsYXNzRGVzY3JpcHRvckltcGwpY2xhc3NE
ZXNjKS5oYXNDb250YWluZXJGaWVsZHMoKSkNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAg
ICAgIH0NCg0KICAgICAgICBYTUxGaWVsZERlc2NyaXB0b3JbXSBlbGVtRGVzY3JpcHRvcnMgPSBj
bGFzc0Rlc2MuZ2V0RWxlbWVudERlc2NyaXB0b3JzKCk7DQogICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgZWxlbURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoZWxl
bURlc2NyaXB0b3JzW2ldID09IG51bGwpIGNvbnRpbnVlOw0KICAgICAgICAgICAgaWYgKCFlbGVt
RGVzY3JpcHRvcnNbaV0uaXNDb250YWluZXIoKSkgY29udGludWU7DQogICAgICAgICAgICBwcm9j
ZXNzQ29udGFpbmVyQXR0cmlidXRlcyh0YXJnZXQsIGVsZW1EZXNjcmlwdG9yc1tpXSwgYXR0cyk7
DQogICAgICAgIH0NCiAgICB9IC8vLS0gcHJvY2Vzc0NvbnRhaW5lckF0dHJpYnV0ZXMNCg0KICAg
IC8qKg0KICAgICAqIFByb2Nlc3NlcyB0aGUgYXR0cmlidXRlcyBmb3IgY29udGFpbmVyIG9iamVj
dHMuDQogICAgICoNCiAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgY3VycmVudGx5IGJl
aW5nIG1hcnNoYWxsZWQuDQogICAgICogQHBhcmFtIGNvbnRhaW5lckZpZWxkRGVzYyB0aGUgWE1M
RmllbGREZXNjcmlwdG9yIGZvciB0aGUgY29udGFpbnRlciB0byBwcm9jZXNzDQogICAgICogQHBh
cmFtIGF0dHMgdGhlIFNBWCBhdHRyaWJ1dGVzIGxpc3QgdG8gYWRkIGFueSBuZWNlc3NhcnkgYXR0
cmlidXRlcyB0by4NCiAgICAgKiBAdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24gSWYgdGhlcmUncyBh
IHByb2JsZW0gbWFyc2hhbGxpbmcgdGhlIGF0dHJpYnV0ZShzKS4NCiAgICAgKi8NCiAgICBwcml2
YXRlIHZvaWQgcHJvY2Vzc0NvbnRhaW5lckF0dHJpYnV0ZXMNCiAgICAgICAgKGZpbmFsIE9iamVj
dCB0YXJnZXQsIGZpbmFsIFhNTEZpZWxkRGVzY3JpcHRvciBjb250YWluZXJGaWVsZERlc2MsIA0K
ICAgICAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXNJbXBsIGF0dHMpDQogICAgICAgIHRocm93
cyBNYXJzaGFsRXhjZXB0aW9uIHsNCiAgICAgICAgaWYgKHRhcmdldC5nZXRDbGFzcygpLmlzQXJy
YXkoKSkgew0KICAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgodGFyZ2V0
KTsNCiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7DQogICAg
ICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IEFycmF5LmdldCh0YXJnZXQsIGopOw0KICAgICAg
ICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICBwcm9j
ZXNzQ29udGFpbmVyQXR0cmlidXRlcyhpdGVtLCBjb250YWluZXJGaWVsZERlc2MsIGF0dHMpOw0K
ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgcmV0dXJuOw0K
ICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVudW1lcmF0aW9uKSB7DQogICAg
ICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IChFbnVtZXJhdGlvbikgdGFyZ2V0Ow0K
ICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7DQogICAg
ICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOw0KICAg
ICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgcHJv
Y2Vzc0NvbnRhaW5lckF0dHJpYnV0ZXMoaXRlbSwgY29udGFpbmVyRmllbGREZXNjLCBhdHRzKTsN
CiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQog
ICAgICAgIH0NCg0KICAgICAgICBPYmplY3QgY29udGFpbmVyT2JqZWN0ID0gY29udGFpbmVyRmll
bGREZXNjLmdldEhhbmRsZXIoKS5nZXRWYWx1ZSh0YXJnZXQpOw0KDQogICAgICAgIGlmIChjb250YWluZXJPYmplY3QgPT0gbnVsbCkgew0KICAgICAgICAgICAgcmV0dXJu
Ow0KICAgICAgICB9DQoNCiAgICAgICAgWE1MQ2xhc3NEZXNjcmlwdG9yIGNvbnRhaW5lckNsYXNz
RGVzYw0KICAgICAgICAgICAgPSAoWE1MQ2xhc3NEZXNjcmlwdG9yKSBjb250YWluZXJGaWVsZERl
c2MuZ2V0Q2xhc3NEZXNjcmlwdG9yKCk7DQoNCiAgICAgICAgaWYgKGNvbnRhaW5lckNsYXNzRGVz
YyA9PSBudWxsKSB7DQogICAgICAgICAgICBjb250YWluZXJDbGFzc0Rlc2MgPSBnZXRDbGFzc0Rl
c2NyaXB0b3IoY29udGFpbmVyRmllbGREZXNjLmdldEZpZWxkVHlwZSgpKTsNCiAgICAgICAgICAg
IGlmIChjb250YWluZXJDbGFzc0Rlc2MgPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIHJldHVy
bjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIExvb2sgZm9yIGF0dHJp
YnV0ZXMNCiAgICAgICAgWE1MRmllbGREZXNjcmlwdG9yW10gYXR0ckRlc2NyaXB0b3JzID0gY29u
dGFpbmVyQ2xhc3NEZXNjLmdldEF0dHJpYnV0ZURlc2NyaXB0b3JzKCk7DQogICAgICAgIGZvciAo
aW50IGlkeCA9IDA7IGlkeCA8IGF0dHJEZXNjcmlwdG9ycy5sZW5ndGg7IGlkeCsrKSB7DQogICAg
ICAgICAgICBpZiAoYXR0ckRlc2NyaXB0b3JzW2lkeF0gPT0gbnVsbCkgew0KICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGF0dHJEZXNjcmlw
dG9yc1tpZHhdLmdldExvY2F0aW9uUGF0aCgpID09IG51bGwgDQogICAgICAgICAgICAgICAgICAg
IHx8IGF0dHJEZXNjcmlwdG9yc1tpZHhdLmdldExvY2F0aW9uUGF0aCgpLmxlbmd0aCgpID09IDAp
IHsNCiAgICAgICAgICAgICAgICBwcm9jZXNzQXR0cmlidXRlKGNvbnRhaW5lck9iamVjdCwgYXR0
ckRlc2NyaXB0b3JzW2lkeF0sIGF0dHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAg
ICAgICAgLy8gcmVjdXJzaXZlbHkgcHJvY2VzcyBjb250YWluZXJzDQogICAgICAgIHByb2Nlc3ND
b250YWluZXJBdHRyaWJ1dGVzKGNvbnRhaW5lck9iamVjdCwgY29udGFpbmVyQ2xhc3NEZXNjLCBh
dHRzKTsNCiAgICB9IC8vLS0gcHJvY2Vzc0NvbnRhaW5lckF0dHJpYnV0ZXMNCg0KICAgIC8qKg0K
ICAgICAqIFJlc29sdmUgYSBRTmFtZSB2YWx1ZSAoe1VSSX12YWx1ZSkgYnkgZGVjbGFyaW5nIGEg
bmFtZXNwYWNlIGFmdGVyDQogICAgICogaGF2aW5nIHJldHJpZXZlZCB0aGUgcHJlZml4Lg0KICAg
ICAqLw0KICAgIHByaXZhdGUgT2JqZWN0IHJlc29sdmVRTmFtZShPYmplY3QgdmFsdWUsIFhNTEZp
ZWxkRGVzY3JpcHRvciBmaWVsZERlc2MpIHsNCiAgICAgICAgaWYgKCAodmFsdWUgPT0gbnVsbCkg
fHwgISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpDQogICAgICAgICAgICByZXR1cm4gdmFsdWU7
DQogICAgICAgIGlmICghKGZpZWxkRGVzYyBpbnN0YW5jZW9mIFhNTEZpZWxkRGVzY3JpcHRvcklt
cGwpKQ0KICAgICAgICAgICByZXR1cm4gdmFsdWU7DQoNCiAgICAgICAgU3RyaW5nIHJlc3VsdCA9
IChTdHJpbmcpdmFsdWU7DQoNCiAgICAgICAgU3RyaW5nIG5zVVJJID0gbnVsbDsNCiAgICAgICAg
aW50IGlkeCA9IC0xOw0KICAgICAgICBpZiAoKHJlc3VsdC5sZW5ndGgoKSA+IDApICYmIChyZXN1
bHQuY2hhckF0KDApID09ICd7JykpIHsNCiAgICAgICAgICAgIGlkeCA9IHJlc3VsdC5pbmRleE9m
KCd9Jyk7DQogICAgICAgICAgICBpZiAoaWR4IDw9IDApIHsNCiAgICAgICAgICAgICAgICBTdHJp
bmcgZXJyID0gIkJhZCBRTmFtZSB2YWx1ZSA6JyIrcmVzdWx0KyInLCBpdCBzaG91bGQgZm9sbG93
IHRoZSBwYXR0ZXJuICd7VVJJfXZhbHVlJyI7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEls
bGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlcnIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAg
bnNVUkkgPSByZXN1bHQuc3Vic3RyaW5nKDEsIGlkeCk7DQogICAgICAgIH0NCiAgICAgICAgZWxz
ZSByZXR1cm4gdmFsdWU7DQoNCiAgICAgICAgU3RyaW5nIHByZWZpeCA9ICgoWE1MRmllbGREZXNj
cmlwdG9ySW1wbClmaWVsZERlc2MpLmdldFFOYW1lUHJlZml4KCk7DQogICAgICAgIC8vbm8gcHJl
Zml4IHByb3ZpZGVkLCBjaGVjayBpZiBvbmUgaGFzIGJlZW4gcHJldmlvdXNseSBkZWZpbmVkDQog
ICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkNCiAgICAgICAgICAgIHByZWZpeCA9IF9uYW1lc3Bh
Y2VzLmdldE5hbWVzcGFjZVByZWZpeChuc1VSSSk7DQogICAgICAgIC8vaWYgc3RpbGwgbm8gcHJl
Zml4LCB1c2UgYSBuYW1pbmcgYWxnb3JpdGhtIChucytjb3VudGVyKS4NCiAgICAgICAgaWYgKHBy
ZWZpeCA9PSBudWxsKQ0KICAgICAgICAgICAgcHJlZml4ID0gREVGQVVMVF9QUkVGSVgrKCsrX25h
bWVzcGFjZUNvdW50ZXIpOw0KICAgICAgICByZXN1bHQgPSAocHJlZml4Lmxlbmd0aCgpICE9IDAp
P3ByZWZpeCsiOiIrcmVzdWx0LnN1YnN0cmluZyhpZHgrMSk6cmVzdWx0LnN1YnN0cmluZyhpZHgr
MSk7DQogICAgICAgIGRlY2xhcmVOYW1lc3BhY2UocHJlZml4LCBuc1VSSSk7DQogICAgICAgIHJl
dHVybiByZXN1bHQ7DQogICAgfQ0KDQogICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKGZpbmFsIE9i
amVjdCBvYmplY3QpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsNCiAgICAgICAgaWYgIChf
dmFsaWRhdGUpIHsNCiAgICAgICAgICAgIC8vLS0gd2UgbXVzdCBoYXZlIGEgdmFsaWQgZWxlbWVu
dCBiZWZvcmUgbWFyc2hhbGxpbmcNCiAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBu
ZXcgVmFsaWRhdG9yKCk7DQogICAgICAgICAgICBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0ID0g
bmV3IFZhbGlkYXRpb25Db250ZXh0KCk7DQogICAgICAgICAgICBjb250ZXh0LnNldEludGVybmFs
Q29udGV4dChnZXRJbnRlcm5hbENvbnRleHQoKSk7DQovLyAgICAgICAgICAgIGNvbnRleHQuc2V0
Q29uZmlndXJhdGlvbihfY29uZmlnKTsNCi8vICAgICAgICAgICAgY29udGV4dC5zZXRSZXNvbHZl
cihfY2RSZXNvbHZlcik7DQogICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUob2JqZWN0LCBj
b250ZXh0KTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhl
IHZhbHVlIG9mIHRoZSBnaXZlbiBDYXN0b3IgWE1MLXNwZWNpZmljIHByb3BlcnR5Lg0KICAgICAq
IEBwYXJhbSBuYW1lIFF1YWxpZmllZCBuYW1lIG9mIHRoZSBDQVNUT1IgWE1MLXNwZWNpZmljIHBy
b3BlcnR5Lg0KICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIHBy
b3BlcnR5Lg0KICAgICAqIEBzaW5jZSAxLjEuMg0KICAgICovDQogICAgcHVibGljIFN0cmluZyBn
ZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSkgew0KICAgICAgICByZXR1cm4gZ2V0SW50ZXJu
YWxDb250ZXh0KCkuZ2V0U3RyaW5nUHJvcGVydHkobmFtZSk7DQogICAgfQ0KDQogICAgLyoqDQog
ICAgICogU2V0cyBhIGN1c3RvbSB2YWx1ZSBvZiBhIGdpdmVuIENhc3RvciBYTUwtc3BlY2lmaWMg
cHJvcGVydHkuDQogICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgQ2FzdG9yIFhNTCBwcm9w
ZXJ0eSANCiAgICAgKiBAcGFyYW0gdmFsdWUgQ3VzdG9tIHZhbHVlIHRvIHNldC4NCiAgICAgKiBA
c2luY2UgMS4xLjINCiAgICAgKi8NCiAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBT
dHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7DQogICAgICAgIGdldEludGVybmFsQ29u
dGV4dCgpLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsNCiAgICAgICAgZGVyaXZlUHJvcGVydGll
cygpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBJbm5lci1jbGFzcyB1c2VkIGZvciBo
YW5kbGluZyB3cmFwcGVyIGVsZW1lbnRzDQogICAgICogYW5kIGxvY2F0aW9ucy4NCiAgICAgKi8N
CiAgICBzdGF0aWMgY2xhc3MgV3JhcHBlckluZm8gew0KICAgICAgICBwcml2YXRlIFN0cmluZyBf
bG9jYWxOYW1lID0gbnVsbDsNCiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3FOYW1lID0gbnVsbDsN
CiAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2xvY2F0aW9uID0gbnVsbDsNCg0KICAgICAgICBXcmFw
cGVySW5mbyhmaW5hbCBTdHJpbmcgbG9jYWxOYW1lLCBmaW5hbCBTdHJpbmcgcU5hbWUsIGZpbmFs
IFN0cmluZyBsb2NhdGlvbikgew0KICAgICAgICAgICAgX2xvY2FsTmFtZSA9IGxvY2FsTmFtZTsN
CiAgICAgICAgICAgIF9xTmFtZSA9IHFOYW1lOw0KICAgICAgICAgICAgX2xvY2F0aW9uID0gbG9j
YXRpb247DQogICAgICAgIH0NCiAgICB9DQoNCg0KICAgIHN0YXRpYyBjbGFzcyBNYXJzaGFsU3Rh
dGUgew0KICAgICAgICBwcml2YXRlIFN0cmluZyBfeHBhdGggPSBudWxsOw0KICAgICAgICBwcml2
YXRlIFhNTEZpZWxkRGVzY3JpcHRvcltdIF9uZXN0ZWRBdHRzID0gbnVsbDsNCiAgICAgICAgcHJp
dmF0ZSBpbnQgX25lc3RlZEF0dENvdW50ID0gMDsNCiAgICAgICAgcHJpdmF0ZSBNYXJzaGFsU3Rh
dGUgX3BhcmVudCA9IG51bGw7DQogICAgICAgIHByaXZhdGUgT2JqZWN0IF9vd25lciAgICAgICAg
PSBudWxsOw0KICAgICAgICBwcml2YXRlIFN0cmluZyBfeG1sTmFtZSAgICAgID0gbnVsbDsNCg0K
ICAgICAgICBNYXJzaGFsU3RhdGUoT2JqZWN0IG93bmVyLCBTdHJpbmcgeG1sTmFtZSkgew0KICAg
ICAgICAgICAgaWYgKG93bmVyID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICBTdHJpbmcgZXJy
ID0gIlRoZSBhcmd1bWVudCAnb3duZXInIG11c3Qgbm90IGJlIG51bGwiOw0KICAgICAgICAgICAg
ICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXJyKTsNCiAgICAgICAgICAg
IH0NCiAgICAgICAgICAgIGlmICh4bWxOYW1lID09IG51bGwpIHsNCiAgICAgICAgICAgICAgICBT
dHJpbmcgZXJyID0gIlRoZSBhcmd1bWVudCAneG1sTmFtZScgbXVzdCBub3QgYmUgbnVsbCI7DQog
ICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlcnIpOw0K
ICAgICAgICAgICAgfQ0KICAgICAgICAgICAgX293bmVyID0gb3duZXI7DQogICAgICAgICAgICBf
eG1sTmFtZSA9IHhtbE5hbWU7DQogICAgICAgIH0NCg0KDQogICAgICAgIE1hcnNoYWxTdGF0ZSBj
cmVhdGVNYXJzaGFsU3RhdGUoT2JqZWN0IG93bmVyLCBTdHJpbmcgeG1sTmFtZSkgew0KICAgICAg
ICAgICAgTWFyc2hhbFN0YXRlIG1zID0gbmV3IE1hcnNoYWxTdGF0ZShvd25lciwgeG1sTmFtZSk7
DQogICAgICAgICAgICBtcy5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgICAgIHJldHVybiBtczsN
CiAgICAgICAgfQ0KDQogICAgICAgIFN0cmluZyBnZXRYUGF0aCgpIHsNCiAgICAgICAgICAgIGlm
IChfeHBhdGggPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIGlmIChfcGFyZW50ICE9IG51bGwp
IHsNCiAgICAgICAgICAgICAgICAgICAgX3hwYXRoID0gX3BhcmVudC5nZXRYUGF0aCgpICsgIi8i
ICsgX3htbE5hbWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0K
ICAgICAgICAgICAgICAgICAgICBfeHBhdGggPSBfeG1sTmFtZTsNCiAgICAgICAgICAgICAgICB9
DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gX3hwYXRoOw0KICAgICAgICB9DQoN
CiAgICAgICAgT2JqZWN0IGdldE93bmVyKCkgew0KICAgICAgICAgICAgcmV0dXJuIF9vd25lcjsN
CiAgICAgICAgfQ0KDQogICAgICAgIE1hcnNoYWxTdGF0ZSBnZXRQYXJlbnQoKSB7DQogICAgICAg
ICAgICByZXR1cm4gX3BhcmVudDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAq
IEEgd3JhcHBlciBmb3IgYSAiTmlsIiBvYmplY3QNCiAgICAgKg0KICAgICAqLw0KICAgIHB1Ymxp
YyBzdGF0aWMgY2xhc3MgTmlsT2JqZWN0IHsNCg0KICAgICAgICBwcml2YXRlIFhNTENsYXNzRGVz
Y3JpcHRvciBfY2xhc3NEZXNjID0gbnVsbDsNCiAgICAgICAgcHJpdmF0ZSBYTUxGaWVsZERlc2Ny
aXB0b3IgX2ZpZWxkRGVzYyA9IG51bGw7DQoNCiAgICAgICAgTmlsT2JqZWN0KFhNTENsYXNzRGVz
Y3JpcHRvciBjbGFzc0Rlc2MsIFhNTEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2MpIHsNCiAgICAg
ICAgICAgIF9jbGFzc0Rlc2MgPSBjbGFzc0Rlc2M7DQogICAgICAgICAgICBfZmllbGREZXNjID0g
ZmllbGREZXNjOw0KICAgICAgICB9DQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIFJldHVybnMg
dGhlIGFzc29jaWF0ZWQgWE1MQ2xhc3NEZXNjcmlwdG9yDQogICAgICAgICAqDQogICAgICAgICAq
IEByZXR1cm4gdGhlIFhNTENsYXNzRGVzY3JpcHRvcg0KICAgICAgICAgKi8NCiAgICAgICAgcHVi
bGljIFhNTENsYXNzRGVzY3JpcHRvciBnZXRDbGFzc0Rlc2NyaXB0b3IoKSB7DQogICAgICAgICAg
ICByZXR1cm4gX2NsYXNzRGVzYzsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qKg0KICAgICAgICAg
KiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIFhNTEZpZWxkRGVzY3JpcHRvcg0KICAgICAgICAgKg0K
ICAgICAgICAgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFhNTEZpZWxkRGVzY3JpcHRvcg0KICAg
ICAgICAgKi8NCiAgICAgICAgcHVibGljIFhNTEZpZWxkRGVzY3JpcHRvciBnZXRGaWVsZERlc2Ny
aXB0b3IoKSB7DQogICAgICAgICAgICByZXR1cm4gX2ZpZWxkRGVzYzsNCiAgICAgICAgfQ0KICAg
IH0NCg0KICAgIC8qKg0KICAgICAqIFRvIHNldCB0aGUgU0FYIHtAbGluayBDb250ZW50SGFuZGxl
cn0gd2hpY2ggaXMgdXNlZCBhcyBkZXN0aW5hdGlvbiBhdCBtYXJzaGFsbGluZy4NCiAgICAgKiBA
cGFyYW0gY29udGVudEhhbmRsZXIgdGhlIFNBWCB7QGxpbmsgQ29udGVudEhhbmRsZXJ9IHRvIHVz
ZSBhcyBkZXN0aW5hdGlvbiBhdCBtYXJzaGFsbGluZw0KICAgICAqLw0KICAgIHB1YmxpYyB2b2lk
IHNldENvbnRlbnRIYW5kbGVyKGZpbmFsIENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyKSB7
DQogICAgICAgIF9oYW5kbGVyID0gY29udGVudEhhbmRsZXI7DQogICAgfQ0KfSAvLy0tIE1hcnNo
YWxsZXINCg0KDQo=

--====001__MESSAGE__ID__54yg6f6h6y456345====
Content-Type: text/plain; charset=us-ascii


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email

--====001__MESSAGE__ID__54yg6f6h6y456345====--